diff --git a/.github/workflows/ci-dev.yml b/.github/workflows/ci-dev.yml new file mode 100644 index 000000000..9e666f776 --- /dev/null +++ b/.github/workflows/ci-dev.yml @@ -0,0 +1,51 @@ +name: CI + +on: + pull_request: + branches: + - develop + +jobs: + + test-full: + name: Full Test Suite + runs-on: ${{ matrix.os }} + + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest] + python-version: [3.8] + + steps: + - uses: actions/checkout@v2 + + - name: Install Linux dependencies + if: runner.os == 'Linux' + run: sudo apt-get install libopenblas-dev + + - name: Install macOS Dependencies + shell: bash -l {0} + if: runner.os == 'macOS' + run: | + brew tap sfarrens/sf + brew install bigmac libomp + + - name: Set up conda + uses: conda-incubator/setup-miniconda@v2 + with: + auto-update-conda: true + python-version: ${{ matrix.python-version }} + auto-activate-base: true + + - name: Install package + shell: bash -l {0} + run: | + ./install_shapepipe --env-dev --develop + + - name: Run tests + shell: bash -l {0} + run: | + conda activate shapepipe-dev + python setup.py test + shapepipe_run -c example/config.ini diff --git a/.github/workflows/ci-tests.yml b/.github/workflows/ci-release.yml similarity index 98% rename from .github/workflows/ci-tests.yml rename to .github/workflows/ci-release.yml index cc4ae4e93..ef1f6a013 100644 --- a/.github/workflows/ci-tests.yml +++ b/.github/workflows/ci-release.yml @@ -5,7 +5,6 @@ on: branches: - main - master - - develop jobs: diff --git a/.github/workflows/deploy-image.yml b/.github/workflows/deploy-image.yml new file mode 100644 index 000000000..81c31c7ad --- /dev/null +++ b/.github/workflows/deploy-image.yml @@ -0,0 +1,41 @@ +name: Create and publish a Docker image + +on: + push: + branches: ['master'] + +env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }} + +jobs: + build-and-push-image: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Log in to the Container registry + uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + + - name: Build and push Docker image + uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc + with: + context: . + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..7d2785ab2 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,57 @@ +FROM continuumio/miniconda3 + +LABEL Description="ShapePipe Docker Image" +ENV SHELL /bin/bash + +ARG CC=gcc-9 +ARG CXX=g++-9 + +# gcc < 10 is required to compile ww +ENV CC=gcc-9 +ENV CXX=g++-9 + +RUN apt-get update --allow-releaseinfo-change && \ + apt-get update && \ + apt-get upgrade -y && \ + apt-get install apt-utils -y && \ + apt-get install make -y && \ + apt-get install automake -y && \ + apt-get install autoconf -y && \ + apt-get install gcc-9 g++-9 -y && \ + apt-get install gfortran -y && \ + apt-get install locales -y && \ + apt-get install libgl1-mesa-glx -y && \ + apt-get install xterm -y && \ + apt-get install cmake protobuf-compiler -y && \ + apt-get install libtool libtool-bin libtool-doc -y && \ + apt-get install libfftw3-bin libfftw3-dev -y && \ + apt-get install libatlas-base-dev liblapack-dev libblas-dev -y && \ + apt-get install vim -y && \ + apt-get install locate -y && \ + apt-get install curl -y && \ + apt-get install acl -y && \ + apt-get install sssd -y && \ + apt-get clean + +ADD nsswitch.conf /etc/ + +RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && \ + locale-gen +ENV LANG en_US.UTF-8 +ENV LANGUAGE en_US:en +ENV LC_ALL en_US.UTF-8 + +SHELL ["/bin/bash", "--login", "-c"] + +COPY ./environment.yml ./ +COPY install_shapepipe README.rst setup.py setup.cfg ./ +RUN touch ./README.md + +RUN conda update -n base -c defaults conda -c defaults +RUN conda env create --file environment.yml + +COPY shapepipe ./shapepipe +COPY scripts ./scripts + +RUN source activate shapepipe +#RUN pip install jupyter diff --git a/auxdir/CFIS/tiles_202402/tiles_COSMOS.txt b/auxdir/CFIS/tiles_202402/tiles_COSMOS.txt new file mode 100644 index 000000000..ff9d7e4cf --- /dev/null +++ b/auxdir/CFIS/tiles_202402/tiles_COSMOS.txt @@ -0,0 +1,9 @@ +299.183 +300.183 +301.183 +299.184 +300.184 +301.184 +299.185 +300.185 +301.185 diff --git a/auxdir/CFIS/tiles_202402/tiles_all.txt b/auxdir/CFIS/tiles_202402/tiles_all.txt new file mode 100644 index 000000000..97dce4eb3 --- /dev/null +++ b/auxdir/CFIS/tiles_202402/tiles_all.txt @@ -0,0 +1,20859 @@ +000.227 +000.228 +000.229 +000.230 +000.231 +000.232 +000.233 +000.234 +000.235 +000.236 +000.237 +000.238 +000.239 +000.240 +000.241 +000.242 +000.243 +000.244 +000.245 +000.246 +000.247 +000.248 +000.249 +000.250 +000.251 +000.252 +000.253 +000.254 +000.255 +001.227 +001.228 +001.229 +001.230 +001.231 +001.232 +001.233 +001.234 +001.235 +001.236 +001.237 +001.238 +001.239 +001.240 +001.241 +001.242 +001.243 +001.244 +001.245 +001.246 +001.247 +001.248 +001.249 +001.250 +001.251 +001.252 +001.253 +001.254 +001.255 +002.227 +002.228 +002.229 +002.230 +002.231 +002.232 +002.233 +002.234 +002.235 +002.236 +002.237 +002.238 +002.239 +002.240 +002.241 +002.242 +002.243 +002.244 +002.245 +002.246 +002.247 +002.248 +002.249 +002.250 +002.251 +002.252 +002.253 +002.254 +002.255 +003.227 +003.228 +003.229 +003.230 +003.231 +003.232 +003.233 +003.234 +003.235 +003.236 +003.237 +003.238 +003.239 +003.240 +003.241 +003.242 +003.243 +003.244 +003.245 +003.246 +003.247 +003.248 +003.249 +003.250 +003.251 +003.252 +003.253 +003.254 +003.255 +004.227 +004.228 +004.229 +004.230 +004.231 +004.232 +004.233 +004.234 +004.235 +004.236 +004.237 +004.238 +004.239 +004.240 +004.241 +004.242 +004.243 +004.244 +004.245 +004.246 +004.247 +004.248 +004.249 +004.250 +004.251 +004.252 +004.253 +004.254 +004.255 +005.227 +005.228 +005.229 +005.230 +005.231 +005.232 +005.233 +005.234 +005.235 +005.236 +005.237 +005.238 +005.239 +005.240 +005.241 +005.242 +005.243 +005.244 +005.245 +005.246 +005.247 +005.248 +005.249 +005.250 +005.251 +005.252 +005.253 +005.254 +005.255 +006.227 +006.228 +006.229 +006.230 +006.231 +006.232 +006.233 +006.234 +006.235 +006.236 +006.237 +006.238 +006.239 +006.240 +006.241 +006.242 +006.243 +006.244 +006.245 +006.246 +006.247 +006.248 +006.249 +006.250 +006.251 +006.252 +006.253 +006.254 +006.255 +007.227 +007.228 +007.229 +007.230 +007.231 +007.232 +007.233 +007.234 +007.235 +007.236 +007.237 +007.238 +007.239 +007.240 +007.241 +007.242 +007.243 +007.244 +007.245 +007.246 +007.247 +007.248 +007.249 +007.250 +007.251 +007.252 +007.253 +007.254 +007.255 +008.227 +008.228 +008.229 +008.230 +008.231 +008.232 +008.233 +008.234 +008.235 +008.236 +008.237 +008.238 +008.239 +008.240 +008.241 +008.242 +008.243 +008.244 +008.245 +008.246 +008.247 +008.248 +008.249 +008.250 +008.251 +008.252 +008.253 +008.254 +008.255 +009.227 +009.228 +009.229 +009.230 +009.231 +009.232 +009.233 +009.234 +009.235 +009.236 +009.237 +009.238 +009.239 +009.240 +009.241 +009.242 +009.243 +009.244 +009.245 +009.246 +009.247 +009.248 +009.249 +009.250 +009.251 +009.252 +009.253 +009.254 +009.255 +010.227 +010.228 +010.229 +010.230 +010.231 +010.232 +010.233 +010.234 +010.235 +010.236 +010.237 +010.238 +010.239 +010.240 +010.241 +010.242 +010.243 +010.244 +010.245 +010.246 +010.247 +010.248 +010.249 +010.250 +010.251 +010.252 +010.253 +010.254 +010.255 +011.227 +011.228 +011.229 +011.230 +011.231 +011.232 +011.233 +011.234 +011.235 +011.236 +011.237 +011.238 +011.239 +011.240 +011.241 +011.242 +011.243 +011.244 +011.245 +011.246 +011.247 +011.248 +011.249 +011.250 +011.251 +011.252 +011.253 +011.254 +011.255 +012.227 +012.228 +012.229 +012.230 +012.231 +012.232 +012.233 +012.234 +012.235 +012.236 +012.237 +012.238 +012.239 +012.240 +012.241 +012.242 +012.243 +012.244 +012.245 +012.246 +012.247 +012.248 +012.249 +012.250 +012.251 +012.252 +012.253 +012.254 +012.255 +013.227 +013.228 +013.229 +013.230 +013.231 +013.232 +013.233 +013.234 +013.235 +013.236 +013.237 +013.238 +013.239 +013.240 +013.241 +013.242 +013.243 +013.244 +013.245 +013.246 +013.247 +013.248 +013.249 +013.250 +013.251 +013.252 +013.253 +013.254 +013.255 +014.227 +014.228 +014.229 +014.230 +014.231 +014.232 +014.233 +014.234 +014.235 +014.236 +014.237 +014.238 +014.239 +014.240 +014.241 +014.242 +014.243 +014.244 +014.245 +014.246 +014.247 +014.248 +014.249 +014.250 +014.251 +014.252 +014.253 +014.254 +014.255 +015.227 +015.228 +015.229 +015.230 +015.231 +015.232 +015.233 +015.234 +015.235 +015.236 +015.237 +015.238 +015.239 +015.240 +015.241 +015.242 +015.243 +015.244 +015.245 +015.246 +015.247 +015.248 +015.249 +015.250 +015.251 +015.252 +015.253 +015.254 +015.255 +016.227 +016.228 +016.229 +016.230 +016.231 +016.232 +016.233 +016.234 +016.235 +016.236 +016.237 +016.238 +016.239 +016.240 +016.241 +016.242 +016.243 +016.244 +016.245 +016.246 +016.247 +016.248 +016.249 +016.250 +016.251 +016.252 +016.253 +016.254 +016.255 +017.227 +017.228 +017.229 +017.230 +017.231 +017.232 +017.233 +017.234 +017.235 +017.236 +017.237 +017.238 +017.239 +017.240 +017.241 +017.242 +017.243 +017.244 +017.245 +017.246 +017.247 +017.248 +017.249 +017.250 +017.251 +017.252 +017.253 +017.254 +017.255 +018.227 +018.228 +018.229 +018.230 +018.231 +018.232 +018.233 +018.234 +018.235 +018.236 +018.237 +018.238 +018.239 +018.240 +018.241 +018.242 +018.243 +018.244 +018.245 +018.246 +018.247 +018.248 +018.249 +018.250 +018.251 +018.252 +018.253 +018.254 +018.255 +019.227 +019.228 +019.229 +019.230 +019.231 +019.232 +019.233 +019.234 +019.235 +019.236 +019.237 +019.238 +019.239 +019.240 +019.241 +019.242 +019.243 +019.244 +019.245 +019.246 +019.247 +019.248 +019.249 +019.250 +019.251 +019.252 +019.253 +019.254 +019.255 +020.227 +020.228 +020.229 +020.230 +020.231 +020.232 +020.233 +020.234 +020.235 +020.236 +020.237 +020.238 +020.239 +020.240 +020.241 +020.242 +020.243 +020.244 +020.245 +020.246 +020.247 +020.248 +020.249 +020.250 +020.251 +020.252 +020.253 +020.254 +020.255 +021.228 +021.229 +021.230 +021.231 +021.232 +021.233 +021.234 +021.235 +021.236 +021.237 +021.238 +021.239 +021.240 +021.241 +021.242 +021.243 +021.244 +021.245 +021.246 +021.247 +021.248 +021.249 +021.250 +021.251 +021.252 +021.253 +021.254 +021.255 +022.228 +022.229 +022.230 +022.231 +022.232 +022.233 +022.234 +022.235 +022.236 +022.237 +022.238 +022.239 +022.240 +022.241 +022.242 +022.243 +022.244 +022.245 +022.246 +022.247 +022.248 +022.249 +022.250 +022.251 +022.252 +022.253 +022.254 +022.255 +023.228 +023.229 +023.230 +023.231 +023.232 +023.233 +023.234 +023.235 +023.236 +023.237 +023.238 +023.239 +023.240 +023.241 +023.242 +023.243 +023.244 +023.245 +023.246 +023.247 +023.248 +023.249 +023.250 +023.251 +023.252 +023.253 +023.254 +023.255 +024.228 +024.229 +024.230 +024.231 +024.232 +024.233 +024.234 +024.235 +024.236 +024.237 +024.238 +024.239 +024.240 +024.241 +024.242 +024.243 +024.244 +024.245 +024.246 +024.247 +024.248 +024.249 +024.250 +024.251 +024.252 +024.253 +024.254 +024.255 +024.350 +025.228 +025.229 +025.230 +025.231 +025.232 +025.233 +025.234 +025.235 +025.236 +025.237 +025.238 +025.239 +025.240 +025.241 +025.242 +025.243 +025.244 +025.245 +025.246 +025.247 +025.248 +025.249 +025.250 +025.251 +025.252 +025.253 +025.254 +025.255 +025.350 +026.228 +026.229 +026.230 +026.231 +026.232 +026.233 +026.234 +026.235 +026.236 +026.237 +026.238 +026.239 +026.240 +026.241 +026.242 +026.243 +026.244 +026.245 +026.246 +026.247 +026.248 +026.249 +026.250 +026.251 +026.252 +026.253 +026.254 +026.255 +026.349 +027.228 +027.229 +027.230 +027.231 +027.232 +027.233 +027.234 +027.235 +027.236 +027.237 +027.238 +027.239 +027.240 +027.241 +027.242 +027.243 +027.244 +027.245 +027.246 +027.247 +027.248 +027.249 +027.250 +027.251 +027.252 +027.253 +027.254 +027.255 +027.349 +027.350 +028.228 +028.229 +028.230 +028.231 +028.232 +028.233 +028.234 +028.235 +028.236 +028.237 +028.238 +028.239 +028.240 +028.241 +028.242 +028.243 +028.244 +028.245 +028.246 +028.247 +028.248 +028.249 +028.250 +028.251 +028.252 +028.253 +028.254 +028.255 +028.346 +028.348 +028.349 +028.350 +029.228 +029.229 +029.230 +029.231 +029.232 +029.233 +029.234 +029.235 +029.236 +029.237 +029.238 +029.239 +029.240 +029.241 +029.242 +029.243 +029.244 +029.245 +029.246 +029.247 +029.248 +029.249 +029.250 +029.251 +029.252 +029.253 +029.254 +029.255 +029.346 +029.348 +029.349 +030.228 +030.229 +030.230 +030.231 +030.232 +030.233 +030.234 +030.235 +030.236 +030.237 +030.238 +030.239 +030.240 +030.241 +030.242 +030.243 +030.244 +030.245 +030.246 +030.247 +030.248 +030.249 +030.250 +030.251 +030.252 +030.253 +030.254 +030.255 +030.345 +030.346 +030.347 +030.348 +030.349 +031.228 +031.229 +031.230 +031.231 +031.232 +031.233 +031.234 +031.235 +031.236 +031.237 +031.238 +031.239 +031.240 +031.241 +031.242 +031.243 +031.244 +031.245 +031.246 +031.247 +031.248 +031.249 +031.250 +031.251 +031.252 +031.253 +031.254 +031.255 +031.345 +031.346 +031.347 +031.349 +032.228 +032.229 +032.230 +032.231 +032.232 +032.233 +032.234 +032.235 +032.236 +032.237 +032.238 +032.239 +032.240 +032.241 +032.242 +032.243 +032.244 +032.245 +032.246 +032.247 +032.248 +032.249 +032.250 +032.251 +032.252 +032.253 +032.254 +032.255 +032.344 +032.345 +032.346 +032.347 +032.348 +033.228 +033.229 +033.230 +033.231 +033.232 +033.233 +033.234 +033.235 +033.236 +033.237 +033.238 +033.239 +033.240 +033.241 +033.242 +033.243 +033.244 +033.245 +033.246 +033.247 +033.248 +033.249 +033.250 +033.251 +033.252 +033.253 +033.254 +033.255 +033.344 +033.345 +033.346 +033.347 +033.348 +034.228 +034.229 +034.230 +034.231 +034.232 +034.233 +034.234 +034.235 +034.236 +034.237 +034.238 +034.239 +034.240 +034.241 +034.242 +034.243 +034.244 +034.245 +034.246 +034.247 +034.248 +034.249 +034.250 +034.251 +034.252 +034.253 +034.254 +034.255 +034.343 +034.344 +034.345 +034.346 +034.348 +035.221 +035.222 +035.223 +035.228 +035.229 +035.230 +035.231 +035.232 +035.233 +035.234 +035.235 +035.236 +035.237 +035.238 +035.239 +035.240 +035.241 +035.242 +035.243 +035.244 +035.245 +035.246 +035.247 +035.248 +035.249 +035.250 +035.251 +035.252 +035.253 +035.254 +035.255 +035.343 +035.344 +035.345 +035.346 +035.347 +036.221 +036.222 +036.223 +036.228 +036.229 +036.230 +036.231 +036.232 +036.233 +036.234 +036.235 +036.236 +036.237 +036.238 +036.239 +036.240 +036.241 +036.242 +036.243 +036.244 +036.245 +036.246 +036.247 +036.248 +036.249 +036.250 +036.251 +036.252 +036.253 +036.343 +036.344 +036.345 +036.346 +036.347 +037.221 +037.222 +037.223 +037.224 +037.228 +037.229 +037.230 +037.231 +037.232 +037.233 +037.234 +037.235 +037.236 +037.237 +037.238 +037.239 +037.240 +037.241 +037.242 +037.243 +037.244 +037.245 +037.246 +037.247 +037.248 +037.249 +037.250 +037.251 +037.252 +037.253 +037.343 +037.344 +037.345 +037.346 +037.347 +038.221 +038.222 +038.223 +038.224 +038.229 +038.230 +038.231 +038.232 +038.233 +038.234 +038.235 +038.236 +038.237 +038.238 +038.239 +038.240 +038.241 +038.242 +038.243 +038.244 +038.245 +038.246 +038.247 +038.248 +038.249 +038.250 +038.251 +038.252 +038.253 +038.343 +038.344 +038.345 +038.346 +039.221 +039.222 +039.223 +039.224 +039.230 +039.231 +039.232 +039.233 +039.234 +039.235 +039.236 +039.237 +039.238 +039.239 +039.240 +039.241 +039.242 +039.243 +039.244 +039.245 +039.246 +039.247 +039.248 +039.249 +039.250 +039.251 +039.252 +039.253 +039.343 +039.344 +039.345 +039.346 +040.221 +040.222 +040.223 +040.224 +040.230 +040.231 +040.232 +040.233 +040.234 +040.235 +040.236 +040.237 +040.238 +040.239 +040.240 +040.241 +040.242 +040.243 +040.244 +040.245 +040.246 +040.247 +040.248 +040.249 +040.250 +040.251 +040.252 +040.253 +040.343 +040.344 +040.345 +040.346 +041.222 +041.223 +041.224 +041.230 +041.231 +041.232 +041.233 +041.234 +041.235 +041.236 +041.237 +041.238 +041.239 +041.240 +041.241 +041.242 +041.243 +041.244 +041.245 +041.246 +041.247 +041.248 +041.249 +041.250 +041.251 +041.252 +041.253 +041.343 +041.344 +041.345 +042.230 +042.231 +042.232 +042.233 +042.234 +042.235 +042.236 +042.237 +042.238 +042.239 +042.240 +042.241 +042.242 +042.243 +042.244 +042.245 +042.246 +042.247 +042.248 +042.249 +042.250 +042.251 +042.252 +042.253 +042.342 +042.343 +042.344 +042.345 +043.230 +043.231 +043.232 +043.233 +043.234 +043.235 +043.236 +043.237 +043.238 +043.239 +043.240 +043.241 +043.242 +043.243 +043.244 +043.245 +043.246 +043.247 +043.248 +043.249 +043.250 +043.251 +043.252 +043.253 +043.342 +043.343 +043.344 +043.345 +044.230 +044.231 +044.232 +044.233 +044.234 +044.235 +044.236 +044.237 +044.238 +044.239 +044.240 +044.241 +044.242 +044.243 +044.244 +044.245 +044.246 +044.247 +044.248 +044.249 +044.250 +044.251 +044.252 +044.253 +044.342 +044.343 +044.344 +045.230 +045.231 +045.232 +045.233 +045.234 +045.235 +045.236 +045.237 +045.238 +045.239 +045.240 +045.241 +045.242 +045.243 +045.244 +045.245 +045.246 +045.247 +045.248 +045.249 +045.250 +045.251 +045.252 +045.253 +045.342 +045.343 +045.344 +046.230 +046.231 +046.232 +046.233 +046.234 +046.235 +046.236 +046.237 +046.238 +046.239 +046.240 +046.241 +046.242 +046.243 +046.244 +046.245 +046.246 +046.247 +046.248 +046.249 +046.250 +046.251 +046.252 +046.253 +046.342 +046.343 +046.344 +047.230 +047.231 +047.232 +047.233 +047.234 +047.235 +047.236 +047.237 +047.238 +047.239 +047.240 +047.241 +047.242 +047.243 +047.244 +047.245 +047.246 +047.247 +047.248 +047.249 +047.250 +047.251 +047.252 +047.253 +047.341 +047.342 +047.343 +048.230 +048.231 +048.232 +048.233 +048.234 +048.235 +048.236 +048.237 +048.238 +048.239 +048.240 +048.241 +048.242 +048.243 +048.244 +048.245 +048.246 +048.247 +048.248 +048.249 +048.250 +048.251 +048.252 +048.253 +048.340 +048.341 +048.342 +048.343 +049.230 +049.231 +049.232 +049.233 +049.234 +049.235 +049.236 +049.237 +049.238 +049.239 +049.240 +049.241 +049.242 +049.243 +049.244 +049.245 +049.246 +049.247 +049.248 +049.249 +049.250 +049.251 +049.340 +049.341 +049.342 +050.232 +050.233 +050.234 +050.235 +050.236 +050.237 +050.238 +050.239 +050.240 +050.241 +050.242 +050.243 +050.244 +050.245 +050.246 +050.247 +050.248 +050.249 +050.250 +050.251 +050.339 +050.340 +050.341 +050.342 +051.217 +051.218 +051.219 +051.232 +051.233 +051.234 +051.235 +051.236 +051.237 +051.238 +051.239 +051.240 +051.241 +051.242 +051.243 +051.244 +051.245 +051.246 +051.247 +051.248 +051.249 +051.250 +051.251 +051.339 +051.340 +051.341 +052.217 +052.218 +052.219 +052.233 +052.234 +052.235 +052.236 +052.237 +052.238 +052.239 +052.240 +052.241 +052.242 +052.243 +052.244 +052.245 +052.246 +052.247 +052.248 +052.249 +052.250 +052.251 +052.332 +052.338 +052.339 +052.340 +053.217 +053.218 +053.219 +053.233 +053.234 +053.235 +053.236 +053.237 +053.238 +053.239 +053.240 +053.241 +053.242 +053.243 +053.244 +053.245 +053.246 +053.247 +053.248 +053.249 +053.250 +053.251 +053.331 +053.332 +053.338 +053.339 +053.340 +054.217 +054.218 +054.219 +054.233 +054.234 +054.235 +054.236 +054.237 +054.238 +054.239 +054.240 +054.241 +054.242 +054.243 +054.244 +054.245 +054.246 +054.247 +054.248 +054.249 +054.250 +054.251 +054.331 +054.332 +054.337 +054.338 +054.339 +054.340 +055.221 +055.222 +055.236 +055.237 +055.238 +055.239 +055.240 +055.241 +055.242 +055.243 +055.244 +055.245 +055.246 +055.247 +055.248 +055.249 +055.250 +055.251 +055.330 +055.331 +055.332 +055.337 +055.338 +055.339 +056.220 +056.221 +056.222 +056.238 +056.239 +056.240 +056.241 +056.242 +056.243 +056.244 +056.245 +056.246 +056.247 +056.248 +056.249 +056.250 +056.251 +056.330 +056.331 +056.332 +056.336 +056.337 +056.338 +056.339 +057.220 +057.221 +057.222 +057.238 +057.239 +057.240 +057.241 +057.242 +057.243 +057.244 +057.245 +057.246 +057.247 +057.248 +057.249 +057.250 +057.329 +057.330 +057.331 +057.332 +057.336 +057.337 +057.338 +057.345 +058.220 +058.221 +058.238 +058.239 +058.240 +058.241 +058.242 +058.243 +058.244 +058.245 +058.246 +058.247 +058.248 +058.249 +058.250 +058.329 +058.330 +058.331 +058.332 +058.336 +058.337 +058.338 +058.345 +059.238 +059.239 +059.240 +059.241 +059.242 +059.243 +059.244 +059.245 +059.246 +059.247 +059.248 +059.249 +059.250 +059.328 +059.329 +059.330 +059.331 +059.332 +059.335 +059.336 +059.337 +059.338 +059.343 +059.345 +060.238 +060.239 +060.240 +060.241 +060.242 +060.243 +060.244 +060.245 +060.246 +060.247 +060.248 +060.249 +060.250 +060.328 +060.329 +060.330 +060.331 +060.332 +060.334 +060.335 +060.336 +060.337 +060.338 +060.343 +060.344 +061.238 +061.239 +061.240 +061.241 +061.242 +061.243 +061.244 +061.245 +061.246 +061.247 +061.248 +061.327 +061.328 +061.329 +061.330 +061.331 +061.332 +061.334 +061.335 +061.336 +061.337 +061.338 +061.343 +061.344 +062.238 +062.239 +062.240 +062.241 +062.242 +062.243 +062.244 +062.245 +062.246 +062.247 +062.248 +062.326 +062.327 +062.328 +062.329 +062.330 +062.331 +062.332 +062.333 +062.334 +062.335 +062.336 +062.337 +062.343 +062.344 +063.238 +063.239 +063.240 +063.241 +063.242 +063.243 +063.244 +063.245 +063.246 +063.247 +063.325 +063.326 +063.327 +063.328 +063.329 +063.330 +063.331 +063.332 +063.333 +063.334 +063.335 +063.336 +063.337 +063.342 +063.343 +063.344 +064.238 +064.239 +064.240 +064.241 +064.242 +064.324 +064.325 +064.326 +064.327 +064.328 +064.329 +064.330 +064.331 +064.332 +064.333 +064.334 +064.335 +064.336 +064.337 +064.342 +064.343 +065.240 +065.241 +065.324 +065.325 +065.326 +065.327 +065.328 +065.329 +065.330 +065.331 +065.332 +065.333 +065.334 +065.335 +065.336 +065.337 +065.341 +065.342 +065.343 +066.168 +066.169 +066.170 +066.171 +066.172 +066.173 +066.174 +066.321 +066.323 +066.324 +066.325 +066.326 +066.327 +066.328 +066.329 +066.330 +066.331 +066.332 +066.333 +066.334 +066.335 +066.336 +066.337 +066.341 +066.342 +066.343 +067.168 +067.169 +067.170 +067.171 +067.172 +067.173 +067.174 +067.321 +067.322 +067.323 +067.324 +067.325 +067.326 +067.327 +067.328 +067.329 +067.330 +067.331 +067.332 +067.333 +067.334 +067.335 +067.336 +067.337 +067.341 +067.342 +067.343 +068.167 +068.168 +068.169 +068.170 +068.171 +068.172 +068.173 +068.174 +068.320 +068.321 +068.322 +068.323 +068.324 +068.325 +068.326 +068.327 +068.328 +068.329 +068.330 +068.331 +068.332 +068.333 +068.334 +068.335 +068.336 +068.337 +068.340 +068.341 +068.342 +068.343 +069.167 +069.168 +069.169 +069.170 +069.171 +069.172 +069.173 +069.174 +069.319 +069.320 +069.321 +069.322 +069.323 +069.324 +069.325 +069.326 +069.327 +069.328 +069.329 +069.330 +069.331 +069.332 +069.333 +069.334 +069.335 +069.336 +069.337 +069.340 +069.341 +069.342 +069.343 +070.167 +070.168 +070.169 +070.170 +070.171 +070.172 +070.173 +070.174 +070.319 +070.320 +070.321 +070.322 +070.323 +070.324 +070.325 +070.326 +070.327 +070.328 +070.329 +070.330 +070.331 +070.332 +070.333 +070.334 +070.335 +070.336 +070.337 +070.340 +070.341 +070.342 +070.343 +071.167 +071.168 +071.169 +071.170 +071.171 +071.172 +071.173 +071.174 +071.318 +071.319 +071.320 +071.321 +071.322 +071.323 +071.324 +071.325 +071.326 +071.327 +071.328 +071.329 +071.330 +071.331 +071.332 +071.333 +071.334 +071.335 +071.336 +071.337 +071.340 +071.341 +071.342 +071.343 +072.167 +072.168 +072.169 +072.170 +072.171 +072.172 +072.173 +072.174 +072.318 +072.319 +072.320 +072.321 +072.322 +072.323 +072.324 +072.325 +072.326 +072.327 +072.328 +072.329 +072.330 +072.331 +072.332 +072.333 +072.334 +072.335 +072.336 +072.337 +072.339 +072.340 +072.341 +072.342 +072.343 +073.167 +073.168 +073.169 +073.170 +073.171 +073.172 +073.173 +073.174 +073.317 +073.318 +073.319 +073.320 +073.321 +073.322 +073.323 +073.324 +073.325 +073.326 +073.327 +073.328 +073.329 +073.330 +073.331 +073.332 +073.333 +073.334 +073.335 +073.336 +073.337 +073.339 +073.340 +073.341 +073.342 +074.167 +074.168 +074.169 +074.170 +074.171 +074.172 +074.173 +074.174 +074.317 +074.318 +074.319 +074.320 +074.321 +074.322 +074.323 +074.324 +074.325 +074.326 +074.327 +074.328 +074.329 +074.330 +074.331 +074.332 +074.333 +074.334 +074.335 +074.336 +074.337 +074.339 +074.340 +074.341 +074.342 +075.167 +075.168 +075.169 +075.170 +075.171 +075.172 +075.173 +075.174 +075.317 +075.318 +075.319 +075.320 +075.321 +075.322 +075.323 +075.324 +075.325 +075.326 +075.327 +075.328 +075.329 +075.330 +075.331 +075.332 +075.333 +075.334 +075.335 +075.336 +075.337 +075.338 +075.339 +075.340 +075.341 +075.342 +076.168 +076.169 +076.170 +076.171 +076.172 +076.173 +076.316 +076.317 +076.318 +076.319 +076.320 +076.321 +076.322 +076.323 +076.324 +076.325 +076.326 +076.327 +076.328 +076.329 +076.330 +076.331 +076.332 +076.333 +076.334 +076.335 +076.336 +076.337 +076.338 +076.339 +076.340 +076.341 +076.342 +077.316 +077.317 +077.318 +077.319 +077.320 +077.321 +077.322 +077.323 +077.324 +077.325 +077.326 +077.327 +077.328 +077.329 +077.330 +077.331 +077.332 +077.333 +077.334 +077.335 +077.336 +077.337 +077.338 +077.339 +077.340 +077.341 +077.342 +078.315 +078.316 +078.317 +078.318 +078.319 +078.320 +078.321 +078.322 +078.323 +078.324 +078.325 +078.326 +078.327 +078.328 +078.329 +078.330 +078.331 +078.332 +078.333 +078.334 +078.335 +078.336 +078.337 +078.338 +078.339 +078.340 +078.341 +079.314 +079.315 +079.316 +079.317 +079.318 +079.319 +079.320 +079.321 +079.322 +079.323 +079.324 +079.325 +079.326 +079.327 +079.328 +079.329 +079.330 +079.331 +079.332 +079.333 +079.334 +079.335 +079.336 +079.337 +079.338 +079.339 +079.340 +079.341 +079.343 +080.314 +080.315 +080.316 +080.317 +080.318 +080.319 +080.320 +080.321 +080.322 +080.323 +080.324 +080.325 +080.326 +080.327 +080.328 +080.329 +080.330 +080.331 +080.332 +080.333 +080.334 +080.335 +080.336 +080.337 +080.338 +080.339 +080.340 +080.341 +080.343 +081.313 +081.314 +081.315 +081.316 +081.317 +081.318 +081.319 +081.320 +081.321 +081.322 +081.323 +081.324 +081.325 +081.326 +081.327 +081.328 +081.329 +081.330 +081.331 +081.332 +081.333 +081.334 +081.335 +081.336 +081.337 +081.338 +081.339 +081.341 +081.343 +082.312 +082.313 +082.314 +082.315 +082.316 +082.317 +082.318 +082.319 +082.320 +082.321 +082.322 +082.323 +082.324 +082.325 +082.326 +082.327 +082.328 +082.329 +082.330 +082.331 +082.333 +082.334 +082.335 +082.336 +082.337 +082.338 +082.339 +083.312 +083.313 +083.314 +083.315 +083.316 +083.317 +083.318 +083.319 +083.320 +083.321 +083.322 +083.323 +083.324 +083.325 +083.326 +083.327 +083.328 +083.329 +083.330 +083.331 +083.333 +083.334 +083.335 +083.336 +083.337 +083.338 +083.339 +083.342 +084.311 +084.312 +084.313 +084.314 +084.315 +084.316 +084.317 +084.318 +084.319 +084.320 +084.321 +084.322 +084.323 +084.324 +084.325 +084.326 +084.327 +084.328 +084.329 +084.330 +084.331 +084.332 +084.333 +084.334 +084.335 +084.336 +084.337 +084.338 +084.339 +084.342 +085.311 +085.312 +085.313 +085.314 +085.315 +085.316 +085.317 +085.318 +085.319 +085.320 +085.321 +085.322 +085.323 +085.324 +085.325 +085.326 +085.327 +085.328 +085.329 +085.330 +085.331 +085.332 +085.333 +085.334 +085.335 +085.336 +085.337 +085.338 +085.342 +086.310 +086.311 +086.312 +086.313 +086.314 +086.315 +086.316 +086.317 +086.318 +086.319 +086.320 +086.321 +086.322 +086.323 +086.324 +086.325 +086.326 +086.327 +086.328 +086.329 +086.330 +086.332 +086.333 +086.334 +086.335 +086.336 +086.337 +086.338 +086.342 +087.310 +087.311 +087.312 +087.313 +087.314 +087.315 +087.316 +087.317 +087.318 +087.319 +087.320 +087.321 +087.322 +087.323 +087.324 +087.325 +087.326 +087.327 +087.328 +087.329 +087.330 +087.331 +087.332 +087.333 +087.334 +087.335 +087.336 +087.337 +087.338 +087.339 +087.341 +087.342 +088.309 +088.310 +088.311 +088.312 +088.313 +088.314 +088.315 +088.316 +088.317 +088.318 +088.319 +088.320 +088.321 +088.322 +088.323 +088.324 +088.325 +088.326 +088.327 +088.328 +088.329 +088.330 +088.331 +088.332 +088.333 +088.334 +088.335 +088.336 +088.337 +088.339 +088.341 +089.309 +089.310 +089.311 +089.312 +089.313 +089.314 +089.315 +089.316 +089.317 +089.318 +089.319 +089.320 +089.321 +089.322 +089.323 +089.324 +089.325 +089.326 +089.327 +089.328 +089.329 +089.330 +089.331 +089.333 +089.334 +089.335 +089.336 +089.337 +089.339 +089.341 +090.302 +090.309 +090.310 +090.311 +090.312 +090.313 +090.314 +090.315 +090.316 +090.317 +090.318 +090.319 +090.320 +090.321 +090.322 +090.323 +090.324 +090.325 +090.326 +090.327 +090.328 +090.329 +090.330 +090.331 +090.332 +090.333 +090.334 +090.335 +090.336 +090.337 +090.339 +090.341 +091.301 +091.302 +091.308 +091.309 +091.310 +091.311 +091.312 +091.313 +091.314 +091.315 +091.316 +091.317 +091.318 +091.319 +091.320 +091.321 +091.322 +091.323 +091.324 +091.325 +091.326 +091.328 +091.329 +091.330 +091.331 +091.332 +091.333 +091.334 +091.335 +091.336 +091.337 +091.338 +091.339 +091.341 +092.301 +092.302 +092.308 +092.309 +092.310 +092.311 +092.312 +092.313 +092.314 +092.315 +092.316 +092.317 +092.318 +092.319 +092.320 +092.321 +092.322 +092.323 +092.324 +092.325 +092.326 +092.328 +092.329 +092.330 +092.331 +092.332 +092.333 +092.334 +092.335 +092.336 +092.337 +092.338 +092.340 +092.341 +093.300 +093.301 +093.307 +093.308 +093.309 +093.310 +093.311 +093.312 +093.313 +093.314 +093.315 +093.316 +093.317 +093.318 +093.319 +093.320 +093.321 +093.322 +093.323 +093.324 +093.325 +093.328 +093.329 +093.330 +093.331 +093.332 +093.333 +093.334 +093.335 +093.336 +093.337 +093.338 +093.340 +094.300 +094.301 +094.306 +094.307 +094.308 +094.309 +094.310 +094.311 +094.312 +094.313 +094.314 +094.315 +094.316 +094.317 +094.318 +094.319 +094.320 +094.321 +094.322 +094.323 +094.327 +094.328 +094.329 +094.330 +094.331 +094.332 +094.333 +094.334 +094.335 +094.336 +094.337 +094.338 +094.340 +095.300 +095.306 +095.307 +095.308 +095.309 +095.310 +095.311 +095.312 +095.313 +095.314 +095.315 +095.316 +095.317 +095.318 +095.319 +095.320 +095.321 +095.322 +095.327 +095.328 +095.329 +095.330 +095.331 +095.332 +095.333 +095.334 +095.335 +095.336 +095.337 +095.338 +095.340 +096.305 +096.306 +096.307 +096.308 +096.309 +096.310 +096.311 +096.312 +096.313 +096.314 +096.315 +096.316 +096.317 +096.318 +096.319 +096.320 +096.321 +096.322 +096.327 +096.328 +096.329 +096.330 +096.331 +096.332 +096.333 +096.334 +096.335 +096.336 +096.337 +096.338 +096.340 +097.305 +097.306 +097.307 +097.308 +097.309 +097.310 +097.311 +097.312 +097.313 +097.314 +097.315 +097.316 +097.317 +097.318 +097.319 +097.320 +097.321 +097.322 +097.327 +097.328 +097.329 +097.330 +097.331 +097.332 +097.333 +097.334 +097.335 +097.336 +097.337 +098.304 +098.305 +098.306 +098.307 +098.308 +098.309 +098.310 +098.311 +098.312 +098.313 +098.314 +098.315 +098.316 +098.317 +098.318 +098.319 +098.320 +098.321 +098.322 +098.327 +098.328 +098.329 +098.330 +098.331 +098.332 +098.333 +098.334 +098.335 +098.336 +098.337 +098.338 +098.339 +099.303 +099.304 +099.305 +099.306 +099.307 +099.308 +099.309 +099.310 +099.311 +099.312 +099.313 +099.314 +099.315 +099.316 +099.317 +099.318 +099.319 +099.320 +099.321 +099.322 +099.327 +099.328 +099.329 +099.330 +099.331 +099.332 +099.333 +099.334 +099.335 +099.336 +099.337 +099.338 +099.339 +100.303 +100.304 +100.305 +100.306 +100.307 +100.308 +100.309 +100.310 +100.311 +100.312 +100.313 +100.314 +100.315 +100.316 +100.317 +100.318 +100.319 +100.320 +100.321 +100.322 +100.327 +100.328 +100.329 +100.330 +100.331 +100.332 +100.333 +100.334 +100.335 +100.336 +100.337 +100.338 +100.339 +101.302 +101.303 +101.304 +101.305 +101.306 +101.307 +101.308 +101.309 +101.310 +101.311 +101.312 +101.313 +101.314 +101.315 +101.316 +101.317 +101.318 +101.319 +101.320 +101.321 +101.322 +101.328 +101.329 +101.330 +101.331 +101.332 +101.333 +101.334 +101.335 +101.336 +101.337 +101.338 +101.339 +102.302 +102.303 +102.304 +102.305 +102.306 +102.307 +102.308 +102.309 +102.310 +102.311 +102.312 +102.313 +102.314 +102.315 +102.316 +102.317 +102.318 +102.319 +102.320 +102.321 +102.322 +102.327 +102.328 +102.329 +102.330 +102.331 +102.332 +102.333 +102.334 +102.335 +102.336 +102.337 +102.338 +103.301 +103.302 +103.303 +103.304 +103.305 +103.306 +103.307 +103.308 +103.309 +103.310 +103.311 +103.312 +103.313 +103.314 +103.315 +103.316 +103.317 +103.318 +103.319 +103.320 +103.321 +103.322 +103.327 +103.328 +103.329 +103.330 +103.331 +103.332 +103.333 +103.334 +103.335 +103.336 +103.337 +103.338 +104.301 +104.302 +104.303 +104.304 +104.305 +104.306 +104.307 +104.308 +104.309 +104.310 +104.311 +104.312 +104.313 +104.314 +104.315 +104.316 +104.317 +104.318 +104.319 +104.320 +104.321 +104.322 +104.327 +104.328 +104.329 +104.330 +104.331 +104.332 +104.333 +104.334 +104.335 +104.336 +104.337 +104.338 +105.301 +105.302 +105.303 +105.304 +105.305 +105.306 +105.307 +105.308 +105.309 +105.310 +105.311 +105.312 +105.313 +105.314 +105.315 +105.316 +105.317 +105.318 +105.319 +105.320 +105.321 +105.322 +105.326 +105.327 +105.328 +105.329 +105.330 +105.331 +105.332 +105.333 +105.334 +105.335 +105.336 +105.337 +105.338 +106.300 +106.301 +106.302 +106.303 +106.304 +106.305 +106.306 +106.307 +106.308 +106.309 +106.310 +106.311 +106.312 +106.313 +106.314 +106.315 +106.317 +106.318 +106.319 +106.320 +106.321 +106.326 +106.327 +106.328 +106.329 +106.330 +106.331 +106.332 +106.333 +106.334 +106.335 +106.336 +106.337 +106.338 +107.299 +107.300 +107.301 +107.302 +107.303 +107.304 +107.305 +107.306 +107.307 +107.308 +107.309 +107.310 +107.311 +107.312 +107.313 +107.314 +107.317 +107.318 +107.319 +107.320 +107.321 +107.326 +107.327 +107.328 +107.329 +107.330 +107.331 +107.332 +107.333 +107.334 +107.335 +107.336 +107.337 +108.299 +108.300 +108.301 +108.302 +108.303 +108.304 +108.305 +108.306 +108.307 +108.308 +108.309 +108.310 +108.311 +108.312 +108.313 +108.314 +108.317 +108.318 +108.319 +108.320 +108.321 +108.325 +108.326 +108.327 +108.328 +108.329 +108.330 +108.331 +108.332 +108.333 +108.334 +108.335 +108.336 +108.337 +109.298 +109.299 +109.300 +109.301 +109.302 +109.303 +109.304 +109.305 +109.306 +109.307 +109.308 +109.309 +109.310 +109.311 +109.312 +109.313 +109.317 +109.318 +109.319 +109.320 +109.325 +109.326 +109.327 +109.328 +109.329 +109.330 +109.331 +109.332 +109.333 +109.334 +109.335 +109.336 +109.337 +110.297 +110.298 +110.299 +110.300 +110.301 +110.302 +110.303 +110.304 +110.305 +110.306 +110.307 +110.308 +110.309 +110.310 +110.311 +110.312 +110.317 +110.318 +110.319 +110.320 +110.325 +110.326 +110.327 +110.328 +110.329 +110.330 +110.331 +110.332 +110.333 +110.334 +110.335 +110.336 +110.337 +111.297 +111.298 +111.299 +111.300 +111.301 +111.302 +111.303 +111.304 +111.305 +111.307 +111.308 +111.309 +111.310 +111.311 +111.312 +111.317 +111.318 +111.319 +111.320 +111.325 +111.326 +111.327 +111.328 +111.329 +111.330 +111.331 +111.332 +111.333 +111.334 +111.335 +111.336 +112.297 +112.298 +112.299 +112.300 +112.301 +112.302 +112.303 +112.304 +112.305 +112.307 +112.308 +112.309 +112.310 +112.311 +112.317 +112.318 +112.319 +112.324 +112.325 +112.326 +112.327 +112.328 +112.329 +112.330 +112.331 +112.332 +112.333 +112.334 +112.335 +112.336 +113.296 +113.297 +113.298 +113.299 +113.300 +113.301 +113.302 +113.303 +113.304 +113.307 +113.308 +113.309 +113.310 +113.311 +113.317 +113.318 +113.323 +113.324 +113.325 +113.326 +113.327 +113.328 +113.329 +113.330 +113.331 +113.332 +113.333 +113.334 +113.335 +113.336 +114.296 +114.297 +114.298 +114.299 +114.300 +114.301 +114.302 +114.303 +114.307 +114.308 +114.309 +114.310 +114.317 +114.318 +114.323 +114.324 +114.325 +114.326 +114.327 +114.328 +114.329 +114.330 +114.331 +114.332 +114.333 +114.334 +114.335 +114.336 +115.295 +115.296 +115.297 +115.298 +115.299 +115.300 +115.301 +115.302 +115.303 +115.307 +115.308 +115.309 +115.310 +115.317 +115.323 +115.324 +115.325 +115.326 +115.327 +115.328 +115.329 +115.330 +115.331 +115.332 +115.333 +115.334 +115.335 +115.336 +116.295 +116.296 +116.297 +116.298 +116.299 +116.300 +116.301 +116.302 +116.307 +116.308 +116.309 +116.310 +116.316 +116.317 +116.322 +116.323 +116.324 +116.325 +116.326 +116.327 +116.328 +116.329 +116.330 +116.331 +116.332 +116.333 +116.334 +116.335 +117.294 +117.295 +117.296 +117.297 +117.298 +117.299 +117.300 +117.301 +117.302 +117.307 +117.308 +117.309 +117.316 +117.322 +117.323 +117.324 +117.325 +117.326 +117.327 +117.328 +117.329 +117.330 +117.331 +117.332 +117.333 +117.334 +117.335 +118.293 +118.294 +118.295 +118.296 +118.297 +118.298 +118.299 +118.300 +118.301 +118.302 +118.307 +118.308 +118.309 +118.315 +118.316 +118.322 +118.323 +118.324 +118.325 +118.326 +118.327 +118.328 +118.329 +118.330 +118.331 +118.332 +118.333 +118.334 +118.335 +119.293 +119.294 +119.295 +119.296 +119.297 +119.298 +119.299 +119.300 +119.301 +119.307 +119.308 +119.314 +119.315 +119.316 +119.321 +119.322 +119.323 +119.324 +119.325 +119.326 +119.327 +119.328 +119.329 +119.330 +119.331 +119.332 +119.333 +119.334 +119.335 +120.292 +120.293 +120.294 +120.295 +120.296 +120.297 +120.298 +120.299 +120.300 +120.301 +120.307 +120.308 +120.314 +120.315 +120.316 +120.321 +120.322 +120.323 +120.324 +120.325 +120.326 +120.327 +120.328 +120.329 +120.330 +120.331 +120.332 +120.333 +120.334 +120.335 +121.292 +121.293 +121.294 +121.295 +121.296 +121.297 +121.298 +121.299 +121.300 +121.307 +121.313 +121.314 +121.315 +121.316 +121.321 +121.322 +121.323 +121.324 +121.325 +121.326 +121.327 +121.328 +121.329 +121.330 +121.331 +121.332 +121.333 +121.334 +121.335 +122.291 +122.292 +122.293 +122.294 +122.295 +122.296 +122.297 +122.298 +122.299 +122.313 +122.314 +122.315 +122.321 +122.322 +122.323 +122.324 +122.325 +122.326 +122.327 +122.328 +122.329 +122.330 +122.331 +122.332 +122.333 +122.334 +123.290 +123.291 +123.292 +123.293 +123.294 +123.295 +123.296 +123.297 +123.298 +123.299 +123.312 +123.313 +123.314 +123.315 +123.320 +123.321 +123.322 +123.323 +123.324 +123.325 +123.326 +123.327 +123.328 +123.329 +123.330 +123.331 +123.332 +123.333 +123.334 +124.289 +124.290 +124.291 +124.292 +124.293 +124.294 +124.295 +124.296 +124.297 +124.298 +124.299 +124.312 +124.313 +124.314 +124.320 +124.321 +124.322 +124.323 +124.324 +124.325 +124.326 +124.327 +124.328 +124.329 +124.330 +124.331 +124.332 +124.333 +124.334 +125.289 +125.290 +125.291 +125.292 +125.293 +125.294 +125.295 +125.296 +125.297 +125.298 +125.299 +125.311 +125.312 +125.313 +125.314 +125.319 +125.320 +125.321 +125.322 +125.323 +125.324 +125.325 +125.326 +125.327 +125.328 +125.329 +125.330 +125.331 +125.332 +125.333 +125.334 +126.288 +126.289 +126.290 +126.291 +126.292 +126.293 +126.294 +126.295 +126.296 +126.297 +126.298 +126.299 +126.311 +126.312 +126.313 +126.314 +126.319 +126.320 +126.321 +126.322 +126.323 +126.324 +126.325 +126.326 +126.327 +126.328 +126.329 +126.330 +126.331 +126.332 +126.333 +126.334 +127.287 +127.288 +127.289 +127.290 +127.291 +127.292 +127.293 +127.294 +127.295 +127.296 +127.297 +127.298 +127.299 +127.310 +127.311 +127.312 +127.313 +127.319 +127.320 +127.321 +127.322 +127.323 +127.324 +127.325 +127.326 +127.327 +127.328 +127.329 +127.330 +127.331 +127.332 +127.333 +128.287 +128.288 +128.289 +128.290 +128.291 +128.292 +128.293 +128.294 +128.295 +128.296 +128.297 +128.298 +128.310 +128.311 +128.312 +128.313 +128.318 +128.319 +128.320 +128.321 +128.322 +128.323 +128.324 +128.325 +128.326 +128.327 +128.328 +128.329 +128.330 +128.331 +128.332 +128.333 +129.286 +129.287 +129.288 +129.289 +129.290 +129.291 +129.292 +129.293 +129.294 +129.295 +129.296 +129.297 +129.298 +129.299 +129.309 +129.310 +129.311 +129.312 +129.318 +129.319 +129.320 +129.321 +129.322 +129.323 +129.324 +129.325 +129.326 +129.327 +129.328 +129.329 +129.330 +129.331 +129.332 +129.333 +130.285 +130.286 +130.287 +130.288 +130.289 +130.290 +130.291 +130.292 +130.293 +130.294 +130.295 +130.296 +130.297 +130.298 +130.299 +130.309 +130.310 +130.311 +130.312 +130.317 +130.318 +130.319 +130.320 +130.321 +130.322 +130.323 +130.324 +130.325 +130.326 +130.327 +130.328 +130.329 +130.330 +130.331 +130.332 +130.333 +131.285 +131.286 +131.287 +131.288 +131.289 +131.290 +131.291 +131.292 +131.293 +131.294 +131.295 +131.296 +131.297 +131.298 +131.299 +131.308 +131.309 +131.310 +131.311 +131.312 +131.317 +131.318 +131.319 +131.320 +131.321 +131.322 +131.323 +131.324 +131.325 +131.326 +131.327 +131.328 +131.329 +131.330 +131.331 +131.332 +131.333 +132.285 +132.286 +132.287 +132.288 +132.289 +132.290 +132.291 +132.292 +132.293 +132.294 +132.295 +132.296 +132.297 +132.298 +132.299 +132.308 +132.309 +132.310 +132.311 +132.312 +132.317 +132.318 +132.319 +132.320 +132.321 +132.322 +132.323 +132.324 +132.325 +132.326 +132.327 +132.328 +132.329 +132.330 +132.331 +132.332 +133.284 +133.285 +133.286 +133.287 +133.288 +133.289 +133.290 +133.291 +133.292 +133.293 +133.294 +133.295 +133.296 +133.297 +133.298 +133.299 +133.307 +133.308 +133.309 +133.310 +133.311 +133.316 +133.317 +133.318 +133.319 +133.320 +133.321 +133.322 +133.323 +133.324 +133.325 +133.326 +133.327 +133.328 +133.329 +133.330 +133.331 +133.332 +134.283 +134.284 +134.285 +134.286 +134.287 +134.288 +134.289 +134.290 +134.291 +134.292 +134.293 +134.294 +134.295 +134.296 +134.297 +134.298 +134.299 +134.307 +134.308 +134.309 +134.310 +134.311 +134.316 +134.317 +134.318 +134.319 +134.320 +134.321 +134.322 +134.323 +134.324 +134.325 +134.326 +134.327 +134.328 +134.329 +134.330 +134.331 +134.332 +135.283 +135.284 +135.285 +135.286 +135.287 +135.288 +135.289 +135.290 +135.291 +135.292 +135.293 +135.294 +135.295 +135.296 +135.297 +135.298 +135.299 +135.306 +135.307 +135.308 +135.309 +135.310 +135.315 +135.316 +135.317 +135.318 +135.319 +135.320 +135.321 +135.322 +135.323 +135.324 +135.325 +135.326 +135.327 +135.328 +135.329 +135.330 +135.331 +135.332 +136.282 +136.283 +136.284 +136.285 +136.286 +136.287 +136.288 +136.289 +136.290 +136.291 +136.292 +136.293 +136.294 +136.295 +136.296 +136.297 +136.298 +136.299 +136.306 +136.307 +136.308 +136.309 +136.310 +136.315 +136.316 +136.317 +136.318 +136.319 +136.320 +136.321 +136.322 +136.323 +136.324 +136.325 +136.326 +136.327 +136.328 +136.329 +136.330 +136.331 +136.332 +137.282 +137.283 +137.284 +137.285 +137.286 +137.287 +137.288 +137.289 +137.290 +137.291 +137.292 +137.293 +137.294 +137.295 +137.296 +137.297 +137.298 +137.299 +137.305 +137.306 +137.307 +137.308 +137.309 +137.310 +137.315 +137.316 +137.317 +137.318 +137.319 +137.320 +137.321 +137.322 +137.323 +137.324 +137.325 +137.326 +137.327 +137.328 +137.329 +137.330 +137.331 +138.281 +138.282 +138.283 +138.284 +138.285 +138.286 +138.287 +138.288 +138.289 +138.290 +138.291 +138.292 +138.293 +138.294 +138.295 +138.296 +138.297 +138.298 +138.304 +138.305 +138.306 +138.307 +138.308 +138.309 +138.314 +138.315 +138.316 +138.317 +138.318 +138.319 +138.320 +138.321 +138.322 +138.323 +138.324 +138.325 +138.326 +138.327 +138.328 +138.329 +138.330 +138.331 +139.281 +139.282 +139.283 +139.284 +139.285 +139.286 +139.287 +139.288 +139.289 +139.290 +139.291 +139.292 +139.293 +139.294 +139.295 +139.296 +139.297 +139.298 +139.304 +139.305 +139.306 +139.307 +139.308 +139.309 +139.314 +139.315 +139.316 +139.317 +139.318 +139.319 +139.320 +139.321 +139.322 +139.323 +139.324 +139.325 +139.326 +139.327 +139.328 +139.329 +139.330 +139.331 +140.280 +140.281 +140.282 +140.283 +140.284 +140.285 +140.286 +140.287 +140.288 +140.289 +140.290 +140.291 +140.292 +140.293 +140.294 +140.295 +140.296 +140.297 +140.303 +140.304 +140.305 +140.306 +140.307 +140.308 +140.313 +140.314 +140.315 +140.316 +140.317 +140.318 +140.319 +140.320 +140.321 +140.322 +140.323 +140.324 +140.325 +140.326 +140.327 +140.328 +140.329 +140.330 +140.331 +141.280 +141.281 +141.282 +141.283 +141.284 +141.285 +141.286 +141.287 +141.288 +141.289 +141.290 +141.291 +141.292 +141.293 +141.294 +141.295 +141.296 +141.297 +141.303 +141.304 +141.305 +141.306 +141.307 +141.308 +141.313 +141.314 +141.315 +141.316 +141.317 +141.318 +141.319 +141.320 +141.321 +141.322 +141.323 +141.324 +141.325 +141.326 +141.327 +141.328 +141.329 +141.330 +141.331 +142.279 +142.280 +142.281 +142.282 +142.283 +142.284 +142.285 +142.286 +142.287 +142.288 +142.289 +142.290 +142.291 +142.292 +142.293 +142.294 +142.295 +142.296 +142.302 +142.303 +142.304 +142.305 +142.306 +142.307 +142.308 +142.313 +142.314 +142.315 +142.316 +142.317 +142.318 +142.319 +142.320 +142.321 +142.322 +142.323 +142.324 +142.325 +142.326 +142.327 +142.328 +142.329 +142.330 +143.278 +143.279 +143.280 +143.281 +143.282 +143.283 +143.284 +143.285 +143.286 +143.287 +143.288 +143.289 +143.290 +143.291 +143.292 +143.293 +143.294 +143.295 +143.302 +143.303 +143.304 +143.305 +143.306 +143.307 +143.312 +143.313 +143.314 +143.315 +143.316 +143.317 +143.318 +143.319 +143.320 +143.321 +143.322 +143.323 +143.324 +143.325 +143.326 +143.327 +143.328 +143.329 +143.330 +144.278 +144.279 +144.280 +144.281 +144.282 +144.283 +144.284 +144.285 +144.286 +144.287 +144.288 +144.289 +144.290 +144.291 +144.292 +144.293 +144.294 +144.295 +144.301 +144.302 +144.303 +144.304 +144.305 +144.306 +144.307 +144.312 +144.313 +144.314 +144.315 +144.316 +144.317 +144.318 +144.319 +144.320 +144.321 +144.322 +144.323 +144.324 +144.325 +144.326 +144.327 +144.328 +144.329 +144.330 +145.277 +145.278 +145.279 +145.280 +145.281 +145.282 +145.283 +145.284 +145.285 +145.286 +145.287 +145.288 +145.289 +145.290 +145.291 +145.292 +145.293 +145.294 +145.301 +145.302 +145.303 +145.304 +145.305 +145.306 +145.311 +145.312 +145.313 +145.314 +145.315 +145.316 +145.317 +145.318 +145.319 +145.320 +145.321 +145.322 +145.323 +145.324 +145.325 +145.326 +145.327 +145.328 +145.329 +145.330 +146.277 +146.278 +146.279 +146.280 +146.281 +146.282 +146.283 +146.284 +146.285 +146.286 +146.287 +146.288 +146.289 +146.290 +146.291 +146.292 +146.293 +146.300 +146.301 +146.302 +146.303 +146.304 +146.305 +146.306 +146.311 +146.312 +146.313 +146.314 +146.315 +146.316 +146.317 +146.318 +146.319 +146.320 +146.321 +146.322 +146.323 +146.324 +146.325 +146.326 +146.327 +146.328 +146.329 +146.330 +147.276 +147.277 +147.278 +147.279 +147.280 +147.281 +147.282 +147.283 +147.284 +147.285 +147.286 +147.287 +147.288 +147.289 +147.290 +147.291 +147.292 +147.300 +147.301 +147.302 +147.303 +147.304 +147.305 +147.306 +147.311 +147.312 +147.313 +147.314 +147.315 +147.316 +147.317 +147.318 +147.319 +147.320 +147.321 +147.322 +147.323 +147.324 +147.325 +147.326 +147.327 +147.328 +147.329 +147.330 +148.276 +148.277 +148.278 +148.279 +148.280 +148.281 +148.282 +148.283 +148.284 +148.285 +148.286 +148.287 +148.288 +148.289 +148.290 +148.291 +148.292 +148.299 +148.300 +148.301 +148.302 +148.303 +148.304 +148.305 +148.310 +148.311 +148.312 +148.313 +148.314 +148.315 +148.316 +148.317 +148.318 +148.319 +148.320 +148.321 +148.322 +148.323 +148.324 +148.325 +148.326 +148.327 +148.328 +148.329 +149.276 +149.277 +149.278 +149.279 +149.280 +149.281 +149.282 +149.283 +149.284 +149.285 +149.286 +149.287 +149.288 +149.289 +149.290 +149.291 +149.292 +149.299 +149.300 +149.301 +149.302 +149.303 +149.304 +149.310 +149.311 +149.312 +149.313 +149.314 +149.315 +149.316 +149.317 +149.318 +149.319 +149.320 +149.321 +149.322 +149.323 +149.324 +149.325 +149.326 +149.327 +149.328 +149.329 +150.275 +150.276 +150.277 +150.278 +150.279 +150.280 +150.281 +150.282 +150.283 +150.284 +150.285 +150.286 +150.287 +150.288 +150.289 +150.290 +150.291 +150.298 +150.299 +150.300 +150.301 +150.302 +150.303 +150.304 +150.310 +150.311 +150.312 +150.313 +150.314 +150.315 +150.316 +150.317 +150.318 +150.319 +150.320 +150.321 +150.322 +150.323 +150.324 +150.325 +150.326 +150.327 +150.328 +150.329 +151.274 +151.275 +151.276 +151.277 +151.278 +151.279 +151.280 +151.281 +151.282 +151.283 +151.284 +151.285 +151.286 +151.287 +151.288 +151.289 +151.290 +151.291 +151.298 +151.299 +151.300 +151.301 +151.302 +151.303 +151.304 +151.309 +151.310 +151.311 +151.312 +151.313 +151.314 +151.315 +151.316 +151.317 +151.318 +151.319 +151.320 +151.321 +151.322 +151.323 +151.324 +151.325 +151.326 +151.327 +151.328 +151.329 +152.273 +152.274 +152.275 +152.276 +152.277 +152.278 +152.279 +152.280 +152.281 +152.282 +152.283 +152.284 +152.285 +152.286 +152.287 +152.288 +152.289 +152.290 +152.297 +152.298 +152.299 +152.300 +152.301 +152.302 +152.303 +152.309 +152.310 +152.311 +152.312 +152.313 +152.314 +152.315 +152.316 +152.317 +152.318 +152.319 +152.320 +152.321 +152.322 +152.323 +152.324 +152.325 +152.326 +152.327 +152.328 +152.329 +153.273 +153.274 +153.275 +153.276 +153.277 +153.278 +153.279 +153.280 +153.281 +153.282 +153.283 +153.284 +153.285 +153.286 +153.287 +153.288 +153.289 +153.297 +153.298 +153.299 +153.300 +153.301 +153.302 +153.303 +153.309 +153.310 +153.311 +153.312 +153.313 +153.314 +153.315 +153.316 +153.317 +153.318 +153.319 +153.320 +153.321 +153.322 +153.323 +153.324 +153.325 +153.326 +153.327 +153.328 +154.272 +154.273 +154.274 +154.275 +154.276 +154.277 +154.278 +154.279 +154.280 +154.281 +154.282 +154.283 +154.284 +154.285 +154.286 +154.287 +154.288 +154.297 +154.298 +154.299 +154.300 +154.301 +154.302 +154.308 +154.309 +154.310 +154.311 +154.312 +154.313 +154.314 +154.315 +154.316 +154.317 +154.318 +154.319 +154.320 +154.321 +154.322 +154.323 +154.324 +154.325 +154.326 +154.327 +154.328 +155.271 +155.272 +155.273 +155.274 +155.275 +155.276 +155.277 +155.278 +155.279 +155.280 +155.281 +155.282 +155.283 +155.284 +155.285 +155.286 +155.287 +155.288 +155.297 +155.298 +155.299 +155.300 +155.301 +155.302 +155.308 +155.309 +155.310 +155.311 +155.312 +155.313 +155.314 +155.315 +155.316 +155.317 +155.318 +155.319 +155.320 +155.321 +155.322 +155.323 +155.324 +155.325 +155.326 +155.327 +155.328 +156.270 +156.271 +156.272 +156.273 +156.274 +156.275 +156.276 +156.277 +156.278 +156.279 +156.280 +156.281 +156.282 +156.283 +156.284 +156.285 +156.286 +156.287 +156.288 +156.297 +156.298 +156.299 +156.300 +156.301 +156.307 +156.308 +156.309 +156.310 +156.311 +156.312 +156.313 +156.314 +156.315 +156.316 +156.317 +156.318 +156.319 +156.320 +156.321 +156.322 +156.323 +156.324 +156.325 +156.326 +156.327 +156.328 +157.270 +157.271 +157.272 +157.273 +157.274 +157.275 +157.276 +157.277 +157.278 +157.279 +157.280 +157.281 +157.282 +157.283 +157.284 +157.285 +157.286 +157.287 +157.288 +157.297 +157.298 +157.299 +157.300 +157.307 +157.308 +157.309 +157.310 +157.311 +157.312 +157.313 +157.314 +157.315 +157.316 +157.317 +157.318 +157.319 +157.320 +157.321 +157.322 +157.323 +157.324 +157.325 +157.326 +157.327 +158.270 +158.271 +158.272 +158.273 +158.274 +158.275 +158.276 +158.277 +158.278 +158.279 +158.280 +158.281 +158.282 +158.283 +158.284 +158.285 +158.286 +158.287 +158.288 +158.297 +158.298 +158.299 +158.300 +158.307 +158.308 +158.309 +158.310 +158.311 +158.312 +158.313 +158.314 +158.315 +158.316 +158.317 +158.318 +158.319 +158.320 +158.321 +158.322 +158.323 +158.324 +158.325 +158.326 +158.327 +159.269 +159.270 +159.271 +159.272 +159.273 +159.274 +159.275 +159.276 +159.277 +159.278 +159.279 +159.280 +159.281 +159.282 +159.283 +159.284 +159.285 +159.286 +159.287 +159.288 +159.297 +159.298 +159.299 +159.300 +159.307 +159.308 +159.309 +159.310 +159.311 +159.312 +159.313 +159.314 +159.315 +159.316 +159.317 +159.318 +159.319 +159.320 +159.321 +159.322 +159.323 +159.324 +159.325 +159.326 +159.327 +160.268 +160.269 +160.270 +160.271 +160.272 +160.273 +160.274 +160.275 +160.276 +160.277 +160.278 +160.279 +160.280 +160.281 +160.282 +160.283 +160.284 +160.285 +160.286 +160.287 +160.288 +160.297 +160.298 +160.299 +160.300 +160.307 +160.308 +160.309 +160.310 +160.311 +160.312 +160.313 +160.314 +160.315 +160.316 +160.317 +160.318 +160.319 +160.320 +160.321 +160.322 +160.323 +160.324 +160.325 +160.326 +160.327 +161.267 +161.268 +161.269 +161.270 +161.271 +161.272 +161.273 +161.274 +161.275 +161.276 +161.277 +161.278 +161.279 +161.280 +161.281 +161.282 +161.283 +161.284 +161.285 +161.286 +161.287 +161.288 +161.297 +161.298 +161.299 +161.307 +161.308 +161.309 +161.310 +161.311 +161.312 +161.313 +161.314 +161.315 +161.316 +161.317 +161.318 +161.319 +161.320 +161.321 +161.322 +161.323 +161.324 +161.325 +161.326 +161.327 +162.266 +162.267 +162.268 +162.269 +162.270 +162.271 +162.272 +162.273 +162.274 +162.275 +162.276 +162.277 +162.278 +162.279 +162.280 +162.281 +162.282 +162.283 +162.284 +162.285 +162.286 +162.287 +162.288 +162.297 +162.298 +162.299 +162.307 +162.308 +162.309 +162.310 +162.311 +162.312 +162.313 +162.314 +162.315 +162.316 +162.317 +162.318 +162.319 +162.320 +162.321 +162.322 +162.323 +162.324 +162.325 +162.326 +163.266 +163.267 +163.268 +163.269 +163.270 +163.271 +163.272 +163.273 +163.274 +163.275 +163.276 +163.277 +163.278 +163.279 +163.280 +163.281 +163.282 +163.283 +163.284 +163.285 +163.286 +163.287 +163.288 +163.297 +163.298 +163.299 +163.307 +163.308 +163.309 +163.310 +163.311 +163.312 +163.313 +163.314 +163.315 +163.316 +163.317 +163.318 +163.319 +163.320 +163.321 +163.322 +163.323 +163.324 +163.325 +163.326 +164.266 +164.267 +164.268 +164.269 +164.270 +164.271 +164.272 +164.273 +164.274 +164.275 +164.276 +164.277 +164.278 +164.279 +164.280 +164.281 +164.282 +164.283 +164.284 +164.285 +164.286 +164.287 +164.288 +164.297 +164.298 +164.307 +164.308 +164.309 +164.310 +164.311 +164.312 +164.313 +164.314 +164.315 +164.316 +164.317 +164.318 +164.319 +164.320 +164.321 +164.322 +164.323 +164.324 +164.325 +164.326 +165.265 +165.266 +165.267 +165.268 +165.269 +165.270 +165.271 +165.272 +165.273 +165.274 +165.275 +165.276 +165.277 +165.278 +165.279 +165.280 +165.281 +165.282 +165.283 +165.284 +165.285 +165.286 +165.287 +165.288 +165.297 +165.298 +165.307 +165.308 +165.309 +165.310 +165.311 +165.312 +165.313 +165.314 +165.315 +165.316 +165.317 +165.318 +165.319 +165.320 +165.321 +165.322 +165.323 +165.324 +165.325 +165.326 +166.264 +166.265 +166.266 +166.267 +166.268 +166.269 +166.270 +166.271 +166.272 +166.273 +166.274 +166.275 +166.276 +166.277 +166.278 +166.279 +166.280 +166.281 +166.282 +166.283 +166.284 +166.285 +166.286 +166.287 +166.288 +166.297 +166.307 +166.308 +166.309 +166.310 +166.311 +166.312 +166.313 +166.314 +166.315 +166.316 +166.317 +166.318 +166.319 +166.320 +166.321 +166.322 +166.323 +166.324 +166.325 +166.326 +167.263 +167.264 +167.265 +167.266 +167.267 +167.268 +167.269 +167.270 +167.271 +167.272 +167.273 +167.274 +167.275 +167.276 +167.277 +167.278 +167.279 +167.280 +167.281 +167.282 +167.283 +167.284 +167.285 +167.286 +167.287 +167.288 +167.307 +167.308 +167.309 +167.310 +167.311 +167.312 +167.313 +167.314 +167.315 +167.316 +167.317 +167.318 +167.319 +167.320 +167.321 +167.322 +167.323 +167.324 +167.325 +167.326 +168.263 +168.264 +168.265 +168.266 +168.267 +168.268 +168.269 +168.270 +168.271 +168.272 +168.273 +168.274 +168.275 +168.276 +168.277 +168.278 +168.279 +168.280 +168.281 +168.282 +168.283 +168.284 +168.285 +168.286 +168.287 +168.307 +168.308 +168.309 +168.310 +168.311 +168.312 +168.313 +168.314 +168.315 +168.316 +168.317 +168.318 +168.319 +168.320 +168.321 +168.322 +168.323 +168.324 +168.325 +169.262 +169.263 +169.264 +169.265 +169.266 +169.267 +169.268 +169.269 +169.270 +169.271 +169.272 +169.273 +169.274 +169.275 +169.276 +169.277 +169.278 +169.279 +169.280 +169.281 +169.282 +169.283 +169.284 +169.285 +169.286 +169.287 +169.307 +169.308 +169.309 +169.310 +169.311 +169.312 +169.313 +169.314 +169.315 +169.316 +169.317 +169.318 +169.319 +169.320 +169.321 +169.322 +169.323 +169.324 +169.325 +170.262 +170.263 +170.264 +170.265 +170.266 +170.267 +170.268 +170.269 +170.270 +170.271 +170.272 +170.273 +170.274 +170.275 +170.276 +170.277 +170.278 +170.279 +170.280 +170.281 +170.282 +170.283 +170.284 +170.285 +170.286 +170.287 +170.307 +170.308 +170.309 +170.310 +170.311 +170.312 +170.313 +170.314 +170.315 +170.316 +170.317 +170.318 +170.319 +170.320 +170.321 +170.322 +170.323 +170.324 +170.325 +171.261 +171.262 +171.263 +171.264 +171.265 +171.266 +171.267 +171.268 +171.269 +171.270 +171.271 +171.272 +171.273 +171.274 +171.275 +171.276 +171.277 +171.278 +171.279 +171.280 +171.281 +171.282 +171.283 +171.284 +171.285 +171.286 +171.307 +171.308 +171.309 +171.310 +171.311 +171.312 +171.313 +171.314 +171.315 +171.316 +171.317 +171.318 +171.319 +171.320 +171.321 +171.322 +171.323 +171.324 +171.325 +172.260 +172.261 +172.262 +172.263 +172.264 +172.265 +172.266 +172.267 +172.268 +172.269 +172.270 +172.271 +172.272 +172.273 +172.274 +172.275 +172.276 +172.277 +172.278 +172.279 +172.280 +172.281 +172.282 +172.283 +172.284 +172.285 +172.286 +172.306 +172.307 +172.308 +172.309 +172.310 +172.311 +172.312 +172.313 +172.314 +172.315 +172.316 +172.317 +172.318 +172.319 +172.320 +172.321 +172.322 +172.323 +172.324 +172.325 +173.259 +173.260 +173.261 +173.262 +173.263 +173.264 +173.265 +173.266 +173.267 +173.268 +173.269 +173.270 +173.271 +173.272 +173.273 +173.274 +173.275 +173.276 +173.277 +173.278 +173.279 +173.280 +173.281 +173.282 +173.283 +173.284 +173.285 +173.306 +173.307 +173.308 +173.309 +173.310 +173.311 +173.312 +173.313 +173.314 +173.315 +173.316 +173.317 +173.318 +173.319 +173.320 +173.321 +173.322 +173.323 +173.324 +174.259 +174.260 +174.261 +174.262 +174.263 +174.264 +174.265 +174.266 +174.267 +174.268 +174.269 +174.270 +174.271 +174.272 +174.273 +174.274 +174.275 +174.276 +174.277 +174.278 +174.279 +174.280 +174.281 +174.282 +174.283 +174.284 +174.285 +174.294 +174.306 +174.307 +174.308 +174.309 +174.310 +174.311 +174.312 +174.313 +174.314 +174.315 +174.316 +174.317 +174.318 +174.319 +174.320 +174.321 +174.322 +174.323 +174.324 +175.258 +175.259 +175.260 +175.261 +175.262 +175.263 +175.264 +175.265 +175.266 +175.267 +175.268 +175.269 +175.270 +175.271 +175.272 +175.273 +175.274 +175.275 +175.276 +175.277 +175.278 +175.279 +175.280 +175.281 +175.282 +175.283 +175.284 +175.294 +175.305 +175.306 +175.307 +175.308 +175.309 +175.310 +175.311 +175.312 +175.313 +175.314 +175.315 +175.316 +175.317 +175.318 +175.319 +175.320 +175.321 +175.322 +175.323 +175.324 +176.258 +176.259 +176.260 +176.261 +176.262 +176.263 +176.264 +176.265 +176.266 +176.267 +176.268 +176.269 +176.270 +176.271 +176.272 +176.273 +176.274 +176.275 +176.276 +176.277 +176.278 +176.279 +176.280 +176.281 +176.282 +176.283 +176.291 +176.293 +176.294 +176.305 +176.306 +176.307 +176.308 +176.309 +176.310 +176.311 +176.312 +176.313 +176.314 +176.315 +176.316 +176.317 +176.318 +176.319 +176.320 +176.321 +176.322 +176.323 +176.324 +177.257 +177.258 +177.259 +177.260 +177.261 +177.262 +177.263 +177.264 +177.265 +177.266 +177.267 +177.268 +177.269 +177.270 +177.271 +177.272 +177.273 +177.274 +177.275 +177.276 +177.277 +177.278 +177.279 +177.280 +177.281 +177.282 +177.283 +177.290 +177.291 +177.293 +177.294 +177.305 +177.306 +177.307 +177.308 +177.309 +177.310 +177.311 +177.312 +177.313 +177.314 +177.315 +177.316 +177.317 +177.318 +177.319 +177.320 +177.321 +177.322 +177.323 +177.324 +178.257 +178.258 +178.259 +178.260 +178.261 +178.262 +178.263 +178.264 +178.265 +178.266 +178.267 +178.268 +178.269 +178.270 +178.271 +178.272 +178.273 +178.274 +178.275 +178.276 +178.277 +178.278 +178.279 +178.280 +178.281 +178.282 +178.290 +178.291 +178.292 +178.293 +178.294 +178.305 +178.306 +178.307 +178.308 +178.309 +178.310 +178.311 +178.312 +178.313 +178.314 +178.315 +178.316 +178.317 +178.318 +178.319 +178.320 +178.321 +178.322 +178.323 +179.256 +179.257 +179.258 +179.259 +179.260 +179.261 +179.262 +179.263 +179.264 +179.265 +179.266 +179.267 +179.268 +179.269 +179.270 +179.271 +179.272 +179.273 +179.274 +179.275 +179.276 +179.277 +179.278 +179.279 +179.280 +179.281 +179.282 +179.289 +179.290 +179.291 +179.292 +179.293 +179.294 +179.305 +179.306 +179.307 +179.308 +179.309 +179.310 +179.311 +179.312 +179.313 +179.314 +179.315 +179.316 +179.317 +179.318 +179.319 +179.320 +179.321 +179.322 +179.323 +180.255 +180.256 +180.257 +180.258 +180.259 +180.260 +180.261 +180.262 +180.263 +180.264 +180.265 +180.266 +180.267 +180.268 +180.269 +180.270 +180.271 +180.272 +180.273 +180.274 +180.275 +180.276 +180.277 +180.278 +180.279 +180.280 +180.281 +180.288 +180.289 +180.290 +180.291 +180.292 +180.293 +180.294 +180.305 +180.306 +180.307 +180.308 +180.309 +180.310 +180.311 +180.312 +180.313 +180.314 +180.315 +180.316 +180.317 +180.318 +180.319 +180.320 +180.321 +180.322 +180.323 +181.254 +181.255 +181.256 +181.257 +181.258 +181.259 +181.260 +181.261 +181.262 +181.263 +181.264 +181.265 +181.266 +181.267 +181.268 +181.269 +181.270 +181.271 +181.272 +181.273 +181.274 +181.275 +181.276 +181.277 +181.278 +181.279 +181.280 +181.281 +181.287 +181.288 +181.289 +181.290 +181.291 +181.292 +181.293 +181.294 +181.305 +181.306 +181.307 +181.308 +181.309 +181.310 +181.311 +181.312 +181.313 +181.314 +181.315 +181.316 +181.317 +181.318 +181.319 +181.320 +181.321 +181.322 +181.323 +182.253 +182.254 +182.255 +182.256 +182.257 +182.258 +182.259 +182.260 +182.261 +182.262 +182.263 +182.264 +182.265 +182.266 +182.267 +182.268 +182.269 +182.270 +182.271 +182.272 +182.273 +182.274 +182.275 +182.276 +182.277 +182.278 +182.279 +182.280 +182.287 +182.288 +182.289 +182.290 +182.291 +182.292 +182.293 +182.294 +182.305 +182.306 +182.307 +182.308 +182.309 +182.310 +182.311 +182.312 +182.313 +182.314 +182.315 +182.316 +182.317 +182.318 +182.319 +182.320 +182.321 +182.322 +182.323 +183.252 +183.253 +183.254 +183.255 +183.256 +183.257 +183.258 +183.259 +183.260 +183.261 +183.262 +183.263 +183.264 +183.265 +183.266 +183.267 +183.268 +183.269 +183.270 +183.271 +183.272 +183.273 +183.274 +183.275 +183.276 +183.277 +183.278 +183.279 +183.287 +183.288 +183.289 +183.290 +183.291 +183.292 +183.293 +183.294 +183.305 +183.306 +183.307 +183.308 +183.309 +183.310 +183.311 +183.312 +183.313 +183.314 +183.315 +183.316 +183.317 +183.318 +183.319 +183.320 +183.321 +183.322 +184.252 +184.253 +184.254 +184.255 +184.256 +184.257 +184.258 +184.259 +184.260 +184.261 +184.262 +184.263 +184.264 +184.265 +184.266 +184.267 +184.268 +184.269 +184.270 +184.271 +184.272 +184.273 +184.274 +184.275 +184.276 +184.277 +184.278 +184.279 +184.286 +184.287 +184.288 +184.289 +184.290 +184.292 +184.293 +184.294 +184.305 +184.306 +184.307 +184.308 +184.309 +184.310 +184.311 +184.312 +184.313 +184.314 +184.315 +184.316 +184.317 +184.318 +184.319 +184.320 +184.321 +184.322 +185.251 +185.252 +185.253 +185.254 +185.255 +185.256 +185.257 +185.258 +185.259 +185.260 +185.261 +185.262 +185.263 +185.264 +185.265 +185.266 +185.267 +185.268 +185.269 +185.270 +185.271 +185.272 +185.273 +185.274 +185.275 +185.276 +185.277 +185.278 +185.279 +185.286 +185.287 +185.288 +185.289 +185.290 +185.292 +185.293 +185.294 +185.305 +185.306 +185.307 +185.308 +185.309 +185.310 +185.311 +185.312 +185.313 +185.314 +185.315 +185.316 +185.317 +185.318 +185.319 +185.320 +185.321 +185.322 +186.251 +186.252 +186.253 +186.254 +186.255 +186.256 +186.257 +186.258 +186.259 +186.260 +186.261 +186.262 +186.263 +186.264 +186.265 +186.266 +186.267 +186.268 +186.269 +186.270 +186.271 +186.272 +186.273 +186.274 +186.275 +186.276 +186.277 +186.278 +186.279 +186.285 +186.286 +186.287 +186.288 +186.289 +186.290 +186.292 +186.293 +186.294 +186.305 +186.306 +186.307 +186.308 +186.309 +186.310 +186.311 +186.312 +186.313 +186.314 +186.315 +186.316 +186.317 +186.318 +186.319 +186.320 +186.321 +186.322 +187.250 +187.251 +187.252 +187.253 +187.254 +187.255 +187.256 +187.257 +187.258 +187.259 +187.260 +187.261 +187.262 +187.263 +187.264 +187.265 +187.266 +187.267 +187.268 +187.269 +187.270 +187.271 +187.272 +187.273 +187.274 +187.275 +187.276 +187.277 +187.278 +187.279 +187.284 +187.285 +187.286 +187.287 +187.288 +187.289 +187.290 +187.292 +187.293 +187.294 +187.305 +187.306 +187.307 +187.308 +187.309 +187.310 +187.311 +187.312 +187.313 +187.314 +187.315 +187.316 +187.317 +187.318 +187.319 +187.320 +187.321 +187.322 +188.250 +188.251 +188.252 +188.253 +188.254 +188.255 +188.256 +188.257 +188.258 +188.259 +188.260 +188.261 +188.262 +188.263 +188.264 +188.265 +188.266 +188.267 +188.268 +188.269 +188.270 +188.271 +188.272 +188.273 +188.274 +188.275 +188.276 +188.277 +188.278 +188.279 +188.284 +188.285 +188.286 +188.287 +188.288 +188.289 +188.290 +188.292 +188.293 +188.305 +188.306 +188.307 +188.308 +188.309 +188.310 +188.311 +188.312 +188.313 +188.314 +188.315 +188.316 +188.317 +188.318 +188.319 +188.320 +188.321 +189.250 +189.251 +189.252 +189.253 +189.254 +189.255 +189.256 +189.257 +189.258 +189.259 +189.260 +189.261 +189.262 +189.263 +189.264 +189.265 +189.266 +189.267 +189.268 +189.269 +189.270 +189.271 +189.272 +189.273 +189.274 +189.275 +189.276 +189.277 +189.278 +189.279 +189.283 +189.284 +189.285 +189.286 +189.287 +189.288 +189.289 +189.290 +189.292 +189.293 +189.305 +189.306 +189.307 +189.308 +189.309 +189.310 +189.311 +189.312 +189.313 +189.314 +189.315 +189.316 +189.317 +189.318 +189.319 +189.320 +189.321 +190.249 +190.250 +190.251 +190.252 +190.253 +190.254 +190.255 +190.256 +190.257 +190.258 +190.259 +190.260 +190.261 +190.262 +190.263 +190.264 +190.265 +190.266 +190.267 +190.268 +190.269 +190.270 +190.271 +190.272 +190.273 +190.274 +190.275 +190.276 +190.277 +190.278 +190.279 +190.283 +190.284 +190.285 +190.286 +190.287 +190.288 +190.289 +190.290 +190.292 +190.293 +190.304 +190.305 +190.306 +190.307 +190.308 +190.309 +190.310 +190.311 +190.312 +190.313 +190.314 +190.315 +190.316 +190.317 +190.318 +190.319 +190.320 +190.321 +191.248 +191.249 +191.250 +191.251 +191.252 +191.253 +191.254 +191.255 +191.256 +191.257 +191.258 +191.259 +191.260 +191.261 +191.262 +191.263 +191.264 +191.265 +191.266 +191.267 +191.268 +191.269 +191.270 +191.271 +191.272 +191.273 +191.274 +191.275 +191.276 +191.277 +191.278 +191.279 +191.282 +191.283 +191.284 +191.285 +191.286 +191.287 +191.288 +191.289 +191.290 +191.292 +191.304 +191.305 +191.306 +191.307 +191.308 +191.309 +191.310 +191.311 +191.312 +191.313 +191.314 +191.315 +191.316 +191.317 +191.318 +191.319 +191.320 +191.321 +192.248 +192.249 +192.250 +192.251 +192.252 +192.253 +192.254 +192.255 +192.256 +192.257 +192.258 +192.259 +192.260 +192.261 +192.262 +192.263 +192.264 +192.265 +192.266 +192.267 +192.268 +192.269 +192.270 +192.271 +192.272 +192.273 +192.274 +192.275 +192.276 +192.277 +192.278 +192.279 +192.282 +192.283 +192.284 +192.285 +192.286 +192.287 +192.288 +192.289 +192.290 +192.292 +192.303 +192.304 +192.305 +192.306 +192.307 +192.308 +192.309 +192.310 +192.311 +192.312 +192.313 +192.314 +192.315 +192.316 +192.317 +192.318 +192.319 +192.320 +192.321 +193.247 +193.248 +193.249 +193.250 +193.251 +193.252 +193.253 +193.254 +193.255 +193.256 +193.257 +193.258 +193.259 +193.260 +193.261 +193.262 +193.263 +193.264 +193.265 +193.266 +193.267 +193.268 +193.269 +193.270 +193.271 +193.272 +193.273 +193.274 +193.275 +193.276 +193.277 +193.278 +193.279 +193.281 +193.282 +193.283 +193.284 +193.285 +193.286 +193.287 +193.288 +193.289 +193.290 +193.303 +193.304 +193.305 +193.306 +193.307 +193.308 +193.309 +193.310 +193.311 +193.312 +193.313 +193.314 +193.315 +193.316 +193.317 +193.318 +193.319 +193.320 +194.246 +194.247 +194.248 +194.249 +194.250 +194.251 +194.252 +194.253 +194.254 +194.255 +194.256 +194.257 +194.258 +194.259 +194.260 +194.261 +194.262 +194.263 +194.264 +194.265 +194.266 +194.267 +194.268 +194.269 +194.270 +194.271 +194.272 +194.273 +194.274 +194.275 +194.276 +194.277 +194.278 +194.279 +194.280 +194.281 +194.282 +194.283 +194.284 +194.285 +194.286 +194.287 +194.288 +194.289 +194.290 +194.297 +194.303 +194.304 +194.305 +194.306 +194.307 +194.308 +194.309 +194.310 +194.311 +194.312 +194.313 +194.314 +194.315 +194.316 +194.317 +194.318 +194.319 +194.320 +195.245 +195.246 +195.247 +195.248 +195.249 +195.250 +195.251 +195.252 +195.253 +195.254 +195.255 +195.256 +195.257 +195.258 +195.259 +195.260 +195.261 +195.262 +195.263 +195.264 +195.265 +195.266 +195.267 +195.268 +195.269 +195.270 +195.271 +195.272 +195.273 +195.274 +195.275 +195.276 +195.277 +195.278 +195.279 +195.280 +195.281 +195.282 +195.283 +195.284 +195.285 +195.286 +195.287 +195.288 +195.289 +195.290 +195.297 +195.302 +195.303 +195.304 +195.305 +195.306 +195.307 +195.308 +195.309 +195.310 +195.311 +195.312 +195.313 +195.314 +195.315 +195.316 +195.317 +195.318 +195.319 +195.320 +196.244 +196.245 +196.246 +196.247 +196.248 +196.249 +196.250 +196.251 +196.252 +196.253 +196.254 +196.255 +196.256 +196.257 +196.258 +196.259 +196.260 +196.261 +196.262 +196.263 +196.264 +196.265 +196.266 +196.267 +196.268 +196.269 +196.270 +196.271 +196.272 +196.273 +196.274 +196.275 +196.276 +196.277 +196.278 +196.279 +196.280 +196.281 +196.282 +196.283 +196.284 +196.285 +196.286 +196.287 +196.288 +196.289 +196.290 +196.296 +196.297 +196.302 +196.303 +196.304 +196.305 +196.306 +196.307 +196.308 +196.309 +196.310 +196.311 +196.312 +196.313 +196.314 +196.315 +196.316 +196.317 +196.318 +196.319 +196.320 +197.243 +197.244 +197.245 +197.246 +197.247 +197.248 +197.249 +197.250 +197.251 +197.252 +197.253 +197.254 +197.255 +197.256 +197.257 +197.258 +197.259 +197.260 +197.261 +197.262 +197.263 +197.264 +197.265 +197.266 +197.267 +197.268 +197.269 +197.270 +197.271 +197.272 +197.273 +197.274 +197.275 +197.276 +197.277 +197.278 +197.279 +197.280 +197.281 +197.282 +197.283 +197.284 +197.285 +197.286 +197.287 +197.288 +197.289 +197.290 +197.296 +197.297 +197.301 +197.302 +197.303 +197.304 +197.305 +197.306 +197.307 +197.308 +197.309 +197.310 +197.311 +197.312 +197.313 +197.314 +197.315 +197.316 +197.317 +197.318 +197.319 +197.320 +198.242 +198.243 +198.244 +198.245 +198.246 +198.247 +198.248 +198.249 +198.250 +198.251 +198.252 +198.253 +198.254 +198.255 +198.256 +198.257 +198.258 +198.259 +198.260 +198.261 +198.262 +198.263 +198.264 +198.265 +198.266 +198.267 +198.268 +198.269 +198.270 +198.271 +198.272 +198.273 +198.274 +198.275 +198.276 +198.277 +198.278 +198.279 +198.280 +198.281 +198.282 +198.283 +198.284 +198.285 +198.286 +198.287 +198.288 +198.289 +198.295 +198.296 +198.297 +198.301 +198.302 +198.303 +198.304 +198.305 +198.306 +198.307 +198.308 +198.309 +198.310 +198.311 +198.312 +198.313 +198.314 +198.315 +198.316 +198.317 +198.318 +198.319 +199.242 +199.243 +199.244 +199.245 +199.246 +199.247 +199.248 +199.249 +199.250 +199.251 +199.252 +199.253 +199.254 +199.255 +199.256 +199.257 +199.258 +199.259 +199.260 +199.261 +199.262 +199.263 +199.264 +199.265 +199.266 +199.267 +199.268 +199.269 +199.270 +199.271 +199.272 +199.273 +199.274 +199.275 +199.276 +199.277 +199.278 +199.279 +199.280 +199.281 +199.282 +199.283 +199.284 +199.285 +199.286 +199.287 +199.288 +199.289 +199.295 +199.296 +199.297 +199.300 +199.301 +199.302 +199.303 +199.304 +199.305 +199.306 +199.307 +199.308 +199.309 +199.310 +199.311 +199.312 +199.313 +199.314 +199.315 +199.316 +199.317 +199.318 +199.319 +200.241 +200.242 +200.243 +200.244 +200.245 +200.246 +200.247 +200.248 +200.249 +200.250 +200.251 +200.252 +200.253 +200.254 +200.255 +200.256 +200.257 +200.258 +200.259 +200.260 +200.261 +200.262 +200.263 +200.264 +200.265 +200.266 +200.267 +200.268 +200.269 +200.270 +200.271 +200.272 +200.273 +200.274 +200.275 +200.276 +200.277 +200.278 +200.279 +200.280 +200.281 +200.282 +200.283 +200.284 +200.285 +200.286 +200.287 +200.288 +200.289 +200.295 +200.296 +200.297 +200.300 +200.301 +200.302 +200.303 +200.304 +200.305 +200.306 +200.307 +200.308 +200.309 +200.310 +200.311 +200.312 +200.313 +200.314 +200.315 +200.316 +200.317 +200.318 +200.319 +201.240 +201.241 +201.242 +201.243 +201.244 +201.245 +201.246 +201.247 +201.248 +201.249 +201.250 +201.251 +201.252 +201.253 +201.254 +201.255 +201.256 +201.257 +201.258 +201.259 +201.260 +201.261 +201.262 +201.263 +201.264 +201.265 +201.266 +201.267 +201.268 +201.269 +201.270 +201.271 +201.272 +201.273 +201.274 +201.275 +201.276 +201.277 +201.278 +201.279 +201.280 +201.281 +201.282 +201.283 +201.284 +201.285 +201.286 +201.287 +201.288 +201.294 +201.295 +201.296 +201.297 +201.300 +201.301 +201.302 +201.303 +201.304 +201.305 +201.306 +201.307 +201.308 +201.309 +201.310 +201.311 +201.312 +201.313 +201.314 +201.315 +201.316 +201.317 +201.318 +201.319 +202.239 +202.240 +202.241 +202.242 +202.243 +202.244 +202.245 +202.246 +202.247 +202.248 +202.249 +202.250 +202.251 +202.252 +202.253 +202.254 +202.255 +202.256 +202.257 +202.258 +202.259 +202.260 +202.261 +202.262 +202.263 +202.264 +202.265 +202.266 +202.267 +202.268 +202.269 +202.270 +202.271 +202.272 +202.273 +202.274 +202.275 +202.276 +202.277 +202.278 +202.279 +202.280 +202.281 +202.282 +202.283 +202.284 +202.285 +202.286 +202.287 +202.288 +202.294 +202.295 +202.296 +202.297 +202.299 +202.300 +202.301 +202.302 +202.303 +202.304 +202.305 +202.306 +202.307 +202.308 +202.309 +202.310 +202.311 +202.312 +202.313 +202.314 +202.315 +202.316 +202.317 +202.318 +203.239 +203.240 +203.241 +203.242 +203.243 +203.244 +203.245 +203.246 +203.247 +203.248 +203.249 +203.250 +203.251 +203.252 +203.253 +203.254 +203.255 +203.256 +203.257 +203.258 +203.259 +203.260 +203.261 +203.262 +203.263 +203.264 +203.265 +203.266 +203.267 +203.268 +203.269 +203.270 +203.271 +203.272 +203.273 +203.274 +203.275 +203.276 +203.277 +203.278 +203.279 +203.280 +203.281 +203.282 +203.283 +203.284 +203.285 +203.286 +203.287 +203.293 +203.294 +203.295 +203.296 +203.297 +203.299 +203.300 +203.301 +203.302 +203.303 +203.304 +203.305 +203.306 +203.307 +203.308 +203.309 +203.310 +203.311 +203.312 +203.313 +203.314 +203.315 +203.316 +203.317 +203.318 +204.238 +204.239 +204.240 +204.241 +204.242 +204.243 +204.244 +204.245 +204.246 +204.247 +204.248 +204.249 +204.250 +204.251 +204.252 +204.253 +204.254 +204.255 +204.256 +204.257 +204.258 +204.259 +204.260 +204.261 +204.262 +204.263 +204.264 +204.265 +204.266 +204.267 +204.268 +204.269 +204.270 +204.271 +204.272 +204.273 +204.274 +204.275 +204.276 +204.277 +204.278 +204.279 +204.280 +204.281 +204.282 +204.283 +204.284 +204.285 +204.286 +204.287 +204.293 +204.294 +204.295 +204.296 +204.297 +204.298 +204.299 +204.300 +204.301 +204.302 +204.303 +204.304 +204.305 +204.306 +204.307 +204.308 +204.309 +204.310 +204.311 +204.312 +204.313 +204.314 +204.315 +204.316 +204.317 +204.318 +205.238 +205.239 +205.240 +205.241 +205.242 +205.243 +205.244 +205.245 +205.246 +205.247 +205.248 +205.249 +205.250 +205.251 +205.252 +205.253 +205.254 +205.255 +205.256 +205.257 +205.258 +205.259 +205.260 +205.261 +205.262 +205.263 +205.264 +205.265 +205.266 +205.267 +205.268 +205.269 +205.270 +205.271 +205.272 +205.273 +205.274 +205.275 +205.276 +205.277 +205.278 +205.279 +205.280 +205.281 +205.282 +205.283 +205.284 +205.285 +205.286 +205.287 +205.292 +205.293 +205.294 +205.295 +205.296 +205.297 +205.298 +205.299 +205.300 +205.301 +205.302 +205.303 +205.304 +205.305 +205.306 +205.307 +205.308 +205.309 +205.310 +205.311 +205.312 +205.313 +205.314 +205.315 +205.316 +205.317 +205.318 +206.238 +206.239 +206.240 +206.241 +206.242 +206.243 +206.244 +206.245 +206.246 +206.247 +206.248 +206.249 +206.250 +206.251 +206.252 +206.253 +206.254 +206.255 +206.256 +206.257 +206.258 +206.259 +206.260 +206.261 +206.262 +206.263 +206.264 +206.265 +206.266 +206.267 +206.268 +206.269 +206.270 +206.271 +206.272 +206.273 +206.274 +206.275 +206.276 +206.277 +206.278 +206.279 +206.280 +206.281 +206.282 +206.283 +206.284 +206.285 +206.286 +206.292 +206.293 +206.294 +206.295 +206.296 +206.297 +206.298 +206.299 +206.300 +206.301 +206.302 +206.303 +206.304 +206.305 +206.306 +206.307 +206.308 +206.309 +206.310 +206.311 +206.312 +206.313 +206.314 +206.315 +206.316 +206.317 +207.238 +207.239 +207.240 +207.241 +207.242 +207.243 +207.244 +207.245 +207.246 +207.247 +207.248 +207.249 +207.250 +207.251 +207.252 +207.253 +207.254 +207.255 +207.256 +207.257 +207.258 +207.259 +207.260 +207.261 +207.262 +207.263 +207.264 +207.265 +207.266 +207.267 +207.268 +207.269 +207.270 +207.271 +207.272 +207.273 +207.274 +207.275 +207.276 +207.277 +207.278 +207.279 +207.280 +207.281 +207.282 +207.283 +207.284 +207.285 +207.286 +207.291 +207.292 +207.293 +207.294 +207.295 +207.296 +207.297 +207.298 +207.299 +207.300 +207.301 +207.302 +207.303 +207.304 +207.305 +207.306 +207.307 +207.308 +207.309 +207.310 +207.311 +207.312 +207.313 +207.314 +207.315 +207.316 +207.317 +208.238 +208.239 +208.240 +208.241 +208.242 +208.243 +208.244 +208.245 +208.246 +208.247 +208.248 +208.249 +208.250 +208.251 +208.252 +208.253 +208.254 +208.255 +208.256 +208.257 +208.258 +208.259 +208.260 +208.261 +208.262 +208.263 +208.264 +208.265 +208.266 +208.267 +208.268 +208.269 +208.270 +208.271 +208.272 +208.273 +208.274 +208.275 +208.276 +208.277 +208.278 +208.279 +208.280 +208.281 +208.282 +208.283 +208.284 +208.285 +208.291 +208.292 +208.293 +208.294 +208.295 +208.296 +208.297 +208.298 +208.299 +208.300 +208.301 +208.302 +208.303 +208.304 +208.305 +208.306 +208.307 +208.308 +208.309 +208.310 +208.311 +208.312 +208.313 +208.314 +208.315 +208.316 +208.317 +209.238 +209.239 +209.240 +209.241 +209.242 +209.243 +209.244 +209.245 +209.246 +209.247 +209.248 +209.249 +209.250 +209.251 +209.252 +209.253 +209.254 +209.255 +209.256 +209.257 +209.258 +209.259 +209.260 +209.261 +209.262 +209.263 +209.264 +209.265 +209.266 +209.267 +209.268 +209.269 +209.270 +209.271 +209.272 +209.273 +209.274 +209.275 +209.276 +209.277 +209.278 +209.279 +209.280 +209.281 +209.282 +209.283 +209.284 +209.285 +209.291 +209.292 +209.293 +209.294 +209.295 +209.296 +209.297 +209.298 +209.299 +209.300 +209.301 +209.302 +209.303 +209.304 +209.305 +209.306 +209.307 +209.308 +209.309 +209.310 +209.311 +209.312 +209.313 +209.314 +209.315 +209.316 +209.317 +210.238 +210.239 +210.240 +210.241 +210.242 +210.243 +210.244 +210.245 +210.246 +210.247 +210.248 +210.249 +210.250 +210.251 +210.252 +210.253 +210.254 +210.255 +210.256 +210.257 +210.258 +210.259 +210.260 +210.261 +210.262 +210.263 +210.264 +210.265 +210.266 +210.267 +210.268 +210.269 +210.270 +210.271 +210.272 +210.273 +210.274 +210.275 +210.276 +210.277 +210.278 +210.279 +210.280 +210.281 +210.282 +210.283 +210.284 +210.290 +210.291 +210.292 +210.293 +210.294 +210.295 +210.296 +210.297 +210.298 +210.299 +210.300 +210.301 +210.302 +210.303 +210.304 +210.305 +210.306 +210.307 +210.308 +210.309 +210.310 +210.311 +210.312 +210.313 +210.314 +210.315 +210.316 +210.317 +211.238 +211.239 +211.240 +211.241 +211.242 +211.243 +211.244 +211.245 +211.246 +211.247 +211.248 +211.249 +211.250 +211.251 +211.252 +211.253 +211.254 +211.255 +211.256 +211.257 +211.258 +211.259 +211.260 +211.261 +211.262 +211.263 +211.264 +211.265 +211.266 +211.267 +211.268 +211.269 +211.270 +211.271 +211.272 +211.273 +211.274 +211.275 +211.276 +211.277 +211.278 +211.279 +211.280 +211.281 +211.282 +211.283 +211.284 +211.290 +211.291 +211.292 +211.293 +211.294 +211.295 +211.296 +211.297 +211.298 +211.299 +211.300 +211.301 +211.302 +211.303 +211.304 +211.305 +211.306 +211.307 +211.308 +211.309 +211.310 +211.311 +211.312 +211.313 +211.314 +211.315 +211.316 +212.238 +212.239 +212.240 +212.241 +212.242 +212.243 +212.244 +212.245 +212.246 +212.247 +212.248 +212.249 +212.250 +212.251 +212.252 +212.253 +212.254 +212.255 +212.256 +212.257 +212.258 +212.259 +212.260 +212.261 +212.262 +212.263 +212.264 +212.265 +212.266 +212.267 +212.268 +212.269 +212.270 +212.271 +212.272 +212.273 +212.274 +212.275 +212.276 +212.277 +212.278 +212.279 +212.280 +212.281 +212.282 +212.283 +212.284 +212.289 +212.290 +212.291 +212.292 +212.293 +212.294 +212.295 +212.296 +212.297 +212.298 +212.299 +212.300 +212.301 +212.302 +212.303 +212.304 +212.305 +212.306 +212.307 +212.308 +212.309 +212.310 +212.311 +212.312 +212.313 +212.314 +212.315 +212.316 +213.238 +213.239 +213.240 +213.241 +213.242 +213.243 +213.244 +213.245 +213.246 +213.247 +213.248 +213.249 +213.250 +213.251 +213.252 +213.253 +213.254 +213.255 +213.256 +213.257 +213.258 +213.259 +213.260 +213.261 +213.262 +213.263 +213.264 +213.265 +213.266 +213.267 +213.268 +213.269 +213.270 +213.271 +213.272 +213.273 +213.274 +213.275 +213.276 +213.277 +213.278 +213.279 +213.280 +213.281 +213.282 +213.283 +213.289 +213.290 +213.291 +213.292 +213.293 +213.294 +213.295 +213.296 +213.297 +213.298 +213.299 +213.300 +213.301 +213.302 +213.303 +213.304 +213.305 +213.306 +213.307 +213.308 +213.309 +213.310 +213.311 +213.312 +213.313 +213.314 +213.315 +213.316 +214.238 +214.239 +214.240 +214.241 +214.242 +214.243 +214.244 +214.245 +214.246 +214.247 +214.248 +214.249 +214.250 +214.251 +214.252 +214.253 +214.254 +214.255 +214.256 +214.257 +214.258 +214.259 +214.260 +214.261 +214.262 +214.263 +214.264 +214.265 +214.266 +214.267 +214.268 +214.269 +214.270 +214.271 +214.272 +214.273 +214.274 +214.275 +214.276 +214.277 +214.278 +214.279 +214.280 +214.281 +214.282 +214.283 +214.288 +214.289 +214.290 +214.291 +214.292 +214.293 +214.294 +214.295 +214.296 +214.297 +214.298 +214.299 +214.300 +214.301 +214.302 +214.303 +214.304 +214.305 +214.306 +214.307 +214.308 +214.309 +214.310 +214.311 +214.312 +214.313 +214.314 +214.315 +214.316 +215.238 +215.239 +215.240 +215.241 +215.242 +215.243 +215.244 +215.245 +215.246 +215.247 +215.248 +215.249 +215.250 +215.251 +215.252 +215.253 +215.254 +215.255 +215.256 +215.257 +215.258 +215.259 +215.260 +215.261 +215.262 +215.263 +215.264 +215.265 +215.266 +215.267 +215.268 +215.269 +215.270 +215.271 +215.272 +215.273 +215.274 +215.275 +215.276 +215.277 +215.278 +215.279 +215.280 +215.281 +215.282 +215.288 +215.289 +215.290 +215.291 +215.292 +215.293 +215.294 +215.295 +215.296 +215.297 +215.298 +215.299 +215.300 +215.301 +215.302 +215.303 +215.304 +215.305 +215.306 +215.307 +215.308 +215.309 +215.310 +215.311 +215.312 +215.313 +215.314 +215.315 +216.238 +216.239 +216.240 +216.241 +216.242 +216.243 +216.244 +216.245 +216.246 +216.247 +216.248 +216.249 +216.250 +216.251 +216.252 +216.253 +216.254 +216.255 +216.256 +216.257 +216.258 +216.259 +216.260 +216.261 +216.262 +216.263 +216.264 +216.265 +216.266 +216.267 +216.268 +216.269 +216.270 +216.271 +216.272 +216.273 +216.274 +216.275 +216.276 +216.277 +216.278 +216.279 +216.280 +216.281 +216.282 +216.288 +216.289 +216.290 +216.291 +216.292 +216.293 +216.294 +216.295 +216.296 +216.297 +216.298 +216.299 +216.300 +216.301 +216.302 +216.303 +216.304 +216.305 +216.306 +216.307 +216.308 +216.309 +216.310 +216.311 +216.312 +216.313 +216.314 +216.315 +217.238 +217.239 +217.240 +217.241 +217.242 +217.243 +217.244 +217.245 +217.246 +217.247 +217.248 +217.249 +217.250 +217.251 +217.252 +217.253 +217.254 +217.255 +217.256 +217.257 +217.258 +217.259 +217.260 +217.261 +217.262 +217.263 +217.264 +217.265 +217.266 +217.267 +217.268 +217.269 +217.270 +217.271 +217.272 +217.273 +217.274 +217.275 +217.276 +217.277 +217.278 +217.279 +217.280 +217.281 +217.287 +217.288 +217.289 +217.290 +217.291 +217.292 +217.293 +217.294 +217.295 +217.296 +217.297 +217.298 +217.299 +217.300 +217.301 +217.302 +217.303 +217.304 +217.305 +217.306 +217.307 +217.308 +217.309 +217.310 +217.311 +217.312 +217.313 +217.314 +217.315 +218.238 +218.239 +218.240 +218.241 +218.242 +218.243 +218.244 +218.245 +218.246 +218.247 +218.248 +218.249 +218.250 +218.251 +218.252 +218.253 +218.254 +218.255 +218.256 +218.257 +218.258 +218.259 +218.260 +218.261 +218.262 +218.263 +218.264 +218.265 +218.266 +218.267 +218.268 +218.269 +218.270 +218.271 +218.272 +218.273 +218.274 +218.275 +218.276 +218.277 +218.278 +218.279 +218.280 +218.281 +218.287 +218.288 +218.289 +218.290 +218.291 +218.292 +218.293 +218.294 +218.295 +218.296 +218.297 +218.298 +218.299 +218.300 +218.301 +218.302 +218.303 +218.304 +218.305 +218.306 +218.307 +218.308 +218.309 +218.310 +218.311 +218.312 +218.313 +218.314 +218.315 +219.238 +219.239 +219.240 +219.241 +219.242 +219.243 +219.244 +219.245 +219.246 +219.247 +219.248 +219.249 +219.250 +219.251 +219.252 +219.253 +219.254 +219.255 +219.256 +219.257 +219.258 +219.259 +219.260 +219.261 +219.262 +219.263 +219.264 +219.265 +219.266 +219.267 +219.268 +219.269 +219.270 +219.271 +219.272 +219.273 +219.274 +219.275 +219.276 +219.277 +219.278 +219.279 +219.280 +219.286 +219.287 +219.288 +219.289 +219.290 +219.291 +219.292 +219.293 +219.294 +219.295 +219.296 +219.297 +219.298 +219.299 +219.300 +219.301 +219.302 +219.303 +219.304 +219.305 +219.306 +219.307 +219.308 +219.309 +219.310 +219.311 +219.312 +219.313 +219.314 +220.238 +220.239 +220.240 +220.241 +220.242 +220.243 +220.244 +220.245 +220.246 +220.247 +220.248 +220.249 +220.250 +220.251 +220.252 +220.253 +220.254 +220.255 +220.256 +220.257 +220.258 +220.259 +220.260 +220.261 +220.262 +220.263 +220.264 +220.265 +220.266 +220.267 +220.268 +220.269 +220.270 +220.271 +220.272 +220.273 +220.274 +220.275 +220.276 +220.277 +220.278 +220.279 +220.280 +220.286 +220.287 +220.288 +220.289 +220.290 +220.291 +220.292 +220.293 +220.294 +220.295 +220.296 +220.297 +220.298 +220.299 +220.300 +220.301 +220.302 +220.303 +220.304 +220.305 +220.306 +220.307 +220.308 +220.309 +220.310 +220.311 +220.312 +220.313 +220.314 +221.238 +221.239 +221.240 +221.241 +221.242 +221.243 +221.244 +221.245 +221.246 +221.247 +221.248 +221.249 +221.250 +221.251 +221.252 +221.253 +221.254 +221.255 +221.256 +221.257 +221.258 +221.259 +221.260 +221.261 +221.262 +221.263 +221.264 +221.265 +221.266 +221.267 +221.268 +221.269 +221.270 +221.271 +221.272 +221.273 +221.274 +221.275 +221.276 +221.277 +221.278 +221.279 +221.285 +221.286 +221.287 +221.288 +221.289 +221.290 +221.291 +221.292 +221.293 +221.294 +221.295 +221.296 +221.297 +221.298 +221.299 +221.300 +221.301 +221.302 +221.303 +221.304 +221.305 +221.306 +221.307 +221.308 +221.309 +221.310 +221.311 +221.312 +221.313 +221.314 +222.238 +222.239 +222.240 +222.241 +222.242 +222.243 +222.244 +222.245 +222.246 +222.247 +222.248 +222.249 +222.250 +222.251 +222.252 +222.253 +222.254 +222.255 +222.256 +222.257 +222.258 +222.259 +222.260 +222.261 +222.262 +222.263 +222.264 +222.265 +222.266 +222.267 +222.268 +222.269 +222.270 +222.271 +222.272 +222.273 +222.274 +222.275 +222.276 +222.277 +222.278 +222.279 +222.285 +222.286 +222.287 +222.288 +222.289 +222.290 +222.291 +222.292 +222.293 +222.294 +222.295 +222.296 +222.297 +222.298 +222.299 +222.300 +222.301 +222.302 +222.303 +222.304 +222.305 +222.306 +222.307 +222.308 +222.309 +222.310 +222.311 +222.312 +222.313 +223.238 +223.239 +223.240 +223.241 +223.242 +223.243 +223.244 +223.245 +223.246 +223.247 +223.248 +223.249 +223.250 +223.251 +223.252 +223.253 +223.254 +223.255 +223.256 +223.257 +223.258 +223.259 +223.260 +223.261 +223.262 +223.263 +223.264 +223.265 +223.266 +223.267 +223.268 +223.269 +223.270 +223.271 +223.272 +223.273 +223.274 +223.275 +223.276 +223.277 +223.278 +223.285 +223.286 +223.287 +223.288 +223.289 +223.290 +223.291 +223.292 +223.293 +223.294 +223.295 +223.296 +223.297 +223.298 +223.299 +223.300 +223.301 +223.302 +223.303 +223.304 +223.305 +223.306 +223.307 +223.308 +223.309 +223.310 +223.311 +223.312 +223.313 +224.238 +224.239 +224.240 +224.241 +224.242 +224.243 +224.244 +224.245 +224.246 +224.247 +224.248 +224.249 +224.250 +224.251 +224.252 +224.253 +224.254 +224.255 +224.256 +224.257 +224.258 +224.259 +224.260 +224.261 +224.262 +224.263 +224.264 +224.265 +224.266 +224.267 +224.268 +224.269 +224.270 +224.271 +224.272 +224.273 +224.274 +224.275 +224.276 +224.277 +224.278 +224.284 +224.285 +224.286 +224.287 +224.288 +224.289 +224.290 +224.291 +224.292 +224.293 +224.294 +224.295 +224.296 +224.297 +224.298 +224.299 +224.300 +224.301 +224.302 +224.303 +224.304 +224.305 +224.306 +224.307 +224.308 +224.309 +224.310 +224.311 +224.312 +224.313 +225.238 +225.239 +225.240 +225.241 +225.242 +225.243 +225.244 +225.245 +225.246 +225.247 +225.248 +225.249 +225.250 +225.251 +225.252 +225.253 +225.254 +225.255 +225.256 +225.257 +225.258 +225.259 +225.260 +225.261 +225.262 +225.263 +225.264 +225.265 +225.266 +225.267 +225.268 +225.269 +225.270 +225.271 +225.272 +225.273 +225.274 +225.275 +225.276 +225.277 +225.284 +225.285 +225.286 +225.287 +225.288 +225.289 +225.290 +225.291 +225.292 +225.293 +225.294 +225.295 +225.296 +225.297 +225.298 +225.299 +225.300 +225.301 +225.302 +225.303 +225.304 +225.305 +225.306 +225.307 +225.308 +225.309 +225.310 +225.311 +225.312 +225.313 +226.238 +226.239 +226.240 +226.241 +226.242 +226.243 +226.244 +226.245 +226.246 +226.247 +226.248 +226.249 +226.250 +226.251 +226.252 +226.253 +226.254 +226.255 +226.256 +226.257 +226.258 +226.259 +226.260 +226.261 +226.262 +226.263 +226.264 +226.265 +226.266 +226.267 +226.268 +226.269 +226.270 +226.271 +226.272 +226.273 +226.274 +226.275 +226.276 +226.277 +226.283 +226.284 +226.285 +226.286 +226.287 +226.288 +226.289 +226.290 +226.291 +226.292 +226.293 +226.294 +226.295 +226.296 +226.297 +226.298 +226.299 +226.300 +226.301 +226.302 +226.303 +226.304 +226.305 +226.306 +226.307 +226.308 +226.309 +226.310 +226.311 +226.312 +226.313 +227.238 +227.239 +227.240 +227.241 +227.242 +227.243 +227.244 +227.245 +227.246 +227.247 +227.248 +227.249 +227.250 +227.251 +227.252 +227.253 +227.254 +227.255 +227.256 +227.257 +227.258 +227.259 +227.260 +227.261 +227.262 +227.263 +227.264 +227.265 +227.266 +227.267 +227.268 +227.269 +227.270 +227.271 +227.272 +227.273 +227.274 +227.275 +227.276 +227.277 +227.283 +227.284 +227.285 +227.286 +227.287 +227.288 +227.289 +227.290 +227.291 +227.292 +227.293 +227.294 +227.295 +227.296 +227.297 +227.298 +227.299 +227.300 +227.301 +227.302 +227.303 +227.304 +227.305 +227.306 +227.307 +227.308 +227.309 +227.310 +227.311 +227.312 +228.238 +228.239 +228.240 +228.241 +228.242 +228.243 +228.244 +228.245 +228.246 +228.247 +228.248 +228.249 +228.250 +228.251 +228.252 +228.253 +228.254 +228.255 +228.256 +228.257 +228.258 +228.259 +228.260 +228.261 +228.262 +228.263 +228.264 +228.265 +228.266 +228.267 +228.268 +228.269 +228.270 +228.271 +228.272 +228.273 +228.274 +228.275 +228.276 +228.282 +228.283 +228.284 +228.285 +228.286 +228.287 +228.288 +228.289 +228.290 +228.291 +228.292 +228.293 +228.294 +228.295 +228.296 +228.297 +228.298 +228.299 +228.300 +228.301 +228.302 +228.303 +228.304 +228.305 +228.306 +228.307 +228.308 +228.309 +228.310 +228.311 +228.312 +229.238 +229.239 +229.240 +229.241 +229.242 +229.243 +229.244 +229.245 +229.246 +229.247 +229.248 +229.249 +229.250 +229.251 +229.252 +229.253 +229.254 +229.255 +229.256 +229.257 +229.258 +229.259 +229.260 +229.261 +229.262 +229.263 +229.264 +229.265 +229.266 +229.267 +229.268 +229.269 +229.270 +229.271 +229.272 +229.273 +229.274 +229.275 +229.276 +229.282 +229.283 +229.284 +229.285 +229.286 +229.287 +229.288 +229.289 +229.290 +229.291 +229.292 +229.293 +229.294 +229.295 +229.296 +229.297 +229.298 +229.299 +229.300 +229.301 +229.302 +229.303 +229.304 +229.305 +229.306 +229.307 +229.308 +229.309 +229.310 +229.311 +229.312 +230.238 +230.239 +230.240 +230.241 +230.242 +230.243 +230.244 +230.245 +230.246 +230.247 +230.248 +230.249 +230.250 +230.251 +230.252 +230.253 +230.254 +230.255 +230.256 +230.257 +230.258 +230.259 +230.260 +230.261 +230.262 +230.263 +230.264 +230.265 +230.266 +230.267 +230.268 +230.269 +230.270 +230.271 +230.272 +230.273 +230.274 +230.275 +230.281 +230.282 +230.283 +230.284 +230.285 +230.286 +230.287 +230.288 +230.289 +230.290 +230.291 +230.292 +230.293 +230.294 +230.295 +230.296 +230.297 +230.298 +230.299 +230.300 +230.301 +230.302 +230.303 +230.304 +230.305 +230.306 +230.307 +230.308 +230.309 +230.310 +230.311 +230.312 +231.238 +231.239 +231.240 +231.241 +231.242 +231.243 +231.244 +231.245 +231.246 +231.247 +231.248 +231.249 +231.250 +231.251 +231.252 +231.253 +231.254 +231.255 +231.256 +231.257 +231.258 +231.259 +231.260 +231.261 +231.262 +231.263 +231.264 +231.265 +231.266 +231.267 +231.268 +231.269 +231.270 +231.271 +231.272 +231.273 +231.274 +231.275 +231.281 +231.282 +231.283 +231.284 +231.285 +231.286 +231.287 +231.288 +231.289 +231.290 +231.291 +231.292 +231.293 +231.294 +231.295 +231.296 +231.297 +231.298 +231.299 +231.300 +231.301 +231.302 +231.303 +231.304 +231.305 +231.306 +231.307 +231.308 +231.309 +231.310 +231.311 +231.312 +232.238 +232.239 +232.240 +232.241 +232.242 +232.243 +232.244 +232.245 +232.246 +232.247 +232.248 +232.249 +232.250 +232.251 +232.252 +232.253 +232.254 +232.255 +232.256 +232.257 +232.258 +232.259 +232.260 +232.261 +232.262 +232.263 +232.264 +232.265 +232.266 +232.267 +232.268 +232.269 +232.270 +232.271 +232.272 +232.273 +232.274 +232.281 +232.282 +232.283 +232.284 +232.285 +232.286 +232.287 +232.288 +232.289 +232.290 +232.291 +232.292 +232.293 +232.294 +232.295 +232.296 +232.297 +232.298 +232.299 +232.300 +232.301 +232.302 +232.303 +232.304 +232.305 +232.306 +232.307 +232.308 +232.309 +232.310 +232.311 +233.238 +233.239 +233.240 +233.241 +233.242 +233.243 +233.244 +233.245 +233.246 +233.247 +233.248 +233.249 +233.250 +233.251 +233.252 +233.253 +233.254 +233.255 +233.256 +233.257 +233.258 +233.259 +233.260 +233.261 +233.262 +233.263 +233.264 +233.265 +233.266 +233.267 +233.268 +233.269 +233.270 +233.271 +233.272 +233.273 +233.280 +233.281 +233.282 +233.283 +233.284 +233.285 +233.286 +233.287 +233.288 +233.289 +233.290 +233.291 +233.292 +233.293 +233.294 +233.295 +233.296 +233.297 +233.298 +233.299 +233.300 +233.301 +233.302 +233.303 +233.304 +233.305 +233.306 +233.307 +233.308 +233.309 +233.310 +233.311 +234.238 +234.239 +234.240 +234.241 +234.242 +234.243 +234.244 +234.245 +234.246 +234.247 +234.248 +234.249 +234.250 +234.251 +234.252 +234.253 +234.254 +234.255 +234.256 +234.257 +234.258 +234.259 +234.260 +234.261 +234.262 +234.263 +234.264 +234.265 +234.266 +234.267 +234.268 +234.269 +234.270 +234.271 +234.272 +234.273 +234.280 +234.281 +234.282 +234.283 +234.284 +234.285 +234.286 +234.287 +234.288 +234.289 +234.290 +234.291 +234.292 +234.293 +234.294 +234.295 +234.296 +234.297 +234.298 +234.299 +234.300 +234.301 +234.302 +234.303 +234.304 +234.305 +234.306 +234.307 +234.308 +234.309 +234.310 +234.311 +235.238 +235.239 +235.240 +235.241 +235.242 +235.243 +235.244 +235.245 +235.246 +235.247 +235.248 +235.249 +235.250 +235.251 +235.252 +235.253 +235.254 +235.255 +235.256 +235.257 +235.258 +235.259 +235.260 +235.261 +235.262 +235.263 +235.264 +235.265 +235.266 +235.267 +235.268 +235.269 +235.270 +235.271 +235.272 +235.279 +235.280 +235.281 +235.282 +235.283 +235.284 +235.285 +235.286 +235.287 +235.288 +235.289 +235.290 +235.291 +235.292 +235.293 +235.294 +235.295 +235.296 +235.297 +235.298 +235.299 +235.300 +235.301 +235.302 +235.303 +235.304 +235.305 +235.306 +235.307 +235.308 +235.309 +235.310 +235.311 +236.238 +236.239 +236.240 +236.241 +236.242 +236.243 +236.244 +236.245 +236.246 +236.247 +236.248 +236.249 +236.250 +236.251 +236.252 +236.253 +236.254 +236.255 +236.256 +236.257 +236.258 +236.259 +236.260 +236.261 +236.262 +236.263 +236.264 +236.265 +236.266 +236.267 +236.268 +236.269 +236.270 +236.271 +236.272 +236.278 +236.279 +236.280 +236.281 +236.282 +236.283 +236.284 +236.285 +236.286 +236.287 +236.288 +236.289 +236.290 +236.291 +236.292 +236.293 +236.294 +236.295 +236.296 +236.297 +236.298 +236.299 +236.300 +236.301 +236.302 +236.303 +236.304 +236.305 +236.306 +236.307 +236.308 +236.309 +236.310 +236.311 +237.238 +237.239 +237.240 +237.241 +237.242 +237.243 +237.244 +237.245 +237.246 +237.247 +237.248 +237.249 +237.250 +237.251 +237.252 +237.253 +237.254 +237.255 +237.256 +237.257 +237.258 +237.259 +237.260 +237.261 +237.262 +237.263 +237.264 +237.265 +237.266 +237.267 +237.268 +237.269 +237.270 +237.271 +237.278 +237.279 +237.280 +237.281 +237.282 +237.283 +237.284 +237.285 +237.286 +237.287 +237.288 +237.289 +237.290 +237.291 +237.292 +237.293 +237.294 +237.295 +237.296 +237.297 +237.298 +237.299 +237.300 +237.301 +237.302 +237.303 +237.304 +237.305 +237.306 +237.307 +237.308 +237.309 +237.310 +238.238 +238.239 +238.240 +238.241 +238.242 +238.243 +238.244 +238.245 +238.246 +238.247 +238.248 +238.249 +238.250 +238.251 +238.252 +238.253 +238.254 +238.255 +238.256 +238.257 +238.258 +238.259 +238.260 +238.261 +238.262 +238.263 +238.264 +238.265 +238.266 +238.267 +238.268 +238.269 +238.270 +238.271 +238.277 +238.278 +238.279 +238.280 +238.281 +238.282 +238.283 +238.284 +238.285 +238.286 +238.287 +238.288 +238.289 +238.290 +238.291 +238.292 +238.293 +238.294 +238.295 +238.296 +238.297 +238.298 +238.299 +238.300 +238.301 +238.302 +238.303 +238.304 +238.305 +238.306 +238.307 +238.308 +238.309 +238.310 +239.238 +239.239 +239.240 +239.241 +239.242 +239.243 +239.244 +239.245 +239.246 +239.247 +239.248 +239.249 +239.250 +239.251 +239.252 +239.253 +239.254 +239.255 +239.256 +239.257 +239.258 +239.259 +239.260 +239.261 +239.262 +239.263 +239.264 +239.265 +239.266 +239.267 +239.268 +239.269 +239.270 +239.277 +239.278 +239.279 +239.280 +239.281 +239.282 +239.283 +239.284 +239.285 +239.286 +239.287 +239.288 +239.289 +239.290 +239.291 +239.292 +239.293 +239.294 +239.295 +239.296 +239.297 +239.298 +239.299 +239.300 +239.301 +239.302 +239.303 +239.304 +239.305 +239.306 +239.307 +239.308 +239.309 +239.310 +240.238 +240.239 +240.240 +240.241 +240.242 +240.243 +240.244 +240.245 +240.246 +240.247 +240.248 +240.249 +240.250 +240.251 +240.252 +240.253 +240.254 +240.255 +240.256 +240.257 +240.258 +240.259 +240.260 +240.261 +240.263 +240.264 +240.265 +240.266 +240.267 +240.268 +240.269 +240.270 +240.276 +240.277 +240.278 +240.279 +240.280 +240.281 +240.282 +240.283 +240.284 +240.285 +240.286 +240.287 +240.288 +240.289 +240.290 +240.291 +240.292 +240.293 +240.294 +240.295 +240.296 +240.297 +240.298 +240.299 +240.300 +240.301 +240.302 +240.303 +240.304 +240.305 +240.306 +240.307 +240.308 +240.309 +240.310 +241.238 +241.239 +241.240 +241.241 +241.242 +241.243 +241.244 +241.245 +241.246 +241.247 +241.248 +241.249 +241.250 +241.251 +241.252 +241.253 +241.254 +241.255 +241.256 +241.257 +241.258 +241.259 +241.260 +241.261 +241.262 +241.263 +241.264 +241.265 +241.266 +241.267 +241.268 +241.269 +241.270 +241.276 +241.277 +241.278 +241.279 +241.280 +241.281 +241.282 +241.283 +241.284 +241.285 +241.286 +241.287 +241.288 +241.289 +241.290 +241.291 +241.292 +241.293 +241.294 +241.295 +241.296 +241.297 +241.298 +241.299 +241.300 +241.301 +241.302 +241.303 +241.304 +241.305 +241.306 +241.307 +241.308 +241.309 +242.238 +242.239 +242.240 +242.241 +242.242 +242.243 +242.244 +242.245 +242.246 +242.247 +242.248 +242.249 +242.250 +242.251 +242.252 +242.253 +242.254 +242.255 +242.256 +242.257 +242.258 +242.259 +242.260 +242.262 +242.263 +242.264 +242.265 +242.266 +242.267 +242.268 +242.269 +242.276 +242.277 +242.278 +242.279 +242.280 +242.281 +242.282 +242.283 +242.284 +242.285 +242.286 +242.287 +242.288 +242.289 +242.290 +242.291 +242.292 +242.293 +242.294 +242.295 +242.296 +242.297 +242.298 +242.299 +242.300 +242.301 +242.302 +242.303 +242.304 +242.305 +242.306 +242.307 +242.308 +242.309 +243.238 +243.239 +243.240 +243.241 +243.242 +243.243 +243.244 +243.245 +243.246 +243.247 +243.248 +243.249 +243.250 +243.251 +243.252 +243.253 +243.254 +243.255 +243.256 +243.257 +243.258 +243.259 +243.261 +243.262 +243.263 +243.264 +243.265 +243.266 +243.267 +243.268 +243.269 +243.275 +243.276 +243.277 +243.278 +243.279 +243.280 +243.281 +243.282 +243.283 +243.284 +243.285 +243.286 +243.287 +243.288 +243.289 +243.290 +243.291 +243.292 +243.293 +243.294 +243.295 +243.296 +243.297 +243.298 +243.299 +243.300 +243.301 +243.302 +243.303 +243.304 +243.305 +243.306 +243.307 +243.308 +243.309 +244.238 +244.239 +244.240 +244.241 +244.242 +244.243 +244.244 +244.245 +244.246 +244.247 +244.248 +244.249 +244.250 +244.251 +244.252 +244.253 +244.254 +244.255 +244.256 +244.257 +244.258 +244.259 +244.260 +244.261 +244.262 +244.263 +244.264 +244.265 +244.266 +244.267 +244.268 +244.269 +244.274 +244.275 +244.276 +244.277 +244.278 +244.279 +244.280 +244.281 +244.282 +244.283 +244.284 +244.285 +244.286 +244.287 +244.288 +244.289 +244.290 +244.291 +244.292 +244.293 +244.294 +244.295 +244.296 +244.297 +244.298 +244.299 +244.300 +244.301 +244.302 +244.303 +244.304 +244.305 +244.306 +244.307 +244.308 +245.238 +245.239 +245.240 +245.241 +245.242 +245.243 +245.244 +245.245 +245.246 +245.247 +245.248 +245.249 +245.250 +245.251 +245.252 +245.253 +245.254 +245.255 +245.256 +245.257 +245.258 +245.259 +245.260 +245.261 +245.262 +245.263 +245.264 +245.265 +245.266 +245.267 +245.268 +245.269 +245.274 +245.275 +245.276 +245.277 +245.278 +245.279 +245.280 +245.281 +245.282 +245.283 +245.284 +245.285 +245.286 +245.287 +245.288 +245.289 +245.290 +245.291 +245.292 +245.293 +245.294 +245.295 +245.296 +245.297 +245.298 +245.299 +245.300 +245.301 +245.302 +245.303 +245.304 +245.305 +245.306 +245.307 +245.308 +246.239 +246.240 +246.241 +246.242 +246.243 +246.244 +246.245 +246.246 +246.247 +246.248 +246.249 +246.250 +246.251 +246.252 +246.253 +246.254 +246.255 +246.256 +246.257 +246.258 +246.259 +246.260 +246.261 +246.262 +246.263 +246.264 +246.265 +246.266 +246.267 +246.268 +246.269 +246.273 +246.274 +246.275 +246.276 +246.277 +246.278 +246.279 +246.280 +246.281 +246.282 +246.283 +246.284 +246.285 +246.286 +246.287 +246.288 +246.289 +246.290 +246.291 +246.292 +246.293 +246.294 +246.295 +246.296 +246.297 +246.298 +246.299 +246.300 +246.301 +246.302 +246.303 +246.304 +246.305 +246.306 +246.307 +246.308 +247.239 +247.240 +247.241 +247.242 +247.243 +247.244 +247.245 +247.246 +247.247 +247.248 +247.249 +247.250 +247.251 +247.252 +247.253 +247.254 +247.255 +247.256 +247.257 +247.258 +247.259 +247.260 +247.261 +247.262 +247.263 +247.264 +247.265 +247.266 +247.267 +247.268 +247.269 +247.273 +247.274 +247.275 +247.276 +247.277 +247.278 +247.279 +247.280 +247.281 +247.282 +247.283 +247.284 +247.285 +247.286 +247.287 +247.288 +247.289 +247.290 +247.291 +247.292 +247.293 +247.294 +247.295 +247.296 +247.297 +247.298 +247.299 +247.300 +247.301 +247.302 +247.303 +247.304 +247.305 +247.306 +247.307 +247.308 +248.239 +248.240 +248.241 +248.242 +248.243 +248.244 +248.245 +248.246 +248.247 +248.248 +248.249 +248.250 +248.251 +248.252 +248.253 +248.254 +248.255 +248.256 +248.258 +248.259 +248.260 +248.261 +248.262 +248.263 +248.264 +248.265 +248.266 +248.267 +248.268 +248.269 +248.272 +248.273 +248.274 +248.275 +248.276 +248.277 +248.278 +248.279 +248.280 +248.281 +248.282 +248.283 +248.284 +248.285 +248.286 +248.287 +248.288 +248.289 +248.290 +248.291 +248.292 +248.293 +248.294 +248.295 +248.296 +248.297 +248.298 +248.299 +248.300 +248.301 +248.302 +248.303 +248.304 +248.305 +248.306 +248.307 +248.308 +249.238 +249.239 +249.240 +249.241 +249.242 +249.243 +249.244 +249.245 +249.246 +249.247 +249.248 +249.249 +249.250 +249.251 +249.252 +249.253 +249.254 +249.255 +249.257 +249.258 +249.259 +249.260 +249.261 +249.262 +249.263 +249.264 +249.265 +249.266 +249.267 +249.268 +249.269 +249.272 +249.273 +249.274 +249.275 +249.276 +249.277 +249.278 +249.279 +249.280 +249.281 +249.282 +249.283 +249.284 +249.285 +249.286 +249.287 +249.288 +249.289 +249.290 +249.291 +249.292 +249.293 +249.294 +249.295 +249.296 +249.297 +249.298 +249.299 +249.300 +249.301 +249.302 +249.303 +249.304 +249.305 +249.306 +249.307 +250.238 +250.239 +250.240 +250.241 +250.242 +250.243 +250.244 +250.245 +250.246 +250.247 +250.248 +250.249 +250.250 +250.251 +250.252 +250.253 +250.254 +250.257 +250.258 +250.259 +250.260 +250.261 +250.262 +250.263 +250.264 +250.265 +250.266 +250.267 +250.268 +250.269 +250.271 +250.272 +250.273 +250.274 +250.275 +250.276 +250.277 +250.278 +250.279 +250.280 +250.281 +250.282 +250.283 +250.284 +250.285 +250.286 +250.287 +250.288 +250.289 +250.290 +250.291 +250.292 +250.293 +250.294 +250.295 +250.296 +250.297 +250.298 +250.299 +250.300 +250.301 +250.302 +250.303 +250.304 +250.305 +250.306 +250.307 +251.238 +251.239 +251.240 +251.241 +251.242 +251.243 +251.244 +251.245 +251.246 +251.247 +251.248 +251.249 +251.250 +251.251 +251.252 +251.253 +251.256 +251.257 +251.258 +251.259 +251.260 +251.261 +251.262 +251.263 +251.264 +251.265 +251.266 +251.267 +251.268 +251.269 +251.271 +251.272 +251.273 +251.274 +251.275 +251.276 +251.277 +251.278 +251.279 +251.280 +251.281 +251.282 +251.283 +251.284 +251.285 +251.286 +251.287 +251.288 +251.289 +251.290 +251.291 +251.292 +251.293 +251.294 +251.295 +251.296 +251.297 +251.298 +251.299 +251.300 +251.301 +251.302 +251.303 +251.304 +251.305 +251.306 +251.307 +252.238 +252.239 +252.240 +252.241 +252.242 +252.243 +252.244 +252.245 +252.246 +252.247 +252.248 +252.249 +252.250 +252.251 +252.252 +252.253 +252.256 +252.257 +252.258 +252.259 +252.260 +252.261 +252.262 +252.263 +252.264 +252.265 +252.266 +252.267 +252.268 +252.269 +252.270 +252.271 +252.272 +252.273 +252.274 +252.275 +252.276 +252.277 +252.278 +252.279 +252.280 +252.281 +252.282 +252.283 +252.284 +252.285 +252.286 +252.287 +252.288 +252.289 +252.290 +252.291 +252.292 +252.293 +252.294 +252.295 +252.296 +252.297 +252.298 +252.299 +252.300 +252.301 +252.302 +252.303 +252.304 +252.305 +252.306 +252.307 +253.238 +253.239 +253.240 +253.241 +253.242 +253.243 +253.244 +253.245 +253.246 +253.247 +253.248 +253.249 +253.250 +253.251 +253.252 +253.255 +253.256 +253.257 +253.258 +253.259 +253.260 +253.261 +253.262 +253.263 +253.264 +253.265 +253.266 +253.267 +253.268 +253.269 +253.270 +253.271 +253.272 +253.273 +253.274 +253.275 +253.276 +253.277 +253.278 +253.279 +253.280 +253.281 +253.282 +253.283 +253.284 +253.285 +253.286 +253.287 +253.288 +253.289 +253.290 +253.291 +253.292 +253.293 +253.294 +253.295 +253.296 +253.297 +253.298 +253.299 +253.300 +253.301 +253.302 +253.303 +253.304 +253.305 +253.306 +254.238 +254.239 +254.240 +254.241 +254.242 +254.243 +254.244 +254.245 +254.246 +254.247 +254.248 +254.249 +254.250 +254.251 +254.254 +254.255 +254.256 +254.257 +254.258 +254.259 +254.260 +254.261 +254.262 +254.263 +254.264 +254.265 +254.266 +254.267 +254.268 +254.269 +254.270 +254.271 +254.272 +254.273 +254.274 +254.275 +254.276 +254.277 +254.278 +254.279 +254.280 +254.281 +254.282 +254.283 +254.284 +254.285 +254.286 +254.287 +254.288 +254.289 +254.290 +254.291 +254.292 +254.293 +254.294 +254.295 +254.296 +254.297 +254.298 +254.299 +254.300 +254.301 +254.302 +254.303 +254.304 +254.305 +254.306 +255.238 +255.239 +255.240 +255.241 +255.242 +255.243 +255.244 +255.245 +255.246 +255.247 +255.248 +255.249 +255.250 +255.251 +255.254 +255.255 +255.256 +255.257 +255.258 +255.259 +255.260 +255.261 +255.262 +255.263 +255.264 +255.265 +255.266 +255.267 +255.268 +255.269 +255.270 +255.271 +255.272 +255.273 +255.274 +255.275 +255.276 +255.277 +255.278 +255.279 +255.280 +255.281 +255.282 +255.283 +255.284 +255.285 +255.286 +255.287 +255.288 +255.289 +255.290 +255.291 +255.292 +255.293 +255.294 +255.295 +255.296 +255.297 +255.298 +255.299 +255.300 +255.301 +255.302 +255.303 +255.304 +255.305 +255.306 +256.238 +256.239 +256.240 +256.241 +256.242 +256.243 +256.244 +256.245 +256.246 +256.247 +256.248 +256.249 +256.250 +256.251 +256.253 +256.254 +256.255 +256.256 +256.257 +256.258 +256.259 +256.260 +256.261 +256.262 +256.263 +256.264 +256.265 +256.266 +256.267 +256.268 +256.269 +256.270 +256.271 +256.272 +256.273 +256.274 +256.275 +256.276 +256.277 +256.278 +256.279 +256.280 +256.281 +256.282 +256.283 +256.284 +256.285 +256.286 +256.287 +256.288 +256.289 +256.290 +256.291 +256.292 +256.293 +256.294 +256.295 +256.296 +256.297 +256.298 +256.299 +256.300 +256.301 +256.302 +256.303 +256.304 +256.305 +256.306 +257.238 +257.239 +257.240 +257.241 +257.242 +257.243 +257.244 +257.245 +257.246 +257.247 +257.248 +257.249 +257.250 +257.252 +257.253 +257.254 +257.255 +257.256 +257.257 +257.258 +257.259 +257.260 +257.261 +257.262 +257.263 +257.264 +257.265 +257.266 +257.267 +257.268 +257.269 +257.270 +257.271 +257.272 +257.273 +257.274 +257.275 +257.276 +257.277 +257.278 +257.279 +257.280 +257.281 +257.282 +257.283 +257.284 +257.285 +257.286 +257.287 +257.288 +257.289 +257.290 +257.291 +257.292 +257.293 +257.294 +257.295 +257.296 +257.297 +257.298 +257.299 +257.300 +257.301 +257.302 +257.303 +257.304 +257.305 +257.306 +258.238 +258.239 +258.240 +258.241 +258.242 +258.243 +258.244 +258.245 +258.246 +258.247 +258.248 +258.249 +258.250 +258.252 +258.253 +258.254 +258.255 +258.256 +258.257 +258.258 +258.259 +258.260 +258.261 +258.262 +258.263 +258.264 +258.265 +258.266 +258.267 +258.268 +258.269 +258.270 +258.271 +258.272 +258.273 +258.274 +258.275 +258.276 +258.277 +258.278 +258.279 +258.280 +258.281 +258.282 +258.283 +258.284 +258.285 +258.286 +258.287 +258.288 +258.289 +258.290 +258.291 +258.292 +258.293 +258.294 +258.295 +258.296 +258.297 +258.298 +258.299 +258.300 +258.301 +258.302 +258.303 +258.304 +258.305 +259.238 +259.239 +259.240 +259.241 +259.242 +259.243 +259.244 +259.245 +259.246 +259.247 +259.248 +259.249 +259.251 +259.252 +259.253 +259.254 +259.255 +259.256 +259.257 +259.258 +259.259 +259.260 +259.261 +259.262 +259.263 +259.264 +259.265 +259.266 +259.267 +259.268 +259.269 +259.270 +259.271 +259.272 +259.273 +259.274 +259.275 +259.276 +259.277 +259.278 +259.279 +259.280 +259.281 +259.282 +259.283 +259.284 +259.285 +259.286 +259.287 +259.288 +259.289 +259.290 +259.291 +259.292 +259.293 +259.294 +259.295 +259.296 +259.297 +259.298 +259.299 +259.300 +259.301 +259.302 +259.303 +259.304 +259.305 +260.238 +260.239 +260.240 +260.241 +260.242 +260.243 +260.244 +260.245 +260.246 +260.247 +260.248 +260.249 +260.251 +260.252 +260.253 +260.254 +260.255 +260.256 +260.257 +260.258 +260.259 +260.260 +260.261 +260.262 +260.263 +260.264 +260.265 +260.266 +260.267 +260.268 +260.269 +260.270 +260.271 +260.272 +260.273 +260.274 +260.275 +260.276 +260.277 +260.278 +260.279 +260.280 +260.281 +260.282 +260.283 +260.284 +260.285 +260.286 +260.287 +260.288 +260.289 +260.290 +260.291 +260.292 +260.293 +260.294 +260.295 +260.296 +260.297 +260.298 +260.299 +260.300 +260.301 +260.302 +260.303 +260.304 +260.305 +261.238 +261.239 +261.240 +261.241 +261.242 +261.243 +261.244 +261.245 +261.246 +261.247 +261.248 +261.250 +261.251 +261.252 +261.253 +261.254 +261.255 +261.256 +261.257 +261.258 +261.259 +261.260 +261.261 +261.262 +261.263 +261.264 +261.265 +261.266 +261.267 +261.268 +261.269 +261.270 +261.271 +261.272 +261.273 +261.274 +261.275 +261.276 +261.277 +261.278 +261.279 +261.280 +261.281 +261.282 +261.283 +261.284 +261.285 +261.286 +261.287 +261.288 +261.289 +261.290 +261.291 +261.292 +261.293 +261.294 +261.295 +261.296 +261.297 +261.298 +261.299 +261.300 +261.301 +261.302 +261.303 +261.304 +261.305 +262.238 +262.239 +262.240 +262.241 +262.242 +262.243 +262.244 +262.245 +262.246 +262.247 +262.250 +262.251 +262.252 +262.253 +262.254 +262.255 +262.256 +262.257 +262.258 +262.259 +262.260 +262.261 +262.262 +262.263 +262.264 +262.265 +262.266 +262.267 +262.268 +262.269 +262.270 +262.271 +262.272 +262.273 +262.274 +262.275 +262.276 +262.277 +262.278 +262.279 +262.280 +262.281 +262.282 +262.283 +262.284 +262.285 +262.286 +262.287 +262.288 +262.289 +262.290 +262.291 +262.292 +262.293 +262.294 +262.295 +262.296 +262.297 +262.298 +262.299 +262.300 +262.301 +262.302 +262.303 +262.304 +263.238 +263.239 +263.240 +263.241 +263.242 +263.243 +263.244 +263.245 +263.246 +263.249 +263.250 +263.251 +263.252 +263.253 +263.254 +263.255 +263.256 +263.257 +263.258 +263.259 +263.260 +263.261 +263.262 +263.263 +263.264 +263.265 +263.266 +263.267 +263.268 +263.269 +263.270 +263.271 +263.272 +263.273 +263.274 +263.275 +263.276 +263.277 +263.278 +263.279 +263.280 +263.281 +263.282 +263.283 +263.284 +263.285 +263.286 +263.287 +263.288 +263.289 +263.290 +263.291 +263.292 +263.293 +263.294 +263.295 +263.296 +263.297 +263.298 +263.299 +263.300 +263.301 +263.302 +263.303 +263.304 +264.238 +264.239 +264.240 +264.241 +264.242 +264.243 +264.244 +264.245 +264.249 +264.250 +264.251 +264.252 +264.253 +264.254 +264.255 +264.256 +264.257 +264.258 +264.259 +264.260 +264.261 +264.262 +264.263 +264.264 +264.265 +264.266 +264.267 +264.268 +264.269 +264.270 +264.271 +264.272 +264.273 +264.274 +264.275 +264.276 +264.277 +264.278 +264.279 +264.280 +264.281 +264.282 +264.283 +264.284 +264.285 +264.286 +264.287 +264.288 +264.289 +264.290 +264.291 +264.292 +264.293 +264.294 +264.295 +264.296 +264.297 +264.298 +264.299 +264.300 +264.301 +264.302 +264.303 +264.304 +265.238 +265.239 +265.240 +265.241 +265.242 +265.243 +265.244 +265.248 +265.249 +265.250 +265.251 +265.252 +265.253 +265.254 +265.255 +265.256 +265.257 +265.258 +265.259 +265.260 +265.261 +265.262 +265.263 +265.264 +265.265 +265.266 +265.267 +265.268 +265.269 +265.270 +265.271 +265.272 +265.273 +265.274 +265.275 +265.276 +265.277 +265.278 +265.279 +265.280 +265.281 +265.282 +265.283 +265.284 +265.285 +265.286 +265.287 +265.288 +265.289 +265.290 +265.291 +265.292 +265.293 +265.294 +265.295 +265.296 +265.297 +265.298 +265.299 +265.300 +265.301 +265.302 +265.303 +265.304 +266.238 +266.239 +266.240 +266.241 +266.242 +266.243 +266.244 +266.247 +266.248 +266.249 +266.250 +266.251 +266.252 +266.253 +266.254 +266.255 +266.256 +266.257 +266.258 +266.259 +266.260 +266.261 +266.262 +266.263 +266.264 +266.265 +266.266 +266.267 +266.268 +266.269 +266.270 +266.271 +266.272 +266.273 +266.274 +266.275 +266.276 +266.277 +266.278 +266.279 +266.280 +266.281 +266.282 +266.283 +266.284 +266.285 +266.286 +266.287 +266.288 +266.289 +266.290 +266.291 +266.292 +266.293 +266.294 +266.295 +266.296 +266.297 +266.298 +266.299 +266.300 +266.301 +266.302 +266.303 +266.304 +267.238 +267.239 +267.240 +267.241 +267.242 +267.243 +267.246 +267.247 +267.248 +267.249 +267.250 +267.251 +267.252 +267.253 +267.254 +267.255 +267.256 +267.257 +267.258 +267.259 +267.260 +267.261 +267.262 +267.263 +267.264 +267.265 +267.266 +267.267 +267.268 +267.269 +267.270 +267.271 +267.272 +267.273 +267.274 +267.275 +267.276 +267.277 +267.278 +267.279 +267.280 +267.281 +267.282 +267.283 +267.284 +267.285 +267.286 +267.287 +267.288 +267.289 +267.290 +267.291 +267.292 +267.293 +267.294 +267.295 +267.296 +267.297 +267.298 +267.299 +267.300 +267.301 +267.302 +267.303 +268.238 +268.239 +268.240 +268.241 +268.242 +268.243 +268.246 +268.247 +268.248 +268.249 +268.250 +268.251 +268.252 +268.253 +268.254 +268.255 +268.256 +268.257 +268.258 +268.259 +268.260 +268.261 +268.262 +268.263 +268.264 +268.265 +268.266 +268.267 +268.268 +268.269 +268.270 +268.271 +268.272 +268.273 +268.274 +268.275 +268.276 +268.277 +268.278 +268.279 +268.280 +268.281 +268.282 +268.283 +268.284 +268.285 +268.286 +268.287 +268.288 +268.289 +268.290 +268.291 +268.292 +268.293 +268.294 +268.295 +268.296 +268.297 +268.298 +268.299 +268.300 +268.301 +268.302 +268.303 +269.238 +269.239 +269.240 +269.241 +269.242 +269.245 +269.246 +269.247 +269.248 +269.249 +269.250 +269.251 +269.252 +269.253 +269.254 +269.255 +269.256 +269.257 +269.258 +269.259 +269.260 +269.261 +269.262 +269.263 +269.264 +269.265 +269.266 +269.267 +269.268 +269.269 +269.270 +269.271 +269.272 +269.273 +269.274 +269.275 +269.276 +269.277 +269.278 +269.279 +269.280 +269.281 +269.282 +269.283 +269.284 +269.285 +269.286 +269.287 +269.288 +269.289 +269.290 +269.291 +269.292 +269.293 +269.294 +269.295 +269.296 +269.297 +269.298 +269.299 +269.300 +269.301 +269.302 +269.303 +270.238 +270.239 +270.240 +270.241 +270.244 +270.245 +270.246 +270.247 +270.248 +270.249 +270.250 +270.251 +270.252 +270.253 +270.254 +270.255 +270.256 +270.257 +270.258 +270.259 +270.260 +270.261 +270.262 +270.263 +270.264 +270.265 +270.266 +270.267 +270.268 +270.269 +270.270 +270.271 +270.272 +270.273 +270.274 +270.275 +270.276 +270.277 +270.278 +270.279 +270.280 +270.281 +270.282 +270.283 +270.284 +270.285 +270.286 +270.287 +270.288 +270.289 +270.290 +270.291 +270.292 +270.293 +270.294 +270.295 +270.296 +270.297 +270.298 +270.299 +270.300 +270.301 +270.302 +271.238 +271.239 +271.240 +271.244 +271.245 +271.246 +271.247 +271.248 +271.249 +271.250 +271.251 +271.252 +271.253 +271.254 +271.255 +271.256 +271.257 +271.258 +271.259 +271.260 +271.261 +271.262 +271.263 +271.264 +271.265 +271.266 +271.267 +271.268 +271.269 +271.270 +271.271 +271.272 +271.273 +271.274 +271.275 +271.276 +271.277 +271.278 +271.279 +271.280 +271.281 +271.282 +271.283 +271.284 +271.285 +271.286 +271.287 +271.288 +271.289 +271.290 +271.291 +271.292 +271.293 +271.294 +271.295 +271.296 +271.297 +271.298 +271.299 +271.300 +271.301 +271.302 +272.238 +272.239 +272.243 +272.244 +272.245 +272.246 +272.247 +272.248 +272.249 +272.250 +272.251 +272.252 +272.253 +272.254 +272.255 +272.256 +272.257 +272.258 +272.259 +272.260 +272.261 +272.262 +272.263 +272.264 +272.265 +272.266 +272.267 +272.268 +272.269 +272.270 +272.271 +272.272 +272.273 +272.274 +272.275 +272.276 +272.277 +272.278 +272.279 +272.280 +272.281 +272.282 +272.283 +272.284 +272.285 +272.286 +272.287 +272.288 +272.289 +272.290 +272.291 +272.292 +272.293 +272.294 +272.295 +272.296 +272.297 +272.298 +272.299 +272.300 +272.301 +272.302 +273.242 +273.243 +273.244 +273.245 +273.246 +273.247 +273.248 +273.249 +273.250 +273.251 +273.252 +273.253 +273.254 +273.255 +273.256 +273.257 +273.258 +273.259 +273.260 +273.261 +273.262 +273.263 +273.264 +273.265 +273.266 +273.267 +273.268 +273.269 +273.270 +273.271 +273.272 +273.273 +273.274 +273.275 +273.276 +273.277 +273.278 +273.279 +273.280 +273.281 +273.282 +273.283 +273.284 +273.285 +273.286 +273.287 +273.288 +273.289 +273.290 +273.291 +273.292 +273.293 +273.294 +273.295 +273.296 +273.297 +273.298 +273.299 +273.300 +273.301 +273.302 +274.241 +274.242 +274.243 +274.244 +274.245 +274.246 +274.247 +274.248 +274.249 +274.250 +274.251 +274.252 +274.253 +274.254 +274.255 +274.256 +274.257 +274.258 +274.259 +274.260 +274.261 +274.262 +274.263 +274.264 +274.265 +274.266 +274.267 +274.268 +274.269 +274.270 +274.271 +274.272 +274.273 +274.274 +274.275 +274.276 +274.277 +274.278 +274.279 +274.280 +274.281 +274.282 +274.283 +274.284 +274.285 +274.286 +274.287 +274.288 +274.289 +274.290 +274.291 +274.292 +274.293 +274.294 +274.295 +274.296 +274.297 +274.298 +274.299 +274.300 +274.301 +275.241 +275.242 +275.243 +275.244 +275.245 +275.246 +275.247 +275.248 +275.249 +275.250 +275.251 +275.252 +275.253 +275.254 +275.255 +275.256 +275.257 +275.258 +275.259 +275.260 +275.261 +275.262 +275.263 +275.264 +275.265 +275.266 +275.267 +275.268 +275.269 +275.270 +275.271 +275.272 +275.273 +275.274 +275.275 +275.276 +275.277 +275.278 +275.279 +275.280 +275.281 +275.282 +275.283 +275.284 +275.285 +275.286 +275.287 +275.288 +275.289 +275.290 +275.291 +275.292 +275.293 +275.294 +275.295 +275.296 +275.297 +275.298 +275.299 +275.300 +275.301 +276.240 +276.241 +276.242 +276.243 +276.244 +276.245 +276.246 +276.247 +276.248 +276.249 +276.250 +276.251 +276.252 +276.253 +276.254 +276.255 +276.256 +276.257 +276.258 +276.259 +276.260 +276.261 +276.262 +276.263 +276.264 +276.265 +276.266 +276.267 +276.268 +276.269 +276.270 +276.271 +276.272 +276.273 +276.274 +276.275 +276.276 +276.277 +276.278 +276.279 +276.280 +276.281 +276.282 +276.283 +276.284 +276.285 +276.286 +276.287 +276.288 +276.289 +276.290 +276.291 +276.292 +276.293 +276.294 +276.295 +276.296 +276.297 +276.298 +276.299 +276.300 +276.301 +277.240 +277.241 +277.242 +277.243 +277.244 +277.245 +277.246 +277.247 +277.248 +277.249 +277.250 +277.251 +277.252 +277.253 +277.254 +277.255 +277.256 +277.257 +277.258 +277.259 +277.260 +277.261 +277.262 +277.263 +277.264 +277.265 +277.266 +277.267 +277.268 +277.269 +277.270 +277.271 +277.272 +277.273 +277.274 +277.275 +277.276 +277.277 +277.278 +277.279 +277.280 +277.281 +277.282 +277.283 +277.284 +277.285 +277.286 +277.287 +277.288 +277.289 +277.290 +277.291 +277.292 +277.293 +277.294 +277.295 +277.296 +277.297 +277.298 +277.299 +277.300 +278.239 +278.240 +278.241 +278.242 +278.243 +278.244 +278.245 +278.246 +278.247 +278.248 +278.249 +278.250 +278.251 +278.252 +278.253 +278.254 +278.255 +278.256 +278.257 +278.258 +278.259 +278.260 +278.261 +278.262 +278.263 +278.264 +278.265 +278.266 +278.267 +278.268 +278.269 +278.270 +278.271 +278.272 +278.273 +278.274 +278.275 +278.276 +278.277 +278.278 +278.279 +278.280 +278.281 +278.282 +278.283 +278.284 +278.285 +278.286 +278.287 +278.288 +278.289 +278.290 +278.291 +278.292 +278.293 +278.294 +278.295 +278.296 +278.297 +278.298 +278.299 +278.300 +279.239 +279.240 +279.241 +279.242 +279.243 +279.244 +279.245 +279.246 +279.247 +279.248 +279.249 +279.250 +279.251 +279.252 +279.253 +279.254 +279.255 +279.256 +279.257 +279.258 +279.259 +279.260 +279.261 +279.262 +279.263 +279.264 +279.265 +279.266 +279.267 +279.268 +279.269 +279.270 +279.271 +279.272 +279.273 +279.274 +279.275 +279.276 +279.277 +279.278 +279.279 +279.280 +279.281 +279.282 +279.283 +279.284 +279.285 +279.286 +279.287 +279.288 +279.289 +279.290 +279.291 +279.292 +279.293 +279.294 +279.295 +279.296 +279.297 +279.298 +279.299 +279.300 +280.238 +280.239 +280.240 +280.241 +280.242 +280.243 +280.244 +280.245 +280.246 +280.247 +280.248 +280.249 +280.250 +280.251 +280.252 +280.253 +280.254 +280.255 +280.256 +280.257 +280.258 +280.259 +280.260 +280.261 +280.262 +280.263 +280.264 +280.265 +280.266 +280.267 +280.268 +280.269 +280.270 +280.271 +280.272 +280.273 +280.274 +280.275 +280.276 +280.277 +280.278 +280.279 +280.280 +280.281 +280.282 +280.283 +280.284 +280.285 +280.286 +280.287 +280.288 +280.289 +280.290 +280.291 +280.292 +280.293 +280.294 +280.295 +280.296 +280.297 +280.298 +280.299 +280.300 +281.238 +281.239 +281.240 +281.241 +281.242 +281.243 +281.244 +281.245 +281.246 +281.247 +281.248 +281.249 +281.250 +281.251 +281.252 +281.253 +281.254 +281.255 +281.256 +281.257 +281.258 +281.259 +281.260 +281.261 +281.262 +281.263 +281.264 +281.265 +281.266 +281.267 +281.268 +281.269 +281.270 +281.271 +281.272 +281.273 +281.274 +281.275 +281.276 +281.277 +281.278 +281.279 +281.280 +281.281 +281.282 +281.283 +281.284 +281.285 +281.286 +281.287 +281.288 +281.289 +281.290 +281.291 +281.292 +281.293 +281.294 +281.295 +281.296 +281.297 +281.298 +281.299 +282.238 +282.239 +282.240 +282.241 +282.242 +282.243 +282.244 +282.245 +282.246 +282.247 +282.248 +282.249 +282.250 +282.251 +282.252 +282.253 +282.254 +282.255 +282.256 +282.257 +282.258 +282.259 +282.260 +282.261 +282.262 +282.263 +282.264 +282.265 +282.266 +282.267 +282.268 +282.269 +282.270 +282.271 +282.272 +282.273 +282.274 +282.275 +282.276 +282.277 +282.278 +282.279 +282.280 +282.281 +282.282 +282.283 +282.284 +282.285 +282.286 +282.287 +282.288 +282.289 +282.290 +282.291 +282.292 +282.293 +282.294 +282.295 +282.296 +282.297 +282.298 +282.299 +283.238 +283.239 +283.240 +283.241 +283.242 +283.243 +283.244 +283.245 +283.246 +283.247 +283.248 +283.249 +283.250 +283.251 +283.252 +283.253 +283.254 +283.255 +283.256 +283.257 +283.258 +283.259 +283.260 +283.261 +283.262 +283.263 +283.264 +283.265 +283.266 +283.267 +283.268 +283.269 +283.270 +283.271 +283.272 +283.273 +283.274 +283.275 +283.276 +283.277 +283.278 +283.279 +283.280 +283.281 +283.282 +283.283 +283.284 +283.285 +283.286 +283.287 +283.288 +283.289 +283.290 +283.291 +283.292 +283.293 +283.294 +283.295 +283.296 +283.297 +283.298 +283.299 +284.238 +284.239 +284.240 +284.241 +284.242 +284.243 +284.244 +284.245 +284.246 +284.247 +284.248 +284.249 +284.250 +284.251 +284.252 +284.253 +284.254 +284.255 +284.256 +284.257 +284.258 +284.259 +284.260 +284.261 +284.262 +284.263 +284.264 +284.265 +284.266 +284.267 +284.268 +284.269 +284.270 +284.271 +284.272 +284.273 +284.274 +284.275 +284.276 +284.277 +284.278 +284.279 +284.280 +284.281 +284.282 +284.283 +284.284 +284.285 +284.286 +284.287 +284.288 +284.289 +284.290 +284.291 +284.292 +284.293 +284.294 +284.295 +284.296 +284.297 +284.298 +284.299 +285.238 +285.239 +285.240 +285.241 +285.242 +285.243 +285.244 +285.245 +285.246 +285.247 +285.248 +285.249 +285.250 +285.251 +285.252 +285.253 +285.254 +285.255 +285.256 +285.257 +285.258 +285.259 +285.260 +285.261 +285.262 +285.263 +285.264 +285.265 +285.266 +285.267 +285.268 +285.269 +285.270 +285.271 +285.272 +285.273 +285.274 +285.275 +285.276 +285.277 +285.278 +285.279 +285.280 +285.281 +285.282 +285.283 +285.284 +285.285 +285.286 +285.287 +285.288 +285.289 +285.290 +285.291 +285.292 +285.293 +285.294 +285.295 +285.296 +285.297 +285.298 +286.238 +286.239 +286.240 +286.241 +286.242 +286.243 +286.244 +286.245 +286.246 +286.247 +286.248 +286.249 +286.250 +286.251 +286.252 +286.253 +286.254 +286.255 +286.256 +286.257 +286.258 +286.259 +286.260 +286.261 +286.262 +286.263 +286.264 +286.265 +286.266 +286.267 +286.268 +286.269 +286.270 +286.271 +286.272 +286.273 +286.274 +286.275 +286.276 +286.277 +286.278 +286.279 +286.280 +286.281 +286.282 +286.283 +286.284 +286.285 +286.286 +286.287 +286.288 +286.289 +286.290 +286.291 +286.292 +286.293 +286.294 +286.295 +286.296 +286.297 +286.298 +287.238 +287.239 +287.240 +287.241 +287.242 +287.243 +287.244 +287.245 +287.246 +287.247 +287.248 +287.249 +287.250 +287.251 +287.252 +287.253 +287.254 +287.255 +287.256 +287.257 +287.258 +287.259 +287.260 +287.261 +287.262 +287.263 +287.264 +287.265 +287.266 +287.267 +287.268 +287.269 +287.270 +287.271 +287.272 +287.273 +287.274 +287.275 +287.276 +287.277 +287.278 +287.279 +287.280 +287.281 +287.282 +287.283 +287.284 +287.285 +287.286 +287.287 +287.288 +287.289 +287.290 +287.291 +287.292 +287.293 +287.294 +287.295 +287.296 +287.297 +287.298 +288.238 +288.239 +288.240 +288.241 +288.242 +288.243 +288.244 +288.245 +288.246 +288.247 +288.248 +288.249 +288.250 +288.251 +288.252 +288.253 +288.254 +288.255 +288.256 +288.257 +288.258 +288.259 +288.260 +288.261 +288.262 +288.263 +288.264 +288.265 +288.266 +288.267 +288.268 +288.269 +288.270 +288.271 +288.272 +288.273 +288.274 +288.275 +288.276 +288.277 +288.278 +288.279 +288.280 +288.281 +288.282 +288.283 +288.284 +288.285 +288.286 +288.287 +288.288 +288.289 +288.290 +288.291 +288.292 +288.293 +288.294 +288.295 +288.296 +288.297 +288.298 +289.238 +289.239 +289.240 +289.241 +289.242 +289.243 +289.244 +289.245 +289.246 +289.247 +289.248 +289.249 +289.250 +289.251 +289.252 +289.253 +289.254 +289.255 +289.256 +289.257 +289.258 +289.259 +289.260 +289.261 +289.262 +289.263 +289.264 +289.265 +289.266 +289.267 +289.268 +289.269 +289.270 +289.271 +289.272 +289.273 +289.274 +289.275 +289.276 +289.277 +289.278 +289.279 +289.280 +289.281 +289.282 +289.283 +289.284 +289.285 +289.286 +289.287 +289.288 +289.289 +289.290 +289.291 +289.292 +289.293 +289.294 +289.295 +289.296 +289.297 +290.238 +290.239 +290.240 +290.241 +290.242 +290.243 +290.244 +290.245 +290.246 +290.247 +290.248 +290.249 +290.250 +290.251 +290.252 +290.253 +290.254 +290.255 +290.256 +290.257 +290.258 +290.259 +290.260 +290.261 +290.262 +290.263 +290.264 +290.265 +290.266 +290.267 +290.268 +290.269 +290.270 +290.271 +290.272 +290.273 +290.274 +290.275 +290.276 +290.277 +290.278 +290.279 +290.280 +290.281 +290.282 +290.283 +290.284 +290.285 +290.286 +290.287 +290.288 +290.289 +290.290 +290.291 +290.292 +290.293 +290.294 +290.295 +290.296 +290.297 +291.238 +291.239 +291.240 +291.241 +291.242 +291.243 +291.244 +291.245 +291.246 +291.247 +291.248 +291.249 +291.250 +291.251 +291.252 +291.253 +291.254 +291.255 +291.256 +291.257 +291.258 +291.259 +291.260 +291.261 +291.262 +291.263 +291.264 +291.265 +291.266 +291.267 +291.268 +291.269 +291.270 +291.271 +291.272 +291.273 +291.274 +291.275 +291.276 +291.277 +291.278 +291.279 +291.280 +291.281 +291.282 +291.283 +291.284 +291.285 +291.286 +291.287 +291.288 +291.289 +291.290 +291.291 +291.292 +291.293 +291.294 +291.295 +291.296 +291.297 +292.238 +292.239 +292.240 +292.241 +292.242 +292.243 +292.244 +292.245 +292.246 +292.247 +292.248 +292.249 +292.250 +292.251 +292.252 +292.253 +292.254 +292.255 +292.256 +292.257 +292.258 +292.259 +292.260 +292.261 +292.262 +292.263 +292.264 +292.265 +292.266 +292.267 +292.268 +292.269 +292.270 +292.271 +292.272 +292.273 +292.274 +292.275 +292.276 +292.277 +292.278 +292.279 +292.280 +292.281 +292.282 +292.283 +292.284 +292.285 +292.286 +292.287 +292.288 +292.289 +292.290 +292.291 +292.292 +292.293 +292.294 +292.295 +292.296 +292.297 +293.238 +293.239 +293.240 +293.241 +293.242 +293.243 +293.244 +293.245 +293.246 +293.247 +293.248 +293.249 +293.250 +293.251 +293.252 +293.253 +293.254 +293.255 +293.256 +293.257 +293.258 +293.259 +293.260 +293.261 +293.262 +293.263 +293.264 +293.265 +293.266 +293.267 +293.268 +293.269 +293.270 +293.271 +293.272 +293.273 +293.274 +293.275 +293.276 +293.277 +293.278 +293.279 +293.280 +293.281 +293.282 +293.283 +293.284 +293.285 +293.286 +293.287 +293.288 +293.289 +293.290 +293.291 +293.292 +293.293 +293.294 +293.295 +293.296 +294.238 +294.239 +294.240 +294.241 +294.242 +294.243 +294.244 +294.245 +294.246 +294.247 +294.248 +294.249 +294.250 +294.251 +294.252 +294.253 +294.254 +294.255 +294.256 +294.257 +294.258 +294.259 +294.260 +294.261 +294.262 +294.263 +294.264 +294.265 +294.266 +294.267 +294.268 +294.269 +294.270 +294.271 +294.272 +294.273 +294.274 +294.275 +294.276 +294.277 +294.278 +294.279 +294.280 +294.281 +294.282 +294.283 +294.284 +294.285 +294.286 +294.287 +294.288 +294.289 +294.290 +294.291 +294.292 +294.293 +294.294 +294.295 +294.296 +295.238 +295.239 +295.240 +295.241 +295.242 +295.243 +295.244 +295.245 +295.246 +295.247 +295.248 +295.249 +295.250 +295.251 +295.252 +295.253 +295.254 +295.255 +295.256 +295.257 +295.258 +295.259 +295.260 +295.261 +295.262 +295.263 +295.264 +295.265 +295.266 +295.267 +295.268 +295.269 +295.270 +295.271 +295.272 +295.273 +295.274 +295.275 +295.276 +295.277 +295.278 +295.279 +295.280 +295.281 +295.282 +295.283 +295.284 +295.285 +295.286 +295.287 +295.288 +295.289 +295.290 +295.291 +295.292 +295.293 +295.294 +295.295 +295.296 +296.238 +296.239 +296.240 +296.241 +296.242 +296.243 +296.244 +296.245 +296.246 +296.247 +296.248 +296.249 +296.250 +296.251 +296.252 +296.253 +296.254 +296.255 +296.256 +296.257 +296.258 +296.259 +296.260 +296.261 +296.262 +296.263 +296.264 +296.265 +296.266 +296.267 +296.268 +296.269 +296.270 +296.271 +296.272 +296.273 +296.274 +296.275 +296.276 +296.277 +296.278 +296.279 +296.280 +296.281 +296.282 +296.283 +296.284 +296.285 +296.286 +296.287 +296.288 +296.289 +296.290 +296.291 +296.292 +296.293 +296.294 +296.295 +296.296 +297.238 +297.239 +297.240 +297.241 +297.242 +297.243 +297.244 +297.245 +297.246 +297.247 +297.248 +297.249 +297.250 +297.251 +297.252 +297.253 +297.254 +297.255 +297.256 +297.257 +297.258 +297.259 +297.260 +297.261 +297.262 +297.263 +297.264 +297.265 +297.266 +297.267 +297.268 +297.269 +297.270 +297.271 +297.272 +297.273 +297.274 +297.275 +297.276 +297.277 +297.278 +297.279 +297.280 +297.281 +297.282 +297.283 +297.284 +297.285 +297.286 +297.287 +297.288 +297.289 +297.290 +297.291 +297.292 +297.293 +297.294 +297.295 +298.238 +298.239 +298.240 +298.241 +298.242 +298.243 +298.244 +298.245 +298.246 +298.247 +298.248 +298.249 +298.250 +298.251 +298.252 +298.253 +298.254 +298.255 +298.256 +298.257 +298.258 +298.259 +298.260 +298.261 +298.262 +298.263 +298.264 +298.265 +298.266 +298.267 +298.268 +298.269 +298.270 +298.271 +298.272 +298.273 +298.274 +298.275 +298.276 +298.277 +298.278 +298.279 +298.280 +298.281 +298.282 +298.283 +298.284 +298.285 +298.286 +298.287 +298.288 +298.289 +298.290 +298.291 +298.292 +298.293 +298.294 +298.295 +299.183 +299.184 +299.185 +299.238 +299.239 +299.240 +299.241 +299.242 +299.243 +299.244 +299.245 +299.246 +299.247 +299.248 +299.249 +299.250 +299.251 +299.252 +299.253 +299.254 +299.255 +299.256 +299.257 +299.258 +299.259 +299.260 +299.261 +299.262 +299.263 +299.264 +299.265 +299.266 +299.267 +299.268 +299.269 +299.270 +299.271 +299.272 +299.273 +299.274 +299.275 +299.276 +299.277 +299.278 +299.279 +299.280 +299.281 +299.282 +299.283 +299.284 +299.285 +299.286 +299.287 +299.288 +299.289 +299.290 +299.291 +299.292 +299.293 +299.294 +299.295 +300.183 +300.184 +300.185 +300.238 +300.239 +300.240 +300.241 +300.242 +300.243 +300.244 +300.245 +300.246 +300.247 +300.248 +300.249 +300.250 +300.251 +300.252 +300.253 +300.254 +300.255 +300.256 +300.257 +300.258 +300.259 +300.260 +300.261 +300.262 +300.263 +300.264 +300.265 +300.266 +300.267 +300.268 +300.269 +300.270 +300.271 +300.272 +300.273 +300.274 +300.275 +300.276 +300.277 +300.278 +300.279 +300.280 +300.281 +300.282 +300.283 +300.284 +300.285 +300.286 +300.287 +300.288 +300.289 +300.290 +300.291 +300.292 +300.293 +300.294 +300.295 +301.183 +301.184 +301.185 +301.238 +301.239 +301.240 +301.241 +301.242 +301.243 +301.244 +301.245 +301.246 +301.247 +301.248 +301.249 +301.250 +301.251 +301.252 +301.253 +301.254 +301.255 +301.256 +301.257 +301.258 +301.259 +301.260 +301.261 +301.262 +301.263 +301.264 +301.265 +301.266 +301.268 +301.269 +301.270 +301.271 +301.272 +301.273 +301.274 +301.275 +301.276 +301.277 +301.278 +301.279 +301.280 +301.281 +301.282 +301.283 +301.284 +301.285 +301.286 +301.287 +301.288 +301.289 +301.290 +301.291 +301.292 +301.293 +301.294 +302.238 +302.239 +302.240 +302.241 +302.242 +302.243 +302.244 +302.245 +302.246 +302.247 +302.248 +302.249 +302.250 +302.251 +302.252 +302.253 +302.254 +302.255 +302.256 +302.257 +302.258 +302.259 +302.260 +302.261 +302.262 +302.263 +302.264 +302.265 +302.266 +302.268 +302.269 +302.270 +302.271 +302.272 +302.273 +302.274 +302.275 +302.276 +302.277 +302.278 +302.279 +302.280 +302.281 +302.282 +302.283 +302.284 +302.285 +302.286 +302.287 +302.288 +302.289 +302.290 +302.291 +302.292 +302.293 +302.294 +303.238 +303.239 +303.240 +303.241 +303.242 +303.243 +303.244 +303.245 +303.246 +303.247 +303.248 +303.249 +303.250 +303.251 +303.252 +303.253 +303.254 +303.255 +303.256 +303.257 +303.258 +303.259 +303.260 +303.261 +303.262 +303.263 +303.264 +303.265 +303.268 +303.269 +303.270 +303.271 +303.272 +303.273 +303.274 +303.275 +303.276 +303.277 +303.278 +303.279 +303.280 +303.281 +303.282 +303.283 +303.284 +303.285 +303.286 +303.287 +303.288 +303.289 +303.290 +303.291 +303.292 +303.293 +303.294 +304.238 +304.239 +304.240 +304.241 +304.242 +304.243 +304.244 +304.245 +304.246 +304.247 +304.248 +304.249 +304.250 +304.251 +304.252 +304.253 +304.254 +304.255 +304.256 +304.257 +304.258 +304.259 +304.260 +304.261 +304.262 +304.263 +304.264 +304.265 +304.268 +304.269 +304.270 +304.271 +304.272 +304.273 +304.274 +304.275 +304.276 +304.277 +304.278 +304.279 +304.280 +304.281 +304.282 +304.283 +304.284 +304.285 +304.286 +304.287 +304.288 +304.289 +304.290 +304.291 +304.292 +304.293 +304.294 +305.238 +305.239 +305.240 +305.241 +305.242 +305.243 +305.244 +305.245 +305.246 +305.247 +305.248 +305.249 +305.250 +305.251 +305.252 +305.253 +305.254 +305.255 +305.256 +305.257 +305.258 +305.259 +305.260 +305.261 +305.262 +305.263 +305.264 +305.265 +305.268 +305.269 +305.270 +305.271 +305.272 +305.273 +305.274 +305.275 +305.276 +305.277 +305.278 +305.279 +305.280 +305.281 +305.282 +305.283 +305.284 +305.285 +305.286 +305.287 +305.288 +305.289 +305.290 +305.291 +305.292 +305.293 +306.238 +306.239 +306.240 +306.241 +306.242 +306.243 +306.244 +306.245 +306.246 +306.247 +306.248 +306.249 +306.250 +306.251 +306.252 +306.253 +306.254 +306.255 +306.256 +306.257 +306.258 +306.259 +306.260 +306.261 +306.262 +306.263 +306.264 +306.268 +306.269 +306.270 +306.271 +306.272 +306.273 +306.274 +306.275 +306.276 +306.277 +306.278 +306.279 +306.280 +306.281 +306.282 +306.283 +306.284 +306.285 +306.286 +306.287 +306.288 +306.289 +306.290 +306.291 +306.292 +306.293 +307.238 +307.239 +307.240 +307.241 +307.242 +307.243 +307.244 +307.245 +307.246 +307.247 +307.248 +307.249 +307.250 +307.251 +307.252 +307.253 +307.254 +307.255 +307.256 +307.257 +307.258 +307.259 +307.260 +307.261 +307.262 +307.263 +307.264 +307.268 +307.269 +307.270 +307.271 +307.272 +307.273 +307.274 +307.275 +307.276 +307.277 +307.278 +307.279 +307.280 +307.281 +307.282 +307.283 +307.284 +307.285 +307.286 +307.287 +307.288 +307.289 +307.290 +307.291 +307.292 +307.293 +308.238 +308.239 +308.240 +308.241 +308.242 +308.243 +308.244 +308.245 +308.246 +308.247 +308.248 +308.249 +308.250 +308.251 +308.252 +308.253 +308.254 +308.255 +308.257 +308.258 +308.259 +308.260 +308.261 +308.262 +308.263 +308.268 +308.269 +308.270 +308.271 +308.272 +308.273 +308.274 +308.275 +308.276 +308.277 +308.278 +308.279 +308.280 +308.281 +308.282 +308.283 +308.284 +308.285 +308.286 +308.287 +308.288 +308.289 +308.290 +308.291 +308.292 +308.293 +309.238 +309.239 +309.240 +309.241 +309.242 +309.243 +309.244 +309.245 +309.246 +309.247 +309.248 +309.249 +309.250 +309.251 +309.252 +309.253 +309.254 +309.255 +309.257 +309.258 +309.259 +309.260 +309.261 +309.262 +309.263 +309.268 +309.269 +309.270 +309.271 +309.272 +309.273 +309.274 +309.275 +309.276 +309.277 +309.278 +309.279 +309.280 +309.281 +309.282 +309.283 +309.284 +309.285 +309.286 +309.287 +309.288 +309.289 +309.290 +309.291 +309.292 +309.293 +310.238 +310.239 +310.240 +310.241 +310.242 +310.243 +310.244 +310.245 +310.246 +310.247 +310.248 +310.249 +310.250 +310.251 +310.252 +310.253 +310.254 +310.255 +310.257 +310.258 +310.259 +310.260 +310.261 +310.262 +310.268 +310.269 +310.270 +310.271 +310.272 +310.273 +310.274 +310.275 +310.276 +310.277 +310.278 +310.279 +310.280 +310.281 +310.282 +310.283 +310.284 +310.285 +310.286 +310.287 +310.288 +310.289 +310.290 +310.291 +310.292 +311.238 +311.239 +311.240 +311.241 +311.242 +311.243 +311.244 +311.245 +311.246 +311.247 +311.248 +311.249 +311.250 +311.251 +311.252 +311.253 +311.254 +311.255 +311.257 +311.258 +311.259 +311.260 +311.261 +311.262 +311.268 +311.269 +311.270 +311.271 +311.272 +311.273 +311.274 +311.275 +311.276 +311.277 +311.278 +311.279 +311.280 +311.281 +311.282 +311.283 +311.284 +311.285 +311.286 +311.287 +311.288 +311.289 +311.290 +311.291 +311.292 +312.238 +312.239 +312.240 +312.241 +312.242 +312.243 +312.244 +312.245 +312.246 +312.247 +312.248 +312.249 +312.250 +312.251 +312.252 +312.253 +312.254 +312.255 +312.257 +312.258 +312.259 +312.260 +312.261 +312.267 +312.268 +312.269 +312.270 +312.271 +312.272 +312.273 +312.274 +312.275 +312.276 +312.277 +312.278 +312.279 +312.280 +312.281 +312.282 +312.283 +312.284 +312.285 +312.286 +312.287 +312.288 +312.289 +312.290 +312.291 +312.292 +313.238 +313.239 +313.240 +313.241 +313.242 +313.243 +313.244 +313.245 +313.246 +313.247 +313.248 +313.249 +313.250 +313.251 +313.252 +313.253 +313.254 +313.255 +313.257 +313.258 +313.259 +313.260 +313.261 +313.267 +313.268 +313.269 +313.270 +313.271 +313.272 +313.273 +313.274 +313.275 +313.276 +313.277 +313.278 +313.279 +313.280 +313.281 +313.282 +313.283 +313.284 +313.285 +313.286 +313.287 +313.288 +313.289 +313.290 +313.291 +314.238 +314.239 +314.240 +314.241 +314.242 +314.243 +314.244 +314.245 +314.246 +314.247 +314.248 +314.249 +314.250 +314.251 +314.252 +314.253 +314.254 +314.255 +314.257 +314.258 +314.259 +314.266 +314.267 +314.268 +314.269 +314.270 +314.271 +314.272 +314.273 +314.274 +314.275 +314.276 +314.277 +314.278 +314.279 +314.280 +314.281 +314.282 +314.283 +314.284 +314.285 +314.286 +314.287 +314.288 +314.289 +314.290 +314.291 +315.238 +315.239 +315.240 +315.241 +315.242 +315.243 +315.244 +315.245 +315.246 +315.247 +315.248 +315.249 +315.250 +315.251 +315.252 +315.253 +315.254 +315.255 +315.257 +315.258 +315.259 +315.266 +315.267 +315.268 +315.269 +315.270 +315.271 +315.272 +315.273 +315.274 +315.275 +315.276 +315.277 +315.278 +315.279 +315.280 +315.281 +315.282 +315.283 +315.284 +315.285 +315.286 +315.287 +315.288 +315.289 +315.290 +315.291 +316.238 +316.239 +316.240 +316.241 +316.242 +316.243 +316.244 +316.245 +316.246 +316.247 +316.248 +316.249 +316.250 +316.251 +316.252 +316.253 +316.254 +316.255 +316.257 +316.258 +316.266 +316.267 +316.268 +316.269 +316.270 +316.271 +316.272 +316.273 +316.274 +316.275 +316.276 +316.277 +316.278 +316.279 +316.280 +316.281 +316.282 +316.283 +316.284 +316.285 +316.286 +316.287 +316.288 +316.289 +316.290 +316.291 +317.238 +317.239 +317.240 +317.241 +317.242 +317.243 +317.244 +317.245 +317.246 +317.247 +317.248 +317.249 +317.250 +317.251 +317.252 +317.253 +317.254 +317.255 +317.257 +317.258 +317.265 +317.266 +317.267 +317.268 +317.269 +317.270 +317.271 +317.272 +317.273 +317.274 +317.275 +317.276 +317.277 +317.278 +317.279 +317.280 +317.281 +317.282 +317.283 +317.284 +317.285 +317.286 +317.287 +317.288 +317.289 +317.290 +318.238 +318.239 +318.240 +318.241 +318.242 +318.243 +318.244 +318.245 +318.246 +318.247 +318.248 +318.249 +318.250 +318.251 +318.252 +318.253 +318.254 +318.255 +318.257 +318.265 +318.266 +318.267 +318.268 +318.269 +318.270 +318.271 +318.272 +318.273 +318.274 +318.275 +318.276 +318.277 +318.278 +318.279 +318.280 +318.281 +318.282 +318.283 +318.284 +318.285 +318.286 +318.287 +318.288 +318.289 +318.290 +319.238 +319.239 +319.240 +319.241 +319.242 +319.243 +319.244 +319.245 +319.246 +319.247 +319.248 +319.249 +319.250 +319.251 +319.252 +319.253 +319.254 +319.255 +319.257 +319.264 +319.265 +319.266 +319.267 +319.268 +319.269 +319.270 +319.271 +319.272 +319.273 +319.274 +319.275 +319.276 +319.277 +319.278 +319.279 +319.280 +319.281 +319.282 +319.283 +319.284 +319.285 +319.286 +319.287 +319.288 +319.289 +319.290 +320.238 +320.239 +320.240 +320.241 +320.242 +320.243 +320.244 +320.245 +320.246 +320.247 +320.248 +320.249 +320.250 +320.251 +320.252 +320.253 +320.254 +320.255 +320.264 +320.265 +320.266 +320.267 +320.268 +320.269 +320.270 +320.271 +320.272 +320.273 +320.274 +320.275 +320.276 +320.277 +320.278 +320.279 +320.280 +320.281 +320.282 +320.283 +320.284 +320.285 +320.286 +320.287 +320.288 +320.289 +320.290 +321.238 +321.239 +321.240 +321.241 +321.242 +321.243 +321.244 +321.245 +321.246 +321.247 +321.248 +321.249 +321.250 +321.251 +321.252 +321.253 +321.254 +321.255 +321.263 +321.264 +321.265 +321.266 +321.267 +321.268 +321.269 +321.270 +321.271 +321.272 +321.273 +321.274 +321.275 +321.276 +321.277 +321.278 +321.279 +321.280 +321.281 +321.282 +321.283 +321.284 +321.285 +321.286 +321.287 +321.288 +321.289 +322.238 +322.239 +322.240 +322.241 +322.242 +322.243 +322.244 +322.245 +322.246 +322.247 +322.248 +322.249 +322.250 +322.251 +322.252 +322.253 +322.254 +322.263 +322.264 +322.265 +322.266 +322.267 +322.268 +322.269 +322.270 +322.271 +322.272 +322.273 +322.274 +322.275 +322.276 +322.277 +322.278 +322.279 +322.280 +322.281 +322.282 +322.283 +322.284 +322.285 +322.286 +322.287 +322.288 +322.289 +323.238 +323.239 +323.240 +323.241 +323.242 +323.243 +323.244 +323.245 +323.246 +323.247 +323.248 +323.249 +323.250 +323.251 +323.252 +323.253 +323.254 +323.261 +323.262 +323.263 +323.264 +323.265 +323.266 +323.267 +323.268 +323.269 +323.270 +323.271 +323.272 +323.273 +323.274 +323.275 +323.276 +323.277 +323.278 +323.279 +323.280 +323.281 +323.282 +323.283 +323.284 +323.285 +323.286 +323.287 +323.288 +323.289 +324.238 +324.239 +324.240 +324.241 +324.242 +324.243 +324.244 +324.245 +324.246 +324.247 +324.248 +324.249 +324.250 +324.251 +324.252 +324.253 +324.261 +324.262 +324.263 +324.264 +324.265 +324.266 +324.267 +324.268 +324.269 +324.270 +324.271 +324.272 +324.273 +324.274 +324.275 +324.276 +324.277 +324.278 +324.279 +324.280 +324.281 +324.282 +324.283 +324.284 +324.285 +324.286 +324.287 +324.288 +324.289 +325.238 +325.239 +325.240 +325.241 +325.242 +325.243 +325.244 +325.245 +325.246 +325.247 +325.248 +325.249 +325.250 +325.251 +325.252 +325.253 +325.260 +325.261 +325.262 +325.263 +325.264 +325.265 +325.266 +325.267 +325.268 +325.269 +325.270 +325.271 +325.272 +325.273 +325.274 +325.275 +325.276 +325.277 +325.278 +325.279 +325.280 +325.281 +325.282 +325.283 +325.284 +325.285 +325.286 +325.287 +325.288 +326.238 +326.239 +326.240 +326.241 +326.242 +326.243 +326.244 +326.245 +326.246 +326.247 +326.248 +326.249 +326.250 +326.251 +326.252 +326.260 +326.261 +326.262 +326.263 +326.264 +326.265 +326.266 +326.267 +326.268 +326.269 +326.270 +326.271 +326.272 +326.273 +326.274 +326.275 +326.276 +326.277 +326.278 +326.279 +326.280 +326.281 +326.282 +326.283 +326.284 +326.285 +326.286 +326.287 +326.288 +327.238 +327.239 +327.240 +327.241 +327.242 +327.243 +327.244 +327.245 +327.246 +327.247 +327.248 +327.249 +327.250 +327.251 +327.252 +327.259 +327.260 +327.261 +327.262 +327.263 +327.264 +327.265 +327.266 +327.267 +327.268 +327.269 +327.270 +327.271 +327.272 +327.273 +327.274 +327.275 +327.276 +327.277 +327.278 +327.279 +327.280 +327.281 +327.282 +327.283 +327.284 +327.285 +327.286 +327.287 +327.288 +328.238 +328.239 +328.240 +328.241 +328.242 +328.243 +328.244 +328.245 +328.246 +328.247 +328.248 +328.249 +328.250 +328.251 +328.259 +328.260 +328.261 +328.262 +328.263 +328.264 +328.265 +328.266 +328.267 +328.268 +328.269 +328.270 +328.271 +328.272 +328.273 +328.274 +328.275 +328.276 +328.277 +328.278 +328.279 +328.280 +328.281 +328.282 +328.283 +328.284 +328.285 +328.286 +328.287 +329.238 +329.239 +329.240 +329.241 +329.242 +329.243 +329.244 +329.245 +329.246 +329.247 +329.248 +329.249 +329.250 +329.251 +329.258 +329.259 +329.260 +329.261 +329.262 +329.263 +329.264 +329.265 +329.266 +329.267 +329.268 +329.269 +329.270 +329.271 +329.272 +329.273 +329.274 +329.275 +329.276 +329.277 +329.278 +329.279 +329.280 +329.281 +329.282 +329.283 +329.284 +329.285 +329.286 +329.287 +330.238 +330.239 +330.240 +330.241 +330.242 +330.243 +330.244 +330.245 +330.246 +330.247 +330.248 +330.249 +330.250 +330.258 +330.259 +330.260 +330.261 +330.262 +330.263 +330.264 +330.265 +330.266 +330.267 +330.268 +330.269 +330.270 +330.271 +330.272 +330.273 +330.274 +330.275 +330.276 +330.277 +330.278 +330.279 +330.280 +330.281 +330.282 +330.283 +330.284 +330.285 +330.286 +330.287 +331.238 +331.239 +331.240 +331.241 +331.242 +331.243 +331.244 +331.245 +331.246 +331.247 +331.248 +331.249 +331.250 +331.257 +331.258 +331.259 +331.260 +331.261 +331.262 +331.263 +331.264 +331.265 +331.266 +331.267 +331.268 +331.269 +331.270 +331.271 +331.272 +331.273 +331.274 +331.275 +331.276 +331.277 +331.278 +331.279 +331.280 +331.281 +331.282 +331.283 +331.284 +331.285 +331.286 +331.287 +332.238 +332.239 +332.240 +332.241 +332.242 +332.243 +332.244 +332.245 +332.246 +332.247 +332.248 +332.249 +332.250 +332.257 +332.258 +332.259 +332.260 +332.261 +332.262 +332.263 +332.264 +332.265 +332.266 +332.267 +332.268 +332.269 +332.270 +332.271 +332.272 +332.273 +332.274 +332.275 +332.276 +332.277 +332.278 +332.279 +332.280 +332.281 +332.282 +332.283 +332.284 +332.285 +332.286 +333.238 +333.239 +333.240 +333.241 +333.242 +333.243 +333.244 +333.245 +333.246 +333.247 +333.248 +333.249 +333.250 +333.256 +333.257 +333.258 +333.259 +333.260 +333.261 +333.262 +333.263 +333.264 +333.265 +333.266 +333.267 +333.268 +333.269 +333.270 +333.271 +333.272 +333.273 +333.274 +333.275 +333.276 +333.277 +333.278 +333.279 +333.280 +333.281 +333.282 +333.283 +333.284 +333.285 +333.286 +334.238 +334.239 +334.240 +334.241 +334.242 +334.243 +334.244 +334.245 +334.246 +334.247 +334.248 +334.249 +334.250 +334.255 +334.256 +334.257 +334.258 +334.259 +334.260 +334.261 +334.262 +334.263 +334.264 +334.265 +334.266 +334.267 +334.268 +334.269 +334.270 +334.271 +334.272 +334.273 +334.274 +334.275 +334.276 +334.277 +334.278 +334.279 +334.280 +334.281 +334.282 +334.283 +334.284 +334.285 +334.286 +335.238 +335.239 +335.240 +335.241 +335.242 +335.243 +335.244 +335.245 +335.246 +335.247 +335.248 +335.249 +335.250 +335.255 +335.256 +335.257 +335.258 +335.259 +335.260 +335.261 +335.262 +335.263 +335.264 +335.265 +335.266 +335.267 +335.268 +335.269 +335.270 +335.271 +335.272 +335.273 +335.274 +335.275 +335.276 +335.277 +335.278 +335.279 +335.280 +335.281 +335.282 +335.283 +335.284 +335.285 +335.286 +336.238 +336.239 +336.240 +336.241 +336.242 +336.243 +336.244 +336.245 +336.246 +336.247 +336.248 +336.249 +336.250 +336.254 +336.255 +336.256 +336.257 +336.258 +336.259 +336.260 +336.261 +336.262 +336.263 +336.264 +336.265 +336.266 +336.267 +336.268 +336.269 +336.270 +336.271 +336.272 +336.273 +336.274 +336.275 +336.276 +336.277 +336.278 +336.279 +336.280 +336.281 +336.282 +336.283 +336.284 +336.285 +337.238 +337.239 +337.240 +337.241 +337.242 +337.243 +337.244 +337.245 +337.246 +337.247 +337.248 +337.249 +337.250 +337.253 +337.254 +337.255 +337.256 +337.257 +337.258 +337.259 +337.260 +337.261 +337.262 +337.263 +337.264 +337.265 +337.266 +337.267 +337.268 +337.269 +337.270 +337.271 +337.272 +337.273 +337.274 +337.275 +337.276 +337.277 +337.278 +337.279 +337.280 +337.281 +337.282 +337.283 +337.284 +337.285 +338.238 +338.239 +338.240 +338.241 +338.242 +338.243 +338.244 +338.245 +338.246 +338.247 +338.248 +338.249 +338.250 +338.253 +338.254 +338.255 +338.256 +338.257 +338.258 +338.259 +338.260 +338.261 +338.262 +338.263 +338.264 +338.265 +338.266 +338.267 +338.268 +338.269 +338.270 +338.271 +338.272 +338.273 +338.274 +338.275 +338.276 +338.277 +338.278 +338.279 +338.280 +338.281 +338.282 +338.283 +338.284 +338.285 +339.238 +339.239 +339.240 +339.241 +339.242 +339.243 +339.244 +339.245 +339.246 +339.247 +339.248 +339.249 +339.250 +339.252 +339.253 +339.254 +339.255 +339.256 +339.257 +339.258 +339.259 +339.260 +339.261 +339.262 +339.263 +339.264 +339.265 +339.266 +339.267 +339.268 +339.269 +339.270 +339.271 +339.272 +339.273 +339.274 +339.275 +339.276 +339.277 +339.278 +339.279 +339.280 +339.281 +339.282 +339.283 +339.284 +339.285 +340.238 +340.239 +340.240 +340.241 +340.242 +340.243 +340.244 +340.245 +340.246 +340.247 +340.248 +340.249 +340.250 +340.252 +340.253 +340.254 +340.255 +340.256 +340.257 +340.258 +340.259 +340.260 +340.261 +340.262 +340.263 +340.264 +340.265 +340.266 +340.267 +340.268 +340.269 +340.270 +340.271 +340.272 +340.273 +340.274 +340.275 +340.276 +340.277 +340.278 +340.279 +340.280 +340.281 +340.282 +340.283 +340.284 +341.238 +341.239 +341.240 +341.241 +341.242 +341.243 +341.244 +341.245 +341.246 +341.247 +341.248 +341.249 +341.250 +341.251 +341.252 +341.253 +341.254 +341.255 +341.256 +341.257 +341.258 +341.259 +341.260 +341.261 +341.262 +341.263 +341.264 +341.265 +341.266 +341.267 +341.268 +341.269 +341.270 +341.271 +341.272 +341.273 +341.274 +341.275 +341.276 +341.277 +341.278 +341.279 +341.280 +341.281 +341.282 +341.283 +341.284 +342.238 +342.239 +342.240 +342.241 +342.242 +342.243 +342.244 +342.245 +342.246 +342.247 +342.248 +342.249 +342.250 +342.251 +342.252 +342.253 +342.254 +342.255 +342.256 +342.257 +342.258 +342.259 +342.260 +342.261 +342.262 +342.263 +342.264 +342.265 +342.266 +342.267 +342.268 +342.269 +342.270 +342.271 +342.272 +342.273 +342.274 +342.275 +342.276 +342.277 +342.278 +342.279 +342.280 +342.281 +342.282 +342.283 +342.284 +343.238 +343.239 +343.240 +343.241 +343.242 +343.243 +343.244 +343.245 +343.246 +343.247 +343.248 +343.249 +343.250 +343.251 +343.252 +343.253 +343.254 +343.255 +343.256 +343.257 +343.258 +343.259 +343.260 +343.261 +343.262 +343.263 +343.264 +343.265 +343.266 +343.267 +343.268 +343.269 +343.270 +343.271 +343.272 +343.273 +343.274 +343.275 +343.276 +343.277 +343.278 +343.279 +343.280 +343.281 +343.282 +343.283 +344.238 +344.239 +344.240 +344.241 +344.242 +344.243 +344.244 +344.245 +344.246 +344.247 +344.248 +344.249 +344.250 +344.251 +344.252 +344.253 +344.254 +344.255 +344.256 +344.257 +344.258 +344.259 +344.260 +344.261 +344.262 +344.263 +344.264 +344.265 +344.266 +344.267 +344.268 +344.269 +344.270 +344.271 +344.272 +344.273 +344.274 +344.275 +344.276 +344.277 +344.278 +344.279 +344.280 +344.281 +344.282 +344.283 +345.238 +345.239 +345.240 +345.241 +345.242 +345.243 +345.244 +345.245 +345.246 +345.247 +345.248 +345.249 +345.250 +345.251 +345.252 +345.253 +345.254 +345.255 +345.256 +345.257 +345.258 +345.259 +345.260 +345.261 +345.262 +345.263 +345.264 +345.265 +345.266 +345.267 +345.268 +345.269 +345.270 +345.271 +345.272 +345.273 +345.274 +345.275 +345.276 +345.277 +345.278 +345.279 +345.280 +345.281 +345.282 +345.283 +346.238 +346.239 +346.240 +346.241 +346.242 +346.243 +346.244 +346.245 +346.246 +346.247 +346.248 +346.249 +346.250 +346.251 +346.252 +346.253 +346.254 +346.255 +346.256 +346.257 +346.258 +346.259 +346.260 +346.261 +346.262 +346.263 +346.264 +346.265 +346.266 +346.267 +346.268 +346.269 +346.270 +346.271 +346.272 +346.273 +346.274 +346.275 +346.276 +346.277 +346.278 +346.279 +346.280 +346.281 +346.282 +346.283 +347.238 +347.239 +347.240 +347.241 +347.242 +347.243 +347.244 +347.245 +347.246 +347.247 +347.248 +347.249 +347.250 +347.251 +347.252 +347.253 +347.254 +347.255 +347.256 +347.257 +347.258 +347.259 +347.260 +347.261 +347.262 +347.263 +347.264 +347.265 +347.266 +347.267 +347.268 +347.269 +347.270 +347.271 +347.272 +347.273 +347.274 +347.275 +347.276 +347.277 +347.278 +347.279 +347.280 +347.281 +347.282 +348.239 +348.240 +348.241 +348.242 +348.243 +348.244 +348.245 +348.246 +348.247 +348.248 +348.249 +348.250 +348.251 +348.252 +348.253 +348.254 +348.255 +348.256 +348.257 +348.258 +348.259 +348.260 +348.261 +348.262 +348.263 +348.264 +348.265 +348.266 +348.267 +348.268 +348.269 +348.270 +348.271 +348.272 +348.273 +348.274 +348.275 +348.276 +348.277 +348.278 +348.279 +348.280 +348.281 +348.282 +349.239 +349.240 +349.241 +349.242 +349.243 +349.244 +349.245 +349.246 +349.247 +349.248 +349.249 +349.250 +349.251 +349.252 +349.253 +349.254 +349.255 +349.256 +349.257 +349.258 +349.259 +349.260 +349.261 +349.262 +349.263 +349.264 +349.265 +349.266 +349.267 +349.268 +349.269 +349.270 +349.271 +349.272 +349.273 +349.274 +349.275 +349.276 +349.277 +349.278 +349.279 +349.280 +349.281 +349.282 +350.239 +350.240 +350.241 +350.242 +350.243 +350.244 +350.245 +350.246 +350.247 +350.248 +350.249 +350.250 +350.251 +350.252 +350.253 +350.254 +350.255 +350.256 +350.257 +350.258 +350.259 +350.260 +350.261 +350.262 +350.263 +350.264 +350.265 +350.266 +350.267 +350.268 +350.269 +350.270 +350.271 +350.272 +350.273 +350.274 +350.275 +350.276 +350.277 +350.278 +350.279 +350.280 +350.281 +351.239 +351.240 +351.241 +351.242 +351.243 +351.244 +351.245 +351.246 +351.247 +351.248 +351.249 +351.250 +351.251 +351.252 +351.253 +351.254 +351.255 +351.256 +351.257 +351.258 +351.259 +351.260 +351.261 +351.262 +351.263 +351.264 +351.265 +351.266 +351.267 +351.268 +351.269 +351.270 +351.271 +351.272 +351.273 +351.274 +351.275 +351.276 +351.277 +351.278 +351.279 +351.280 +351.281 +352.239 +352.240 +352.241 +352.242 +352.243 +352.244 +352.245 +352.246 +352.247 +352.248 +352.249 +352.250 +352.251 +352.252 +352.253 +352.254 +352.255 +352.256 +352.257 +352.258 +352.259 +352.260 +352.261 +352.262 +352.263 +352.264 +352.265 +352.266 +352.267 +352.268 +352.269 +352.270 +352.271 +352.272 +352.273 +352.274 +352.275 +352.276 +352.277 +352.278 +352.279 +352.280 +352.281 +353.239 +353.240 +353.241 +353.242 +353.243 +353.244 +353.245 +353.246 +353.247 +353.248 +353.249 +353.250 +353.251 +353.252 +353.253 +353.254 +353.255 +353.256 +353.257 +353.258 +353.259 +353.260 +353.261 +353.262 +353.263 +353.264 +353.265 +353.266 +353.267 +353.268 +353.269 +353.270 +353.271 +353.272 +353.273 +353.274 +353.275 +353.276 +353.277 +353.278 +353.279 +353.280 +353.281 +354.239 +354.240 +354.241 +354.242 +354.243 +354.244 +354.245 +354.246 +354.247 +354.248 +354.249 +354.250 +354.251 +354.252 +354.253 +354.254 +354.255 +354.256 +354.257 +354.258 +354.259 +354.260 +354.261 +354.262 +354.263 +354.264 +354.265 +354.266 +354.267 +354.268 +354.269 +354.270 +354.271 +354.272 +354.273 +354.274 +354.275 +354.276 +354.277 +354.278 +354.279 +354.280 +355.239 +355.240 +355.241 +355.242 +355.243 +355.244 +355.245 +355.246 +355.247 +355.248 +355.249 +355.250 +355.251 +355.252 +355.253 +355.254 +355.255 +355.256 +355.257 +355.258 +355.259 +355.260 +355.261 +355.262 +355.263 +355.264 +355.265 +355.266 +355.267 +355.268 +355.269 +355.270 +355.271 +355.272 +355.273 +355.274 +355.275 +355.276 +355.277 +355.278 +355.279 +355.280 +356.239 +356.240 +356.241 +356.242 +356.243 +356.244 +356.245 +356.246 +356.247 +356.248 +356.249 +356.250 +356.251 +356.252 +356.253 +356.254 +356.255 +356.256 +356.257 +356.258 +356.259 +356.260 +356.261 +356.262 +356.263 +356.264 +356.265 +356.266 +356.267 +356.268 +356.269 +356.270 +356.271 +356.272 +356.273 +356.274 +356.275 +356.276 +356.277 +356.278 +356.279 +356.280 +357.239 +357.240 +357.241 +357.242 +357.243 +357.244 +357.245 +357.246 +357.247 +357.248 +357.249 +357.250 +357.251 +357.252 +357.253 +357.254 +357.255 +357.256 +357.257 +357.258 +357.259 +357.260 +357.261 +357.262 +357.263 +357.264 +357.265 +357.266 +357.267 +357.268 +357.269 +357.270 +357.271 +357.272 +357.273 +357.274 +357.275 +357.276 +357.277 +357.278 +357.279 +358.239 +358.240 +358.241 +358.242 +358.243 +358.244 +358.245 +358.246 +358.247 +358.248 +358.249 +358.250 +358.251 +358.252 +358.253 +358.254 +358.255 +358.256 +358.257 +358.258 +358.259 +358.260 +358.261 +358.262 +358.263 +358.264 +358.265 +358.266 +358.267 +358.268 +358.269 +358.270 +358.271 +358.272 +358.273 +358.274 +358.275 +358.276 +358.277 +358.278 +358.279 +359.239 +359.240 +359.241 +359.242 +359.243 +359.244 +359.245 +359.246 +359.247 +359.248 +359.249 +359.250 +359.251 +359.252 +359.253 +359.254 +359.255 +359.256 +359.257 +359.258 +359.259 +359.260 +359.261 +359.262 +359.263 +359.264 +359.265 +359.266 +359.267 +359.268 +359.269 +359.270 +359.271 +359.272 +359.273 +359.274 +359.275 +359.276 +359.277 +359.278 +359.279 +360.239 +360.240 +360.241 +360.242 +360.243 +360.244 +360.245 +360.246 +360.247 +360.248 +360.249 +360.250 +360.251 +360.252 +360.253 +360.254 +360.255 +360.256 +360.257 +360.258 +360.259 +360.260 +360.261 +360.262 +360.263 +360.264 +360.265 +360.266 +360.267 +360.268 +360.269 +360.270 +360.271 +360.272 +360.273 +360.274 +360.275 +360.276 +360.277 +360.278 +360.279 +361.239 +361.240 +361.241 +361.242 +361.243 +361.244 +361.245 +361.246 +361.247 +361.248 +361.249 +361.250 +361.251 +361.252 +361.253 +361.254 +361.255 +361.256 +361.257 +361.258 +361.259 +361.260 +361.261 +361.262 +361.263 +361.264 +361.265 +361.266 +361.267 +361.268 +361.269 +361.270 +361.271 +361.272 +361.273 +361.274 +361.275 +361.276 +361.277 +361.278 +362.238 +362.239 +362.240 +362.241 +362.242 +362.243 +362.244 +362.245 +362.246 +362.247 +362.248 +362.249 +362.250 +362.251 +362.252 +362.253 +362.254 +362.255 +362.256 +362.257 +362.258 +362.259 +362.260 +362.261 +362.262 +362.263 +362.264 +362.265 +362.266 +362.267 +362.268 +362.269 +362.270 +362.271 +362.272 +362.273 +362.274 +362.275 +362.276 +362.277 +362.278 +363.238 +363.239 +363.240 +363.241 +363.242 +363.243 +363.244 +363.245 +363.246 +363.247 +363.248 +363.249 +363.250 +363.251 +363.252 +363.253 +363.254 +363.255 +363.256 +363.257 +363.258 +363.259 +363.260 +363.261 +363.262 +363.263 +363.264 +363.265 +363.266 +363.267 +363.268 +363.269 +363.270 +363.271 +363.272 +363.273 +363.274 +363.275 +363.276 +363.277 +363.278 +364.238 +364.239 +364.240 +364.241 +364.242 +364.243 +364.244 +364.245 +364.246 +364.247 +364.248 +364.249 +364.250 +364.251 +364.252 +364.253 +364.254 +364.255 +364.256 +364.257 +364.258 +364.259 +364.260 +364.261 +364.262 +364.263 +364.264 +364.265 +364.266 +364.267 +364.268 +364.269 +364.270 +364.271 +364.272 +364.273 +364.274 +364.275 +364.276 +364.277 +365.238 +365.239 +365.240 +365.241 +365.242 +365.243 +365.244 +365.245 +365.246 +365.247 +365.248 +365.249 +365.250 +365.251 +365.252 +365.253 +365.254 +365.255 +365.256 +365.257 +365.258 +365.259 +365.260 +365.261 +365.262 +365.263 +365.264 +365.265 +365.266 +365.267 +365.268 +365.269 +365.270 +365.271 +365.272 +365.273 +365.274 +365.275 +365.276 +365.277 +366.238 +366.239 +366.240 +366.241 +366.242 +366.243 +366.244 +366.245 +366.246 +366.247 +366.248 +366.249 +366.250 +366.251 +366.252 +366.253 +366.254 +366.255 +366.256 +366.257 +366.258 +366.259 +366.260 +366.261 +366.262 +366.263 +366.264 +366.265 +366.266 +366.267 +366.268 +366.269 +366.270 +366.271 +366.272 +366.273 +366.274 +366.275 +366.276 +366.277 +367.238 +367.239 +367.240 +367.241 +367.242 +367.243 +367.244 +367.245 +367.246 +367.247 +367.248 +367.249 +367.250 +367.251 +367.252 +367.253 +367.254 +367.255 +367.256 +367.257 +367.258 +367.259 +367.260 +367.261 +367.262 +367.263 +367.264 +367.265 +367.266 +367.267 +367.268 +367.269 +367.270 +367.271 +367.272 +367.273 +367.274 +367.275 +367.276 +368.238 +368.239 +368.240 +368.241 +368.242 +368.243 +368.244 +368.245 +368.246 +368.247 +368.248 +368.249 +368.250 +368.251 +368.252 +368.253 +368.254 +368.255 +368.256 +368.257 +368.258 +368.259 +368.260 +368.261 +368.262 +368.263 +368.264 +368.265 +368.266 +368.267 +368.268 +368.269 +368.270 +368.271 +368.272 +368.273 +368.274 +368.275 +368.276 +369.238 +369.239 +369.240 +369.241 +369.242 +369.243 +369.244 +369.245 +369.246 +369.247 +369.248 +369.249 +369.250 +369.251 +369.252 +369.253 +369.254 +369.255 +369.256 +369.257 +369.258 +369.259 +369.260 +369.261 +369.262 +369.263 +369.264 +369.265 +369.266 +369.267 +369.268 +369.269 +369.270 +369.271 +369.272 +369.273 +369.274 +369.275 +370.238 +370.239 +370.240 +370.241 +370.242 +370.243 +370.244 +370.245 +370.246 +370.247 +370.248 +370.249 +370.250 +370.251 +370.252 +370.253 +370.254 +370.255 +370.256 +370.257 +370.258 +370.259 +370.260 +370.261 +370.262 +370.263 +370.264 +370.265 +370.266 +370.267 +370.268 +370.269 +370.270 +370.271 +370.272 +370.273 +370.274 +370.275 +371.238 +371.239 +371.240 +371.241 +371.242 +371.243 +371.244 +371.245 +371.246 +371.247 +371.248 +371.249 +371.250 +371.251 +371.252 +371.253 +371.254 +371.255 +371.256 +371.257 +371.258 +371.259 +371.260 +371.261 +371.262 +371.263 +371.264 +371.265 +371.266 +371.267 +371.268 +371.269 +371.270 +371.271 +371.272 +371.273 +371.274 +371.275 +372.238 +372.239 +372.240 +372.241 +372.242 +372.243 +372.244 +372.245 +372.246 +372.247 +372.248 +372.249 +372.250 +372.251 +372.252 +372.253 +372.254 +372.255 +372.256 +372.257 +372.258 +372.259 +372.260 +372.261 +372.262 +372.263 +372.264 +372.265 +372.266 +372.267 +372.268 +372.269 +372.270 +372.271 +372.272 +372.273 +372.274 +372.275 +373.238 +373.239 +373.240 +373.241 +373.242 +373.243 +373.244 +373.245 +373.246 +373.247 +373.248 +373.249 +373.250 +373.251 +373.252 +373.253 +373.254 +373.255 +373.256 +373.257 +373.258 +373.259 +373.260 +373.261 +373.262 +373.263 +373.264 +373.265 +373.266 +373.267 +373.268 +373.269 +373.270 +373.271 +373.272 +373.273 +373.274 +374.238 +374.239 +374.240 +374.241 +374.242 +374.243 +374.244 +374.245 +374.246 +374.247 +374.248 +374.249 +374.250 +374.251 +374.252 +374.253 +374.254 +374.255 +374.256 +374.257 +374.258 +374.259 +374.260 +374.261 +374.262 +374.263 +374.264 +374.265 +374.266 +374.267 +374.268 +374.269 +374.270 +374.271 +374.272 +374.273 +374.274 +375.238 +375.239 +375.240 +375.241 +375.242 +375.243 +375.244 +375.245 +375.246 +375.247 +375.248 +375.249 +375.250 +375.251 +375.252 +375.253 +375.254 +375.255 +375.256 +375.257 +375.258 +375.259 +375.260 +375.261 +375.262 +375.263 +375.264 +375.265 +375.266 +375.267 +375.268 +375.269 +375.270 +375.271 +375.272 +375.273 +375.274 +376.238 +376.239 +376.240 +376.241 +376.242 +376.243 +376.244 +376.245 +376.246 +376.247 +376.248 +376.249 +376.250 +376.251 +376.252 +376.253 +376.254 +376.255 +376.256 +376.257 +376.258 +376.259 +376.260 +376.261 +376.262 +376.263 +376.264 +376.265 +376.266 +376.267 +376.268 +376.269 +376.270 +376.271 +376.272 +376.273 +376.274 +377.238 +377.239 +377.240 +377.241 +377.242 +377.243 +377.244 +377.245 +377.246 +377.247 +377.248 +377.249 +377.250 +377.251 +377.252 +377.253 +377.254 +377.255 +377.256 +377.257 +377.258 +377.259 +377.260 +377.261 +377.262 +377.263 +377.264 +377.265 +377.266 +377.267 +377.268 +377.269 +377.270 +377.271 +377.272 +377.273 +378.238 +378.239 +378.240 +378.241 +378.242 +378.243 +378.244 +378.245 +378.246 +378.247 +378.248 +378.249 +378.250 +378.251 +378.252 +378.253 +378.254 +378.255 +378.256 +378.257 +378.258 +378.259 +378.260 +378.261 +378.262 +378.263 +378.264 +378.265 +378.266 +378.267 +378.268 +378.269 +378.270 +378.271 +378.272 +378.273 +379.238 +379.239 +379.240 +379.241 +379.242 +379.243 +379.244 +379.245 +379.246 +379.247 +379.248 +379.249 +379.250 +379.251 +379.252 +379.253 +379.254 +379.255 +379.256 +379.257 +379.258 +379.259 +379.260 +379.261 +379.262 +379.263 +379.264 +379.265 +379.266 +379.267 +379.268 +379.269 +379.270 +379.271 +379.272 +379.273 +380.238 +380.239 +380.240 +380.241 +380.242 +380.243 +380.244 +380.245 +380.246 +380.247 +380.248 +380.249 +380.250 +380.251 +380.252 +380.253 +380.254 +380.255 +380.256 +380.257 +380.258 +380.259 +380.260 +380.261 +380.262 +380.263 +380.264 +380.265 +380.266 +380.267 +380.268 +380.269 +380.270 +380.271 +380.272 +380.273 +381.238 +381.239 +381.240 +381.241 +381.242 +381.243 +381.244 +381.245 +381.246 +381.247 +381.248 +381.249 +381.250 +381.251 +381.252 +381.253 +381.254 +381.255 +381.256 +381.257 +381.258 +381.259 +381.260 +381.261 +381.262 +381.263 +381.264 +381.265 +381.266 +381.267 +381.268 +381.269 +381.270 +381.271 +381.272 +382.238 +382.239 +382.240 +382.241 +382.242 +382.243 +382.244 +382.245 +382.246 +382.247 +382.248 +382.249 +382.250 +382.251 +382.252 +382.253 +382.254 +382.255 +382.256 +382.257 +382.258 +382.259 +382.260 +382.261 +382.262 +382.263 +382.264 +382.265 +382.266 +382.267 +382.268 +382.269 +382.270 +382.271 +382.272 +383.238 +383.239 +383.240 +383.241 +383.242 +383.243 +383.244 +383.245 +383.246 +383.247 +383.248 +383.249 +383.250 +383.251 +383.252 +383.253 +383.254 +383.255 +383.256 +383.257 +383.258 +383.259 +383.260 +383.261 +383.262 +383.263 +383.264 +383.265 +383.266 +383.267 +383.268 +383.269 +383.270 +383.271 +383.272 +384.238 +384.239 +384.240 +384.241 +384.242 +384.243 +384.244 +384.245 +384.246 +384.247 +384.248 +384.249 +384.250 +384.251 +384.252 +384.253 +384.254 +384.255 +384.256 +384.257 +384.258 +384.259 +384.260 +384.261 +384.262 +384.263 +384.264 +384.265 +384.266 +384.267 +384.268 +384.269 +384.270 +384.271 +385.238 +385.239 +385.240 +385.241 +385.242 +385.243 +385.244 +385.245 +385.246 +385.247 +385.248 +385.249 +385.250 +385.251 +385.252 +385.253 +385.254 +385.255 +385.256 +385.257 +385.258 +385.259 +385.260 +385.261 +385.262 +385.263 +385.264 +385.265 +385.266 +385.267 +385.268 +385.269 +385.270 +385.271 +386.238 +386.239 +386.240 +386.241 +386.242 +386.243 +386.244 +386.245 +386.246 +386.247 +386.248 +386.249 +386.250 +386.251 +386.252 +386.253 +386.254 +386.255 +386.256 +386.257 +386.258 +386.259 +386.260 +386.261 +386.262 +386.263 +386.264 +386.265 +386.266 +386.267 +386.268 +386.269 +386.270 +386.271 +387.238 +387.239 +387.240 +387.241 +387.242 +387.243 +387.244 +387.245 +387.246 +387.247 +387.248 +387.249 +387.250 +387.251 +387.252 +387.253 +387.254 +387.255 +387.256 +387.257 +387.258 +387.259 +387.260 +387.261 +387.262 +387.263 +387.264 +387.265 +387.266 +387.267 +387.268 +387.269 +387.270 +387.271 +388.238 +388.239 +388.240 +388.241 +388.242 +388.243 +388.244 +388.245 +388.246 +388.247 +388.248 +388.249 +388.250 +388.251 +388.252 +388.253 +388.254 +388.255 +388.256 +388.257 +388.258 +388.259 +388.260 +388.261 +388.262 +388.263 +388.264 +388.265 +388.266 +388.267 +388.268 +388.269 +388.270 +389.238 +389.239 +389.240 +389.241 +389.242 +389.243 +389.244 +389.245 +389.246 +389.247 +389.248 +389.249 +389.250 +389.251 +389.252 +389.253 +389.254 +389.255 +389.256 +389.257 +389.258 +389.259 +389.260 +389.261 +389.262 +389.263 +389.264 +389.265 +389.266 +389.267 +389.268 +389.269 +389.270 +390.238 +390.239 +390.240 +390.241 +390.242 +390.243 +390.244 +390.245 +390.246 +390.247 +390.248 +390.249 +390.250 +390.251 +390.252 +390.253 +390.254 +390.255 +390.256 +390.257 +390.258 +390.259 +390.260 +390.261 +390.262 +390.263 +390.264 +390.265 +390.266 +390.267 +390.268 +390.269 +391.238 +391.239 +391.240 +391.241 +391.242 +391.243 +391.244 +391.245 +391.246 +391.247 +391.248 +391.249 +391.250 +391.251 +391.252 +391.253 +391.254 +391.255 +391.256 +391.257 +391.258 +391.259 +391.260 +391.261 +391.262 +391.263 +391.264 +391.265 +391.266 +391.267 +391.268 +391.269 +392.238 +392.239 +392.240 +392.241 +392.242 +392.243 +392.244 +392.245 +392.246 +392.247 +392.248 +392.249 +392.250 +392.251 +392.252 +392.253 +392.254 +392.255 +392.256 +392.257 +392.258 +392.259 +392.260 +392.261 +392.262 +392.263 +392.264 +392.265 +392.266 +392.267 +392.268 +392.269 +393.238 +393.239 +393.240 +393.241 +393.242 +393.243 +393.244 +393.245 +393.246 +393.247 +393.248 +393.249 +393.250 +393.251 +393.252 +393.253 +393.254 +393.255 +393.256 +393.257 +393.258 +393.259 +393.260 +393.261 +393.262 +393.263 +393.264 +393.265 +393.266 +393.267 +393.268 +394.238 +394.239 +394.240 +394.241 +394.242 +394.243 +394.244 +394.245 +394.246 +394.247 +394.248 +394.249 +394.250 +394.251 +394.252 +394.253 +394.254 +394.255 +394.256 +394.257 +394.258 +394.259 +394.260 +394.261 +394.262 +394.263 +394.264 +394.265 +394.266 +394.267 +394.268 +395.238 +395.239 +395.240 +395.241 +395.242 +395.243 +395.244 +395.245 +395.246 +395.247 +395.248 +395.249 +395.250 +395.251 +395.252 +395.253 +395.254 +395.255 +395.256 +395.257 +395.258 +395.259 +395.260 +395.261 +395.262 +395.263 +395.264 +395.265 +395.266 +395.267 +396.238 +396.239 +396.240 +396.241 +396.242 +396.243 +396.244 +396.245 +396.246 +396.247 +396.248 +396.249 +396.250 +396.251 +396.252 +396.253 +396.254 +396.255 +396.256 +396.257 +396.258 +396.259 +396.260 +396.261 +396.262 +396.263 +396.264 +396.265 +396.266 +396.267 +397.238 +397.239 +397.240 +397.241 +397.242 +397.243 +397.244 +397.245 +397.246 +397.247 +397.248 +397.249 +397.250 +397.251 +397.252 +397.253 +397.254 +397.255 +397.256 +397.257 +397.258 +397.259 +397.260 +397.261 +397.262 +397.263 +397.264 +397.265 +397.266 +397.267 +398.238 +398.239 +398.240 +398.241 +398.242 +398.243 +398.244 +398.245 +398.246 +398.247 +398.248 +398.249 +398.250 +398.251 +398.252 +398.253 +398.254 +398.255 +398.256 +398.257 +398.258 +398.259 +398.260 +398.261 +398.262 +398.263 +398.264 +398.265 +398.266 +398.267 +399.238 +399.239 +399.240 +399.241 +399.242 +399.243 +399.244 +399.245 +399.246 +399.247 +399.248 +399.249 +399.250 +399.251 +399.252 +399.253 +399.254 +399.255 +399.256 +399.257 +399.258 +399.259 +399.260 +399.261 +399.262 +399.263 +399.264 +399.265 +399.266 +400.238 +400.239 +400.240 +400.241 +400.242 +400.243 +400.244 +400.245 +400.246 +400.247 +400.248 +400.249 +400.250 +400.251 +400.252 +400.253 +400.254 +400.255 +400.256 +400.257 +400.258 +400.259 +400.260 +400.261 +400.262 +400.263 +400.264 +400.265 +400.266 +401.238 +401.239 +401.240 +401.241 +401.242 +401.243 +401.244 +401.245 +401.246 +401.247 +401.248 +401.249 +401.250 +401.251 +401.252 +401.253 +401.254 +401.255 +401.256 +401.257 +401.258 +401.259 +401.260 +401.261 +401.262 +401.263 +401.264 +401.265 +401.266 +402.238 +402.239 +402.240 +402.241 +402.242 +402.243 +402.244 +402.245 +402.246 +402.247 +402.248 +402.249 +402.250 +402.251 +402.252 +402.253 +402.254 +402.255 +402.256 +402.257 +402.258 +402.259 +402.260 +402.261 +402.262 +402.263 +402.264 +402.265 +403.238 +403.239 +403.240 +403.241 +403.242 +403.243 +403.244 +403.245 +403.246 +403.247 +403.248 +403.249 +403.250 +403.251 +403.252 +403.253 +403.254 +403.255 +403.256 +403.257 +403.258 +403.259 +403.260 +403.261 +403.262 +403.263 +403.264 +403.265 +404.238 +404.239 +404.240 +404.241 +404.242 +404.243 +404.244 +404.245 +404.246 +404.247 +404.248 +404.249 +404.250 +404.251 +404.252 +404.253 +404.254 +404.255 +404.256 +404.257 +404.258 +404.259 +404.260 +404.261 +404.262 +404.263 +404.264 +404.265 +405.238 +405.239 +405.240 +405.241 +405.242 +405.243 +405.244 +405.245 +405.246 +405.247 +405.248 +405.249 +405.250 +405.251 +405.252 +405.253 +405.254 +405.255 +405.256 +405.257 +405.258 +405.259 +405.260 +405.261 +405.262 +405.263 +405.264 +406.238 +406.239 +406.240 +406.241 +406.242 +406.243 +406.244 +406.245 +406.246 +406.247 +406.248 +406.249 +406.250 +406.251 +406.252 +406.253 +406.254 +406.255 +406.256 +406.257 +406.258 +406.259 +406.260 +406.261 +406.262 +406.263 +406.264 +407.238 +407.239 +407.240 +407.241 +407.242 +407.243 +407.244 +407.245 +407.246 +407.247 +407.248 +407.249 +407.250 +407.251 +407.252 +407.253 +407.254 +407.255 +407.256 +407.257 +407.258 +407.259 +407.260 +407.261 +407.262 +407.263 +407.264 +408.238 +408.239 +408.240 +408.241 +408.242 +408.243 +408.244 +408.245 +408.246 +408.247 +408.248 +408.249 +408.250 +408.251 +408.252 +408.253 +408.254 +408.255 +408.256 +408.257 +408.258 +408.259 +408.260 +408.261 +408.262 +408.263 +408.264 +409.238 +409.239 +409.240 +409.241 +409.242 +409.243 +409.244 +409.245 +409.246 +409.247 +409.248 +409.249 +409.250 +409.251 +409.252 +409.253 +409.254 +409.255 +409.256 +409.257 +409.258 +409.259 +409.260 +409.261 +409.262 +409.263 +410.238 +410.239 +410.240 +410.241 +410.242 +410.243 +410.244 +410.245 +410.246 +410.247 +410.248 +410.249 +410.250 +410.251 +410.252 +410.253 +410.254 +410.255 +410.256 +410.257 +410.258 +410.259 +410.260 +410.261 +410.262 +410.263 +411.238 +411.239 +411.240 +411.241 +411.242 +411.243 +411.244 +411.245 +411.246 +411.247 +411.248 +411.249 +411.250 +411.251 +411.252 +411.253 +411.254 +411.255 +411.256 +411.257 +411.258 +411.259 +411.260 +411.261 +411.262 +412.238 +412.239 +412.240 +412.241 +412.242 +412.243 +412.244 +412.245 +412.246 +412.247 +412.248 +412.249 +412.250 +412.251 +412.252 +412.253 +412.254 +412.255 +412.256 +412.257 +412.258 +412.259 +412.260 +412.261 +412.262 +413.238 +413.239 +413.240 +413.241 +413.242 +413.243 +413.244 +413.245 +413.246 +413.247 +413.248 +413.249 +413.250 +413.251 +413.252 +413.253 +413.254 +413.255 +413.256 +413.257 +413.258 +413.259 +413.260 +413.261 +413.262 +414.238 +414.239 +414.240 +414.241 +414.242 +414.243 +414.244 +414.245 +414.246 +414.247 +414.248 +414.249 +414.250 +414.251 +414.252 +414.253 +414.254 +414.255 +414.256 +414.257 +414.258 +414.259 +414.260 +414.261 +415.238 +415.239 +415.240 +415.241 +415.242 +415.243 +415.244 +415.245 +415.246 +415.247 +415.248 +415.249 +415.250 +415.251 +415.252 +415.253 +415.254 +415.255 +415.256 +415.257 +415.258 +415.259 +415.260 +415.261 +416.238 +416.239 +416.240 +416.241 +416.242 +416.243 +416.244 +416.245 +416.246 +416.247 +416.248 +416.249 +416.250 +416.251 +416.252 +416.253 +416.254 +416.255 +416.256 +416.257 +416.258 +416.259 +416.260 +416.261 +417.238 +417.239 +417.240 +417.241 +417.242 +417.243 +417.244 +417.245 +417.246 +417.247 +417.248 +417.249 +417.250 +417.251 +417.252 +417.253 +417.254 +417.255 +417.256 +417.257 +417.258 +417.259 +417.260 +418.238 +418.239 +418.240 +418.241 +418.242 +418.243 +418.244 +418.245 +418.246 +418.247 +418.248 +418.249 +418.250 +418.251 +418.252 +418.253 +418.254 +418.255 +418.256 +418.257 +418.258 +418.259 +418.260 +419.238 +419.239 +419.240 +419.241 +419.242 +419.243 +419.244 +419.245 +419.246 +419.247 +419.248 +419.249 +419.250 +419.251 +419.252 +419.253 +419.254 +419.255 +419.256 +419.257 +419.258 +419.259 +420.238 +420.239 +420.240 +420.241 +420.242 +420.243 +420.244 +420.245 +420.246 +420.247 +420.248 +420.249 +420.250 +420.251 +420.252 +420.253 +420.254 +420.255 +420.256 +420.257 +420.258 +420.259 +421.238 +421.239 +421.240 +421.241 +421.242 +421.243 +421.244 +421.245 +421.246 +421.247 +421.248 +421.249 +421.250 +421.251 +421.252 +421.253 +421.254 +421.255 +421.256 +421.257 +421.258 +422.238 +422.239 +422.240 +422.241 +422.242 +422.243 +422.244 +422.245 +422.246 +422.247 +422.248 +422.249 +422.250 +422.251 +422.252 +422.253 +422.254 +422.255 +422.256 +422.257 +422.258 +423.238 +423.239 +423.240 +423.241 +423.242 +423.243 +423.244 +423.245 +423.246 +423.247 +423.248 +423.249 +423.250 +423.251 +423.252 +423.253 +423.254 +423.255 +423.256 +423.257 +424.238 +424.239 +424.240 +424.241 +424.242 +424.243 +424.244 +424.245 +424.246 +424.247 +424.248 +424.249 +424.250 +424.251 +424.252 +424.253 +424.254 +424.255 +424.256 +424.257 +425.238 +425.239 +425.240 +425.241 +425.242 +425.243 +425.244 +425.245 +425.246 +425.247 +425.248 +425.249 +425.250 +425.251 +425.252 +425.253 +425.254 +425.255 +425.256 +425.257 +426.238 +426.239 +426.240 +426.241 +426.242 +426.243 +426.244 +426.245 +426.246 +426.247 +426.248 +426.249 +426.250 +426.251 +426.252 +426.253 +426.254 +426.255 +426.256 +426.257 +427.238 +427.239 +427.240 +427.241 +427.242 +427.243 +427.244 +427.245 +427.246 +427.247 +427.248 +427.249 +427.250 +427.251 +427.252 +427.253 +427.254 +427.255 +427.256 +427.257 +428.238 +428.239 +428.240 +428.241 +428.242 +428.243 +428.244 +428.245 +428.246 +428.247 +428.248 +428.249 +428.250 +428.251 +428.252 +428.253 +428.254 +428.255 +428.256 +429.238 +429.239 +429.240 +429.241 +429.242 +429.243 +429.244 +429.245 +429.246 +429.247 +429.248 +429.249 +429.250 +429.251 +429.252 +429.253 +429.254 +429.255 +429.256 +430.238 +430.239 +430.240 +430.241 +430.242 +430.243 +430.244 +430.245 +430.246 +430.247 +430.248 +430.249 +430.250 +430.251 +430.252 +430.253 +430.254 +430.255 +430.256 +431.238 +431.239 +431.240 +431.241 +431.242 +431.243 +431.244 +431.245 +431.246 +431.247 +431.248 +431.249 +431.250 +431.251 +431.252 +431.253 +431.254 +431.255 +432.238 +432.239 +432.240 +432.241 +432.242 +432.243 +432.244 +432.245 +432.246 +432.247 +432.248 +432.249 +432.250 +432.251 +432.252 +432.253 +432.254 +432.255 +433.238 +433.239 +433.240 +433.241 +433.242 +433.243 +433.244 +433.245 +433.246 +433.247 +433.248 +433.249 +433.250 +433.251 +433.252 +433.253 +433.254 +433.255 +434.238 +434.239 +434.240 +434.241 +434.242 +434.243 +434.244 +434.245 +434.246 +434.247 +434.248 +434.249 +434.250 +434.251 +434.252 +434.253 +434.254 +435.238 +435.239 +435.240 +435.241 +435.242 +435.243 +435.244 +435.245 +435.246 +435.247 +435.248 +435.249 +435.250 +435.251 +435.252 +435.253 +436.238 +436.239 +436.240 +436.241 +436.242 +436.243 +436.244 +436.245 +436.246 +436.247 +436.248 +436.249 +436.250 +436.251 +436.252 +436.253 +437.238 +437.239 +437.240 +437.241 +437.242 +437.243 +437.244 +437.245 +437.246 +437.247 +437.248 +437.249 +437.250 +437.251 +437.252 +437.253 +438.238 +438.239 +438.240 +438.241 +438.242 +438.243 +438.244 +438.245 +438.246 +438.247 +438.248 +438.249 +438.250 +438.251 +438.252 +438.253 +439.238 +439.239 +439.240 +439.241 +439.242 +439.243 +439.244 +439.245 +439.246 +439.247 +439.248 +439.249 +439.250 +439.251 +439.252 +440.238 +440.239 +440.240 +440.241 +440.242 +440.243 +440.244 +440.245 +440.246 +440.247 +440.248 +440.249 +440.250 +440.251 +440.252 +441.238 +441.239 +441.240 +441.241 +441.242 +441.243 +441.244 +441.245 +441.246 +441.247 +441.248 +441.249 +441.250 +441.251 +442.238 +442.239 +442.240 +442.241 +442.242 +442.243 +442.244 +442.245 +442.246 +442.247 +442.248 +442.249 +442.250 +442.251 +443.238 +443.239 +443.240 +443.241 +443.242 +443.243 +443.244 +443.245 +443.246 +443.247 +443.248 +443.249 +443.250 +443.251 +444.238 +444.239 +444.240 +444.241 +444.242 +444.243 +444.244 +444.245 +444.246 +444.247 +444.248 +444.249 +444.250 +445.238 +445.239 +445.240 +445.241 +445.242 +445.243 +445.244 +445.245 +445.246 +445.247 +445.248 +445.249 +446.238 +446.239 +446.240 +446.241 +446.242 +446.243 +446.244 +446.245 +446.246 +446.247 +446.248 +446.249 +447.238 +447.239 +447.240 +447.241 +447.242 +447.243 +447.244 +447.245 +447.246 +447.247 +447.248 +448.238 +448.239 +448.240 +448.241 +448.242 +448.243 +448.244 +448.245 +448.246 +448.247 +448.248 +449.238 +449.239 +449.240 +449.241 +449.242 +449.243 +449.244 +449.245 +449.246 +449.247 +449.248 +450.238 +450.239 +450.240 +450.241 +450.242 +450.243 +450.244 +450.245 +450.246 +450.247 +451.238 +451.239 +451.240 +451.241 +451.242 +451.243 +451.244 +451.245 +451.246 +451.247 +452.238 +452.239 +452.240 +452.241 +452.242 +452.243 +452.244 +452.245 +452.246 +452.247 +453.238 +453.239 +453.240 +453.241 +453.242 +453.243 +453.244 +453.245 +453.246 +454.238 +454.239 +454.240 +454.241 +454.242 +454.243 +454.244 +454.245 +454.246 +455.238 +455.239 +455.240 +455.241 +455.242 +455.243 +455.244 +455.245 +456.238 +456.239 +456.240 +456.241 +456.242 +456.243 +456.244 +456.245 +457.238 +457.239 +457.240 +457.241 +457.242 +457.243 +457.244 +458.238 +458.239 +458.240 +458.241 +458.242 +458.243 +458.244 +459.238 +459.239 +459.240 +459.241 +459.242 +459.243 +460.238 +460.239 +460.240 +460.241 +460.242 +460.243 +461.238 +461.239 +461.240 +461.241 +461.242 +462.238 +462.239 +462.240 +462.241 +462.242 +463.238 +463.239 +463.240 +463.241 +463.242 +464.238 +464.239 +464.240 +464.241 +465.238 +465.239 +465.240 +465.241 +466.238 +466.239 +466.240 +467.238 +467.239 +467.240 +468.238 +468.239 +469.238 +470.238 +567.255 +568.253 +568.255 +569.253 +569.255 +570.251 +570.253 +570.254 +570.255 +571.250 +571.251 +571.252 +571.253 +571.254 +571.255 +572.250 +572.251 +572.252 +572.253 +572.254 +572.255 +573.248 +573.250 +573.251 +573.252 +573.253 +573.254 +574.248 +574.249 +574.250 +574.251 +574.252 +574.253 +574.254 +575.248 +575.249 +575.250 +575.251 +575.252 +575.253 +575.254 +576.246 +576.247 +576.248 +576.249 +576.250 +576.251 +576.252 +576.253 +576.254 +577.238 +577.240 +577.246 +577.247 +577.248 +577.249 +577.250 +577.251 +577.252 +577.253 +578.238 +578.240 +578.246 +578.247 +578.248 +578.249 +578.250 +578.251 +578.252 +578.253 +579.237 +579.238 +579.239 +579.240 +579.244 +579.245 +579.246 +579.247 +579.248 +579.249 +579.250 +579.251 +579.252 +579.253 +580.237 +580.238 +580.239 +580.240 +580.244 +580.245 +580.246 +580.247 +580.248 +580.249 +580.250 +580.251 +580.252 +580.253 +581.236 +581.237 +581.238 +581.239 +581.240 +581.244 +581.245 +581.246 +581.247 +581.248 +581.249 +581.250 +581.251 +581.252 +582.236 +582.237 +582.238 +582.239 +582.240 +582.243 +582.244 +582.245 +582.246 +582.247 +582.248 +582.249 +582.250 +582.251 +582.252 +583.236 +583.237 +583.238 +583.239 +583.240 +583.243 +583.244 +583.245 +583.246 +583.247 +583.248 +583.249 +583.250 +583.251 +583.252 +584.235 +584.236 +584.237 +584.238 +584.239 +584.240 +584.242 +584.243 +584.244 +584.245 +584.246 +584.247 +584.248 +584.249 +584.250 +584.251 +584.252 +585.235 +585.236 +585.237 +585.238 +585.239 +585.240 +585.242 +585.243 +585.244 +585.245 +585.246 +585.247 +585.248 +585.249 +585.250 +585.251 +586.234 +586.235 +586.236 +586.237 +586.238 +586.239 +586.242 +586.243 +586.244 +586.245 +586.246 +586.247 +586.248 +586.249 +586.250 +586.251 +587.234 +587.235 +587.236 +587.237 +587.238 +587.239 +587.241 +587.242 +587.243 +587.244 +587.245 +587.246 +587.247 +587.248 +587.249 +587.250 +587.251 +588.234 +588.235 +588.236 +588.237 +588.238 +588.239 +588.240 +588.241 +588.242 +588.243 +588.244 +588.245 +588.246 +588.247 +588.248 +588.249 +588.250 +589.233 +589.234 +589.235 +589.236 +589.237 +589.238 +589.240 +589.241 +589.242 +589.243 +589.244 +589.245 +589.246 +589.247 +589.248 +589.249 +589.250 +590.233 +590.234 +590.235 +590.236 +590.237 +590.238 +590.240 +590.241 +590.242 +590.243 +590.244 +590.245 +590.246 +590.247 +590.248 +590.249 +590.250 +591.232 +591.233 +591.234 +591.235 +591.236 +591.237 +591.238 +591.239 +591.240 +591.241 +591.242 +591.243 +591.244 +591.245 +591.246 +591.247 +591.248 +591.249 +591.250 +592.232 +592.233 +592.234 +592.235 +592.236 +592.237 +592.239 +592.240 +592.241 +592.242 +592.243 +592.244 +592.245 +592.246 +592.247 +592.248 +592.249 +593.232 +593.233 +593.234 +593.235 +593.236 +593.238 +593.239 +593.240 +593.241 +593.242 +593.243 +593.244 +593.245 +593.246 +593.247 +593.248 +593.249 +594.231 +594.232 +594.233 +594.234 +594.235 +594.236 +594.238 +594.239 +594.240 +594.241 +594.242 +594.243 +594.244 +594.245 +594.246 +594.247 +594.248 +594.249 +595.231 +595.232 +595.233 +595.234 +595.235 +595.237 +595.238 +595.239 +595.240 +595.241 +595.242 +595.243 +595.244 +595.245 +595.246 +595.247 +595.248 +596.230 +596.231 +596.232 +596.233 +596.234 +596.235 +596.236 +596.237 +596.238 +596.239 +596.240 +596.241 +596.242 +596.243 +596.244 +596.245 +596.246 +596.247 +596.248 +597.230 +597.231 +597.232 +597.233 +597.234 +597.235 +597.236 +597.237 +597.238 +597.239 +597.240 +597.241 +597.242 +597.243 +597.244 +597.245 +597.246 +597.247 +597.248 +598.230 +598.231 +598.232 +598.233 +598.234 +598.235 +598.236 +598.237 +598.238 +598.239 +598.240 +598.241 +598.242 +598.243 +598.244 +598.245 +598.246 +598.247 +598.248 +599.229 +599.230 +599.231 +599.232 +599.233 +599.234 +599.235 +599.236 +599.237 +599.238 +599.239 +599.240 +599.241 +599.242 +599.243 +599.244 +599.245 +599.246 +599.247 +600.229 +600.230 +600.231 +600.232 +600.233 +600.234 +600.235 +600.236 +600.237 +600.238 +600.239 +600.240 +600.241 +600.242 +600.243 +600.244 +600.245 +600.246 +600.247 +601.228 +601.229 +601.230 +601.231 +601.232 +601.233 +601.234 +601.235 +601.236 +601.237 +601.238 +601.239 +601.240 +601.241 +601.242 +601.243 +601.244 +601.245 +601.246 +601.247 +602.228 +602.229 +602.230 +602.231 +602.232 +602.233 +602.234 +602.235 +602.236 +602.237 +602.238 +602.239 +602.240 +602.241 +602.242 +602.243 +602.244 +602.245 +602.246 +603.227 +603.228 +603.229 +603.230 +603.231 +603.232 +603.233 +603.234 +603.235 +603.236 +603.238 +603.239 +603.240 +603.241 +603.242 +603.243 +603.244 +603.245 +603.246 +604.227 +604.228 +604.229 +604.230 +604.231 +604.232 +604.233 +604.234 +604.235 +604.236 +604.238 +604.239 +604.240 +604.241 +604.242 +604.243 +604.244 +604.245 +604.246 +605.227 +605.228 +605.229 +605.230 +605.231 +605.232 +605.233 +605.234 +605.235 +605.236 +605.238 +605.239 +605.240 +605.241 +605.242 +605.243 +605.244 +605.245 +606.226 +606.227 +606.228 +606.229 +606.230 +606.231 +606.232 +606.233 +606.234 +606.235 +606.236 +606.238 +606.239 +606.240 +606.241 +606.242 +606.243 +606.244 +606.245 +607.226 +607.227 +607.228 +607.229 +607.230 +607.231 +607.232 +607.233 +607.234 +607.235 +607.236 +607.237 +607.238 +607.239 +607.240 +607.241 +607.242 +607.243 +607.244 +607.245 +608.225 +608.226 +608.227 +608.228 +608.229 +608.230 +608.231 +608.232 +608.233 +608.234 +608.235 +608.236 +608.237 +608.238 +608.239 +608.240 +608.241 +608.242 +608.243 +608.244 +608.245 +609.225 +609.226 +609.227 +609.228 +609.229 +609.230 +609.231 +609.232 +609.233 +609.234 +609.235 +609.236 +609.237 +609.238 +609.239 +609.240 +609.241 +609.242 +609.243 +609.244 +610.224 +610.225 +610.226 +610.227 +610.228 +610.229 +610.230 +610.231 +610.232 +610.233 +610.234 +610.235 +610.236 +610.237 +610.238 +610.239 +610.240 +610.241 +610.242 +610.243 +610.244 +611.224 +611.225 +611.226 +611.227 +611.228 +611.229 +611.230 +611.231 +611.232 +611.233 +611.234 +611.235 +611.236 +611.237 +611.238 +611.239 +611.240 +611.241 +611.242 +611.243 +611.244 +612.223 +612.224 +612.225 +612.226 +612.227 +612.228 +612.229 +612.230 +612.231 +612.232 +612.233 +612.234 +612.235 +612.236 +612.237 +612.238 +612.239 +612.240 +612.241 +612.242 +612.243 +613.223 +613.224 +613.225 +613.226 +613.227 +613.228 +613.229 +613.230 +613.231 +613.232 +613.233 +613.234 +613.235 +613.236 +613.237 +613.238 +613.239 +613.240 +613.241 +613.242 +613.243 +614.222 +614.223 +614.224 +614.225 +614.226 +614.227 +614.228 +614.229 +614.230 +614.231 +614.232 +614.233 +614.234 +614.235 +614.236 +614.237 +614.238 +614.239 +614.240 +614.241 +614.242 +614.243 +615.222 +615.223 +615.224 +615.225 +615.226 +615.227 +615.228 +615.229 +615.230 +615.231 +615.232 +615.233 +615.234 +615.235 +615.236 +615.237 +615.238 +615.239 +615.240 +615.241 +615.242 +615.243 +616.221 +616.222 +616.223 +616.224 +616.225 +616.226 +616.227 +616.228 +616.229 +616.230 +616.231 +616.232 +616.233 +616.234 +616.235 +616.236 +616.237 +616.238 +616.239 +616.240 +616.241 +616.242 +617.221 +617.222 +617.223 +617.224 +617.225 +617.226 +617.227 +617.228 +617.229 +617.230 +617.231 +617.232 +617.233 +617.234 +617.235 +617.236 +617.237 +617.238 +617.239 +617.240 +617.241 +617.242 +618.220 +618.221 +618.222 +618.223 +618.224 +618.225 +618.226 +618.227 +618.228 +618.229 +618.230 +618.231 +618.232 +618.233 +618.234 +618.235 +618.236 +618.237 +618.238 +618.239 +618.240 +618.241 +618.242 +619.220 +619.221 +619.222 +619.223 +619.224 +619.225 +619.226 +619.227 +619.228 +619.229 +619.230 +619.231 +619.232 +619.233 +619.234 +619.235 +619.236 +619.237 +619.238 +619.239 +619.240 +619.241 +620.219 +620.220 +620.221 +620.222 +620.223 +620.224 +620.225 +620.226 +620.227 +620.228 +620.229 +620.230 +620.231 +620.232 +620.233 +620.234 +620.235 +620.236 +620.237 +620.238 +620.239 +620.240 +620.241 +621.219 +621.220 +621.221 +621.222 +621.223 +621.224 +621.225 +621.226 +621.227 +621.228 +621.229 +621.230 +621.231 +621.232 +621.233 +621.234 +621.235 +621.236 +621.237 +621.238 +621.239 +621.240 +621.241 +622.218 +622.219 +622.220 +622.221 +622.222 +622.223 +622.224 +622.225 +622.226 +622.227 +622.228 +622.229 +622.230 +622.231 +622.232 +622.233 +622.234 +622.235 +622.236 +622.237 +622.238 +622.239 +622.240 +622.241 +623.218 +623.219 +623.220 +623.221 +623.222 +623.223 +623.224 +623.225 +623.226 +623.227 +623.228 +623.229 +623.230 +623.231 +623.232 +623.233 +623.234 +623.235 +623.236 +623.237 +623.238 +623.239 +623.240 +624.217 +624.218 +624.219 +624.220 +624.221 +624.222 +624.223 +624.224 +624.225 +624.226 +624.227 +624.228 +624.229 +624.230 +624.231 +624.232 +624.233 +624.234 +624.235 +624.236 +624.237 +624.238 +624.239 +624.240 +625.217 +625.218 +625.219 +625.220 +625.221 +625.222 +625.223 +625.224 +625.225 +625.226 +625.227 +625.228 +625.229 +625.230 +625.231 +625.232 +625.233 +625.234 +625.235 +625.236 +625.237 +625.238 +625.239 +625.240 +626.217 +626.218 +626.219 +626.220 +626.221 +626.222 +626.223 +626.224 +626.225 +626.226 +626.227 +626.228 +626.229 +626.230 +626.231 +626.232 +626.233 +626.234 +626.235 +626.236 +626.237 +626.238 +626.239 +627.217 +627.218 +627.219 +627.220 +627.221 +627.222 +627.223 +627.224 +627.225 +627.226 +627.227 +627.228 +627.229 +627.230 +627.231 +627.232 +627.233 +627.234 +627.235 +627.236 +627.237 +627.238 +627.239 +628.217 +628.218 +628.219 +628.220 +628.221 +628.222 +628.223 +628.224 +628.225 +628.226 +628.227 +628.228 +628.229 +628.230 +628.231 +628.232 +628.233 +628.234 +628.235 +628.236 +628.237 +628.238 +628.239 +629.217 +629.218 +629.219 +629.220 +629.221 +629.222 +629.223 +629.224 +629.225 +629.226 +629.227 +629.228 +629.229 +629.230 +629.231 +629.232 +629.233 +629.234 +629.235 +629.236 +629.237 +629.238 +630.217 +630.218 +630.219 +630.220 +630.221 +630.222 +630.223 +630.224 +630.225 +630.226 +630.227 +630.228 +630.229 +630.230 +630.231 +630.232 +630.233 +630.234 +630.235 +630.236 +630.237 +630.238 +631.217 +631.218 +631.219 +631.220 +631.221 +631.222 +631.223 +631.224 +631.225 +631.226 +631.227 +631.228 +631.229 +631.230 +631.231 +631.232 +631.233 +631.234 +631.235 +631.236 +631.237 +631.238 +632.217 +632.218 +632.219 +632.220 +632.221 +632.222 +632.223 +632.224 +632.225 +632.226 +632.227 +632.228 +632.229 +632.230 +632.231 +632.232 +632.233 +632.234 +632.235 +632.236 +632.237 +633.217 +633.218 +633.219 +633.220 +633.221 +633.222 +633.223 +633.224 +633.225 +633.226 +633.227 +633.228 +633.229 +633.230 +633.231 +633.232 +633.233 +633.234 +633.235 +633.236 +633.237 +634.217 +634.218 +634.219 +634.220 +634.221 +634.222 +634.223 +634.224 +634.225 +634.226 +634.227 +634.228 +634.229 +634.230 +634.231 +634.232 +634.233 +634.234 +634.235 +634.236 +634.237 +635.217 +635.218 +635.219 +635.220 +635.221 +635.222 +635.223 +635.224 +635.225 +635.226 +635.227 +635.228 +635.229 +635.230 +635.231 +635.232 +635.233 +635.234 +635.235 +635.236 +636.217 +636.219 +636.220 +636.221 +636.222 +636.223 +636.224 +636.225 +636.226 +636.227 +636.228 +636.229 +636.230 +636.231 +636.232 +636.233 +636.234 +636.235 +636.236 +637.217 +637.219 +637.220 +637.221 +637.222 +637.223 +637.224 +637.225 +637.226 +637.227 +637.228 +637.229 +637.230 +637.231 +637.232 +637.233 +637.234 +637.235 +637.236 +638.219 +638.221 +638.222 +638.223 +638.224 +638.225 +638.226 +638.227 +638.228 +638.229 +638.230 +638.231 +638.232 +638.233 +638.234 +638.235 +639.219 +639.221 +639.222 +639.223 +639.224 +639.225 +639.226 +639.227 +639.228 +639.229 +639.230 +639.231 +639.232 +639.233 +639.234 +639.235 +640.221 +640.222 +640.223 +640.224 +640.225 +640.226 +640.227 +640.228 +640.229 +640.230 +640.231 +640.232 +640.233 +640.234 +640.235 +641.221 +641.222 +641.223 +641.224 +641.225 +641.226 +641.227 +641.228 +641.229 +641.230 +641.231 +641.232 +641.233 +641.234 +642.221 +642.222 +642.223 +642.224 +642.225 +642.226 +642.227 +642.228 +642.229 +642.230 +642.231 +642.232 +642.233 +642.234 +643.221 +643.222 +643.223 +643.224 +643.225 +643.226 +643.227 +643.228 +643.229 +643.230 +643.231 +643.232 +643.233 +643.234 +644.221 +644.222 +644.223 +644.224 +644.225 +644.226 +644.227 +644.228 +644.229 +644.230 +644.231 +644.232 +644.233 +645.221 +645.222 +645.223 +645.224 +645.225 +645.226 +645.227 +645.228 +645.229 +645.230 +645.231 +645.232 +645.233 +646.221 +646.223 +646.224 +646.225 +646.226 +646.227 +646.228 +646.229 +646.230 +646.231 +646.232 +646.233 +647.223 +647.224 +647.225 +647.226 +647.227 +647.228 +647.229 +647.230 +647.231 +647.232 +648.223 +648.225 +648.226 +648.227 +648.228 +648.229 +648.230 +648.231 +648.232 +649.225 +649.226 +649.227 +649.228 +649.229 +649.230 +649.231 +649.232 +650.225 +650.226 +650.227 +650.228 +650.229 +650.230 +650.231 +651.225 +651.226 +651.227 +651.228 +651.229 +651.230 +651.231 +652.195 +652.197 +652.225 +652.226 +652.227 +652.228 +652.229 +652.230 +653.194 +653.195 +653.196 +653.197 +653.225 +653.226 +653.227 +653.228 +653.229 +653.230 +654.192 +654.193 +654.194 +654.195 +654.196 +654.197 +654.225 +654.226 +654.227 +654.228 +654.229 +654.230 +655.191 +655.192 +655.193 +655.194 +655.195 +655.196 +655.225 +655.228 +655.229 +656.188 +656.189 +656.190 +656.191 +656.192 +656.193 +656.194 +656.195 +656.228 +656.229 +657.185 +657.186 +657.187 +657.188 +657.189 +657.190 +657.191 +657.192 +657.193 +657.194 +657.195 +657.227 +657.228 +657.229 +658.181 +658.182 +658.183 +658.184 +658.185 +658.186 +658.187 +658.188 +658.189 +658.190 +658.191 +658.192 +658.193 +658.194 +658.195 +658.227 +658.228 +659.181 +659.182 +659.183 +659.184 +659.185 +659.186 +659.187 +659.188 +659.189 +659.190 +659.191 +659.192 +659.193 +659.194 +659.195 +659.227 +659.228 +660.181 +660.182 +660.183 +660.184 +660.185 +660.186 +660.187 +660.188 +660.189 +660.190 +660.191 +660.192 +660.193 +660.194 +660.195 +660.227 +661.182 +661.183 +661.184 +661.185 +661.186 +661.187 +661.188 +661.189 +661.190 +661.191 +661.192 +661.193 +661.194 +661.227 +662.182 +662.183 +662.184 +662.185 +662.186 +662.187 +662.188 +662.189 +662.190 +662.191 +662.193 +663.182 +663.183 +663.184 +663.185 +663.186 +663.187 +663.188 +663.189 +663.190 +663.191 +664.183 +664.184 +664.185 +664.186 +664.187 +664.188 +664.189 +665.185 +665.186 +665.187 diff --git a/auxdir/CFIS/tiles_cuts.txt b/auxdir/CFIS/tiles_cuts.txt deleted file mode 100644 index b1c181630..000000000 --- a/auxdir/CFIS/tiles_cuts.txt +++ /dev/null @@ -1,12055 +0,0 @@ -001.238 0.28510217391642745 0.8567792078664276 28.741671418001033 29.24967467376608 -002.238 0.8567792078664276 1.4284562418164275 28.741671418001033 29.24967467376608 -003.238 1.4284562418164275 2.0001332757164274 28.741671418001033 29.24967467376608 -004.238 2.0001332757164274 2.5718103096664278 28.741671418001033 29.24967467376608 -005.238 2.5718103096664278 3.1434873436164277 28.741671418001033 29.24967467376608 -006.238 3.1434873436164277 3.7151643775664276 28.741671418001033 29.24967467376608 -007.238 3.7151643775664276 4.286841411516428 28.741671418001033 29.24967467376608 -008.238 4.286841411516428 4.858518445416429 28.741671418001033 29.24967467376608 -009.238 4.858518445416429 5.430195479366427 28.741671418001033 29.24967467376608 -010.238 5.430195479366427 6.001872513316426 28.741671418001033 29.24967467376608 -011.238 6.001872513316426 6.5735495472164285 28.741671418001033 29.24967467376608 -012.238 6.5735495472164285 7.145226581166426 28.741671418001033 29.24967467376608 -013.238 7.145226581166426 7.716903615116426 28.741671418001033 29.24967467376608 -014.238 7.716903615116426 8.288580649016428 28.741671418001033 29.24967467376608 -015.238 8.288580649016428 8.860257682966427 28.741671418001033 29.24967467376608 -016.238 8.860257682966427 9.431934716916428 28.741671418001033 29.24967467376608 -017.238 9.431934716916428 10.003611750866428 28.741671418001033 29.24967467376608 -018.238 10.003611750866428 10.575288784816426 28.741671418001033 29.24967467376608 -019.238 10.575288784816426 11.146965818716428 28.741671418001033 29.24967467376608 -020.238 11.146965818716428 11.718642852666427 28.741671418001033 29.24967467376608 -021.238 11.718642852666427 12.290319886616427 28.741671418001033 29.24967467376608 -022.238 12.290319886616427 12.861996920516429 28.741671418001033 29.24967467376608 -023.238 12.861996920516429 13.433673954466425 28.741671418001033 29.24967467376608 -024.238 13.433673954466425 14.005350988416428 28.741671418001033 29.24967467376608 -025.238 14.005350988416428 14.577028022366429 28.741671418001033 29.24967467376608 -026.238 14.577028022366429 15.14870505631643 28.741671418001033 29.24967467376608 -027.238 15.14870505631643 15.720382090216429 28.741671418001033 29.24967467376608 -028.238 15.720382090216429 16.29205912416643 28.741671418001033 29.24967467376608 -029.238 16.29205912416643 16.863736158116424 28.741671418001033 29.24967467376608 -030.238 16.863736158116424 17.435413192016426 28.741671418001033 29.24967467376608 -031.238 17.435413192016426 18.007090225966426 28.741671418001033 29.24967467376608 -032.238 18.007090225966426 18.578767259916432 28.741671418001033 29.24967467376608 -033.238 18.578767259916432 19.150444293816427 28.741671418001033 29.24967467376608 -034.238 19.150444293816427 19.722121327766423 28.741671418001033 29.24967467376608 -035.238 19.722121327766423 20.293798361716426 28.741671418001033 29.24967467376608 -036.238 20.293798361716426 20.86547539566643 28.741671418001033 29.24967467376608 -037.238 20.86547539566643 21.437152429616425 28.741671418001033 29.24967467376608 -038.238 21.437152429616425 22.008829463516427 28.741671418001033 29.24967467376608 -039.238 22.008829463516427 22.580506497466427 28.741671418001033 29.24967467376608 -040.238 22.580506497466427 23.152183531416426 28.741671418001033 29.24967467376608 -041.238 23.152183531416426 23.72386056531643 28.741671418001033 29.24967467376608 -042.238 23.72386056531643 24.295537599266424 28.741671418001033 29.24967467376608 -043.238 24.295537599266424 24.867214633216427 28.741671418001033 29.24967467376608 -044.238 24.867214633216427 25.438891667116426 28.741671418001033 29.24967467376608 -045.238 25.438891667116426 26.010568701066425 28.741671418001033 29.24967467376608 -046.238 26.010568701066425 26.58224573501643 28.741671418001033 29.24967467376608 -047.238 26.58224573501643 27.153922768966424 28.741671418001033 29.24967467376608 -048.238 27.153922768966424 27.725599802916424 28.741671418001033 29.24967467376608 -049.238 27.725599802916424 28.29727683681643 28.741671418001033 29.24967467376608 -050.238 28.29727683681643 28.868953870766425 28.741671418001033 29.24967467376608 -051.238 28.868953870766425 29.44063090471643 28.741671418001033 29.24967467376608 -052.238 29.44063090471643 30.01230793861643 28.741671418001033 29.24967467376608 -053.238 30.01230793861643 30.583984972566434 28.741671418001033 29.24967467376608 -054.238 30.583984972566434 31.155662006516433 28.741671418001033 29.24967467376608 -055.238 31.155662006516433 31.727339040466433 28.741671418001033 29.24967467376608 -056.238 31.727339040466433 32.29901607441643 28.741671418001033 29.24967467376608 -057.238 32.29901607441643 32.87069310831643 28.741671418001033 29.24967467376608 -058.238 32.87069310831643 33.44237014226643 28.741671418001033 29.24967467376608 -059.238 33.44237014226643 34.01404717621644 28.741671418001033 29.24967467376608 -060.238 34.01404717621644 34.585724210116425 28.741671418001033 29.24967467376608 -061.238 34.585724210116425 35.15740124406643 28.741671418001033 29.24967467376608 -062.238 35.15740124406643 35.72907827801643 28.741671418001033 29.24967467376608 -063.238 35.72907827801643 36.30075531191642 28.741671418001033 29.24967467376608 -064.238 36.30075531191642 36.88159182408282 28.741671418001033 29.24967467376608 -203.238 115.75470355085004 116.33554006306643 28.741671418001033 29.24967467376608 -204.238 116.33554006306643 116.90721709701643 28.741671418001033 29.24967467376608 -205.238 116.90721709701643 117.47889413096644 28.741671418001033 29.24967467376608 -206.238 117.47889413096644 118.05057116491643 28.741671418001033 29.24967467376608 -207.238 118.05057116491643 118.62224819881644 28.741671418001033 29.24967467376608 -208.238 118.62224819881644 119.19392523276643 28.741671418001033 29.24967467376608 -209.238 119.19392523276643 119.76560226671643 28.741671418001033 29.24967467376608 -210.238 119.76560226671643 120.33727930061644 28.741671418001033 29.24967467376608 -211.238 120.33727930061644 120.90895633456643 28.741671418001033 29.24967467376608 -212.238 120.90895633456643 121.48063336851644 28.741671418001033 29.24967467376608 -213.238 121.48063336851644 122.05231040241642 28.741671418001033 29.24967467376608 -214.238 122.05231040241642 122.62398743636643 28.741671418001033 29.24967467376608 -215.238 122.62398743636643 123.19566447031643 28.741671418001033 29.24967467376608 -216.238 123.19566447031643 123.76734150426643 28.741671418001033 29.24967467376608 -217.238 123.76734150426643 124.33901853821644 28.741671418001033 29.24967467376608 -218.238 124.33901853821644 124.91069557211642 28.741671418001033 29.24967467376608 -219.238 124.91069557211642 125.48237260606643 28.741671418001033 29.24967467376608 -220.238 125.48237260606643 126.05404964001644 28.741671418001033 29.24967467376608 -221.238 126.05404964001644 126.62572667391643 28.741671418001033 29.24967467376608 -222.238 126.62572667391643 127.19740370786644 28.741671418001033 29.24967467376608 -223.238 127.19740370786644 127.76908074181642 28.741671418001033 29.24967467376608 -224.238 127.76908074181642 128.34075777571644 28.741671418001033 29.24967467376608 -225.238 128.34075777571644 128.91243480966642 28.741671418001033 29.24967467376608 -226.238 128.91243480966642 129.48411184361643 28.741671418001033 29.24967467376608 -227.238 129.48411184361643 130.05578887756644 28.741671418001033 29.24967467376608 -228.238 130.05578887756644 130.62746591151642 28.741671418001033 29.24967467376608 -229.238 130.62746591151642 131.19914294541644 28.741671418001033 29.24967467376608 -230.238 131.19914294541644 131.77081997936642 28.741671418001033 29.24967467376608 -231.238 131.77081997936642 132.3424970133164 28.741671418001033 29.24967467376608 -232.238 132.3424970133164 132.91417404721642 28.741671418001033 29.24967467376608 -233.238 132.91417404721642 133.48585108116643 28.741671418001033 29.24967467376608 -234.238 133.48585108116643 134.0575281151164 28.741671418001033 29.24967467376608 -235.238 134.0575281151164 134.62920514906642 28.741671418001033 29.24967467376608 -236.238 134.62920514906642 135.20088218301643 28.741671418001033 29.24967467376608 -237.238 135.20088218301643 135.77255921691642 28.741671418001033 29.24967467376608 -238.238 135.77255921691642 136.3442362508664 28.741671418001033 29.24967467376608 -239.238 136.3442362508664 136.91591328481644 28.741671418001033 29.24967467376608 -240.238 136.91591328481644 137.4875903187164 28.741671418001033 29.24967467376608 -241.238 137.4875903187164 138.05926735266644 28.741671418001033 29.24967467376608 -242.238 138.05926735266644 138.63094438661642 28.741671418001033 29.24967467376608 -243.238 138.63094438661642 139.20262142051644 28.741671418001033 29.24967467376608 -244.238 139.20262142051644 139.77429845446642 28.741671418001033 29.24967467376608 -245.238 139.77429845446642 140.34597548841643 28.741671418001033 29.24967467376608 -246.238 140.34597548841643 140.91765252236644 28.741671418001033 29.24967467376608 -247.238 140.91765252236644 141.48932955631642 28.741671418001033 29.24967467376608 -248.238 141.48932955631642 142.06100659021644 28.741671418001033 29.24967467376608 -249.238 142.06100659021644 142.63268362416642 28.741671418001033 29.24967467376608 -250.238 142.63268362416642 143.20436065811643 28.741671418001033 29.24967467376608 -251.238 143.20436065811643 143.77603769201642 28.741671418001033 29.24967467376608 -252.238 143.77603769201642 144.34771472596643 28.741671418001033 29.24967467376608 -253.238 144.34771472596643 144.91939175991644 28.741671418001033 29.24967467376608 -254.238 144.91939175991644 145.49106879381645 28.741671418001033 29.24967467376608 -255.238 145.49106879381645 146.06274582776643 28.741671418001033 29.24967467376608 -256.238 146.06274582776643 146.63442286171642 28.741671418001033 29.24967467376608 -257.238 146.63442286171642 147.20609989566643 28.741671418001033 29.24967467376608 -258.238 147.20609989566643 147.77777692961644 28.741671418001033 29.24967467376608 -259.238 147.77777692961644 148.34945396351645 28.741671418001033 29.24967467376608 -260.238 148.34945396351645 148.92113099746643 28.741671418001033 29.24967467376608 -261.238 148.92113099746643 149.49280803141642 28.741671418001033 29.24967467376608 -262.238 149.49280803141642 150.06448506531643 28.741671418001033 29.24967467376608 -263.238 150.06448506531643 150.63616209926644 28.741671418001033 29.24967467376608 -264.238 150.63616209926644 151.20783913321642 28.741671418001033 29.24967467376608 -265.238 151.20783913321642 151.77951616716643 28.741671418001033 29.24967467376608 -266.238 151.77951616716643 152.35119320111642 28.741671418001033 29.24967467376608 -267.238 152.35119320111642 152.92287023501643 28.741671418001033 29.24967467376608 -268.238 152.92287023501643 153.49454726896641 28.741671418001033 29.24967467376608 -269.238 153.49454726896641 154.06622430291645 28.741671418001033 29.24967467376608 -270.238 154.06622430291645 154.6379013368164 28.741671418001033 29.24967467376608 -271.238 154.6379013368164 155.20957837076642 28.741671418001033 29.24967467376608 -272.238 155.20957837076642 155.79041488298282 28.741671418001033 29.24967467376608 -280.238 159.77383516405004 160.3546716762164 28.741671418001033 29.24967467376608 -281.238 160.3546716762164 160.92634871011643 28.741671418001033 29.24967467376608 -282.238 160.92634871011643 161.49802574406644 28.741671418001033 29.24967467376608 -283.238 161.49802574406644 162.06970277801645 28.741671418001033 29.24967467376608 -284.238 162.06970277801645 162.64137981191644 28.741671418001033 29.24967467376608 -285.238 162.64137981191644 163.21305684586645 28.741671418001033 29.24967467376608 -286.238 163.21305684586645 163.78473387981643 28.741671418001033 29.24967467376608 -287.238 163.78473387981643 164.35641091376644 28.741671418001033 29.24967467376608 -288.238 164.35641091376644 164.92808794771645 28.741671418001033 29.24967467376608 -289.238 164.92808794771645 165.49976498161644 28.741671418001033 29.24967467376608 -290.238 165.49976498161644 166.07144201556645 28.741671418001033 29.24967467376608 -291.238 166.07144201556645 166.64311904951643 28.741671418001033 29.24967467376608 -292.238 166.64311904951643 167.21479608341645 28.741671418001033 29.24967467376608 -293.238 167.21479608341645 167.78647311736643 28.741671418001033 29.24967467376608 -294.238 167.78647311736643 168.3581501513164 28.741671418001033 29.24967467376608 -295.238 168.3581501513164 168.92982718526645 28.741671418001033 29.24967467376608 -296.238 168.92982718526645 169.50150421921643 28.741671418001033 29.24967467376608 -297.238 169.50150421921643 170.07318125311645 28.741671418001033 29.24967467376608 -298.238 170.07318125311645 170.64485828706643 28.741671418001033 29.24967467376608 -299.238 170.64485828706643 171.21653532101644 28.741671418001033 29.24967467376608 -300.238 171.21653532101644 171.78821235491642 28.741671418001033 29.24967467376608 -301.238 171.78821235491642 172.35988938886643 28.741671418001033 29.24967467376608 -302.238 172.35988938886643 172.93156642281645 28.741671418001033 29.24967467376608 -303.238 172.93156642281645 173.50324345671643 28.741671418001033 29.24967467376608 -304.238 173.50324345671643 174.07492049066644 28.741671418001033 29.24967467376608 -305.238 174.07492049066644 174.64659752461642 28.741671418001033 29.24967467376608 -306.238 174.64659752461642 175.21827455856643 28.741671418001033 29.24967467376608 -307.238 175.21827455856643 175.78995159251645 28.741671418001033 29.24967467376608 -308.238 175.78995159251645 176.36162862641643 28.741671418001033 29.24967467376608 -309.238 176.36162862641643 176.93330566036644 28.741671418001033 29.24967467376608 -310.238 176.93330566036644 177.50498269431642 28.741671418001033 29.24967467376608 -311.238 177.50498269431642 178.07665972821644 28.741671418001033 29.24967467376608 -312.238 178.07665972821644 178.64833676216642 28.741671418001033 29.24967467376608 -313.238 178.64833676216642 179.22001379611643 28.741671418001033 29.24967467376608 -314.238 179.22001379611643 179.79169083001642 28.741671418001033 29.24967467376608 -315.238 179.79169083001642 180.3633678639664 28.741671418001033 29.24967467376608 -316.238 180.3633678639664 180.93504489791638 28.741671418001033 29.24967467376608 -317.238 180.93504489791638 181.5067219318664 28.741671418001033 29.24967467376608 -318.238 181.5067219318664 182.0783989658164 28.741671418001033 29.24967467376608 -319.238 182.0783989658164 182.65007599971642 28.741671418001033 29.24967467376608 -320.238 182.65007599971642 183.2217530336664 28.741671418001033 29.24967467376608 -321.238 183.2217530336664 183.79343006761638 28.741671418001033 29.24967467376608 -322.238 183.79343006761638 184.3651071015164 28.741671418001033 29.24967467376608 -323.238 184.3651071015164 184.9367841354664 28.741671418001033 29.24967467376608 -324.238 184.9367841354664 185.50846116941642 28.741671418001033 29.24967467376608 -325.238 185.50846116941642 186.0801382033664 28.741671418001033 29.24967467376608 -326.238 186.0801382033664 186.65181523731638 28.741671418001033 29.24967467376608 -327.238 186.65181523731638 187.2234922712164 28.741671418001033 29.24967467376608 -328.238 187.2234922712164 187.79516930516644 28.741671418001033 29.24967467376608 -329.238 187.79516930516644 188.36684633911642 28.741671418001033 29.24967467376608 -330.238 188.36684633911642 188.9385233730164 28.741671418001033 29.24967467376608 -331.238 188.9385233730164 189.51020040696642 28.741671418001033 29.24967467376608 -332.238 189.51020040696642 190.0818774409164 28.741671418001033 29.24967467376608 -333.238 190.0818774409164 190.65355447481642 28.741671418001033 29.24967467376608 -334.238 190.65355447481642 191.2252315087664 28.741671418001033 29.24967467376608 -335.238 191.2252315087664 191.79690854271644 28.741671418001033 29.24967467376608 -336.238 191.79690854271644 192.36858557666642 28.741671418001033 29.24967467376608 -337.238 192.36858557666642 192.9402626106164 28.741671418001033 29.24967467376608 -338.238 192.9402626106164 193.51193964451642 28.741671418001033 29.24967467376608 -339.238 193.51193964451642 194.0836166784664 28.741671418001033 29.24967467376608 -340.238 194.0836166784664 194.65529371241644 28.741671418001033 29.24967467376608 -341.238 194.65529371241644 195.2269707463164 28.741671418001033 29.24967467376608 -342.238 195.2269707463164 195.7986477802664 28.741671418001033 29.24967467376608 -343.238 195.7986477802664 196.37032481421642 28.741671418001033 29.24967467376608 -344.238 196.37032481421642 196.9420018481164 28.741671418001033 29.24967467376608 -345.238 196.9420018481164 197.51367888206642 28.741671418001033 29.24967467376608 -346.238 197.51367888206642 198.08535591601643 28.741671418001033 29.24967467376608 -347.238 198.08535591601643 198.6570329499664 28.741671418001033 29.24967467376608 -348.238 198.6570329499664 199.22870998391642 28.741671418001033 29.24967467376608 -349.238 199.22870998391642 199.8095464960828 28.741671418001033 29.24967467376608 -403.238 230.09011033824999 230.67094685041639 28.741671418001033 29.24967467376608 -404.238 230.67094685041639 231.2426238843164 28.741671418001033 29.24967467376608 -405.238 231.2426238843164 231.81430091826644 28.741671418001033 29.24967467376608 -406.238 231.81430091826644 232.3859779522164 28.741671418001033 29.24967467376608 -407.238 232.3859779522164 232.9576549861664 28.741671418001033 29.24967467376608 -408.238 232.9576549861664 233.5293320201164 28.741671418001033 29.24967467376608 -409.238 233.5293320201164 234.1010090540164 28.741671418001033 29.24967467376608 -410.238 234.1010090540164 234.67268608796644 28.741671418001033 29.24967467376608 -411.238 234.67268608796644 235.24436312191642 28.741671418001033 29.24967467376608 -412.238 235.24436312191642 235.81604015581644 28.741671418001033 29.24967467376608 -413.238 235.81604015581644 236.38771718976642 28.741671418001033 29.24967467376608 -414.238 236.38771718976642 236.9593942237164 28.741671418001033 29.24967467376608 -415.238 236.9593942237164 237.53107125761642 28.741671418001033 29.24967467376608 -416.238 237.53107125761642 238.1027482915664 28.741671418001033 29.24967467376608 -417.238 238.1027482915664 238.67442532551644 28.741671418001033 29.24967467376608 -418.238 238.67442532551644 239.24610235946642 28.741671418001033 29.24967467376608 -419.238 239.24610235946642 239.8177793934164 28.741671418001033 29.24967467376608 -420.238 239.8177793934164 240.38945642731642 28.741671418001033 29.24967467376608 -421.238 240.38945642731642 240.9611334612664 28.741671418001033 29.24967467376608 -422.238 240.9611334612664 241.53281049521644 28.741671418001033 29.24967467376608 -423.238 241.53281049521644 242.10448752911643 28.741671418001033 29.24967467376608 -424.238 242.10448752911643 242.67616456306644 28.741671418001033 29.24967467376608 -425.238 242.67616456306644 243.2478415970164 28.741671418001033 29.24967467376608 -426.238 243.2478415970164 243.8195186309664 28.741671418001033 29.24967467376608 -427.238 243.8195186309664 244.3911956649164 28.741671418001033 29.24967467376608 -428.238 244.3911956649164 244.9628726988164 28.741671418001033 29.24967467376608 -429.238 244.9628726988164 245.53454973276644 28.741671418001033 29.24967467376608 -430.238 245.53454973276644 246.10622676671642 28.741671418001033 29.24967467376608 -431.238 246.10622676671642 246.6779038006164 28.741671418001033 29.24967467376608 -432.238 246.6779038006164 247.24958083456642 28.741671418001033 29.24967467376608 -433.238 247.24958083456642 247.82125786851643 28.741671418001033 29.24967467376608 -434.238 247.82125786851643 248.3929349024164 28.741671418001033 29.24967467376608 -435.238 248.3929349024164 248.9646119363664 28.741671418001033 29.24967467376608 -436.238 248.9646119363664 249.5362889703164 28.741671418001033 29.24967467376608 -437.238 249.5362889703164 250.10796600426642 28.741671418001033 29.24967467376608 -438.238 250.10796600426642 250.6796430382164 28.741671418001033 29.24967467376608 -439.238 250.6796430382164 251.2513200721164 28.741671418001033 29.24967467376608 -440.238 251.2513200721164 251.82299710606642 28.741671418001033 29.24967467376608 -441.238 251.82299710606642 252.39467414001643 28.741671418001033 29.24967467376608 -442.238 252.39467414001643 252.96635117391645 28.741671418001033 29.24967467376608 -443.238 252.96635117391645 253.53802820786643 28.741671418001033 29.24967467376608 -444.238 253.53802820786643 254.1097052418164 28.741671418001033 29.24967467376608 -445.238 254.1097052418164 254.68138227571643 28.741671418001033 29.24967467376608 -446.238 254.68138227571643 255.2530593096664 28.741671418001033 29.24967467376608 -447.238 255.2530593096664 255.82473634361642 28.741671418001033 29.24967467376608 -448.238 255.82473634361642 256.39641337756643 28.741671418001033 29.24967467376608 -449.238 256.39641337756643 256.9680904115164 28.741671418001033 29.24967467376608 -450.238 256.9680904115164 257.5397674454164 28.741671418001033 29.24967467376608 -451.238 257.5397674454164 258.1114444793664 28.741671418001033 29.24967467376608 -452.238 258.1114444793664 258.68312151331645 28.741671418001033 29.24967467376608 -453.238 258.68312151331645 259.2547985472164 28.741671418001033 29.24967467376608 -454.238 259.2547985472164 259.8264755811664 28.741671418001033 29.24967467376608 -455.238 259.8264755811664 260.39815261511643 28.741671418001033 29.24967467376608 -456.238 260.39815261511643 260.96982964906636 28.741671418001033 29.24967467376608 -457.238 260.96982964906636 261.54150668301645 28.741671418001033 29.24967467376608 -458.238 261.54150668301645 262.1131837169164 28.741671418001033 29.24967467376608 -459.238 262.1131837169164 262.68486075086645 28.741671418001033 29.24967467376608 -460.238 262.68486075086645 263.2565377848164 28.741671418001033 29.24967467376608 -461.238 263.2565377848164 263.82821481871645 28.741671418001033 29.24967467376608 -462.238 263.82821481871645 264.3998918526664 28.741671418001033 29.24967467376608 -463.238 264.3998918526664 264.9715688866164 28.741671418001033 29.24967467376608 -464.238 264.9715688866164 265.54324592051637 28.741671418001033 29.24967467376608 -465.238 265.54324592051637 266.1149229544664 28.741671418001033 29.24967467376608 -466.238 266.1149229544664 266.6865999884164 28.741671418001033 29.24967467376608 -467.238 266.6865999884164 267.2582770223664 28.741671418001033 29.24967467376608 -468.238 267.2582770223664 267.8391135345828 28.741671418001033 29.24967467376608 -596.238 340.42377788805004 341.0046144002164 28.741671418001033 29.24967467376608 -597.238 341.0046144002164 341.57629143411646 28.741671418001033 29.24967467376608 -598.238 341.57629143411646 342.14796846806644 28.741671418001033 29.24967467376608 -599.238 342.14796846806644 342.7196455020164 28.741671418001033 29.24967467376608 -600.238 342.7196455020164 343.29132253591644 28.741671418001033 29.24967467376608 -601.238 343.29132253591644 343.8629995698664 28.741671418001033 29.24967467376608 -602.238 343.8629995698664 344.43467660381646 28.741671418001033 29.24967467376608 -603.238 344.43467660381646 345.0063536377164 28.741671418001033 29.24967467376608 -604.238 345.0063536377164 345.57803067166645 28.741671418001033 29.24967467376608 -605.238 345.57803067166645 346.14970770561644 28.741671418001033 29.24967467376608 -606.238 346.14970770561644 346.7213847395664 28.741671418001033 29.24967467376608 -607.238 346.7213847395664 347.29306177351646 28.741671418001033 29.24967467376608 -608.238 347.29306177351646 347.8647388074164 28.741671418001033 29.24967467376608 -609.238 347.8647388074164 348.4364158413664 28.741671418001033 29.24967467376608 -610.238 348.4364158413664 349.00809287531644 28.741671418001033 29.24967467376608 -611.238 349.00809287531644 349.5797699092164 28.741671418001033 29.24967467376608 -612.238 349.5797699092164 350.15144694316643 28.741671418001033 29.24967467376608 -613.238 350.15144694316643 350.7231239771164 28.741671418001033 29.24967467376608 -614.238 350.7231239771164 351.29480101101643 28.741671418001033 29.24967467376608 -615.238 351.29480101101643 351.86647804496636 28.741671418001033 29.24967467376608 -616.238 351.86647804496636 352.43815507891645 28.741671418001033 29.24967467376608 -617.238 352.43815507891645 353.00983211286643 28.741671418001033 29.24967467376608 -618.238 353.00983211286643 353.5815091468164 28.741671418001033 29.24967467376608 -619.238 353.5815091468164 354.1531861807164 28.741671418001033 29.24967467376608 -620.238 354.1531861807164 354.72486321466636 28.741671418001033 29.24967467376608 -621.238 354.72486321466636 355.2965402486164 28.741671418001033 29.24967467376608 -622.238 355.2965402486164 355.8682172825164 28.741671418001033 29.24967467376608 -623.238 355.8682172825164 356.43989431646645 28.741671418001033 29.24967467376608 -624.238 356.43989431646645 357.0115713504164 28.741671418001033 29.24967467376608 -625.238 357.0115713504164 357.58324838436636 28.741671418001033 29.24967467376608 -626.238 357.58324838436636 358.1549254183164 28.741671418001033 29.24967467376608 -627.238 358.1549254183164 358.7266024522164 28.741671418001033 29.24967467376608 -628.238 358.7266024522164 359.2982794861664 28.741671418001033 29.24967467376608 -629.238 359.2982794861664 359.7916908300664 28.741671418001033 29.24967467376608 -000.238 359.7916908300664 0.28510217391642745 28.741671418001033 29.24967467376608 -001.239 0.28648363190667003 0.86096140270667 29.24967467376608 29.749667981580195 -002.239 0.86096140270667 1.4354391735066696 29.24967467376608 29.749667981580195 -003.239 1.4354391735066696 2.00991694430667 29.24967467376608 29.749667981580195 -004.239 2.00991694430667 2.5843947151066704 29.24967467376608 29.749667981580195 -005.239 2.5843947151066704 3.15887248590667 29.24967467376608 29.749667981580195 -006.239 3.15887248590667 3.73335025665667 29.24967467376608 29.749667981580195 -007.239 3.73335025665667 4.30782802740667 29.24967467376608 29.749667981580195 -008.239 4.30782802740667 4.882305798206669 29.24967467376608 29.749667981580195 -009.239 4.882305798206669 5.456783569006669 29.24967467376608 29.749667981580195 -010.239 5.456783569006669 6.031261339806669 29.24967467376608 29.749667981580195 -011.239 6.031261339806669 6.605739110606669 29.24967467376608 29.749667981580195 -012.239 6.605739110606669 7.18021688140667 29.24967467376608 29.749667981580195 -013.239 7.18021688140667 7.754694652206669 29.24967467376608 29.749667981580195 -014.239 7.754694652206669 8.32917242300667 29.24967467376608 29.749667981580195 -015.239 8.32917242300667 8.90365019380667 29.24967467376608 29.749667981580195 -016.239 8.90365019380667 9.47812796460667 29.24967467376608 29.749667981580195 -017.239 9.47812796460667 10.052605735406669 29.24967467376608 29.749667981580195 -018.239 10.052605735406669 10.627083506206672 29.24967467376608 29.749667981580195 -019.239 10.627083506206672 11.201561276956669 29.24967467376608 29.749667981580195 -020.239 11.201561276956669 11.776039047706668 29.24967467376608 29.749667981580195 -021.239 11.776039047706668 12.35051681850667 29.24967467376608 29.749667981580195 -022.239 12.35051681850667 12.924994589306667 29.24967467376608 29.749667981580195 -023.239 12.924994589306667 13.499472360106669 29.24967467376608 29.749667981580195 -024.239 13.499472360106669 14.073950130906669 29.24967467376608 29.749667981580195 -025.239 14.073950130906669 14.648427901706668 29.24967467376608 29.749667981580195 -026.239 14.648427901706668 15.22290567250667 29.24967467376608 29.749667981580195 -027.239 15.22290567250667 15.797383443306668 29.24967467376608 29.749667981580195 -028.239 15.797383443306668 16.371861214106673 29.24967467376608 29.749667981580195 -029.239 16.371861214106673 16.94633898490667 29.24967467376608 29.749667981580195 -030.239 16.94633898490667 17.520816755706672 29.24967467376608 29.749667981580195 -031.239 17.520816755706672 18.095294526506674 29.24967467376608 29.749667981580195 -032.239 18.095294526506674 18.66977229725667 29.24967467376608 29.749667981580195 -033.239 18.66977229725667 19.24425006800667 29.24967467376608 29.749667981580195 -034.239 19.24425006800667 19.818727838806673 29.24967467376608 29.749667981580195 -035.239 19.818727838806673 20.393205609606674 29.24967467376608 29.749667981580195 -036.239 20.393205609606674 20.96768338040667 29.24967467376608 29.749667981580195 -037.239 20.96768338040667 21.542161151206663 29.24967467376608 29.749667981580195 -038.239 21.542161151206663 22.116638922006665 29.24967467376608 29.749667981580195 -039.239 22.116638922006665 22.69111669280667 29.24967467376608 29.749667981580195 -040.239 22.69111669280667 23.26559446360667 29.24967467376608 29.749667981580195 -041.239 23.26559446360667 23.840072234406676 29.24967467376608 29.749667981580195 -042.239 23.840072234406676 24.41455000520667 29.24967467376608 29.749667981580195 -043.239 24.41455000520667 24.989027776006672 29.24967467376608 29.749667981580195 -044.239 24.989027776006672 25.56350554680667 29.24967467376608 29.749667981580195 -045.239 25.56350554680667 26.137983317556667 29.24967467376608 29.749667981580195 -046.239 26.137983317556667 26.712461088306668 29.24967467376608 29.749667981580195 -047.239 26.712461088306668 27.286938859106673 29.24967467376608 29.749667981580195 -048.239 27.286938859106673 27.86141662990667 29.24967467376608 29.749667981580195 -049.239 27.86141662990667 28.43589440070667 29.24967467376608 29.749667981580195 -050.239 28.43589440070667 29.010372171506674 29.24967467376608 29.749667981580195 -051.239 29.010372171506674 29.584849942306672 29.24967467376608 29.749667981580195 -052.239 29.584849942306672 30.159327713106677 29.24967467376608 29.749667981580195 -053.239 30.159327713106677 30.73380548390667 29.24967467376608 29.749667981580195 -054.239 30.73380548390667 31.308283254706673 29.24967467376608 29.749667981580195 -055.239 31.308283254706673 31.88276102550667 29.24967467376608 29.749667981580195 -056.239 31.88276102550667 32.45723879630667 29.24967467376608 29.749667981580195 -057.239 32.45723879630667 33.03171656710667 29.24967467376608 29.749667981580195 -058.239 33.03171656710667 33.60619433790667 29.24967467376608 29.749667981580195 -059.239 33.60619433790667 34.180672108656665 29.24967467376608 29.749667981580195 -060.239 34.180672108656665 34.75514987940667 29.24967467376608 29.749667981580195 -061.239 34.75514987940667 35.329627650206675 29.24967467376608 29.749667981580195 -062.239 35.329627650206675 35.90410542100667 29.24967467376608 29.749667981580195 -063.239 35.90410542100667 36.47858319180668 29.24967467376608 29.749667981580195 -064.239 36.47858319180668 37.05306096260667 29.24967467376608 29.749667981580195 -065.239 37.05306096260667 37.63674313684956 29.24967467376608 29.749667981580195 -202.239 115.74731115776379 116.33099333200667 29.24967467376608 29.749667981580195 -203.239 116.33099333200667 116.90547110275665 29.24967467376608 29.749667981580195 -204.239 116.90547110275665 117.47994887350666 29.24967467376608 29.749667981580195 -205.239 117.47994887350666 118.05442664430666 29.24967467376608 29.749667981580195 -206.239 118.05442664430666 118.62890441510669 29.24967467376608 29.749667981580195 -207.239 118.62890441510669 119.20338218590669 29.24967467376608 29.749667981580195 -208.239 119.20338218590669 119.77785995670666 29.24967467376608 29.749667981580195 -209.239 119.77785995670666 120.35233772750667 29.24967467376608 29.749667981580195 -210.239 120.35233772750667 120.92681549830667 29.24967467376608 29.749667981580195 -211.239 120.92681549830667 121.50129326910667 29.24967467376608 29.749667981580195 -212.239 121.50129326910667 122.07577103990667 29.24967467376608 29.749667981580195 -213.239 122.07577103990667 122.65024881070667 29.24967467376608 29.749667981580195 -214.239 122.65024881070667 123.22472658150667 29.24967467376608 29.749667981580195 -215.239 123.22472658150667 123.79920435230667 29.24967467376608 29.749667981580195 -216.239 123.79920435230667 124.37368212305668 29.24967467376608 29.749667981580195 -217.239 124.37368212305668 124.94815989380668 29.24967467376608 29.749667981580195 -218.239 124.94815989380668 125.52263766460669 29.24967467376608 29.749667981580195 -219.239 125.52263766460669 126.09711543540666 29.24967467376608 29.749667981580195 -220.239 126.09711543540666 126.67159320620668 29.24967467376608 29.749667981580195 -221.239 126.67159320620668 127.24607097700667 29.24967467376608 29.749667981580195 -222.239 127.24607097700667 127.82054874780667 29.24967467376608 29.749667981580195 -223.239 127.82054874780667 128.39502651860667 29.24967467376608 29.749667981580195 -224.239 128.39502651860667 128.96950428940664 29.24967467376608 29.749667981580195 -225.239 128.96950428940664 129.5439820602067 29.24967467376608 29.749667981580195 -226.239 129.5439820602067 130.1184598310067 29.24967467376608 29.749667981580195 -227.239 130.1184598310067 130.6929376018067 29.24967467376608 29.749667981580195 -228.239 130.6929376018067 131.26741537260665 29.24967467376608 29.749667981580195 -229.239 131.26741537260665 131.84189314335669 29.24967467376608 29.749667981580195 -230.239 131.84189314335669 132.41637091410666 29.24967467376608 29.749667981580195 -231.239 132.41637091410666 132.99084868490667 29.24967467376608 29.749667981580195 -232.239 132.99084868490667 133.56532645570667 29.24967467376608 29.749667981580195 -233.239 133.56532645570667 134.13980422650667 29.24967467376608 29.749667981580195 -234.239 134.13980422650667 134.71428199730667 29.24967467376608 29.749667981580195 -235.239 134.71428199730667 135.28875976810667 29.24967467376608 29.749667981580195 -236.239 135.28875976810667 135.86323753890667 29.24967467376608 29.749667981580195 -237.239 135.86323753890667 136.43771530970668 29.24967467376608 29.749667981580195 -238.239 136.43771530970668 137.01219308050668 29.24967467376608 29.749667981580195 -239.239 137.01219308050668 137.58667085130668 29.24967467376608 29.749667981580195 -240.239 137.58667085130668 138.16114862210668 29.24967467376608 29.749667981580195 -241.239 138.16114862210668 138.73562639290668 29.24967467376608 29.749667981580195 -242.239 138.73562639290668 139.31010416365666 29.24967467376608 29.749667981580195 -243.239 139.31010416365666 139.8845819344067 29.24967467376608 29.749667981580195 -244.239 139.8845819344067 140.4590597052067 29.24967467376608 29.749667981580195 -245.239 140.4590597052067 141.03353747600667 29.24967467376608 29.749667981580195 -246.239 141.03353747600667 141.60801524680667 29.24967467376608 29.749667981580195 -247.239 141.60801524680667 142.18249301760667 29.24967467376608 29.749667981580195 -248.239 142.18249301760667 142.75697078840668 29.24967467376608 29.749667981580195 -249.239 142.75697078840668 143.33144855920668 29.24967467376608 29.749667981580195 -250.239 143.33144855920668 143.90592633000665 29.24967467376608 29.749667981580195 -251.239 143.90592633000665 144.48040410080665 29.24967467376608 29.749667981580195 -252.239 144.48040410080665 145.05488187160665 29.24967467376608 29.749667981580195 -253.239 145.05488187160665 145.62935964240665 29.24967467376608 29.749667981580195 -254.239 145.62935964240665 146.20383741320668 29.24967467376608 29.749667981580195 -255.239 146.20383741320668 146.7783151839567 29.24967467376608 29.749667981580195 -256.239 146.7783151839567 147.35279295470667 29.24967467376608 29.749667981580195 -257.239 147.35279295470667 147.92727072550667 29.24967467376608 29.749667981580195 -258.239 147.92727072550667 148.5017484963067 29.24967467376608 29.749667981580195 -259.239 148.5017484963067 149.07622626710668 29.24967467376608 29.749667981580195 -260.239 149.07622626710668 149.65070403790665 29.24967467376608 29.749667981580195 -261.239 149.65070403790665 150.22518180870665 29.24967467376608 29.749667981580195 -262.239 150.22518180870665 150.79965957950668 29.24967467376608 29.749667981580195 -263.239 150.79965957950668 151.37413735030668 29.24967467376608 29.749667981580195 -264.239 151.37413735030668 151.94861512110668 29.24967467376608 29.749667981580195 -265.239 151.94861512110668 152.52309289190666 29.24967467376608 29.749667981580195 -266.239 152.52309289190666 153.09757066270666 29.24967467376608 29.749667981580195 -267.239 153.09757066270666 153.67204843350666 29.24967467376608 29.749667981580195 -268.239 153.67204843350666 154.24652620425667 29.24967467376608 29.749667981580195 -269.239 154.24652620425667 154.82100397500665 29.24967467376608 29.749667981580195 -270.239 154.82100397500665 155.39548174580665 29.24967467376608 29.749667981580195 -271.239 155.39548174580665 155.96995951660668 29.24967467376608 29.749667981580195 -272.239 155.96995951660668 156.55364169084956 29.24967467376608 29.749667981580195 -278.239 159.40762173796378 159.9913039122067 29.24967467376608 29.749667981580195 -279.239 159.9913039122067 160.56578168300666 29.24967467376608 29.749667981580195 -280.239 160.56578168300666 161.14025945380666 29.24967467376608 29.749667981580195 -281.239 161.14025945380666 161.71473722455664 29.24967467376608 29.749667981580195 -282.239 161.71473722455664 162.28921499530665 29.24967467376608 29.749667981580195 -283.239 162.28921499530665 162.86369276610665 29.24967467376608 29.749667981580195 -284.239 162.86369276610665 163.43817053690668 29.24967467376608 29.749667981580195 -285.239 163.43817053690668 164.01264830770668 29.24967467376608 29.749667981580195 -286.239 164.01264830770668 164.58712607850669 29.24967467376608 29.749667981580195 -287.239 164.58712607850669 165.1616038493067 29.24967467376608 29.749667981580195 -288.239 165.1616038493067 165.7360816201067 29.24967467376608 29.749667981580195 -289.239 165.7360816201067 166.31055939090666 29.24967467376608 29.749667981580195 -290.239 166.31055939090666 166.8850371617067 29.24967467376608 29.749667981580195 -291.239 166.8850371617067 167.4595149325067 29.24967467376608 29.749667981580195 -292.239 167.4595149325067 168.0339927033067 29.24967467376608 29.749667981580195 -293.239 168.0339927033067 168.6084704741067 29.24967467376608 29.749667981580195 -294.239 168.6084704741067 169.18294824490667 29.24967467376608 29.749667981580195 -295.239 169.18294824490667 169.75742601565668 29.24967467376608 29.749667981580195 -296.239 169.75742601565668 170.33190378640666 29.24967467376608 29.749667981580195 -297.239 170.33190378640666 170.90638155720666 29.24967467376608 29.749667981580195 -298.239 170.90638155720666 171.48085932800666 29.24967467376608 29.749667981580195 -299.239 171.48085932800666 172.05533709880666 29.24967467376608 29.749667981580195 -300.239 172.05533709880666 172.62981486960666 29.24967467376608 29.749667981580195 -301.239 172.62981486960666 173.20429264040666 29.24967467376608 29.749667981580195 -302.239 173.20429264040666 173.77877041120666 29.24967467376608 29.749667981580195 -303.239 173.77877041120666 174.35324818200667 29.24967467376608 29.749667981580195 -304.239 174.35324818200667 174.92772595280667 29.24967467376608 29.749667981580195 -305.239 174.92772595280667 175.50220372360667 29.24967467376608 29.749667981580195 -306.239 175.50220372360667 176.07668149440667 29.24967467376608 29.749667981580195 -307.239 176.07668149440667 176.65115926520667 29.24967467376608 29.749667981580195 -308.239 176.65115926520667 177.22563703595665 29.24967467376608 29.749667981580195 -309.239 177.22563703595665 177.8001148067067 29.24967467376608 29.749667981580195 -310.239 177.8001148067067 178.37459257750666 29.24967467376608 29.749667981580195 -311.239 178.37459257750666 178.94907034830666 29.24967467376608 29.749667981580195 -312.239 178.94907034830666 179.52354811910666 29.24967467376608 29.749667981580195 -313.239 179.52354811910666 180.09802588990667 29.24967467376608 29.749667981580195 -314.239 180.09802588990667 180.67250366070667 29.24967467376608 29.749667981580195 -315.239 180.67250366070667 181.24698143150667 29.24967467376608 29.749667981580195 -316.239 181.24698143150667 181.82145920230664 29.24967467376608 29.749667981580195 -317.239 181.82145920230664 182.39593697310664 29.24967467376608 29.749667981580195 -318.239 182.39593697310664 182.97041474390664 29.24967467376608 29.749667981580195 -319.239 182.97041474390664 183.54489251470667 29.24967467376608 29.749667981580195 -320.239 183.54489251470667 184.11937028550668 29.24967467376608 29.749667981580195 -321.239 184.11937028550668 184.69384805625666 29.24967467376608 29.749667981580195 -322.239 184.69384805625666 185.26832582700666 29.24967467376608 29.749667981580195 -323.239 185.26832582700666 185.84280359780666 29.24967467376608 29.749667981580195 -324.239 185.84280359780666 186.41728136860667 29.24967467376608 29.749667981580195 -325.239 186.41728136860667 186.99175913940667 29.24967467376608 29.749667981580195 -326.239 186.99175913940667 187.56623691020667 29.24967467376608 29.749667981580195 -327.239 187.56623691020667 188.14071468100667 29.24967467376608 29.749667981580195 -328.239 188.14071468100667 188.71519245180667 29.24967467376608 29.749667981580195 -329.239 188.71519245180667 189.28967022260667 29.24967467376608 29.749667981580195 -330.239 189.28967022260667 189.86414799340668 29.24967467376608 29.749667981580195 -331.239 189.86414799340668 190.43862576420665 29.24967467376608 29.749667981580195 -332.239 190.43862576420665 191.01310353500662 29.24967467376608 29.749667981580195 -333.239 191.01310353500662 191.58758130580665 29.24967467376608 29.749667981580195 -334.239 191.58758130580665 192.16205907655666 29.24967467376608 29.749667981580195 -335.239 192.16205907655666 192.73653684730667 29.24967467376608 29.749667981580195 -336.239 192.73653684730667 193.31101461810667 29.24967467376608 29.749667981580195 -337.239 193.31101461810667 193.8854923889067 29.24967467376608 29.749667981580195 -338.239 193.8854923889067 194.45997015970667 29.24967467376608 29.749667981580195 -339.239 194.45997015970667 195.03444793050664 29.24967467376608 29.749667981580195 -340.239 195.03444793050664 195.60892570130665 29.24967467376608 29.749667981580195 -341.239 195.60892570130665 196.18340347210665 29.24967467376608 29.749667981580195 -342.239 196.18340347210665 196.75788124290665 29.24967467376608 29.749667981580195 -343.239 196.75788124290665 197.33235901370665 29.24967467376608 29.749667981580195 -344.239 197.33235901370665 197.90683678450665 29.24967467376608 29.749667981580195 -345.239 197.90683678450665 198.48131455530665 29.24967467376608 29.749667981580195 -346.239 198.48131455530665 199.05579232610665 29.24967467376608 29.749667981580195 -347.239 199.05579232610665 199.63027009685666 29.24967467376608 29.749667981580195 -348.239 199.63027009685666 200.20474786760667 29.24967467376608 29.749667981580195 -349.239 200.20474786760667 200.77922563840667 29.24967467376608 29.749667981580195 -350.239 200.77922563840667 201.35370340920667 29.24967467376608 29.749667981580195 -351.239 201.35370340920667 201.92818118000667 29.24967467376608 29.749667981580195 -352.239 201.92818118000667 202.50265895080668 29.24967467376608 29.749667981580195 -353.239 202.50265895080668 203.07713672160662 29.24967467376608 29.749667981580195 -354.239 203.07713672160662 203.65161449240662 29.24967467376608 29.749667981580195 -355.239 203.65161449240662 204.22609226320665 29.24967467376608 29.749667981580195 -356.239 204.22609226320665 204.80057003400665 29.24967467376608 29.749667981580195 -357.239 204.80057003400665 205.37504780480668 29.24967467376608 29.749667981580195 -358.239 205.37504780480668 205.94952557560666 29.24967467376608 29.749667981580195 -359.239 205.94952557560666 206.52400334640666 29.24967467376608 29.749667981580195 -360.239 206.52400334640666 207.09848111715667 29.24967467376608 29.749667981580195 -361.239 207.09848111715667 207.67295888790665 29.24967467376608 29.749667981580195 -362.239 207.67295888790665 208.25664106214955 29.24967467376608 29.749667981580195 -401.239 230.06838754536375 230.65206971960663 29.24967467376608 29.749667981580195 -402.239 230.65206971960663 231.22654749040663 29.24967467376608 29.749667981580195 -403.239 231.22654749040663 231.80102526120666 29.24967467376608 29.749667981580195 -404.239 231.80102526120666 232.37550303200666 29.24967467376608 29.749667981580195 -405.239 232.37550303200666 232.9499808028067 29.24967467376608 29.749667981580195 -406.239 232.9499808028067 233.52445857360667 29.24967467376608 29.749667981580195 -407.239 233.52445857360667 234.09893634440667 29.24967467376608 29.749667981580195 -408.239 234.09893634440667 234.67341411520664 29.24967467376608 29.749667981580195 -409.239 234.67341411520664 235.24789188600667 29.24967467376608 29.749667981580195 -410.239 235.24789188600667 235.82236965680667 29.24967467376608 29.749667981580195 -411.239 235.82236965680667 236.39684742760667 29.24967467376608 29.749667981580195 -412.239 236.39684742760667 236.9713251984067 29.24967467376608 29.749667981580195 -413.239 236.9713251984067 237.54580296915668 29.24967467376608 29.749667981580195 -414.239 237.54580296915668 238.12028073990666 29.24967467376608 29.749667981580195 -415.239 238.12028073990666 238.69475851070663 29.24967467376608 29.749667981580195 -416.239 238.69475851070663 239.26923628150666 29.24967467376608 29.749667981580195 -417.239 239.26923628150666 239.84371405230667 29.24967467376608 29.749667981580195 -418.239 239.84371405230667 240.41819182310667 29.24967467376608 29.749667981580195 -419.239 240.41819182310667 240.99266959390667 29.24967467376608 29.749667981580195 -420.239 240.99266959390667 241.56714736470667 29.24967467376608 29.749667981580195 -421.239 241.56714736470667 242.1416251355067 29.24967467376608 29.749667981580195 -422.239 242.1416251355067 242.71610290630665 29.24967467376608 29.749667981580195 -423.239 242.71610290630665 243.29058067710668 29.24967467376608 29.749667981580195 -424.239 243.29058067710668 243.86505844790668 29.24967467376608 29.749667981580195 -425.239 243.86505844790668 244.43953621870665 29.24967467376608 29.749667981580195 -426.239 244.43953621870665 245.01401398945666 29.24967467376608 29.749667981580195 -427.239 245.01401398945666 245.58849176020667 29.24967467376608 29.749667981580195 -428.239 245.58849176020667 246.1629695310067 29.24967467376608 29.749667981580195 -429.239 246.1629695310067 246.73744730180667 29.24967467376608 29.749667981580195 -430.239 246.73744730180667 247.31192507260667 29.24967467376608 29.749667981580195 -431.239 247.31192507260667 247.88640284340664 29.24967467376608 29.749667981580195 -432.239 247.88640284340664 248.46088061420667 29.24967467376608 29.749667981580195 -433.239 248.46088061420667 249.0353583850067 29.24967467376608 29.749667981580195 -434.239 249.0353583850067 249.60983615580668 29.24967467376608 29.749667981580195 -435.239 249.60983615580668 250.18431392660665 29.24967467376608 29.749667981580195 -436.239 250.18431392660665 250.75879169740665 29.24967467376608 29.749667981580195 -437.239 250.75879169740665 251.33326946820665 29.24967467376608 29.749667981580195 -438.239 251.33326946820665 251.90774723900665 29.24967467376608 29.749667981580195 -439.239 251.90774723900665 252.48222500975666 29.24967467376608 29.749667981580195 -440.239 252.48222500975666 253.05670278050667 29.24967467376608 29.749667981580195 -441.239 253.05670278050667 253.63118055130667 29.24967467376608 29.749667981580195 -442.239 253.63118055130667 254.2056583221067 29.24967467376608 29.749667981580195 -443.239 254.2056583221067 254.78013609290667 29.24967467376608 29.749667981580195 -444.239 254.78013609290667 255.35461386370667 29.24967467376608 29.749667981580195 -445.239 255.35461386370667 255.92909163450668 29.24967467376608 29.749667981580195 -446.239 255.92909163450668 256.5035694053067 29.24967467376608 29.749667981580195 -447.239 256.5035694053067 257.0780471761067 29.24967467376608 29.749667981580195 -448.239 257.0780471761067 257.6525249469067 29.24967467376608 29.749667981580195 -449.239 257.6525249469067 258.2270027177067 29.24967467376608 29.749667981580195 -450.239 258.2270027177067 258.8014804885067 29.24967467376608 29.749667981580195 -451.239 258.8014804885067 259.3759582593067 29.24967467376608 29.749667981580195 -452.239 259.3759582593067 259.95043603005666 29.24967467376608 29.749667981580195 -453.239 259.95043603005666 260.52491380080664 29.24967467376608 29.749667981580195 -454.239 260.52491380080664 261.09939157160665 29.24967467376608 29.749667981580195 -455.239 261.09939157160665 261.67386934240665 29.24967467376608 29.749667981580195 -456.239 261.67386934240665 262.2483471132067 29.24967467376608 29.749667981580195 -457.239 262.2483471132067 262.82282488400665 29.24967467376608 29.749667981580195 -458.239 262.82282488400665 263.39730265480665 29.24967467376608 29.749667981580195 -459.239 263.39730265480665 263.97178042560665 29.24967467376608 29.749667981580195 -460.239 263.97178042560665 264.54625819640665 29.24967467376608 29.749667981580195 -461.239 264.54625819640665 265.12073596720666 29.24967467376608 29.749667981580195 -462.239 265.12073596720666 265.69521373800666 29.24967467376608 29.749667981580195 -463.239 265.69521373800666 266.26969150880666 29.24967467376608 29.749667981580195 -464.239 266.26969150880666 266.84416927960666 29.24967467376608 29.749667981580195 -465.239 266.84416927960666 267.41864705035664 29.24967467376608 29.749667981580195 -466.239 267.41864705035664 267.9931248211067 29.24967467376608 29.749667981580195 -467.239 267.9931248211067 268.5676025919067 29.24967467376608 29.749667981580195 -468.239 268.5676025919067 269.1420803627067 29.24967467376608 29.749667981580195 -469.239 269.1420803627067 269.72576253694956 29.24967467376608 29.749667981580195 -592.239 339.79364176676376 340.37732394100664 29.24967467376608 29.749667981580195 -593.239 340.37732394100664 340.95180171180664 29.24967467376608 29.749667981580195 -594.239 340.95180171180664 341.5262794826066 29.24967467376608 29.749667981580195 -595.239 341.5262794826066 342.10075725340664 29.24967467376608 29.749667981580195 -596.239 342.10075725340664 342.67523502420664 29.24967467376608 29.749667981580195 -597.239 342.67523502420664 343.2497127949566 29.24967467376608 29.749667981580195 -598.239 343.2497127949566 343.82419056570666 29.24967467376608 29.749667981580195 -599.239 343.82419056570666 344.39866833650666 29.24967467376608 29.749667981580195 -600.239 344.39866833650666 344.97314610730666 29.24967467376608 29.749667981580195 -601.239 344.97314610730666 345.54762387810666 29.24967467376608 29.749667981580195 -602.239 345.54762387810666 346.12210164890666 29.24967467376608 29.749667981580195 -603.239 346.12210164890666 346.6965794197066 29.24967467376608 29.749667981580195 -604.239 346.6965794197066 347.27105719050667 29.24967467376608 29.749667981580195 -605.239 347.27105719050667 347.84553496130667 29.24967467376608 29.749667981580195 -606.239 347.84553496130667 348.42001273210667 29.24967467376608 29.749667981580195 -607.239 348.42001273210667 348.99449050290673 29.24967467376608 29.749667981580195 -608.239 348.99449050290673 349.5689682737067 29.24967467376608 29.749667981580195 -609.239 349.5689682737067 350.14344604450673 29.24967467376608 29.749667981580195 -610.239 350.14344604450673 350.71792381525665 29.24967467376608 29.749667981580195 -611.239 350.71792381525665 351.2924015860067 29.24967467376608 29.749667981580195 -612.239 351.2924015860067 351.86687935680663 29.24967467376608 29.749667981580195 -613.239 351.86687935680663 352.44135712760664 29.24967467376608 29.749667981580195 -614.239 352.44135712760664 353.01583489840664 29.24967467376608 29.749667981580195 -615.239 353.01583489840664 353.59031266920664 29.24967467376608 29.749667981580195 -616.239 353.59031266920664 354.16479044000664 29.24967467376608 29.749667981580195 -617.239 354.16479044000664 354.7392682108066 29.24967467376608 29.749667981580195 -618.239 354.7392682108066 355.31374598160664 29.24967467376608 29.749667981580195 -619.239 355.31374598160664 355.88822375240665 29.24967467376608 29.749667981580195 -620.239 355.88822375240665 356.46270152320665 29.24967467376608 29.749667981580195 -621.239 356.46270152320665 357.0371792940067 29.24967467376608 29.749667981580195 -622.239 357.0371792940067 357.61165706480665 29.24967467376608 29.749667981580195 -623.239 357.61165706480665 358.1861348355567 29.24967467376608 29.749667981580195 -624.239 358.1861348355567 358.76061260630667 29.24967467376608 29.749667981580195 -625.239 358.76061260630667 359.33509037710667 29.24967467376608 29.749667981580195 -626.239 359.33509037710667 359.81078700450666 29.24967467376608 29.749667981580195 -000.239 359.81078700450666 0.28648363190667003 29.24967467376608 29.749667981580195 -001.240 0.2879005725553856 0.8652508417553857 29.749667981580195 30.249661222302226 -002.240 0.8652508417553857 1.4426011109553858 29.749667981580195 30.249661222302226 -003.240 1.4426011109553858 2.0199513801553857 29.749667981580195 30.249661222302226 -004.240 2.0199513801553857 2.5973016493053853 29.749667981580195 30.249661222302226 -005.240 2.5973016493053853 3.1746519184553863 29.749667981580195 30.249661222302226 -006.240 3.1746519184553863 3.7520021876553855 29.749667981580195 30.249661222302226 -007.240 3.7520021876553855 4.329352456855386 29.749667981580195 30.249661222302226 -008.240 4.329352456855386 4.906702726055384 29.749667981580195 30.249661222302226 -009.240 4.906702726055384 5.484052995255386 29.749667981580195 30.249661222302226 -010.240 5.484052995255386 6.061403264455385 29.749667981580195 30.249661222302226 -011.240 6.061403264455385 6.638753533655386 29.749667981580195 30.249661222302226 -012.240 6.638753533655386 7.216103802855384 29.749667981580195 30.249661222302226 -013.240 7.216103802855384 7.793454072055386 29.749667981580195 30.249661222302226 -014.240 7.793454072055386 8.370804341205385 29.749667981580195 30.249661222302226 -015.240 8.370804341205385 8.948154610355386 29.749667981580195 30.249661222302226 -016.240 8.948154610355386 9.525504879555385 29.749667981580195 30.249661222302226 -017.240 9.525504879555385 10.102855148755385 29.749667981580195 30.249661222302226 -018.240 10.102855148755385 10.680205417955385 29.749667981580195 30.249661222302226 -019.240 10.680205417955385 11.257555687155387 29.749667981580195 30.249661222302226 -020.240 11.257555687155387 11.834905956355387 29.749667981580195 30.249661222302226 -021.240 11.834905956355387 12.412256225555385 29.749667981580195 30.249661222302226 -022.240 12.412256225555385 12.989606494755385 29.749667981580195 30.249661222302226 -023.240 12.989606494755385 13.566956763955389 29.749667981580195 30.249661222302226 -024.240 13.566956763955389 14.144307033105388 29.749667981580195 30.249661222302226 -025.240 14.144307033105388 14.721657302255387 29.749667981580195 30.249661222302226 -026.240 14.721657302255387 15.299007571455387 29.749667981580195 30.249661222302226 -027.240 15.299007571455387 15.876357840655388 29.749667981580195 30.249661222302226 -028.240 15.876357840655388 16.453708109855388 29.749667981580195 30.249661222302226 -029.240 16.453708109855388 17.031058379055388 29.749667981580195 30.249661222302226 -030.240 17.031058379055388 17.60840864825539 29.749667981580195 30.249661222302226 -031.240 17.60840864825539 18.185758917455388 29.749667981580195 30.249661222302226 -032.240 18.185758917455388 18.763109186655385 29.749667981580195 30.249661222302226 -033.240 18.763109186655385 19.340459455805387 29.749667981580195 30.249661222302226 -034.240 19.340459455805387 19.917809724955383 29.749667981580195 30.249661222302226 -035.240 19.917809724955383 20.495159994155387 29.749667981580195 30.249661222302226 -036.240 20.495159994155387 21.072510263355383 29.749667981580195 30.249661222302226 -037.240 21.072510263355383 21.649860532555387 29.749667981580195 30.249661222302226 -038.240 21.649860532555387 22.227210801755383 29.749667981580195 30.249661222302226 -039.240 22.227210801755383 22.804561070955387 29.749667981580195 30.249661222302226 -040.240 22.804561070955387 23.381911340155384 29.749667981580195 30.249661222302226 -041.240 23.381911340155384 23.959261609355384 29.749667981580195 30.249661222302226 -042.240 23.959261609355384 24.53661187855539 29.749667981580195 30.249661222302226 -043.240 24.53661187855539 25.113962147705386 29.749667981580195 30.249661222302226 -044.240 25.113962147705386 25.691312416855386 29.749667981580195 30.249661222302226 -045.240 25.691312416855386 26.268662686055386 29.749667981580195 30.249661222302226 -046.240 26.268662686055386 26.846012955255382 29.749667981580195 30.249661222302226 -047.240 26.846012955255382 27.423363224455386 29.749667981580195 30.249661222302226 -048.240 27.423363224455386 28.000713493655383 29.749667981580195 30.249661222302226 -049.240 28.000713493655383 28.578063762855386 29.749667981580195 30.249661222302226 -050.240 28.578063762855386 29.155414032055383 29.749667981580195 30.249661222302226 -051.240 29.155414032055383 29.732764301255386 29.749667981580195 30.249661222302226 -052.240 29.732764301255386 30.310114570455386 29.749667981580195 30.249661222302226 -053.240 30.310114570455386 30.887464839605382 29.749667981580195 30.249661222302226 -054.240 30.887464839605382 31.46481510875538 29.749667981580195 30.249661222302226 -055.240 31.46481510875538 32.042165377955385 29.749667981580195 30.249661222302226 -056.240 32.042165377955385 32.61951564715538 29.749667981580195 30.249661222302226 -057.240 32.61951564715538 33.196865916355385 29.749667981580195 30.249661222302226 -058.240 33.196865916355385 33.77421618555539 29.749667981580195 30.249661222302226 -059.240 33.77421618555539 34.35156645475539 29.749667981580195 30.249661222302226 -060.240 34.35156645475539 34.92891672395539 29.749667981580195 30.249661222302226 -061.240 34.92891672395539 35.506266993155386 29.749667981580195 30.249661222302226 -062.240 35.506266993155386 36.08361726230539 29.749667981580195 30.249661222302226 -063.240 36.08361726230539 36.660967531455384 29.749667981580195 30.249661222302226 -064.240 36.660967531455384 37.23831780065538 29.749667981580195 30.249661222302226 -065.240 37.23831780065538 37.82491855036968 29.749667981580195 30.249661222302226 -201.240 115.74870392994107 116.33530467965538 29.749667981580195 30.249661222302226 -202.240 116.33530467965538 116.91265494885539 29.749667981580195 30.249661222302226 -203.240 116.91265494885539 117.49000521805539 29.749667981580195 30.249661222302226 -204.240 117.49000521805539 118.06735548725538 29.749667981580195 30.249661222302226 -205.240 118.06735548725538 118.6447057564554 29.749667981580195 30.249661222302226 -206.240 118.6447057564554 119.22205602565538 29.749667981580195 30.249661222302226 -207.240 119.22205602565538 119.79940629480538 29.749667981580195 30.249661222302226 -208.240 119.79940629480538 120.37675656395538 29.749667981580195 30.249661222302226 -209.240 120.37675656395538 120.9541068331554 29.749667981580195 30.249661222302226 -210.240 120.9541068331554 121.53145710235538 29.749667981580195 30.249661222302226 -211.240 121.53145710235538 122.10880737155537 29.749667981580195 30.249661222302226 -212.240 122.10880737155537 122.68615764075538 29.749667981580195 30.249661222302226 -213.240 122.68615764075538 123.2635079099554 29.749667981580195 30.249661222302226 -214.240 123.2635079099554 123.84085817915539 29.749667981580195 30.249661222302226 -215.240 123.84085817915539 124.41820844835539 29.749667981580195 30.249661222302226 -216.240 124.41820844835539 124.99555871750538 29.749667981580195 30.249661222302226 -217.240 124.99555871750538 125.57290898665539 29.749667981580195 30.249661222302226 -218.240 125.57290898665539 126.15025925585539 29.749667981580195 30.249661222302226 -219.240 126.15025925585539 126.72760952505539 29.749667981580195 30.249661222302226 -220.240 126.72760952505539 127.30495979425538 29.749667981580195 30.249661222302226 -221.240 127.30495979425538 127.88231006345538 29.749667981580195 30.249661222302226 -222.240 127.88231006345538 128.4596603326554 29.749667981580195 30.249661222302226 -223.240 128.4596603326554 129.03701060185537 29.749667981580195 30.249661222302226 -224.240 129.03701060185537 129.6143608710554 29.749667981580195 30.249661222302226 -225.240 129.6143608710554 130.1917111402554 29.749667981580195 30.249661222302226 -226.240 130.1917111402554 130.76906140940537 29.749667981580195 30.249661222302226 -227.240 130.76906140940537 131.34641167855537 29.749667981580195 30.249661222302226 -228.240 131.34641167855537 131.9237619477554 29.749667981580195 30.249661222302226 -229.240 131.9237619477554 132.5011122169554 29.749667981580195 30.249661222302226 -230.240 132.5011122169554 133.0784624861554 29.749667981580195 30.249661222302226 -231.240 133.0784624861554 133.65581275535538 29.749667981580195 30.249661222302226 -232.240 133.65581275535538 134.23316302455538 29.749667981580195 30.249661222302226 -233.240 134.23316302455538 134.81051329375538 29.749667981580195 30.249661222302226 -234.240 134.81051329375538 135.38786356295537 29.749667981580195 30.249661222302226 -235.240 135.38786356295537 135.96521383215537 29.749667981580195 30.249661222302226 -236.240 135.96521383215537 136.5425641013054 29.749667981580195 30.249661222302226 -237.240 136.5425641013054 137.11991437045538 29.749667981580195 30.249661222302226 -238.240 137.11991437045538 137.69726463965537 29.749667981580195 30.249661222302226 -239.240 137.69726463965537 138.27461490885537 29.749667981580195 30.249661222302226 -240.240 138.27461490885537 138.85196517805537 29.749667981580195 30.249661222302226 -241.240 138.85196517805537 139.42931544725536 29.749667981580195 30.249661222302226 -242.240 139.42931544725536 140.0066657164554 29.749667981580195 30.249661222302226 -243.240 140.0066657164554 140.5840159856554 29.749667981580195 30.249661222302226 -244.240 140.5840159856554 141.1613662548554 29.749667981580195 30.249661222302226 -245.240 141.1613662548554 141.73871652400538 29.749667981580195 30.249661222302226 -246.240 141.73871652400538 142.31606679315541 29.749667981580195 30.249661222302226 -247.240 142.31606679315541 142.8934170623554 29.749667981580195 30.249661222302226 -248.240 142.8934170623554 143.4707673315554 29.749667981580195 30.249661222302226 -249.240 143.4707673315554 144.0481176007554 29.749667981580195 30.249661222302226 -250.240 144.0481176007554 144.6254678699554 29.749667981580195 30.249661222302226 -251.240 144.6254678699554 145.2028181391554 29.749667981580195 30.249661222302226 -252.240 145.2028181391554 145.7801684083554 29.749667981580195 30.249661222302226 -253.240 145.7801684083554 146.35751867755536 29.749667981580195 30.249661222302226 -254.240 146.35751867755536 146.9348689467554 29.749667981580195 30.249661222302226 -255.240 146.9348689467554 147.5122192159054 29.749667981580195 30.249661222302226 -256.240 147.5122192159054 148.0895694850554 29.749667981580195 30.249661222302226 -257.240 148.0895694850554 148.6669197542554 29.749667981580195 30.249661222302226 -258.240 148.6669197542554 149.24427002345539 29.749667981580195 30.249661222302226 -259.240 149.24427002345539 149.82162029265538 29.749667981580195 30.249661222302226 -260.240 149.82162029265538 150.39897056185538 29.749667981580195 30.249661222302226 -261.240 150.39897056185538 150.97632083105538 29.749667981580195 30.249661222302226 -262.240 150.97632083105538 151.55367110025537 29.749667981580195 30.249661222302226 -263.240 151.55367110025537 152.13102136945537 29.749667981580195 30.249661222302226 -264.240 152.13102136945537 152.70837163865536 29.749667981580195 30.249661222302226 -265.240 152.70837163865536 153.2857219078054 29.749667981580195 30.249661222302226 -266.240 153.2857219078054 153.86307217695537 29.749667981580195 30.249661222302226 -267.240 153.86307217695537 154.44042244615537 29.749667981580195 30.249661222302226 -268.240 154.44042244615537 155.01777271535536 29.749667981580195 30.249661222302226 -269.240 155.01777271535536 155.5951229845554 29.749667981580195 30.249661222302226 -270.240 155.5951229845554 156.1724732537554 29.749667981580195 30.249661222302226 -271.240 156.1724732537554 156.7590740034697 29.749667981580195 30.249661222302226 -276.240 159.0499741191411 159.6365748688554 29.749667981580195 30.249661222302226 -277.240 159.6365748688554 160.2139251380554 29.749667981580195 30.249661222302226 -278.240 160.2139251380554 160.7912754072554 29.749667981580195 30.249661222302226 -279.240 160.7912754072554 161.3686256764554 29.749667981580195 30.249661222302226 -280.240 161.3686256764554 161.9459759456554 29.749667981580195 30.249661222302226 -281.240 161.9459759456554 162.5233262148554 29.749667981580195 30.249661222302226 -282.240 162.5233262148554 163.10067648405538 29.749667981580195 30.249661222302226 -283.240 163.10067648405538 163.67802675325538 29.749667981580195 30.249661222302226 -284.240 163.67802675325538 164.2553770224054 29.749667981580195 30.249661222302226 -285.240 164.2553770224054 164.8327272915554 29.749667981580195 30.249661222302226 -286.240 164.8327272915554 165.41007756075538 29.749667981580195 30.249661222302226 -287.240 165.41007756075538 165.98742782995538 29.749667981580195 30.249661222302226 -288.240 165.98742782995538 166.56477809915538 29.749667981580195 30.249661222302226 -289.240 166.56477809915538 167.14212836835537 29.749667981580195 30.249661222302226 -290.240 167.14212836835537 167.71947863755537 29.749667981580195 30.249661222302226 -291.240 167.71947863755537 168.29682890675537 29.749667981580195 30.249661222302226 -292.240 168.29682890675537 168.87417917595536 29.749667981580195 30.249661222302226 -293.240 168.87417917595536 169.4515294451054 29.749667981580195 30.249661222302226 -294.240 169.4515294451054 170.02887971425537 29.749667981580195 30.249661222302226 -295.240 170.02887971425537 170.60622998345536 29.749667981580195 30.249661222302226 -296.240 170.60622998345536 171.1835802526554 29.749667981580195 30.249661222302226 -297.240 171.1835802526554 171.7609305218554 29.749667981580195 30.249661222302226 -298.240 171.7609305218554 172.3382807910554 29.749667981580195 30.249661222302226 -299.240 172.3382807910554 172.9156310602554 29.749667981580195 30.249661222302226 -300.240 172.9156310602554 173.4929813294554 29.749667981580195 30.249661222302226 -301.240 173.4929813294554 174.0703315986554 29.749667981580195 30.249661222302226 -302.240 174.0703315986554 174.6476818678554 29.749667981580195 30.249661222302226 -303.240 174.6476818678554 175.22503213700537 29.749667981580195 30.249661222302226 -304.240 175.22503213700537 175.8023824061554 29.749667981580195 30.249661222302226 -305.240 175.8023824061554 176.3797326753554 29.749667981580195 30.249661222302226 -306.240 176.3797326753554 176.9570829445554 29.749667981580195 30.249661222302226 -307.240 176.9570829445554 177.5344332137554 29.749667981580195 30.249661222302226 -308.240 177.5344332137554 178.1117834829554 29.749667981580195 30.249661222302226 -309.240 178.1117834829554 178.68913375215539 29.749667981580195 30.249661222302226 -310.240 178.68913375215539 179.26648402135538 29.749667981580195 30.249661222302226 -311.240 179.26648402135538 179.84383429055538 29.749667981580195 30.249661222302226 -312.240 179.84383429055538 180.42118455975537 29.749667981580195 30.249661222302226 -313.240 180.42118455975537 180.9985348289054 29.749667981580195 30.249661222302226 -314.240 180.9985348289054 181.57588509805538 29.749667981580195 30.249661222302226 -315.240 181.57588509805538 182.15323536725538 29.749667981580195 30.249661222302226 -316.240 182.15323536725538 182.73058563645537 29.749667981580195 30.249661222302226 -317.240 182.73058563645537 183.30793590565537 29.749667981580195 30.249661222302226 -318.240 183.30793590565537 183.88528617485537 29.749667981580195 30.249661222302226 -319.240 183.88528617485537 184.46263644405536 29.749667981580195 30.249661222302226 -320.240 184.46263644405536 185.03998671325536 29.749667981580195 30.249661222302226 -321.240 185.03998671325536 185.61733698245538 29.749667981580195 30.249661222302226 -322.240 185.61733698245538 186.1946872516054 29.749667981580195 30.249661222302226 -323.240 186.1946872516054 186.77203752075536 29.749667981580195 30.249661222302226 -324.240 186.77203752075536 187.3493877899554 29.749667981580195 30.249661222302226 -325.240 187.3493877899554 187.9267380591554 29.749667981580195 30.249661222302226 -326.240 187.9267380591554 188.5040883283554 29.749667981580195 30.249661222302226 -327.240 188.5040883283554 189.08143859755535 29.749667981580195 30.249661222302226 -328.240 189.08143859755535 189.65878886675537 29.749667981580195 30.249661222302226 -329.240 189.65878886675537 190.23613913595534 29.749667981580195 30.249661222302226 -330.240 190.23613913595534 190.81348940515537 29.749667981580195 30.249661222302226 -331.240 190.81348940515537 191.39083967435536 29.749667981580195 30.249661222302226 -332.240 191.39083967435536 191.96818994350537 29.749667981580195 30.249661222302226 -333.240 191.96818994350537 192.54554021265537 29.749667981580195 30.249661222302226 -334.240 192.54554021265537 193.1228904818554 29.749667981580195 30.249661222302226 -335.240 193.1228904818554 193.7002407510554 29.749667981580195 30.249661222302226 -336.240 193.7002407510554 194.2775910202554 29.749667981580195 30.249661222302226 -337.240 194.2775910202554 194.85494128945538 29.749667981580195 30.249661222302226 -338.240 194.85494128945538 195.43229155865538 29.749667981580195 30.249661222302226 -339.240 195.43229155865538 196.00964182785538 29.749667981580195 30.249661222302226 -340.240 196.00964182785538 196.58699209705537 29.749667981580195 30.249661222302226 -341.240 196.58699209705537 197.16434236625537 29.749667981580195 30.249661222302226 -342.240 197.16434236625537 197.74169263540534 29.749667981580195 30.249661222302226 -343.240 197.74169263540534 198.31904290455537 29.749667981580195 30.249661222302226 -344.240 198.31904290455537 198.89639317375537 29.749667981580195 30.249661222302226 -345.240 198.89639317375537 199.47374344295537 29.749667981580195 30.249661222302226 -346.240 199.47374344295537 200.05109371215536 29.749667981580195 30.249661222302226 -347.240 200.05109371215536 200.6284439813554 29.749667981580195 30.249661222302226 -348.240 200.6284439813554 201.20579425055536 29.749667981580195 30.249661222302226 -349.240 201.20579425055536 201.78314451975538 29.749667981580195 30.249661222302226 -350.240 201.78314451975538 202.36049478895538 29.749667981580195 30.249661222302226 -351.240 202.36049478895538 202.93784505810538 29.749667981580195 30.249661222302226 -352.240 202.93784505810538 203.51519532725538 29.749667981580195 30.249661222302226 -353.240 203.51519532725538 204.0925455964554 29.749667981580195 30.249661222302226 -354.240 204.0925455964554 204.66989586565538 29.749667981580195 30.249661222302226 -355.240 204.66989586565538 205.24724613485537 29.749667981580195 30.249661222302226 -356.240 205.24724613485537 205.82459640405537 29.749667981580195 30.249661222302226 -357.240 205.82459640405537 206.4019466732554 29.749667981580195 30.249661222302226 -358.240 206.4019466732554 206.97929694245536 29.749667981580195 30.249661222302226 -359.240 206.97929694245536 207.5566472116554 29.749667981580195 30.249661222302226 -360.240 207.5566472116554 208.1432479613697 29.749667981580195 30.249661222302226 -399.240 230.06405722954108 230.6506579792054 29.749667981580195 30.249661222302226 -400.240 230.6506579792054 231.22800824835537 29.749667981580195 30.249661222302226 -401.240 231.22800824835537 231.80535851755536 29.749667981580195 30.249661222302226 -402.240 231.80535851755536 232.38270878675536 29.749667981580195 30.249661222302226 -403.240 232.38270878675536 232.96005905595538 29.749667981580195 30.249661222302226 -404.240 232.96005905595538 233.53740932515538 29.749667981580195 30.249661222302226 -405.240 233.53740932515538 234.11475959435535 29.749667981580195 30.249661222302226 -406.240 234.11475959435535 234.69210986355537 29.749667981580195 30.249661222302226 -407.240 234.69210986355537 235.2694601327554 29.749667981580195 30.249661222302226 -408.240 235.2694601327554 235.84681040195537 29.749667981580195 30.249661222302226 -409.240 235.84681040195537 236.42416067110537 29.749667981580195 30.249661222302226 -410.240 236.42416067110537 237.0015109402554 29.749667981580195 30.249661222302226 -411.240 237.0015109402554 237.57886120945537 29.749667981580195 30.249661222302226 -412.240 237.57886120945537 238.15621147865536 29.749667981580195 30.249661222302226 -413.240 238.15621147865536 238.7335617478554 29.749667981580195 30.249661222302226 -414.240 238.7335617478554 239.3109120170554 29.749667981580195 30.249661222302226 -415.240 239.3109120170554 239.88826228625538 29.749667981580195 30.249661222302226 -416.240 239.88826228625538 240.46561255545538 29.749667981580195 30.249661222302226 -417.240 240.46561255545538 241.04296282465538 29.749667981580195 30.249661222302226 -418.240 241.04296282465538 241.62031309385537 29.749667981580195 30.249661222302226 -419.240 241.62031309385537 242.19766336300535 29.749667981580195 30.249661222302226 -420.240 242.19766336300535 242.77501363215538 29.749667981580195 30.249661222302226 -421.240 242.77501363215538 243.35236390135537 29.749667981580195 30.249661222302226 -422.240 243.35236390135537 243.92971417055534 29.749667981580195 30.249661222302226 -423.240 243.92971417055534 244.50706443975537 29.749667981580195 30.249661222302226 -424.240 244.50706443975537 245.08441470895536 29.749667981580195 30.249661222302226 -425.240 245.08441470895536 245.66176497815536 29.749667981580195 30.249661222302226 -426.240 245.66176497815536 246.2391152473554 29.749667981580195 30.249661222302226 -427.240 246.2391152473554 246.8164655165554 29.749667981580195 30.249661222302226 -428.240 246.8164655165554 247.39381578570536 29.749667981580195 30.249661222302226 -429.240 247.39381578570536 247.9711660548554 29.749667981580195 30.249661222302226 -430.240 247.9711660548554 248.5485163240554 29.749667981580195 30.249661222302226 -431.240 248.5485163240554 249.12586659325535 29.749667981580195 30.249661222302226 -432.240 249.12586659325535 249.70321686245538 29.749667981580195 30.249661222302226 -433.240 249.70321686245538 250.2805671316554 29.749667981580195 30.249661222302226 -434.240 250.2805671316554 250.85791740085534 29.749667981580195 30.249661222302226 -435.240 250.85791740085534 251.43526767005537 29.749667981580195 30.249661222302226 -436.240 251.43526767005537 252.0126179392554 29.749667981580195 30.249661222302226 -437.240 252.0126179392554 252.58996820845536 29.749667981580195 30.249661222302226 -438.240 252.58996820845536 253.1673184776054 29.749667981580195 30.249661222302226 -439.240 253.1673184776054 253.74466874675537 29.749667981580195 30.249661222302226 -440.240 253.74466874675537 254.32201901595536 29.749667981580195 30.249661222302226 -441.240 254.32201901595536 254.8993692851554 29.749667981580195 30.249661222302226 -442.240 254.8993692851554 255.47671955435538 29.749667981580195 30.249661222302226 -443.240 255.47671955435538 256.0540698235554 29.749667981580195 30.249661222302226 -444.240 256.0540698235554 256.6314200927554 29.749667981580195 30.249661222302226 -445.240 256.6314200927554 257.2087703619554 29.749667981580195 30.249661222302226 -446.240 257.2087703619554 257.78612063115537 29.749667981580195 30.249661222302226 -447.240 257.78612063115537 258.36347090035537 29.749667981580195 30.249661222302226 -448.240 258.36347090035537 258.94082116950534 29.749667981580195 30.249661222302226 -449.240 258.94082116950534 259.5181714386554 29.749667981580195 30.249661222302226 -450.240 259.5181714386554 260.09552170785537 29.749667981580195 30.249661222302226 -451.240 260.09552170785537 260.67287197705537 29.749667981580195 30.249661222302226 -452.240 260.67287197705537 261.25022224625536 29.749667981580195 30.249661222302226 -453.240 261.25022224625536 261.82757251545536 29.749667981580195 30.249661222302226 -454.240 261.82757251545536 262.40492278465535 29.749667981580195 30.249661222302226 -455.240 262.40492278465535 262.98227305385535 29.749667981580195 30.249661222302226 -456.240 262.98227305385535 263.55962332305535 29.749667981580195 30.249661222302226 -457.240 263.55962332305535 264.1369735922053 29.749667981580195 30.249661222302226 -458.240 264.1369735922053 264.71432386135535 29.749667981580195 30.249661222302226 -459.240 264.71432386135535 265.29167413055535 29.749667981580195 30.249661222302226 -460.240 265.29167413055535 265.8690243997554 29.749667981580195 30.249661222302226 -461.240 265.8690243997554 266.4463746689554 29.749667981580195 30.249661222302226 -462.240 266.4463746689554 267.0237249381554 29.749667981580195 30.249661222302226 -463.240 267.0237249381554 267.6010752073554 29.749667981580195 30.249661222302226 -464.240 267.6010752073554 268.1784254765554 29.749667981580195 30.249661222302226 -465.240 268.1784254765554 268.7557757457554 29.749667981580195 30.249661222302226 -466.240 268.7557757457554 269.3331260149554 29.749667981580195 30.249661222302226 -467.240 269.3331260149554 269.9197267646697 29.749667981580195 30.249661222302226 -589.240 339.76060837554104 340.3472091252554 29.749667981580195 30.249661222302226 -590.240 340.3472091252554 340.9245593944554 29.749667981580195 30.249661222302226 -591.240 340.9245593944554 341.5019096636554 29.749667981580195 30.249661222302226 -592.240 341.5019096636554 342.0792599328554 29.749667981580195 30.249661222302226 -593.240 342.0792599328554 342.65661020200537 29.749667981580195 30.249661222302226 -594.240 342.65661020200537 343.2339604711554 29.749667981580195 30.249661222302226 -595.240 343.2339604711554 343.81131074035545 29.749667981580195 30.249661222302226 -596.240 343.81131074035545 344.3886610095554 29.749667981580195 30.249661222302226 -597.240 344.3886610095554 344.9660112787554 29.749667981580195 30.249661222302226 -598.240 344.9660112787554 345.54336154795544 29.749667981580195 30.249661222302226 -599.240 345.54336154795544 346.1207118171554 29.749667981580195 30.249661222302226 -600.240 346.1207118171554 346.6980620863554 29.749667981580195 30.249661222302226 -601.240 346.6980620863554 347.27541235555543 29.749667981580195 30.249661222302226 -602.240 347.27541235555543 347.8527626247054 29.749667981580195 30.249661222302226 -603.240 347.8527626247054 348.4301128938554 29.749667981580195 30.249661222302226 -604.240 348.4301128938554 349.0074631630554 29.749667981580195 30.249661222302226 -605.240 349.0074631630554 349.5848134322554 29.749667981580195 30.249661222302226 -606.240 349.5848134322554 350.16216370145537 29.749667981580195 30.249661222302226 -607.240 350.16216370145537 350.73951397065537 29.749667981580195 30.249661222302226 -608.240 350.73951397065537 351.31686423985536 29.749667981580195 30.249661222302226 -609.240 351.31686423985536 351.89421450905536 29.749667981580195 30.249661222302226 -610.240 351.89421450905536 352.47156477825536 29.749667981580195 30.249661222302226 -611.240 352.47156477825536 353.04891504745535 29.749667981580195 30.249661222302226 -612.240 353.04891504745535 353.6262653166054 29.749667981580195 30.249661222302226 -613.240 353.6262653166054 354.20361558575536 29.749667981580195 30.249661222302226 -614.240 354.20361558575536 354.78096585495535 29.749667981580195 30.249661222302226 -615.240 354.78096585495535 355.3583161241554 29.749667981580195 30.249661222302226 -616.240 355.3583161241554 355.93566639335535 29.749667981580195 30.249661222302226 -617.240 355.93566639335535 356.5130166625554 29.749667981580195 30.249661222302226 -618.240 356.5130166625554 357.0903669317554 29.749667981580195 30.249661222302226 -619.240 357.0903669317554 357.6677172009554 29.749667981580195 30.249661222302226 -620.240 357.6677172009554 358.2450674701554 29.749667981580195 30.249661222302226 -621.240 358.2450674701554 358.8224177393554 29.749667981580195 30.249661222302226 -622.240 358.8224177393554 359.39976800850536 29.749667981580195 30.249661222302226 -623.240 359.39976800850536 359.84383429050536 29.749667981580195 30.249661222302226 -000.240 359.84383429050536 0.2879005725553856 29.749667981580195 30.249661222302226 -001.241 0.28935374239990097 0.869649794299901 30.249661222302226 30.74965439387295 -002.241 0.869649794299901 1.4499458461999009 30.249661222302226 30.74965439387295 -003.241 1.4499458461999009 2.0302418980999013 30.249661222302226 30.74965439387295 -004.241 2.0302418980999013 2.6105379499999013 30.249661222302226 30.74965439387295 -005.241 2.6105379499999013 3.1908340018999013 30.249661222302226 30.74965439387295 -006.241 3.1908340018999013 3.7711300537999017 30.249661222302226 30.74965439387295 -007.241 3.7711300537999017 4.351426105649901 30.249661222302226 30.74965439387295 -008.241 4.351426105649901 4.931722157499902 30.249661222302226 30.74965439387295 -009.241 4.931722157499902 5.5120182093999 30.249661222302226 30.74965439387295 -010.241 5.5120182093999 6.092314261299901 30.249661222302226 30.74965439387295 -011.241 6.092314261299901 6.672610313199902 30.249661222302226 30.74965439387295 -012.241 6.672610313199902 7.252906365099902 30.249661222302226 30.74965439387295 -013.241 7.252906365099902 7.833202416999901 30.249661222302226 30.74965439387295 -014.241 7.833202416999901 8.413498468899903 30.249661222302226 30.74965439387295 -015.241 8.413498468899903 8.993794520799902 30.249661222302226 30.74965439387295 -016.241 8.993794520799902 9.5740905726999 30.249661222302226 30.74965439387295 -017.241 9.5740905726999 10.154386624599901 30.249661222302226 30.74965439387295 -018.241 10.154386624599901 10.7346826764999 30.249661222302226 30.74965439387295 -019.241 10.7346826764999 11.3149787283999 30.249661222302226 30.74965439387295 -020.241 11.3149787283999 11.8952747802999 30.249661222302226 30.74965439387295 -021.241 11.8952747802999 12.475570832149902 30.249661222302226 30.74965439387295 -022.241 12.475570832149902 13.0558668839999 30.249661222302226 30.74965439387295 -023.241 13.0558668839999 13.6361629358999 30.249661222302226 30.74965439387295 -024.241 13.6361629358999 14.216458987799902 30.249661222302226 30.74965439387295 -025.241 14.216458987799902 14.7967550396999 30.249661222302226 30.74965439387295 -026.241 14.7967550396999 15.377051091599899 30.249661222302226 30.74965439387295 -027.241 15.377051091599899 15.957347143499902 30.249661222302226 30.74965439387295 -028.241 15.957347143499902 16.5376431953999 30.249661222302226 30.74965439387295 -029.241 16.5376431953999 17.117939247299905 30.249661222302226 30.74965439387295 -030.241 17.117939247299905 17.6982352991999 30.249661222302226 30.74965439387295 -031.241 17.6982352991999 18.2785313510999 30.249661222302226 30.74965439387295 -032.241 18.2785313510999 18.8588274029999 30.249661222302226 30.74965439387295 -033.241 18.8588274029999 19.4391234548999 30.249661222302226 30.74965439387295 -034.241 19.4391234548999 20.019419506799903 30.249661222302226 30.74965439387295 -035.241 20.019419506799903 20.599715558649905 30.249661222302226 30.74965439387295 -036.241 20.599715558649905 21.180011610499903 30.249661222302226 30.74965439387295 -037.241 21.180011610499903 21.760307662399903 30.249661222302226 30.74965439387295 -038.241 21.760307662399903 22.3406037142999 30.249661222302226 30.74965439387295 -039.241 22.3406037142999 22.920899766199902 30.249661222302226 30.74965439387295 -040.241 22.920899766199902 23.501195818099905 30.249661222302226 30.74965439387295 -041.241 23.501195818099905 24.0814918699999 30.249661222302226 30.74965439387295 -042.241 24.0814918699999 24.6617879218999 30.249661222302226 30.74965439387295 -043.241 24.6617879218999 25.2420839737999 30.249661222302226 30.74965439387295 -044.241 25.2420839737999 25.8223800256999 30.249661222302226 30.74965439387295 -045.241 25.8223800256999 26.402676077599907 30.249661222302226 30.74965439387295 -046.241 26.402676077599907 26.9829721294999 30.249661222302226 30.74965439387295 -047.241 26.9829721294999 27.5632681813999 30.249661222302226 30.74965439387295 -048.241 27.5632681813999 28.143564233299905 30.249661222302226 30.74965439387295 -049.241 28.143564233299905 28.723860285149897 30.249661222302226 30.74965439387295 -050.241 28.723860285149897 29.304156336999903 30.249661222302226 30.74965439387295 -051.241 29.304156336999903 29.884452388899902 30.249661222302226 30.74965439387295 -052.241 29.884452388899902 30.4647484407999 30.249661222302226 30.74965439387295 -053.241 30.4647484407999 31.0450444926999 30.249661222302226 30.74965439387295 -054.241 31.0450444926999 31.6253405445999 30.249661222302226 30.74965439387295 -055.241 31.6253405445999 32.2056365964999 30.249661222302226 30.74965439387295 -056.241 32.2056365964999 32.78593264839991 30.249661222302226 30.74965439387295 -057.241 32.78593264839991 33.36622870029991 30.249661222302226 30.74965439387295 -058.241 33.36622870029991 33.946524752199906 30.249661222302226 30.74965439387295 -059.241 33.946524752199906 34.52682080409991 30.249661222302226 30.74965439387295 -060.241 34.52682080409991 35.107116855999905 30.249661222302226 30.74965439387295 -061.241 35.107116855999905 35.6874129078999 30.249661222302226 30.74965439387295 -062.241 35.6874129078999 36.267708959799904 30.249661222302226 30.74965439387295 -063.241 36.267708959799904 36.8480050116499 30.249661222302226 30.74965439387295 -064.241 36.8480050116499 37.4283010634999 30.249661222302226 30.74965439387295 -065.241 37.4283010634999 38.01789484935328 30.249661222302226 30.74965439387295 -200.241 115.75897033514651 116.34856412099991 30.249661222302226 30.74965439387295 -201.241 116.34856412099991 116.92886017289992 30.249661222302226 30.74965439387295 -202.241 116.92886017289992 117.50915622479991 30.249661222302226 30.74965439387295 -203.241 117.50915622479991 118.0894522766499 30.249661222302226 30.74965439387295 -204.241 118.0894522766499 118.66974832849989 30.249661222302226 30.74965439387295 -205.241 118.66974832849989 119.25004438039988 30.249661222302226 30.74965439387295 -206.241 119.25004438039988 119.83034043229989 30.249661222302226 30.74965439387295 -207.241 119.83034043229989 120.4106364841999 30.249661222302226 30.74965439387295 -208.241 120.4106364841999 120.99093253609988 30.249661222302226 30.74965439387295 -209.241 120.99093253609988 121.5712285879999 30.249661222302226 30.74965439387295 -210.241 121.5712285879999 122.15152463989989 30.249661222302226 30.74965439387295 -211.241 122.15152463989989 122.73182069179991 30.249661222302226 30.74965439387295 -212.241 122.73182069179991 123.3121167436999 30.249661222302226 30.74965439387295 -213.241 123.3121167436999 123.89241279559991 30.249661222302226 30.74965439387295 -214.241 123.89241279559991 124.4727088474999 30.249661222302226 30.74965439387295 -215.241 124.4727088474999 125.0530048993999 30.249661222302226 30.74965439387295 -216.241 125.0530048993999 125.6333009512999 30.249661222302226 30.74965439387295 -217.241 125.6333009512999 126.21359700314989 30.249661222302226 30.74965439387295 -218.241 126.21359700314989 126.7938930549999 30.249661222302226 30.74965439387295 -219.241 126.7938930549999 127.3741891068999 30.249661222302226 30.74965439387295 -220.241 127.3741891068999 127.95448515879991 30.249661222302226 30.74965439387295 -221.241 127.95448515879991 128.53478121069992 30.249661222302226 30.74965439387295 -222.241 128.53478121069992 129.11507726259993 30.249661222302226 30.74965439387295 -223.241 129.11507726259993 129.69537331449988 30.249661222302226 30.74965439387295 -224.241 129.69537331449988 130.27566936639988 30.249661222302226 30.74965439387295 -225.241 130.27566936639988 130.8559654182999 30.249661222302226 30.74965439387295 -226.241 130.8559654182999 131.43626147019992 30.249661222302226 30.74965439387295 -227.241 131.43626147019992 132.0165575220999 30.249661222302226 30.74965439387295 -228.241 132.0165575220999 132.5968535739999 30.249661222302226 30.74965439387295 -229.241 132.5968535739999 133.1771496258999 30.249661222302226 30.74965439387295 -230.241 133.1771496258999 133.75744567779992 30.249661222302226 30.74965439387295 -231.241 133.75744567779992 134.3377417296499 30.249661222302226 30.74965439387295 -232.241 134.3377417296499 134.9180377814999 30.249661222302226 30.74965439387295 -233.241 134.9180377814999 135.4983338333999 30.249661222302226 30.74965439387295 -234.241 135.4983338333999 136.07862988529993 30.249661222302226 30.74965439387295 -235.241 136.07862988529993 136.6589259371999 30.249661222302226 30.74965439387295 -236.241 136.6589259371999 137.2392219890999 30.249661222302226 30.74965439387295 -237.241 137.2392219890999 137.81951804099992 30.249661222302226 30.74965439387295 -238.241 137.81951804099992 138.39981409289993 30.249661222302226 30.74965439387295 -239.241 138.39981409289993 138.98011014479994 30.249661222302226 30.74965439387295 -240.241 138.98011014479994 139.5604061966999 30.249661222302226 30.74965439387295 -241.241 139.5604061966999 140.1407022485999 30.249661222302226 30.74965439387295 -242.241 140.1407022485999 140.7209983004999 30.249661222302226 30.74965439387295 -243.241 140.7209983004999 141.3012943523999 30.249661222302226 30.74965439387295 -244.241 141.3012943523999 141.8815904042999 30.249661222302226 30.74965439387295 -245.241 141.8815904042999 142.4618864561499 30.249661222302226 30.74965439387295 -246.241 142.4618864561499 143.04218250799988 30.249661222302226 30.74965439387295 -247.241 143.04218250799988 143.6224785598999 30.249661222302226 30.74965439387295 -248.241 143.6224785598999 144.2027746117999 30.249661222302226 30.74965439387295 -249.241 144.2027746117999 144.7830706636999 30.249661222302226 30.74965439387295 -250.241 144.7830706636999 145.3633667155999 30.249661222302226 30.74965439387295 -251.241 145.3633667155999 145.94366276749992 30.249661222302226 30.74965439387295 -252.241 145.94366276749992 146.52395881939992 30.249661222302226 30.74965439387295 -253.241 146.52395881939992 147.10425487129993 30.249661222302226 30.74965439387295 -254.241 147.10425487129993 147.68455092319988 30.249661222302226 30.74965439387295 -255.241 147.68455092319988 148.26484697509989 30.249661222302226 30.74965439387295 -256.241 148.26484697509989 148.8451430269999 30.249661222302226 30.74965439387295 -257.241 148.8451430269999 149.42543907889993 30.249661222302226 30.74965439387295 -258.241 149.42543907889993 150.0057351307999 30.249661222302226 30.74965439387295 -259.241 150.0057351307999 150.58603118269988 30.249661222302226 30.74965439387295 -260.241 150.58603118269988 151.1663272345499 30.249661222302226 30.74965439387295 -261.241 151.1663272345499 151.7466232863999 30.249661222302226 30.74965439387295 -262.241 151.7466232863999 152.3269193382999 30.249661222302226 30.74965439387295 -263.241 152.3269193382999 152.9072153901999 30.249661222302226 30.74965439387295 -264.241 152.9072153901999 153.48751144209993 30.249661222302226 30.74965439387295 -265.241 153.48751144209993 154.06780749399994 30.249661222302226 30.74965439387295 -266.241 154.06780749399994 154.64810354589991 30.249661222302226 30.74965439387295 -267.241 154.64810354589991 155.2283995977999 30.249661222302226 30.74965439387295 -268.241 155.2283995977999 155.8086956496999 30.249661222302226 30.74965439387295 -269.241 155.8086956496999 156.3889917015999 30.249661222302226 30.74965439387295 -270.241 156.3889917015999 156.97858548745327 30.249661222302226 30.74965439387295 -274.241 158.7008781752465 159.2904719610499 30.249661222302226 30.74965439387295 -275.241 159.2904719610499 159.8707680128999 30.249661222302226 30.74965439387295 -276.241 159.8707680128999 160.45106406479988 30.249661222302226 30.74965439387295 -277.241 160.45106406479988 161.0313601166999 30.249661222302226 30.74965439387295 -278.241 161.0313601166999 161.6116561685999 30.249661222302226 30.74965439387295 -279.241 161.6116561685999 162.19195222049993 30.249661222302226 30.74965439387295 -280.241 162.19195222049993 162.7722482723999 30.249661222302226 30.74965439387295 -281.241 162.7722482723999 163.35254432429988 30.249661222302226 30.74965439387295 -282.241 163.35254432429988 163.9328403761999 30.249661222302226 30.74965439387295 -283.241 163.9328403761999 164.51313642809993 30.249661222302226 30.74965439387295 -284.241 164.51313642809993 165.09343247999988 30.249661222302226 30.74965439387295 -285.241 165.09343247999988 165.67372853189988 30.249661222302226 30.74965439387295 -286.241 165.67372853189988 166.2540245837999 30.249661222302226 30.74965439387295 -287.241 166.2540245837999 166.8343206356999 30.249661222302226 30.74965439387295 -288.241 166.8343206356999 167.4146166875499 30.249661222302226 30.74965439387295 -289.241 167.4146166875499 167.99491273939987 30.249661222302226 30.74965439387295 -290.241 167.99491273939987 168.57520879129993 30.249661222302226 30.74965439387295 -291.241 168.57520879129993 169.15550484319994 30.249661222302226 30.74965439387295 -292.241 169.15550484319994 169.73580089509989 30.249661222302226 30.74965439387295 -293.241 169.73580089509989 170.3160969469999 30.249661222302226 30.74965439387295 -294.241 170.3160969469999 170.8963929988999 30.249661222302226 30.74965439387295 -295.241 170.8963929988999 171.4766890507999 30.249661222302226 30.74965439387295 -296.241 171.4766890507999 172.0569851026999 30.249661222302226 30.74965439387295 -297.241 172.0569851026999 172.63728115459992 30.249661222302226 30.74965439387295 -298.241 172.63728115459992 173.2175772064999 30.249661222302226 30.74965439387295 -299.241 173.2175772064999 173.7978732583999 30.249661222302226 30.74965439387295 -300.241 173.7978732583999 174.3781693102999 30.249661222302226 30.74965439387295 -301.241 174.3781693102999 174.95846536219992 30.249661222302226 30.74965439387295 -302.241 174.95846536219992 175.5387614140499 30.249661222302226 30.74965439387295 -303.241 175.5387614140499 176.1190574658999 30.249661222302226 30.74965439387295 -304.241 176.1190574658999 176.69935351779992 30.249661222302226 30.74965439387295 -305.241 176.69935351779992 177.27964956969993 30.249661222302226 30.74965439387295 -306.241 177.27964956969993 177.85994562159988 30.249661222302226 30.74965439387295 -307.241 177.85994562159988 178.44024167349988 30.249661222302226 30.74965439387295 -308.241 178.44024167349988 179.0205377253999 30.249661222302226 30.74965439387295 -309.241 179.0205377253999 179.60083377729993 30.249661222302226 30.74965439387295 -310.241 179.60083377729993 180.1811298291999 30.249661222302226 30.74965439387295 -311.241 180.1811298291999 180.7614258810999 30.249661222302226 30.74965439387295 -312.241 180.7614258810999 181.34172193299986 30.249661222302226 30.74965439387295 -313.241 181.34172193299986 181.9220179848999 30.249661222302226 30.74965439387295 -314.241 181.9220179848999 182.50231403679993 30.249661222302226 30.74965439387295 -315.241 182.50231403679993 183.08261008869988 30.249661222302226 30.74965439387295 -316.241 183.08261008869988 183.66290614054992 30.249661222302226 30.74965439387295 -317.241 183.66290614054992 184.2432021923999 30.249661222302226 30.74965439387295 -318.241 184.2432021923999 184.8234982442999 30.249661222302226 30.74965439387295 -319.241 184.8234982442999 185.4037942961999 30.249661222302226 30.74965439387295 -320.241 185.4037942961999 185.98409034809987 30.249661222302226 30.74965439387295 -321.241 185.98409034809987 186.56438639999988 30.249661222302226 30.74965439387295 -322.241 186.56438639999988 187.14468245189988 30.249661222302226 30.74965439387295 -323.241 187.14468245189988 187.7249785037999 30.249661222302226 30.74965439387295 -324.241 187.7249785037999 188.3052745556999 30.249661222302226 30.74965439387295 -325.241 188.3052745556999 188.8855706075999 30.249661222302226 30.74965439387295 -326.241 188.8855706075999 189.4658666594999 30.249661222302226 30.74965439387295 -327.241 189.4658666594999 190.04616271139992 30.249661222302226 30.74965439387295 -328.241 190.04616271139992 190.6264587632999 30.249661222302226 30.74965439387295 -329.241 190.6264587632999 191.2067548151999 30.249661222302226 30.74965439387295 -330.241 191.2067548151999 191.7870508670499 30.249661222302226 30.74965439387295 -331.241 191.7870508670499 192.3673469188999 30.249661222302226 30.74965439387295 -332.241 192.3673469188999 192.9476429707999 30.249661222302226 30.74965439387295 -333.241 192.9476429707999 193.52793902269985 30.249661222302226 30.74965439387295 -334.241 193.52793902269985 194.1082350745999 30.249661222302226 30.74965439387295 -335.241 194.1082350745999 194.68853112649992 30.249661222302226 30.74965439387295 -336.241 194.68853112649992 195.2688271783999 30.249661222302226 30.74965439387295 -337.241 195.2688271783999 195.84912323029988 30.249661222302226 30.74965439387295 -338.241 195.84912323029988 196.4294192821999 30.249661222302226 30.74965439387295 -339.241 196.4294192821999 197.0097153340999 30.249661222302226 30.74965439387295 -340.241 197.0097153340999 197.5900113859999 30.249661222302226 30.74965439387295 -341.241 197.5900113859999 198.1703074378999 30.249661222302226 30.74965439387295 -342.241 198.1703074378999 198.7506034897999 30.249661222302226 30.74965439387295 -343.241 198.7506034897999 199.33089954169986 30.249661222302226 30.74965439387295 -344.241 199.33089954169986 199.9111955935499 30.249661222302226 30.74965439387295 -345.241 199.9111955935499 200.4914916453999 30.249661222302226 30.74965439387295 -346.241 200.4914916453999 201.0717876972999 30.249661222302226 30.74965439387295 -347.241 201.0717876972999 201.6520837491999 30.249661222302226 30.74965439387295 -348.241 201.6520837491999 202.2323798010999 30.249661222302226 30.74965439387295 -349.241 202.2323798010999 202.81267585299992 30.249661222302226 30.74965439387295 -350.241 202.81267585299992 203.3929719048999 30.249661222302226 30.74965439387295 -351.241 203.3929719048999 203.97326795679987 30.249661222302226 30.74965439387295 -352.241 203.97326795679987 204.55356400869988 30.249661222302226 30.74965439387295 -353.241 204.55356400869988 205.1338600605999 30.249661222302226 30.74965439387295 -354.241 205.1338600605999 205.7141561124999 30.249661222302226 30.74965439387295 -355.241 205.7141561124999 206.2944521643999 30.249661222302226 30.74965439387295 -356.241 206.2944521643999 206.87474821629988 30.249661222302226 30.74965439387295 -357.241 206.87474821629988 207.45504426819988 30.249661222302226 30.74965439387295 -358.241 207.45504426819988 208.04463805405328 30.249661222302226 30.74965439387295 -397.241 230.07729255804654 230.66688634389988 30.249661222302226 30.74965439387295 -398.241 230.66688634389988 231.24718239579988 30.249661222302226 30.74965439387295 -399.241 231.24718239579988 231.8274784476999 30.249661222302226 30.74965439387295 -400.241 231.8274784476999 232.4077744995499 30.249661222302226 30.74965439387295 -401.241 232.4077744995499 232.98807055139986 30.249661222302226 30.74965439387295 -402.241 232.98807055139986 233.5683666032999 30.249661222302226 30.74965439387295 -403.241 233.5683666032999 234.14866265519993 30.249661222302226 30.74965439387295 -404.241 234.14866265519993 234.72895870709988 30.249661222302226 30.74965439387295 -405.241 234.72895870709988 235.30925475899988 30.249661222302226 30.74965439387295 -406.241 235.30925475899988 235.8895508108999 30.249661222302226 30.74965439387295 -407.241 235.8895508108999 236.46984686279993 30.249661222302226 30.74965439387295 -408.241 236.46984686279993 237.0501429146999 30.249661222302226 30.74965439387295 -409.241 237.0501429146999 237.63043896659988 30.249661222302226 30.74965439387295 -410.241 237.63043896659988 238.21073501849986 30.249661222302226 30.74965439387295 -411.241 238.21073501849986 238.79103107039992 30.249661222302226 30.74965439387295 -412.241 238.79103107039992 239.37132712229993 30.249661222302226 30.74965439387295 -413.241 239.37132712229993 239.95162317419988 30.249661222302226 30.74965439387295 -414.241 239.95162317419988 240.5319192260499 30.249661222302226 30.74965439387295 -415.241 240.5319192260499 241.1122152778999 30.249661222302226 30.74965439387295 -416.241 241.1122152778999 241.69251132979988 30.249661222302226 30.74965439387295 -417.241 241.69251132979988 242.2728073816999 30.249661222302226 30.74965439387295 -418.241 242.2728073816999 242.85310343359987 30.249661222302226 30.74965439387295 -419.241 242.85310343359987 243.43339948549988 30.249661222302226 30.74965439387295 -420.241 243.43339948549988 244.01369553739988 30.249661222302226 30.74965439387295 -421.241 244.01369553739988 244.5939915892999 30.249661222302226 30.74965439387295 -422.241 244.5939915892999 245.1742876411999 30.249661222302226 30.74965439387295 -423.241 245.1742876411999 245.75458369309987 30.249661222302226 30.74965439387295 -424.241 245.75458369309987 246.33487974499988 30.249661222302226 30.74965439387295 -425.241 246.33487974499988 246.9151757968999 30.249661222302226 30.74965439387295 -426.241 246.9151757968999 247.4954718487999 30.249661222302226 30.74965439387295 -427.241 247.4954718487999 248.07576790069987 30.249661222302226 30.74965439387295 -428.241 248.07576790069987 248.6560639525499 30.249661222302226 30.74965439387295 -429.241 248.6560639525499 249.2363600043999 30.249661222302226 30.74965439387295 -430.241 249.2363600043999 249.8166560562999 30.249661222302226 30.74965439387295 -431.241 249.8166560562999 250.39695210819988 30.249661222302226 30.74965439387295 -432.241 250.39695210819988 250.9772481600999 30.249661222302226 30.74965439387295 -433.241 250.9772481600999 251.5575442119999 30.249661222302226 30.74965439387295 -434.241 251.5575442119999 252.1378402638999 30.249661222302226 30.74965439387295 -435.241 252.1378402638999 252.71813631579988 30.249661222302226 30.74965439387295 -436.241 252.71813631579988 253.2984323676999 30.249661222302226 30.74965439387295 -437.241 253.2984323676999 253.8787284195999 30.249661222302226 30.74965439387295 -438.241 253.8787284195999 254.4590244714999 30.249661222302226 30.74965439387295 -439.241 254.4590244714999 255.0393205233999 30.249661222302226 30.74965439387295 -440.241 255.0393205233999 255.61961657529991 30.249661222302226 30.74965439387295 -441.241 255.61961657529991 256.19991262719986 30.249661222302226 30.74965439387295 -442.241 256.19991262719986 256.7802086790499 30.249661222302226 30.74965439387295 -443.241 256.7802086790499 257.3605047308999 30.249661222302226 30.74965439387295 -444.241 257.3605047308999 257.9408007827999 30.249661222302226 30.74965439387295 -445.241 257.9408007827999 258.5210968346999 30.249661222302226 30.74965439387295 -446.241 258.5210968346999 259.1013928865999 30.249661222302226 30.74965439387295 -447.241 259.1013928865999 259.6816889384999 30.249661222302226 30.74965439387295 -448.241 259.6816889384999 260.2619849903999 30.249661222302226 30.74965439387295 -449.241 260.2619849903999 260.8422810422999 30.249661222302226 30.74965439387295 -450.241 260.8422810422999 261.4225770941998 30.249661222302226 30.74965439387295 -451.241 261.4225770941998 262.0028731460999 30.249661222302226 30.74965439387295 -452.241 262.0028731460999 262.58316919799995 30.249661222302226 30.74965439387295 -453.241 262.58316919799995 263.1634652498999 30.249661222302226 30.74965439387295 -454.241 263.1634652498999 263.7437613017999 30.249661222302226 30.74965439387295 -455.241 263.7437613017999 264.3240573536999 30.249661222302226 30.74965439387295 -456.241 264.3240573536999 264.9043534055499 30.249661222302226 30.74965439387295 -457.241 264.9043534055499 265.4846494573999 30.249661222302226 30.74965439387295 -458.241 265.4846494573999 266.06494550929983 30.249661222302226 30.74965439387295 -459.241 266.06494550929983 266.6452415611999 30.249661222302226 30.74965439387295 -460.241 266.6452415611999 267.22553761309996 30.249661222302226 30.74965439387295 -461.241 267.22553761309996 267.8058336649999 30.249661222302226 30.74965439387295 -462.241 267.8058336649999 268.3861297168999 30.249661222302226 30.74965439387295 -463.241 268.3861297168999 268.9664257687999 30.249661222302226 30.74965439387295 -464.241 268.9664257687999 269.5467218206999 30.249661222302226 30.74965439387295 -465.241 269.5467218206999 270.13631560655324 30.249661222302226 30.74965439387295 -587.241 340.3335424176465 340.9231362034999 30.249661222302226 30.74965439387295 -588.241 340.9231362034999 341.50343225539984 30.249661222302226 30.74965439387295 -589.241 341.50343225539984 342.0837283072999 30.249661222302226 30.74965439387295 -590.241 342.0837283072999 342.6640243591999 30.249661222302226 30.74965439387295 -591.241 342.6640243591999 343.2443204110999 30.249661222302226 30.74965439387295 -592.241 343.2443204110999 343.82461646299987 30.249661222302226 30.74965439387295 -593.241 343.82461646299987 344.40491251489993 30.249661222302226 30.74965439387295 -594.241 344.40491251489993 344.9852085667999 30.249661222302226 30.74965439387295 -595.241 344.9852085667999 345.5655046186999 30.249661222302226 30.74965439387295 -596.241 345.5655046186999 346.1458006705999 30.249661222302226 30.74965439387295 -597.241 346.1458006705999 346.7260967224499 30.249661222302226 30.74965439387295 -598.241 346.7260967224499 347.30639277429987 30.249661222302226 30.74965439387295 -599.241 347.30639277429987 347.8866888261999 30.249661222302226 30.74965439387295 -600.241 347.8866888261999 348.4669848780999 30.249661222302226 30.74965439387295 -601.241 348.4669848780999 349.04728092999994 30.249661222302226 30.74965439387295 -602.241 349.04728092999994 349.6275769818999 30.249661222302226 30.74965439387295 -603.241 349.6275769818999 350.2078730337999 30.249661222302226 30.74965439387295 -604.241 350.2078730337999 350.7881690856999 30.249661222302226 30.74965439387295 -605.241 350.7881690856999 351.36846513759986 30.249661222302226 30.74965439387295 -606.241 351.36846513759986 351.9487611894999 30.249661222302226 30.74965439387295 -607.241 351.9487611894999 352.52905724139987 30.249661222302226 30.74965439387295 -608.241 352.52905724139987 353.1093532932998 30.249661222302226 30.74965439387295 -609.241 353.1093532932998 353.6896493451999 30.249661222302226 30.74965439387295 -610.241 353.6896493451999 354.26994539709995 30.249661222302226 30.74965439387295 -611.241 354.26994539709995 354.85024144894993 30.249661222302226 30.74965439387295 -612.241 354.85024144894993 355.4305375007999 30.249661222302226 30.74965439387295 -613.241 355.4305375007999 356.01083355269986 30.249661222302226 30.74965439387295 -614.241 356.01083355269986 356.59112960459987 30.249661222302226 30.74965439387295 -615.241 356.59112960459987 357.1714256564999 30.249661222302226 30.74965439387295 -616.241 357.1714256564999 357.7517217083998 30.249661222302226 30.74965439387295 -617.241 357.7517217083998 358.3320177602999 30.249661222302226 30.74965439387295 -618.241 358.3320177602999 358.91231381219995 30.249661222302226 30.74965439387295 -619.241 358.91231381219995 359.5019075980533 30.249661222302226 30.74965439387295 -000.241 359.69975995654653 0.28935374239990097 30.249661222302226 30.74965439387295 -001.242 0.2908439158238121 0.8741606144238121 30.74965439387295 31.249647494169494 -002.242 0.8741606144238121 1.4574773130238121 30.74965439387295 31.249647494169494 -003.242 1.4574773130238121 2.040794011623812 30.74965439387295 31.249647494169494 -004.242 2.040794011623812 2.624110710223812 30.74965439387295 31.249647494169494 -005.242 2.624110710223812 3.207427408823812 30.74965439387295 31.249647494169494 -006.242 3.207427408823812 3.790744107473812 30.74965439387295 31.249647494169494 -007.242 3.790744107473812 4.374060806123811 30.74965439387295 31.249647494169494 -008.242 4.374060806123811 4.957377504723812 30.74965439387295 31.249647494169494 -009.242 4.957377504723812 5.540694203323811 30.74965439387295 31.249647494169494 -010.242 5.540694203323811 6.124010901923812 30.74965439387295 31.249647494169494 -011.242 6.124010901923812 6.707327600523812 30.74965439387295 31.249647494169494 -012.242 6.707327600523812 7.290644299123814 30.74965439387295 31.249647494169494 -013.242 7.290644299123814 7.873960997723813 30.74965439387295 31.249647494169494 -014.242 7.873960997723813 8.457277696323814 30.74965439387295 31.249647494169494 -015.242 8.457277696323814 9.040594394923811 30.74965439387295 31.249647494169494 -016.242 9.040594394923811 9.623911093523812 30.74965439387295 31.249647494169494 -017.242 9.623911093523812 10.207227792123813 30.74965439387295 31.249647494169494 -018.242 10.207227792123813 10.790544490723814 30.74965439387295 31.249647494169494 -019.242 10.790544490723814 11.373861189373812 30.74965439387295 31.249647494169494 -020.242 11.373861189373812 11.957177888023814 30.74965439387295 31.249647494169494 -021.242 11.957177888023814 12.540494586623815 30.74965439387295 31.249647494169494 -022.242 12.540494586623815 13.123811285223814 30.74965439387295 31.249647494169494 -023.242 13.123811285223814 13.707127983823813 30.74965439387295 31.249647494169494 -024.242 13.707127983823813 14.29044468242381 30.74965439387295 31.249647494169494 -025.242 14.29044468242381 14.873761381023812 30.74965439387295 31.249647494169494 -026.242 14.873761381023812 15.457078079623813 30.74965439387295 31.249647494169494 -027.242 15.457078079623813 16.040394778223813 30.74965439387295 31.249647494169494 -028.242 16.040394778223813 16.623711476823814 30.74965439387295 31.249647494169494 -029.242 16.623711476823814 17.207028175423815 30.74965439387295 31.249647494169494 -030.242 17.207028175423815 17.790344874023813 30.74965439387295 31.249647494169494 -031.242 17.790344874023813 18.373661572623817 30.74965439387295 31.249647494169494 -032.242 18.373661572623817 18.956978271273815 30.74965439387295 31.249647494169494 -033.242 18.956978271273815 19.540294969923817 30.74965439387295 31.249647494169494 -034.242 19.540294969923817 20.123611668523814 30.74965439387295 31.249647494169494 -035.242 20.123611668523814 20.70692836712381 30.74965439387295 31.249647494169494 -036.242 20.70692836712381 21.29024506572381 30.74965439387295 31.249647494169494 -037.242 21.29024506572381 21.87356176432381 30.74965439387295 31.249647494169494 -038.242 21.87356176432381 22.45687846292381 30.74965439387295 31.249647494169494 -039.242 22.45687846292381 23.040195161523812 30.74965439387295 31.249647494169494 -040.242 23.040195161523812 23.623511860123813 30.74965439387295 31.249647494169494 -041.242 23.623511860123813 24.206828558723814 30.74965439387295 31.249647494169494 -042.242 24.206828558723814 24.790145257323815 30.74965439387295 31.249647494169494 -043.242 24.790145257323815 25.373461955923812 30.74965439387295 31.249647494169494 -044.242 25.373461955923812 25.95677865452381 30.74965439387295 31.249647494169494 -045.242 25.95677865452381 26.54009535317381 30.74965439387295 31.249647494169494 -046.242 26.54009535317381 27.123412051823813 30.74965439387295 31.249647494169494 -047.242 27.123412051823813 27.706728750423814 30.74965439387295 31.249647494169494 -048.242 27.706728750423814 28.290045449023815 30.74965439387295 31.249647494169494 -049.242 28.290045449023815 28.87336214762381 30.74965439387295 31.249647494169494 -050.242 28.87336214762381 29.45667884622381 30.74965439387295 31.249647494169494 -051.242 29.45667884622381 30.039995544823817 30.74965439387295 31.249647494169494 -052.242 30.039995544823817 30.623312243423815 30.74965439387295 31.249647494169494 -053.242 30.623312243423815 31.206628942023816 30.74965439387295 31.249647494169494 -054.242 31.206628942023816 31.78994564062381 30.74965439387295 31.249647494169494 -055.242 31.78994564062381 32.373262339223814 30.74965439387295 31.249647494169494 -056.242 32.373262339223814 32.956579037823815 30.74965439387295 31.249647494169494 -057.242 32.956579037823815 33.539895736423816 30.74965439387295 31.249647494169494 -058.242 33.539895736423816 34.12321243507382 30.74965439387295 31.249647494169494 -059.242 34.12321243507382 34.70652913372381 30.74965439387295 31.249647494169494 -060.242 34.70652913372381 35.28984583232382 30.74965439387295 31.249647494169494 -061.242 35.28984583232382 35.873162530923814 30.74965439387295 31.249647494169494 -062.242 35.873162530923814 36.45647922952382 30.74965439387295 31.249647494169494 -063.242 36.45647922952382 37.03979592812382 30.74965439387295 31.249647494169494 -064.242 37.03979592812382 37.63245881589457 30.74965439387295 31.249647494169494 -198.242 115.19488735235306 115.7875502401238 30.74965439387295 31.249647494169494 -199.242 115.7875502401238 116.37086693872382 30.74965439387295 31.249647494169494 -200.242 116.37086693872382 116.95418363732381 30.74965439387295 31.249647494169494 -201.242 116.95418363732381 117.53750033592382 30.74965439387295 31.249647494169494 -202.242 117.53750033592382 118.12081703457382 30.74965439387295 31.249647494169494 -203.242 118.12081703457382 118.70413373322381 30.74965439387295 31.249647494169494 -204.242 118.70413373322381 119.28745043182383 30.74965439387295 31.249647494169494 -205.242 119.28745043182383 119.87076713042381 30.74965439387295 31.249647494169494 -206.242 119.87076713042381 120.45408382902383 30.74965439387295 31.249647494169494 -207.242 120.45408382902383 121.03740052762384 30.74965439387295 31.249647494169494 -208.242 121.03740052762384 121.62071722622383 30.74965439387295 31.249647494169494 -209.242 121.62071722622383 122.20403392482382 30.74965439387295 31.249647494169494 -210.242 122.20403392482382 122.78735062342382 30.74965439387295 31.249647494169494 -211.242 122.78735062342382 123.37066732202382 30.74965439387295 31.249647494169494 -212.242 123.37066732202382 123.9539840206238 30.74965439387295 31.249647494169494 -213.242 123.9539840206238 124.5373007192238 30.74965439387295 31.249647494169494 -214.242 124.5373007192238 125.12061741782381 30.74965439387295 31.249647494169494 -215.242 125.12061741782381 125.70393411647382 30.74965439387295 31.249647494169494 -216.242 125.70393411647382 126.2872508151238 30.74965439387295 31.249647494169494 -217.242 126.2872508151238 126.87056751372381 30.74965439387295 31.249647494169494 -218.242 126.87056751372381 127.45388421232383 30.74965439387295 31.249647494169494 -219.242 127.45388421232383 128.03720091092381 30.74965439387295 31.249647494169494 -220.242 128.03720091092381 128.6205176095238 30.74965439387295 31.249647494169494 -221.242 128.6205176095238 129.20383430812382 30.74965439387295 31.249647494169494 -222.242 129.20383430812382 129.78715100672383 30.74965439387295 31.249647494169494 -223.242 129.78715100672383 130.3704677053238 30.74965439387295 31.249647494169494 -224.242 130.3704677053238 130.9537844039238 30.74965439387295 31.249647494169494 -225.242 130.9537844039238 131.53710110252382 30.74965439387295 31.249647494169494 -226.242 131.53710110252382 132.12041780112384 30.74965439387295 31.249647494169494 -227.242 132.12041780112384 132.7037344997238 30.74965439387295 31.249647494169494 -228.242 132.7037344997238 133.28705119837383 30.74965439387295 31.249647494169494 -229.242 133.28705119837383 133.8703678970238 30.74965439387295 31.249647494169494 -230.242 133.8703678970238 134.45368459562383 30.74965439387295 31.249647494169494 -231.242 134.45368459562383 135.0370012942238 30.74965439387295 31.249647494169494 -232.242 135.0370012942238 135.6203179928238 30.74965439387295 31.249647494169494 -233.242 135.6203179928238 136.20363469142382 30.74965439387295 31.249647494169494 -234.242 136.20363469142382 136.78695139002383 30.74965439387295 31.249647494169494 -235.242 136.78695139002383 137.37026808862382 30.74965439387295 31.249647494169494 -236.242 137.37026808862382 137.9535847872238 30.74965439387295 31.249647494169494 -237.242 137.9535847872238 138.53690148582382 30.74965439387295 31.249647494169494 -238.242 138.53690148582382 139.12021818442383 30.74965439387295 31.249647494169494 -239.242 139.12021818442383 139.70353488302382 30.74965439387295 31.249647494169494 -240.242 139.70353488302382 140.2868515816238 30.74965439387295 31.249647494169494 -241.242 140.2868515816238 140.87016828027384 30.74965439387295 31.249647494169494 -242.242 140.87016828027384 141.45348497892383 30.74965439387295 31.249647494169494 -243.242 141.45348497892383 142.03680167752384 30.74965439387295 31.249647494169494 -244.242 142.03680167752384 142.6201183761238 30.74965439387295 31.249647494169494 -245.242 142.6201183761238 143.2034350747238 30.74965439387295 31.249647494169494 -246.242 143.2034350747238 143.7867517733238 30.74965439387295 31.249647494169494 -247.242 143.7867517733238 144.37006847192382 30.74965439387295 31.249647494169494 -248.242 144.37006847192382 144.9533851705238 30.74965439387295 31.249647494169494 -249.242 144.9533851705238 145.53670186912382 30.74965439387295 31.249647494169494 -250.242 145.53670186912382 146.12001856772383 30.74965439387295 31.249647494169494 -251.242 146.12001856772383 146.70333526632382 30.74965439387295 31.249647494169494 -252.242 146.70333526632382 147.2866519649238 30.74965439387295 31.249647494169494 -253.242 147.2866519649238 147.86996866352382 30.74965439387295 31.249647494169494 -254.242 147.86996866352382 148.4532853621738 30.74965439387295 31.249647494169494 -255.242 148.4532853621738 149.03660206082384 30.74965439387295 31.249647494169494 -256.242 149.03660206082384 149.61991875942383 30.74965439387295 31.249647494169494 -257.242 149.61991875942383 150.2032354580238 30.74965439387295 31.249647494169494 -258.242 150.2032354580238 150.78655215662383 30.74965439387295 31.249647494169494 -259.242 150.78655215662383 151.3698688552238 30.74965439387295 31.249647494169494 -260.242 151.3698688552238 151.9531855538238 30.74965439387295 31.249647494169494 -261.242 151.9531855538238 152.53650225242382 30.74965439387295 31.249647494169494 -262.242 152.53650225242382 153.11981895102383 30.74965439387295 31.249647494169494 -263.242 153.11981895102383 153.70313564962382 30.74965439387295 31.249647494169494 -264.242 153.70313564962382 154.2864523482238 30.74965439387295 31.249647494169494 -265.242 154.2864523482238 154.86976904682382 30.74965439387295 31.249647494169494 -266.242 154.86976904682382 155.45308574542383 30.74965439387295 31.249647494169494 -267.242 155.45308574542383 156.03640244407381 30.74965439387295 31.249647494169494 -268.242 156.03640244407381 156.6197191427238 30.74965439387295 31.249647494169494 -269.242 156.6197191427238 157.21238203049458 30.74965439387295 31.249647494169494 -273.242 158.94363974795306 159.5363026357238 30.74965439387295 31.249647494169494 -274.242 159.5363026357238 160.11961933432383 30.74965439387295 31.249647494169494 -275.242 160.11961933432383 160.70293603292382 30.74965439387295 31.249647494169494 -276.242 160.70293603292382 161.2862527315238 30.74965439387295 31.249647494169494 -277.242 161.2862527315238 161.86956943012382 30.74965439387295 31.249647494169494 -278.242 161.86956943012382 162.45288612872383 30.74965439387295 31.249647494169494 -279.242 162.45288612872383 163.03620282732382 30.74965439387295 31.249647494169494 -280.242 163.03620282732382 163.61951952597383 30.74965439387295 31.249647494169494 -281.242 163.61951952597383 164.2028362246238 30.74965439387295 31.249647494169494 -282.242 164.2028362246238 164.78615292322382 30.74965439387295 31.249647494169494 -283.242 164.78615292322382 165.36946962182384 30.74965439387295 31.249647494169494 -284.242 165.36946962182384 165.95278632042383 30.74965439387295 31.249647494169494 -285.242 165.95278632042383 166.5361030190238 30.74965439387295 31.249647494169494 -286.242 166.5361030190238 167.11941971762383 30.74965439387295 31.249647494169494 -287.242 167.11941971762383 167.70273641622381 30.74965439387295 31.249647494169494 -288.242 167.70273641622381 168.2860531148238 30.74965439387295 31.249647494169494 -289.242 168.2860531148238 168.86936981342382 30.74965439387295 31.249647494169494 -290.242 168.86936981342382 169.45268651202383 30.74965439387295 31.249647494169494 -291.242 169.45268651202383 170.03600321062382 30.74965439387295 31.249647494169494 -292.242 170.03600321062382 170.6193199092238 30.74965439387295 31.249647494169494 -293.242 170.6193199092238 171.20263660787384 30.74965439387295 31.249647494169494 -294.242 171.20263660787384 171.78595330652382 30.74965439387295 31.249647494169494 -295.242 171.78595330652382 172.36927000512384 30.74965439387295 31.249647494169494 -296.242 172.36927000512384 172.95258670372382 30.74965439387295 31.249647494169494 -297.242 172.95258670372382 173.5359034023238 30.74965439387295 31.249647494169494 -298.242 173.5359034023238 174.11922010092383 30.74965439387295 31.249647494169494 -299.242 174.11922010092383 174.70253679952384 30.74965439387295 31.249647494169494 -300.242 174.70253679952384 175.28585349812383 30.74965439387295 31.249647494169494 -301.242 175.28585349812383 175.86917019672381 30.74965439387295 31.249647494169494 -302.242 175.86917019672381 176.45248689532383 30.74965439387295 31.249647494169494 -303.242 176.45248689532383 177.03580359392382 30.74965439387295 31.249647494169494 -304.242 177.03580359392382 177.6191202925238 30.74965439387295 31.249647494169494 -305.242 177.6191202925238 178.20243699112382 30.74965439387295 31.249647494169494 -306.242 178.20243699112382 178.7857536897738 30.74965439387295 31.249647494169494 -307.242 178.7857536897738 179.36907038842384 30.74965439387295 31.249647494169494 -308.242 179.36907038842384 179.95238708702382 30.74965439387295 31.249647494169494 -309.242 179.95238708702382 180.5357037856238 30.74965439387295 31.249647494169494 -310.242 180.5357037856238 181.1190204842238 30.74965439387295 31.249647494169494 -311.242 181.1190204842238 181.7023371828238 30.74965439387295 31.249647494169494 -312.242 181.7023371828238 182.2856538814238 30.74965439387295 31.249647494169494 -313.242 182.2856538814238 182.86897058002378 30.74965439387295 31.249647494169494 -314.242 182.86897058002378 183.45228727862377 30.74965439387295 31.249647494169494 -315.242 183.45228727862377 184.0356039772238 30.74965439387295 31.249647494169494 -316.242 184.0356039772238 184.6189206758238 30.74965439387295 31.249647494169494 -317.242 184.6189206758238 185.20223737442382 30.74965439387295 31.249647494169494 -318.242 185.20223737442382 185.78555407302377 30.74965439387295 31.249647494169494 -319.242 185.78555407302377 186.3688707716738 30.74965439387295 31.249647494169494 -320.242 186.3688707716738 186.9521874703238 30.74965439387295 31.249647494169494 -321.242 186.9521874703238 187.5355041689238 30.74965439387295 31.249647494169494 -322.242 187.5355041689238 188.11882086752382 30.74965439387295 31.249647494169494 -323.242 188.11882086752382 188.7021375661238 30.74965439387295 31.249647494169494 -324.242 188.7021375661238 189.2854542647238 30.74965439387295 31.249647494169494 -325.242 189.2854542647238 189.8687709633238 30.74965439387295 31.249647494169494 -326.242 189.8687709633238 190.4520876619238 30.74965439387295 31.249647494169494 -327.242 190.4520876619238 191.03540436052378 30.74965439387295 31.249647494169494 -328.242 191.03540436052378 191.6187210591238 30.74965439387295 31.249647494169494 -329.242 191.6187210591238 192.2020377577238 30.74965439387295 31.249647494169494 -330.242 192.2020377577238 192.78535445632377 30.74965439387295 31.249647494169494 -331.242 192.78535445632377 193.3686711549238 30.74965439387295 31.249647494169494 -332.242 193.3686711549238 193.95198785357377 30.74965439387295 31.249647494169494 -333.242 193.95198785357377 194.5353045522238 30.74965439387295 31.249647494169494 -334.242 194.5353045522238 195.11862125082382 30.74965439387295 31.249647494169494 -335.242 195.11862125082382 195.70193794942378 30.74965439387295 31.249647494169494 -336.242 195.70193794942378 196.2852546480238 30.74965439387295 31.249647494169494 -337.242 196.2852546480238 196.8685713466238 30.74965439387295 31.249647494169494 -338.242 196.8685713466238 197.45188804522382 30.74965439387295 31.249647494169494 -339.242 197.45188804522382 198.0352047438238 30.74965439387295 31.249647494169494 -340.242 198.0352047438238 198.6185214424238 30.74965439387295 31.249647494169494 -341.242 198.6185214424238 199.20183814102379 30.74965439387295 31.249647494169494 -342.242 199.20183814102379 199.78515483962377 30.74965439387295 31.249647494169494 -343.242 199.78515483962377 200.3684715382238 30.74965439387295 31.249647494169494 -344.242 200.3684715382238 200.9517882368238 30.74965439387295 31.249647494169494 -345.242 200.9517882368238 201.53510493547378 30.74965439387295 31.249647494169494 -346.242 201.53510493547378 202.1184216341238 30.74965439387295 31.249647494169494 -347.242 202.1184216341238 202.70173833272378 30.74965439387295 31.249647494169494 -348.242 202.70173833272378 203.2850550313238 30.74965439387295 31.249647494169494 -349.242 203.2850550313238 203.8683717299238 30.74965439387295 31.249647494169494 -350.242 203.8683717299238 204.45168842852382 30.74965439387295 31.249647494169494 -351.242 204.45168842852382 205.03500512712378 30.74965439387295 31.249647494169494 -352.242 205.03500512712378 205.6183218257238 30.74965439387295 31.249647494169494 -353.242 205.6183218257238 206.2016385243238 30.74965439387295 31.249647494169494 -354.242 206.2016385243238 206.78495522292383 30.74965439387295 31.249647494169494 -355.242 206.78495522292383 207.36827192152379 30.74965439387295 31.249647494169494 -356.242 207.36827192152379 207.96093480929454 30.74965439387295 31.249647494169494 -395.242 230.10827697805303 230.70093986582378 30.74965439387295 31.249647494169494 -396.242 230.70093986582378 231.2842565644238 30.74965439387295 31.249647494169494 -397.242 231.2842565644238 231.8675732630238 30.74965439387295 31.249647494169494 -398.242 231.8675732630238 232.4508899616738 30.74965439387295 31.249647494169494 -399.242 232.4508899616738 233.03420666032383 30.74965439387295 31.249647494169494 -400.242 233.03420666032383 233.61752335892382 30.74965439387295 31.249647494169494 -401.242 233.61752335892382 234.2008400575238 30.74965439387295 31.249647494169494 -402.242 234.2008400575238 234.78415675612382 30.74965439387295 31.249647494169494 -403.242 234.78415675612382 235.3674734547238 30.74965439387295 31.249647494169494 -404.242 235.3674734547238 235.9507901533238 30.74965439387295 31.249647494169494 -405.242 235.9507901533238 236.5341068519238 30.74965439387295 31.249647494169494 -406.242 236.5341068519238 237.1174235505238 30.74965439387295 31.249647494169494 -407.242 237.1174235505238 237.70074024912378 30.74965439387295 31.249647494169494 -408.242 237.70074024912378 238.2840569477238 30.74965439387295 31.249647494169494 -409.242 238.2840569477238 238.8673736463238 30.74965439387295 31.249647494169494 -410.242 238.8673736463238 239.4506903449238 30.74965439387295 31.249647494169494 -411.242 239.4506903449238 240.0340070435738 30.74965439387295 31.249647494169494 -412.242 240.0340070435738 240.61732374222382 30.74965439387295 31.249647494169494 -413.242 240.61732374222382 241.2006404408238 30.74965439387295 31.249647494169494 -414.242 241.2006404408238 241.78395713942382 30.74965439387295 31.249647494169494 -415.242 241.78395713942382 242.36727383802383 30.74965439387295 31.249647494169494 -416.242 242.36727383802383 242.95059053662382 30.74965439387295 31.249647494169494 -417.242 242.95059053662382 243.5339072352238 30.74965439387295 31.249647494169494 -418.242 243.5339072352238 244.11722393382382 30.74965439387295 31.249647494169494 -419.242 244.11722393382382 244.7005406324238 30.74965439387295 31.249647494169494 -420.242 244.7005406324238 245.2838573310238 30.74965439387295 31.249647494169494 -421.242 245.2838573310238 245.8671740296238 30.74965439387295 31.249647494169494 -422.242 245.8671740296238 246.4504907282238 30.74965439387295 31.249647494169494 -423.242 246.4504907282238 247.03380742682378 30.74965439387295 31.249647494169494 -424.242 247.03380742682378 247.6171241254738 30.74965439387295 31.249647494169494 -425.242 247.6171241254738 248.2004408241238 30.74965439387295 31.249647494169494 -426.242 248.2004408241238 248.78375752272382 30.74965439387295 31.249647494169494 -427.242 248.78375752272382 249.3670742213238 30.74965439387295 31.249647494169494 -428.242 249.3670742213238 249.95039091992382 30.74965439387295 31.249647494169494 -429.242 249.95039091992382 250.5337076185238 30.74965439387295 31.249647494169494 -430.242 250.5337076185238 251.11702431712382 30.74965439387295 31.249647494169494 -431.242 251.11702431712382 251.70034101572384 30.74965439387295 31.249647494169494 -432.242 251.70034101572384 252.28365771432382 30.74965439387295 31.249647494169494 -433.242 252.28365771432382 252.8669744129238 30.74965439387295 31.249647494169494 -434.242 252.8669744129238 253.45029111152382 30.74965439387295 31.249647494169494 -435.242 253.45029111152382 254.0336078101238 30.74965439387295 31.249647494169494 -436.242 254.0336078101238 254.6169245087238 30.74965439387295 31.249647494169494 -437.242 254.6169245087238 255.20024120737384 30.74965439387295 31.249647494169494 -438.242 255.20024120737384 255.78355790602382 30.74965439387295 31.249647494169494 -439.242 255.78355790602382 256.3668746046238 30.74965439387295 31.249647494169494 -440.242 256.3668746046238 256.9501913032238 30.74965439387295 31.249647494169494 -441.242 256.9501913032238 257.5335080018238 30.74965439387295 31.249647494169494 -442.242 257.5335080018238 258.1168247004238 30.74965439387295 31.249647494169494 -443.242 258.1168247004238 258.70014139902383 30.74965439387295 31.249647494169494 -444.242 258.70014139902383 259.2834580976238 30.74965439387295 31.249647494169494 -445.242 259.2834580976238 259.8667747962238 30.74965439387295 31.249647494169494 -446.242 259.8667747962238 260.4500914948238 30.74965439387295 31.249647494169494 -447.242 260.4500914948238 261.0334081934238 30.74965439387295 31.249647494169494 -448.242 261.0334081934238 261.6167248920238 30.74965439387295 31.249647494169494 -449.242 261.6167248920238 262.2000415906238 30.74965439387295 31.249647494169494 -450.242 262.2000415906238 262.7833582892738 30.74965439387295 31.249647494169494 -451.242 262.7833582892738 263.36667498792383 30.74965439387295 31.249647494169494 -452.242 263.36667498792383 263.9499916865238 30.74965439387295 31.249647494169494 -453.242 263.9499916865238 264.5333083851238 30.74965439387295 31.249647494169494 -454.242 264.5333083851238 265.1166250837238 30.74965439387295 31.249647494169494 -455.242 265.1166250837238 265.6999417823238 30.74965439387295 31.249647494169494 -456.242 265.6999417823238 266.2832584809238 30.74965439387295 31.249647494169494 -457.242 266.2832584809238 266.8665751795238 30.74965439387295 31.249647494169494 -458.242 266.8665751795238 267.4498918781238 30.74965439387295 31.249647494169494 -459.242 267.4498918781238 268.03320857672384 30.74965439387295 31.249647494169494 -460.242 268.03320857672384 268.6165252753238 30.74965439387295 31.249647494169494 -461.242 268.6165252753238 269.1998419739238 30.74965439387295 31.249647494169494 -462.242 269.1998419739238 269.7831586725238 30.74965439387295 31.249647494169494 -463.242 269.7831586725238 270.3758215602946 30.74965439387295 31.249647494169494 -584.242 340.3551330149531 340.9477959027238 30.74965439387295 31.249647494169494 -585.242 340.9477959027238 341.5311126013238 30.74965439387295 31.249647494169494 -586.242 341.5311126013238 342.1144292999238 30.74965439387295 31.249647494169494 -587.242 342.1144292999238 342.6977459985238 30.74965439387295 31.249647494169494 -588.242 342.6977459985238 343.2810626971238 30.74965439387295 31.249647494169494 -589.242 343.2810626971238 343.8643793957238 30.74965439387295 31.249647494169494 -590.242 343.8643793957238 344.4476960943238 30.74965439387295 31.249647494169494 -591.242 344.4476960943238 345.0310127929238 30.74965439387295 31.249647494169494 -592.242 345.0310127929238 345.6143294915238 30.74965439387295 31.249647494169494 -593.242 345.6143294915238 346.1976461901738 30.74965439387295 31.249647494169494 -594.242 346.1976461901738 346.7809628888238 30.74965439387295 31.249647494169494 -595.242 346.7809628888238 347.3642795874238 30.74965439387295 31.249647494169494 -596.242 347.3642795874238 347.9475962860238 30.74965439387295 31.249647494169494 -597.242 347.9475962860238 348.5309129846238 30.74965439387295 31.249647494169494 -598.242 348.5309129846238 349.1142296832238 30.74965439387295 31.249647494169494 -599.242 349.1142296832238 349.6975463818238 30.74965439387295 31.249647494169494 -600.242 349.6975463818238 350.28086308042384 30.74965439387295 31.249647494169494 -601.242 350.28086308042384 350.8641797790238 30.74965439387295 31.249647494169494 -602.242 350.8641797790238 351.4474964776238 30.74965439387295 31.249647494169494 -603.242 351.4474964776238 352.0308131762238 30.74965439387295 31.249647494169494 -604.242 352.0308131762238 352.6141298748238 30.74965439387295 31.249647494169494 -605.242 352.6141298748238 353.1974465734238 30.74965439387295 31.249647494169494 -606.242 353.1974465734238 353.78076327207384 30.74965439387295 31.249647494169494 -607.242 353.78076327207384 354.3640799707238 30.74965439387295 31.249647494169494 -608.242 354.3640799707238 354.94739666932384 30.74965439387295 31.249647494169494 -609.242 354.94739666932384 355.5307133679238 30.74965439387295 31.249647494169494 -610.242 355.5307133679238 356.1140300665238 30.74965439387295 31.249647494169494 -611.242 356.1140300665238 356.6973467651238 30.74965439387295 31.249647494169494 -612.242 356.6973467651238 357.28066346372384 30.74965439387295 31.249647494169494 -613.242 357.28066346372384 357.8639801623238 30.74965439387295 31.249647494169494 -614.242 357.8639801623238 358.44729686092376 30.74965439387295 31.249647494169494 -615.242 358.44729686092376 359.0306135595238 30.74965439387295 31.249647494169494 -616.242 359.0306135595238 359.62327644729453 30.74965439387295 31.249647494169494 -000.242 359.69818102805306 0.2908439158238121 30.74965439387295 31.249647494169494 -001.243 0.29237189622515947 0.8787857445251595 31.249647494169494 31.74964052100247 -002.243 0.8787857445251595 1.4651995928251598 31.249647494169494 31.74964052100247 -003.243 1.4651995928251598 2.051613441125159 31.249647494169494 31.74964052100247 -004.243 2.051613441125159 2.638027289425159 31.249647494169494 31.74964052100247 -005.243 2.638027289425159 3.224441137725159 31.249647494169494 31.74964052100247 -006.243 3.224441137725159 3.8108549860251597 31.249647494169494 31.74964052100247 -007.243 3.8108549860251597 4.39726883437516 31.249647494169494 31.74964052100247 -008.243 4.39726883437516 4.98368268272516 31.249647494169494 31.74964052100247 -009.243 4.98368268272516 5.570096531025159 31.249647494169494 31.74964052100247 -010.243 5.570096531025159 6.15651037932516 31.249647494169494 31.74964052100247 -011.243 6.15651037932516 6.74292422762516 31.249647494169494 31.74964052100247 -012.243 6.74292422762516 7.329338075925159 31.249647494169494 31.74964052100247 -013.243 7.329338075925159 7.91575192422516 31.249647494169494 31.74964052100247 -014.243 7.91575192422516 8.50216577252516 31.249647494169494 31.74964052100247 -015.243 8.50216577252516 9.088579620825161 31.249647494169494 31.74964052100247 -016.243 9.088579620825161 9.674993469125159 31.249647494169494 31.74964052100247 -017.243 9.674993469125159 10.26140731742516 31.249647494169494 31.74964052100247 -018.243 10.26140731742516 10.847821165725158 31.249647494169494 31.74964052100247 -019.243 10.847821165725158 11.434235014025159 31.249647494169494 31.74964052100247 -020.243 11.434235014025159 12.020648862325158 31.249647494169494 31.74964052100247 -021.243 12.020648862325158 12.607062710675159 31.249647494169494 31.74964052100247 -022.243 12.607062710675159 13.19347655902516 31.249647494169494 31.74964052100247 -023.243 13.19347655902516 13.77989040732516 31.249647494169494 31.74964052100247 -024.243 13.77989040732516 14.36630425562516 31.249647494169494 31.74964052100247 -025.243 14.36630425562516 14.952718103925157 31.249647494169494 31.74964052100247 -026.243 14.952718103925157 15.53913195222516 31.249647494169494 31.74964052100247 -027.243 15.53913195222516 16.12554580052516 31.249647494169494 31.74964052100247 -028.243 16.12554580052516 16.71195964882516 31.249647494169494 31.74964052100247 -029.243 16.71195964882516 17.298373497125162 31.249647494169494 31.74964052100247 -030.243 17.298373497125162 17.88478734542516 31.249647494169494 31.74964052100247 -031.243 17.88478734542516 18.471201193725154 31.249647494169494 31.74964052100247 -032.243 18.471201193725154 19.057615042025155 31.249647494169494 31.74964052100247 -033.243 19.057615042025155 19.644028890325156 31.249647494169494 31.74964052100247 -034.243 19.644028890325156 20.230442738625158 31.249647494169494 31.74964052100247 -035.243 20.230442738625158 20.816856586975156 31.249647494169494 31.74964052100247 -036.243 20.816856586975156 21.40327043532516 31.249647494169494 31.74964052100247 -037.243 21.40327043532516 21.98968428362516 31.249647494169494 31.74964052100247 -038.243 21.98968428362516 22.57609813192516 31.249647494169494 31.74964052100247 -039.243 22.57609813192516 23.162511980225162 31.249647494169494 31.74964052100247 -040.243 23.162511980225162 23.74892582852516 31.249647494169494 31.74964052100247 -041.243 23.74892582852516 24.33533967682516 31.249647494169494 31.74964052100247 -042.243 24.33533967682516 24.921753525125162 31.249647494169494 31.74964052100247 -043.243 24.921753525125162 25.508167373425167 31.249647494169494 31.74964052100247 -044.243 25.508167373425167 26.094581221725164 31.249647494169494 31.74964052100247 -045.243 26.094581221725164 26.680995070025162 31.249647494169494 31.74964052100247 -046.243 26.680995070025162 27.26740891832516 31.249647494169494 31.74964052100247 -047.243 27.26740891832516 27.853822766625157 31.249647494169494 31.74964052100247 -048.243 27.853822766625157 28.440236614925162 31.249647494169494 31.74964052100247 -049.243 28.440236614925162 29.02665046327516 31.249647494169494 31.74964052100247 -050.243 29.02665046327516 29.61306431162516 31.249647494169494 31.74964052100247 -051.243 29.61306431162516 30.199478159925164 31.249647494169494 31.74964052100247 -052.243 30.199478159925164 30.78589200822516 31.249647494169494 31.74964052100247 -053.243 30.78589200822516 31.37230585652516 31.249647494169494 31.74964052100247 -054.243 31.37230585652516 31.958719704825164 31.249647494169494 31.74964052100247 -055.243 31.958719704825164 32.545133553125154 31.249647494169494 31.74964052100247 -056.243 32.545133553125154 33.13154740142516 31.249647494169494 31.74964052100247 -057.243 33.13154740142516 33.717961249725164 31.249647494169494 31.74964052100247 -058.243 33.717961249725164 34.30437509802516 31.249647494169494 31.74964052100247 -059.243 34.30437509802516 34.89078894632516 31.249647494169494 31.74964052100247 -060.243 34.89078894632516 35.477202794625164 31.249647494169494 31.74964052100247 -061.243 35.477202794625164 36.063616642925155 31.249647494169494 31.74964052100247 -062.243 36.063616642925155 36.65003049122515 31.249647494169494 31.74964052100247 -063.243 36.65003049122515 37.24584021204088 31.249647494169494 31.74964052100247 -196.243 114.63367644360945 115.22948616442517 31.249647494169494 31.74964052100247 -197.243 115.22948616442517 115.81590001272515 31.249647494169494 31.74964052100247 -198.243 115.81590001272515 116.40231386102516 31.249647494169494 31.74964052100247 -199.243 116.40231386102516 116.98872770932516 31.249647494169494 31.74964052100247 -200.243 116.98872770932516 117.57514155762516 31.249647494169494 31.74964052100247 -201.243 117.57514155762516 118.16155540592516 31.249647494169494 31.74964052100247 -202.243 118.16155540592516 118.74796925422517 31.249647494169494 31.74964052100247 -203.243 118.74796925422517 119.33438310252515 31.249647494169494 31.74964052100247 -204.243 119.33438310252515 119.92079695082515 31.249647494169494 31.74964052100247 -205.243 119.92079695082515 120.50721079912518 31.249647494169494 31.74964052100247 -206.243 120.50721079912518 121.09362464742516 31.249647494169494 31.74964052100247 -207.243 121.09362464742516 121.68003849577516 31.249647494169494 31.74964052100247 -208.243 121.68003849577516 122.26645234412517 31.249647494169494 31.74964052100247 -209.243 122.26645234412517 122.85286619242518 31.249647494169494 31.74964052100247 -210.243 122.85286619242518 123.43928004072517 31.249647494169494 31.74964052100247 -211.243 123.43928004072517 124.02569388902516 31.249647494169494 31.74964052100247 -212.243 124.02569388902516 124.61210773732515 31.249647494169494 31.74964052100247 -213.243 124.61210773732515 125.19852158562516 31.249647494169494 31.74964052100247 -214.243 125.19852158562516 125.78493543392516 31.249647494169494 31.74964052100247 -215.243 125.78493543392516 126.37134928222517 31.249647494169494 31.74964052100247 -216.243 126.37134928222517 126.95776313052517 31.249647494169494 31.74964052100247 -217.243 126.95776313052517 127.54417697882515 31.249647494169494 31.74964052100247 -218.243 127.54417697882515 128.13059082712516 31.249647494169494 31.74964052100247 -219.243 128.13059082712516 128.7170046754252 31.249647494169494 31.74964052100247 -220.243 128.7170046754252 129.30341852372518 31.249647494169494 31.74964052100247 -221.243 129.30341852372518 129.88983237207515 31.249647494169494 31.74964052100247 -222.243 129.88983237207515 130.47624622042514 31.249647494169494 31.74964052100247 -223.243 130.47624622042514 131.06266006872517 31.249647494169494 31.74964052100247 -224.243 131.06266006872517 131.64907391702516 31.249647494169494 31.74964052100247 -225.243 131.64907391702516 132.2354877653252 31.249647494169494 31.74964052100247 -226.243 132.2354877653252 132.8219016136252 31.249647494169494 31.74964052100247 -227.243 132.8219016136252 133.40831546192516 31.249647494169494 31.74964052100247 -228.243 133.40831546192516 133.99472931022518 31.249647494169494 31.74964052100247 -229.243 133.99472931022518 134.58114315852518 31.249647494169494 31.74964052100247 -230.243 134.58114315852518 135.16755700682518 31.249647494169494 31.74964052100247 -231.243 135.16755700682518 135.75397085512515 31.249647494169494 31.74964052100247 -232.243 135.75397085512515 136.34038470342514 31.249647494169494 31.74964052100247 -233.243 136.34038470342514 136.92679855172514 31.249647494169494 31.74964052100247 -234.243 136.92679855172514 137.51321240002517 31.249647494169494 31.74964052100247 -235.243 137.51321240002517 138.09962624837516 31.249647494169494 31.74964052100247 -236.243 138.09962624837516 138.68604009672515 31.249647494169494 31.74964052100247 -237.243 138.68604009672515 139.27245394502518 31.249647494169494 31.74964052100247 -238.243 139.27245394502518 139.85886779332517 31.249647494169494 31.74964052100247 -239.243 139.85886779332517 140.44528164162517 31.249647494169494 31.74964052100247 -240.243 140.44528164162517 141.03169548992514 31.249647494169494 31.74964052100247 -241.243 141.03169548992514 141.61810933822517 31.249647494169494 31.74964052100247 -242.243 141.61810933822517 142.20452318652517 31.249647494169494 31.74964052100247 -243.243 142.20452318652517 142.79093703482516 31.249647494169494 31.74964052100247 -244.243 142.79093703482516 143.3773508831252 31.249647494169494 31.74964052100247 -245.243 143.3773508831252 143.9637647314252 31.249647494169494 31.74964052100247 -246.243 143.9637647314252 144.55017857972518 31.249647494169494 31.74964052100247 -247.243 144.55017857972518 145.13659242802515 31.249647494169494 31.74964052100247 -248.243 145.13659242802515 145.72300627632515 31.249647494169494 31.74964052100247 -249.243 145.72300627632515 146.30942012467514 31.249647494169494 31.74964052100247 -250.243 146.30942012467514 146.89583397302516 31.249647494169494 31.74964052100247 -251.243 146.89583397302516 147.4822478213252 31.249647494169494 31.74964052100247 -252.243 147.4822478213252 148.0686616696252 31.249647494169494 31.74964052100247 -253.243 148.0686616696252 148.65507551792518 31.249647494169494 31.74964052100247 -254.243 148.65507551792518 149.24148936622515 31.249647494169494 31.74964052100247 -255.243 149.24148936622515 149.82790321452518 31.249647494169494 31.74964052100247 -256.243 149.82790321452518 150.41431706282515 31.249647494169494 31.74964052100247 -257.243 150.41431706282515 151.00073091112517 31.249647494169494 31.74964052100247 -258.243 151.00073091112517 151.58714475942514 31.249647494169494 31.74964052100247 -259.243 151.58714475942514 152.17355860772517 31.249647494169494 31.74964052100247 -260.243 152.17355860772517 152.75997245602517 31.249647494169494 31.74964052100247 -261.243 152.75997245602517 153.34638630432516 31.249647494169494 31.74964052100247 -262.243 153.34638630432516 153.93280015262516 31.249647494169494 31.74964052100247 -263.243 153.93280015262516 154.5192140009252 31.249647494169494 31.74964052100247 -264.243 154.5192140009252 155.10562784927515 31.249647494169494 31.74964052100247 -265.243 155.10562784927515 155.69204169762517 31.249647494169494 31.74964052100247 -266.243 155.69204169762517 156.27845554592517 31.249647494169494 31.74964052100247 -267.243 156.27845554592517 156.86486939422514 31.249647494169494 31.74964052100247 -268.243 156.86486939422514 157.46067911504085 31.249647494169494 31.74964052100247 -272.243 159.20112891490948 159.79693863572516 31.249647494169494 31.74964052100247 -273.243 159.79693863572516 160.38335248402518 31.249647494169494 31.74964052100247 -274.243 160.38335248402518 160.96976633232518 31.249647494169494 31.74964052100247 -275.243 160.96976633232518 161.55618018062518 31.249647494169494 31.74964052100247 -276.243 161.55618018062518 162.14259402892515 31.249647494169494 31.74964052100247 -277.243 162.14259402892515 162.72900787722517 31.249647494169494 31.74964052100247 -278.243 162.72900787722517 163.31542172557516 31.249647494169494 31.74964052100247 -279.243 163.31542172557516 163.90183557392518 31.249647494169494 31.74964052100247 -280.243 163.90183557392518 164.48824942222518 31.249647494169494 31.74964052100247 -281.243 164.48824942222518 165.07466327052515 31.249647494169494 31.74964052100247 -282.243 165.07466327052515 165.66107711882518 31.249647494169494 31.74964052100247 -283.243 165.66107711882518 166.24749096712517 31.249647494169494 31.74964052100247 -284.243 166.24749096712517 166.83390481542517 31.249647494169494 31.74964052100247 -285.243 166.83390481542517 167.42031866372514 31.249647494169494 31.74964052100247 -286.243 167.42031866372514 168.00673251202517 31.249647494169494 31.74964052100247 -287.243 168.00673251202517 168.5931463603252 31.249647494169494 31.74964052100247 -288.243 168.5931463603252 169.17956020862516 31.249647494169494 31.74964052100247 -289.243 169.17956020862516 169.7659740569252 31.249647494169494 31.74964052100247 -290.243 169.7659740569252 170.35238790522519 31.249647494169494 31.74964052100247 -291.243 170.35238790522519 170.93880175352518 31.249647494169494 31.74964052100247 -292.243 170.93880175352518 171.52521560187517 31.249647494169494 31.74964052100247 -293.243 171.52521560187517 172.11162945022517 31.249647494169494 31.74964052100247 -294.243 172.11162945022517 172.6980432985252 31.249647494169494 31.74964052100247 -295.243 172.6980432985252 173.2844571468252 31.249647494169494 31.74964052100247 -296.243 173.2844571468252 173.8708709951252 31.249647494169494 31.74964052100247 -297.243 173.8708709951252 174.45728484342519 31.249647494169494 31.74964052100247 -298.243 174.45728484342519 175.04369869172518 31.249647494169494 31.74964052100247 -299.243 175.04369869172518 175.63011254002515 31.249647494169494 31.74964052100247 -300.243 175.63011254002515 176.21652638832518 31.249647494169494 31.74964052100247 -301.243 176.21652638832518 176.80294023662518 31.249647494169494 31.74964052100247 -302.243 176.80294023662518 177.38935408492517 31.249647494169494 31.74964052100247 -303.243 177.38935408492517 177.97576793322514 31.249647494169494 31.74964052100247 -304.243 177.97576793322514 178.56218178152517 31.249647494169494 31.74964052100247 -305.243 178.56218178152517 179.14859562982517 31.249647494169494 31.74964052100247 -306.243 179.14859562982517 179.7350094781752 31.249647494169494 31.74964052100247 -307.243 179.7350094781752 180.32142332652515 31.249647494169494 31.74964052100247 -308.243 180.32142332652515 180.90783717482515 31.249647494169494 31.74964052100247 -309.243 180.90783717482515 181.49425102312514 31.249647494169494 31.74964052100247 -310.243 181.49425102312514 182.08066487142514 31.249647494169494 31.74964052100247 -311.243 182.08066487142514 182.66707871972514 31.249647494169494 31.74964052100247 -312.243 182.66707871972514 183.25349256802514 31.249647494169494 31.74964052100247 -313.243 183.25349256802514 183.83990641632516 31.249647494169494 31.74964052100247 -314.243 183.83990641632516 184.42632026462516 31.249647494169494 31.74964052100247 -315.243 184.42632026462516 185.01273411292516 31.249647494169494 31.74964052100247 -316.243 185.01273411292516 185.59914796122516 31.249647494169494 31.74964052100247 -317.243 185.59914796122516 186.18556180952515 31.249647494169494 31.74964052100247 -318.243 186.18556180952515 186.77197565782515 31.249647494169494 31.74964052100247 -319.243 186.77197565782515 187.35838950612515 31.249647494169494 31.74964052100247 -320.243 187.35838950612515 187.94480335442515 31.249647494169494 31.74964052100247 -321.243 187.94480335442515 188.53121720277514 31.249647494169494 31.74964052100247 -322.243 188.53121720277514 189.11763105112516 31.249647494169494 31.74964052100247 -323.243 189.11763105112516 189.70404489942516 31.249647494169494 31.74964052100247 -324.243 189.70404489942516 190.29045874772515 31.249647494169494 31.74964052100247 -325.243 190.29045874772515 190.87687259602515 31.249647494169494 31.74964052100247 -326.243 190.87687259602515 191.46328644432515 31.249647494169494 31.74964052100247 -327.243 191.46328644432515 192.04970029262515 31.249647494169494 31.74964052100247 -328.243 192.04970029262515 192.63611414092514 31.249647494169494 31.74964052100247 -329.243 192.63611414092514 193.22252798922514 31.249647494169494 31.74964052100247 -330.243 193.22252798922514 193.80894183752514 31.249647494169494 31.74964052100247 -331.243 193.80894183752514 194.39535568582514 31.249647494169494 31.74964052100247 -332.243 194.39535568582514 194.98176953412514 31.249647494169494 31.74964052100247 -333.243 194.98176953412514 195.56818338242516 31.249647494169494 31.74964052100247 -334.243 195.56818338242516 196.15459723072516 31.249647494169494 31.74964052100247 -335.243 196.15459723072516 196.74101107907515 31.249647494169494 31.74964052100247 -336.243 196.74101107907515 197.32742492742514 31.249647494169494 31.74964052100247 -337.243 197.32742492742514 197.91383877572514 31.249647494169494 31.74964052100247 -338.243 197.91383877572514 198.50025262402514 31.249647494169494 31.74964052100247 -339.243 198.50025262402514 199.08666647232513 31.249647494169494 31.74964052100247 -340.243 199.08666647232513 199.67308032062516 31.249647494169494 31.74964052100247 -341.243 199.67308032062516 200.25949416892516 31.249647494169494 31.74964052100247 -342.243 200.25949416892516 200.84590801722516 31.249647494169494 31.74964052100247 -343.243 200.84590801722516 201.43232186552515 31.249647494169494 31.74964052100247 -344.243 201.43232186552515 202.01873571382515 31.249647494169494 31.74964052100247 -345.243 202.01873571382515 202.60514956212515 31.249647494169494 31.74964052100247 -346.243 202.60514956212515 203.19156341042515 31.249647494169494 31.74964052100247 -347.243 203.19156341042515 203.77797725872514 31.249647494169494 31.74964052100247 -348.243 203.77797725872514 204.36439110702514 31.249647494169494 31.74964052100247 -349.243 204.36439110702514 204.95080495537513 31.249647494169494 31.74964052100247 -350.243 204.95080495537513 205.53721880372515 31.249647494169494 31.74964052100247 -351.243 205.53721880372515 206.12363265202515 31.249647494169494 31.74964052100247 -352.243 206.12363265202515 206.71004650032515 31.249647494169494 31.74964052100247 -353.243 206.71004650032515 207.29646034862515 31.249647494169494 31.74964052100247 -354.243 207.29646034862515 207.88287419692514 31.249647494169494 31.74964052100247 -355.243 207.88287419692514 208.47868391774085 31.249647494169494 31.74964052100247 -393.243 230.15720456010945 230.75301428092516 31.249647494169494 31.74964052100247 -394.243 230.75301428092516 231.33942812922513 31.249647494169494 31.74964052100247 -395.243 231.33942812922513 231.92584197752512 31.249647494169494 31.74964052100247 -396.243 231.92584197752512 232.51225582582515 31.249647494169494 31.74964052100247 -397.243 232.51225582582515 233.09866967412518 31.249647494169494 31.74964052100247 -398.243 233.09866967412518 233.68508352242515 31.249647494169494 31.74964052100247 -399.243 233.68508352242515 234.27149737072514 31.249647494169494 31.74964052100247 -400.243 234.27149737072514 234.85791121902514 31.249647494169494 31.74964052100247 -401.243 234.85791121902514 235.4443250673251 31.249647494169494 31.74964052100247 -402.243 235.4443250673251 236.03073891562516 31.249647494169494 31.74964052100247 -403.243 236.03073891562516 236.61715276392516 31.249647494169494 31.74964052100247 -404.243 236.61715276392516 237.20356661222516 31.249647494169494 31.74964052100247 -405.243 237.20356661222516 237.78998046052516 31.249647494169494 31.74964052100247 -406.243 237.78998046052516 238.37639430887515 31.249647494169494 31.74964052100247 -407.243 238.37639430887515 238.96280815722514 31.249647494169494 31.74964052100247 -408.243 238.96280815722514 239.5492220055251 31.249647494169494 31.74964052100247 -409.243 239.5492220055251 240.13563585382514 31.249647494169494 31.74964052100247 -410.243 240.13563585382514 240.72204970212516 31.249647494169494 31.74964052100247 -411.243 240.72204970212516 241.30846355042513 31.249647494169494 31.74964052100247 -412.243 241.30846355042513 241.89487739872516 31.249647494169494 31.74964052100247 -413.243 241.89487739872516 242.48129124702515 31.249647494169494 31.74964052100247 -414.243 242.48129124702515 243.06770509532515 31.249647494169494 31.74964052100247 -415.243 243.06770509532515 243.65411894362518 31.249647494169494 31.74964052100247 -416.243 243.65411894362518 244.24053279192515 31.249647494169494 31.74964052100247 -417.243 244.24053279192515 244.82694664022515 31.249647494169494 31.74964052100247 -418.243 244.82694664022515 245.41336048852514 31.249647494169494 31.74964052100247 -419.243 245.41336048852514 245.9997743368251 31.249647494169494 31.74964052100247 -420.243 245.9997743368251 246.58618818517516 31.249647494169494 31.74964052100247 -421.243 246.58618818517516 247.17260203352515 31.249647494169494 31.74964052100247 -422.243 247.17260203352515 247.75901588182512 31.249647494169494 31.74964052100247 -423.243 247.75901588182512 248.34542973012515 31.249647494169494 31.74964052100247 -424.243 248.34542973012515 248.93184357842514 31.249647494169494 31.74964052100247 -425.243 248.93184357842514 249.51825742672514 31.249647494169494 31.74964052100247 -426.243 249.51825742672514 250.1046712750251 31.249647494169494 31.74964052100247 -427.243 250.1046712750251 250.69108512332514 31.249647494169494 31.74964052100247 -428.243 250.69108512332514 251.27749897162516 31.249647494169494 31.74964052100247 -429.243 251.27749897162516 251.86391281992513 31.249647494169494 31.74964052100247 -430.243 251.86391281992513 252.45032666822516 31.249647494169494 31.74964052100247 -431.243 252.45032666822516 253.03674051652516 31.249647494169494 31.74964052100247 -432.243 253.03674051652516 253.62315436482515 31.249647494169494 31.74964052100247 -433.243 253.62315436482515 254.20956821312518 31.249647494169494 31.74964052100247 -434.243 254.20956821312518 254.79598206142515 31.249647494169494 31.74964052100247 -435.243 254.79598206142515 255.38239590977514 31.249647494169494 31.74964052100247 -436.243 255.38239590977514 255.96880975812513 31.249647494169494 31.74964052100247 -437.243 255.96880975812513 256.5552236064251 31.249647494169494 31.74964052100247 -438.243 256.5552236064251 257.1416374547251 31.249647494169494 31.74964052100247 -439.243 257.1416374547251 257.72805130302515 31.249647494169494 31.74964052100247 -440.243 257.72805130302515 258.3144651513251 31.249647494169494 31.74964052100247 -441.243 258.3144651513251 258.9008789996251 31.249647494169494 31.74964052100247 -442.243 258.9008789996251 259.4872928479251 31.249647494169494 31.74964052100247 -443.243 259.4872928479251 260.07370669622514 31.249647494169494 31.74964052100247 -444.243 260.07370669622514 260.66012054452517 31.249647494169494 31.74964052100247 -445.243 260.66012054452517 261.2465343928252 31.249647494169494 31.74964052100247 -446.243 261.2465343928252 261.83294824112517 31.249647494169494 31.74964052100247 -447.243 261.83294824112517 262.41936208942514 31.249647494169494 31.74964052100247 -448.243 262.41936208942514 263.00577593772516 31.249647494169494 31.74964052100247 -449.243 263.00577593772516 263.59218978607515 31.249647494169494 31.74964052100247 -450.243 263.59218978607515 264.17860363442514 31.249647494169494 31.74964052100247 -451.243 264.17860363442514 264.76501748272517 31.249647494169494 31.74964052100247 -452.243 264.76501748272517 265.35143133102514 31.249647494169494 31.74964052100247 -453.243 265.35143133102514 265.9378451793251 31.249647494169494 31.74964052100247 -454.243 265.9378451793251 266.52425902762513 31.249647494169494 31.74964052100247 -455.243 266.52425902762513 267.11067287592516 31.249647494169494 31.74964052100247 -456.243 267.11067287592516 267.6970867242252 31.249647494169494 31.74964052100247 -457.243 267.6970867242252 268.2835005725251 31.249647494169494 31.74964052100247 -458.243 268.2835005725251 268.8699144208251 31.249647494169494 31.74964052100247 -459.243 268.8699144208251 269.45632826912515 31.249647494169494 31.74964052100247 -460.243 269.45632826912515 270.0427421174252 31.249647494169494 31.74964052100247 -461.243 270.0427421174252 270.6385518382409 31.249647494169494 31.74964052100247 -581.243 340.4030080418094 340.99881776262515 31.249647494169494 31.74964052100247 -582.243 340.99881776262515 341.5852316109252 31.249647494169494 31.74964052100247 -583.243 341.5852316109252 342.17164545922515 31.249647494169494 31.74964052100247 -584.243 342.17164545922515 342.7580593075252 31.249647494169494 31.74964052100247 -585.243 342.7580593075252 343.3444731558252 31.249647494169494 31.74964052100247 -586.243 343.3444731558252 343.9308870041251 31.249647494169494 31.74964052100247 -587.243 343.9308870041251 344.51730085242514 31.249647494169494 31.74964052100247 -588.243 344.51730085242514 345.10371470072516 31.249647494169494 31.74964052100247 -589.243 345.10371470072516 345.6901285490252 31.249647494169494 31.74964052100247 -590.243 345.6901285490252 346.27654239732516 31.249647494169494 31.74964052100247 -591.243 346.27654239732516 346.86295624567515 31.249647494169494 31.74964052100247 -592.243 346.86295624567515 347.4493700940252 31.249647494169494 31.74964052100247 -593.243 347.4493700940252 348.0357839423251 31.249647494169494 31.74964052100247 -594.243 348.0357839423251 348.62219779062514 31.249647494169494 31.74964052100247 -595.243 348.62219779062514 349.20861163892516 31.249647494169494 31.74964052100247 -596.243 349.20861163892516 349.79502548722513 31.249647494169494 31.74964052100247 -597.243 349.79502548722513 350.38143933552516 31.249647494169494 31.74964052100247 -598.243 350.38143933552516 350.9678531838251 31.249647494169494 31.74964052100247 -599.243 350.9678531838251 351.55426703212515 31.249647494169494 31.74964052100247 -600.243 351.55426703212515 352.1406808804252 31.249647494169494 31.74964052100247 -601.243 352.1406808804252 352.7270947287251 31.249647494169494 31.74964052100247 -602.243 352.7270947287251 353.3135085770252 31.249647494169494 31.74964052100247 -603.243 353.3135085770252 353.89992242532514 31.249647494169494 31.74964052100247 -604.243 353.89992242532514 354.48633627362517 31.249647494169494 31.74964052100247 -605.243 354.48633627362517 355.0727501219252 31.249647494169494 31.74964052100247 -606.243 355.0727501219252 355.65916397027513 31.249647494169494 31.74964052100247 -607.243 355.65916397027513 356.2455778186252 31.249647494169494 31.74964052100247 -608.243 356.2455778186252 356.8319916669252 31.249647494169494 31.74964052100247 -609.243 356.8319916669252 357.4184055152251 31.249647494169494 31.74964052100247 -610.243 357.4184055152251 358.00481936352514 31.249647494169494 31.74964052100247 -611.243 358.00481936352514 358.59123321182517 31.249647494169494 31.74964052100247 -612.243 358.59123321182517 359.1776470601252 31.249647494169494 31.74964052100247 -613.243 359.1776470601252 359.73500947817513 31.249647494169494 31.74964052100247 -000.243 359.73500947817513 0.29237189622515947 31.249647494169494 31.74964052100247 -001.244 0.29393851718269515 0.8835277188826951 31.74964052100247 32.24963347211302 -002.244 0.8835277188826951 1.473116920532695 31.74964052100247 32.24963347211302 -003.244 1.473116920532695 2.062706122182695 31.74964052100247 32.24963347211302 -004.244 2.062706122182695 2.652295323882695 31.74964052100247 32.24963347211302 -005.244 2.652295323882695 3.241884525582695 31.74964052100247 32.24963347211302 -006.244 3.241884525582695 3.8314737272826953 31.74964052100247 32.24963347211302 -007.244 3.8314737272826953 4.421062928932695 31.74964052100247 32.24963347211302 -008.244 4.421062928932695 5.010652130582695 31.74964052100247 32.24963347211302 -009.244 5.010652130582695 5.600241332282696 31.74964052100247 32.24963347211302 -010.244 5.600241332282696 6.189830533982695 31.74964052100247 32.24963347211302 -011.244 6.189830533982695 6.779419735682695 31.74964052100247 32.24963347211302 -012.244 6.779419735682695 7.369008937382695 31.74964052100247 32.24963347211302 -013.244 7.369008937382695 7.958598139032695 31.74964052100247 32.24963347211302 -014.244 7.958598139032695 8.548187340682695 31.74964052100247 32.24963347211302 -015.244 8.548187340682695 9.137776542382696 31.74964052100247 32.24963347211302 -016.244 9.137776542382696 9.727365744082695 31.74964052100247 32.24963347211302 -017.244 9.727365744082695 10.316954945782694 31.74964052100247 32.24963347211302 -018.244 10.316954945782694 10.906544147432694 31.74964052100247 32.24963347211302 -019.244 10.906544147432694 11.496133349082694 31.74964052100247 32.24963347211302 -020.244 11.496133349082694 12.085722550782696 31.74964052100247 32.24963347211302 -021.244 12.085722550782696 12.675311752482694 31.74964052100247 32.24963347211302 -022.244 12.675311752482694 13.264900954182696 31.74964052100247 32.24963347211302 -023.244 13.264900954182696 13.854490155832694 31.74964052100247 32.24963347211302 -024.244 13.854490155832694 14.444079357482696 31.74964052100247 32.24963347211302 -025.244 14.444079357482696 15.033668559182697 31.74964052100247 32.24963347211302 -026.244 15.033668559182697 15.623257760882694 31.74964052100247 32.24963347211302 -027.244 15.623257760882694 16.212846962582695 31.74964052100247 32.24963347211302 -028.244 16.212846962582695 16.802436164282696 31.74964052100247 32.24963347211302 -029.244 16.802436164282696 17.392025365932696 31.74964052100247 32.24963347211302 -030.244 17.392025365932696 17.981614567582696 31.74964052100247 32.24963347211302 -031.244 17.981614567582696 18.571203769282693 31.74964052100247 32.24963347211302 -032.244 18.571203769282693 19.160792970982694 31.74964052100247 32.24963347211302 -033.244 19.160792970982694 19.7503821726827 31.74964052100247 32.24963347211302 -034.244 19.7503821726827 20.339971374332695 31.74964052100247 32.24963347211302 -035.244 20.339971374332695 20.9295605759827 31.74964052100247 32.24963347211302 -036.244 20.9295605759827 21.519149777682692 31.74964052100247 32.24963347211302 -037.244 21.519149777682692 22.108738979382696 31.74964052100247 32.24963347211302 -038.244 22.108738979382696 22.6983281810827 31.74964052100247 32.24963347211302 -039.244 22.6983281810827 23.287917382732694 31.74964052100247 32.24963347211302 -040.244 23.287917382732694 23.877506584382694 31.74964052100247 32.24963347211302 -041.244 23.877506584382694 24.467095786082687 31.74964052100247 32.24963347211302 -042.244 24.467095786082687 25.056684987782695 31.74964052100247 32.24963347211302 -043.244 25.056684987782695 25.646274189482696 31.74964052100247 32.24963347211302 -044.244 25.646274189482696 26.235863391132696 31.74964052100247 32.24963347211302 -045.244 26.235863391132696 26.825452592782696 31.74964052100247 32.24963347211302 -046.244 26.825452592782696 27.415041794482697 31.74964052100247 32.24963347211302 -047.244 27.415041794482697 28.00463099618269 31.74964052100247 32.24963347211302 -048.244 28.00463099618269 28.594220197882695 31.74964052100247 32.24963347211302 -049.244 28.594220197882695 29.183809399582692 31.74964052100247 32.24963347211302 -050.244 29.183809399582692 29.7733986012327 31.74964052100247 32.24963347211302 -051.244 29.7733986012327 30.3629878028827 31.74964052100247 32.24963347211302 -052.244 30.3629878028827 30.952577004582693 31.74964052100247 32.24963347211302 -053.244 30.952577004582693 31.542166206282687 31.74964052100247 32.24963347211302 -054.244 31.542166206282687 32.131755407982695 31.74964052100247 32.24963347211302 -055.244 32.131755407982695 32.721344609632695 31.74964052100247 32.24963347211302 -056.244 32.721344609632695 33.310933811282695 31.74964052100247 32.24963347211302 -057.244 33.310933811282695 33.9005230129827 31.74964052100247 32.24963347211302 -058.244 33.9005230129827 34.490112214682696 31.74964052100247 32.24963347211302 -059.244 34.490112214682696 35.0797014163827 31.74964052100247 32.24963347211302 -060.244 35.0797014163827 35.669290618032704 31.74964052100247 32.24963347211302 -061.244 35.669290618032704 36.2588798196827 31.74964052100247 32.24963347211302 -062.244 36.2588798196827 36.8484690213827 31.74964052100247 32.24963347211302 -063.244 36.8484690213827 37.4380582230827 31.74964052100247 32.24963347211302 -064.244 37.4380582230827 38.03709423612321 31.74964052100247 32.24963347211302 -195.244 114.6647968319422 115.2638328449827 31.74964052100247 32.24963347211302 -196.244 115.2638328449827 115.8534220466827 31.74964052100247 32.24963347211302 -197.244 115.8534220466827 116.44301124833271 31.74964052100247 32.24963347211302 -198.244 116.44301124833271 117.03260044998271 31.74964052100247 32.24963347211302 -199.244 117.03260044998271 117.6221896516827 31.74964052100247 32.24963347211302 -200.244 117.6221896516827 118.2117788533827 31.74964052100247 32.24963347211302 -201.244 118.2117788533827 118.80136805508272 31.74964052100247 32.24963347211302 -202.244 118.80136805508272 119.3909572567827 31.74964052100247 32.24963347211302 -203.244 119.3909572567827 119.9805464584327 31.74964052100247 32.24963347211302 -204.244 119.9805464584327 120.57013566008268 31.74964052100247 32.24963347211302 -205.244 120.57013566008268 121.15972486178268 31.74964052100247 32.24963347211302 -206.244 121.15972486178268 121.7493140634827 31.74964052100247 32.24963347211302 -207.244 121.7493140634827 122.3389032651827 31.74964052100247 32.24963347211302 -208.244 122.3389032651827 122.9284924668327 31.74964052100247 32.24963347211302 -209.244 122.9284924668327 123.5180816684827 31.74964052100247 32.24963347211302 -210.244 123.5180816684827 124.1076708701827 31.74964052100247 32.24963347211302 -211.244 124.1076708701827 124.6972600718827 31.74964052100247 32.24963347211302 -212.244 124.6972600718827 125.28684927358269 31.74964052100247 32.24963347211302 -213.244 125.28684927358269 125.8764384752327 31.74964052100247 32.24963347211302 -214.244 125.8764384752327 126.4660276768827 31.74964052100247 32.24963347211302 -215.244 126.4660276768827 127.0556168785827 31.74964052100247 32.24963347211302 -216.244 127.0556168785827 127.64520608028269 31.74964052100247 32.24963347211302 -217.244 127.64520608028269 128.2347952819827 31.74964052100247 32.24963347211302 -218.244 128.2347952819827 128.82438448363268 31.74964052100247 32.24963347211302 -219.244 128.82438448363268 129.4139736852827 31.74964052100247 32.24963347211302 -220.244 129.4139736852827 130.00356288698268 31.74964052100247 32.24963347211302 -221.244 130.00356288698268 130.5931520886827 31.74964052100247 32.24963347211302 -222.244 130.5931520886827 131.1827412903827 31.74964052100247 32.24963347211302 -223.244 131.1827412903827 131.7723304920827 31.74964052100247 32.24963347211302 -224.244 131.7723304920827 132.36191969373272 31.74964052100247 32.24963347211302 -225.244 132.36191969373272 132.9515088953827 31.74964052100247 32.24963347211302 -226.244 132.9515088953827 133.54109809708268 31.74964052100247 32.24963347211302 -227.244 133.54109809708268 134.13068729878268 31.74964052100247 32.24963347211302 -228.244 134.13068729878268 134.7202765004827 31.74964052100247 32.24963347211302 -229.244 134.7202765004827 135.3098657021327 31.74964052100247 32.24963347211302 -230.244 135.3098657021327 135.8994549037827 31.74964052100247 32.24963347211302 -231.244 135.8994549037827 136.48904410548272 31.74964052100247 32.24963347211302 -232.244 136.48904410548272 137.0786333071827 31.74964052100247 32.24963347211302 -233.244 137.0786333071827 137.6682225088827 31.74964052100247 32.24963347211302 -234.244 137.6682225088827 138.25781171053268 31.74964052100247 32.24963347211302 -235.244 138.25781171053268 138.8474009121827 31.74964052100247 32.24963347211302 -236.244 138.8474009121827 139.4369901138827 31.74964052100247 32.24963347211302 -237.244 139.4369901138827 140.0265793155827 31.74964052100247 32.24963347211302 -238.244 140.0265793155827 140.6161685172827 31.74964052100247 32.24963347211302 -239.244 140.6161685172827 141.20575771898268 31.74964052100247 32.24963347211302 -240.244 141.20575771898268 141.7953469206327 31.74964052100247 32.24963347211302 -241.244 141.7953469206327 142.38493612228268 31.74964052100247 32.24963347211302 -242.244 142.38493612228268 142.97452532398268 31.74964052100247 32.24963347211302 -243.244 142.97452532398268 143.5641145256827 31.74964052100247 32.24963347211302 -244.244 143.5641145256827 144.15370372738272 31.74964052100247 32.24963347211302 -245.244 144.15370372738272 144.74329292903272 31.74964052100247 32.24963347211302 -246.244 144.74329292903272 145.33288213068272 31.74964052100247 32.24963347211302 -247.244 145.33288213068272 145.9224713323827 31.74964052100247 32.24963347211302 -248.244 145.9224713323827 146.5120605340827 31.74964052100247 32.24963347211302 -249.244 146.5120605340827 147.1016497357827 31.74964052100247 32.24963347211302 -250.244 147.1016497357827 147.6912389374327 31.74964052100247 32.24963347211302 -251.244 147.6912389374327 148.2808281390827 31.74964052100247 32.24963347211302 -252.244 148.2808281390827 148.8704173407827 31.74964052100247 32.24963347211302 -253.244 148.8704173407827 149.4600065424827 31.74964052100247 32.24963347211302 -254.244 149.4600065424827 150.04959574418268 31.74964052100247 32.24963347211302 -255.244 150.04959574418268 150.63918494583265 31.74964052100247 32.24963347211302 -256.244 150.63918494583265 151.22877414748268 31.74964052100247 32.24963347211302 -257.244 151.22877414748268 151.81836334918268 31.74964052100247 32.24963347211302 -258.244 151.81836334918268 152.4079525508827 31.74964052100247 32.24963347211302 -259.244 152.4079525508827 152.99754175258272 31.74964052100247 32.24963347211302 -260.244 152.99754175258272 153.5871309542827 31.74964052100247 32.24963347211302 -261.244 153.5871309542827 154.1767201559327 31.74964052100247 32.24963347211302 -262.244 154.1767201559327 154.7663093575827 31.74964052100247 32.24963347211302 -263.244 154.7663093575827 155.3558985592827 31.74964052100247 32.24963347211302 -264.244 155.3558985592827 155.9454877609827 31.74964052100247 32.24963347211302 -265.244 155.9454877609827 156.5350769626827 31.74964052100247 32.24963347211302 -266.244 156.5350769626827 157.13411297572324 31.74964052100247 32.24963347211302 -270.244 158.8839869580422 159.48302297108268 31.74964052100247 32.24963347211302 -271.244 159.48302297108268 160.07261217273268 31.74964052100247 32.24963347211302 -272.244 160.07261217273268 160.66220137438268 31.74964052100247 32.24963347211302 -273.244 160.66220137438268 161.2517905760827 31.74964052100247 32.24963347211302 -274.244 161.2517905760827 161.84137977778272 31.74964052100247 32.24963347211302 -275.244 161.84137977778272 162.4309689794827 31.74964052100247 32.24963347211302 -276.244 162.4309689794827 163.0205581811827 31.74964052100247 32.24963347211302 -277.244 163.0205581811827 163.6101473828327 31.74964052100247 32.24963347211302 -278.244 163.6101473828327 164.1997365844827 31.74964052100247 32.24963347211302 -279.244 164.1997365844827 164.7893257861827 31.74964052100247 32.24963347211302 -280.244 164.7893257861827 165.37891498788272 31.74964052100247 32.24963347211302 -281.244 165.37891498788272 165.9685041895827 31.74964052100247 32.24963347211302 -282.244 165.9685041895827 166.55809339123272 31.74964052100247 32.24963347211302 -283.244 166.55809339123272 167.1476825928827 31.74964052100247 32.24963347211302 -284.244 167.1476825928827 167.73727179458268 31.74964052100247 32.24963347211302 -285.244 167.73727179458268 168.32686099628268 31.74964052100247 32.24963347211302 -286.244 168.32686099628268 168.9164501979827 31.74964052100247 32.24963347211302 -287.244 168.9164501979827 169.5060393996327 31.74964052100247 32.24963347211302 -288.244 169.5060393996327 170.0956286012827 31.74964052100247 32.24963347211302 -289.244 170.0956286012827 170.68521780298272 31.74964052100247 32.24963347211302 -290.244 170.68521780298272 171.2748070046827 31.74964052100247 32.24963347211302 -291.244 171.2748070046827 171.8643962063827 31.74964052100247 32.24963347211302 -292.244 171.8643962063827 172.45398540803268 31.74964052100247 32.24963347211302 -293.244 172.45398540803268 173.0435746096827 31.74964052100247 32.24963347211302 -294.244 173.0435746096827 173.6331638113827 31.74964052100247 32.24963347211302 -295.244 173.6331638113827 174.2227530130827 31.74964052100247 32.24963347211302 -296.244 174.2227530130827 174.81234221478272 31.74964052100247 32.24963347211302 -297.244 174.81234221478272 175.40193141648268 31.74964052100247 32.24963347211302 -298.244 175.40193141648268 175.9915206181327 31.74964052100247 32.24963347211302 -299.244 175.9915206181327 176.58110981978268 31.74964052100247 32.24963347211302 -300.244 176.58110981978268 177.17069902148268 31.74964052100247 32.24963347211302 -301.244 177.17069902148268 177.7602882231827 31.74964052100247 32.24963347211302 -302.244 177.7602882231827 178.3498774248827 31.74964052100247 32.24963347211302 -303.244 178.3498774248827 178.9394666265327 31.74964052100247 32.24963347211302 -304.244 178.9394666265327 179.52905582818272 31.74964052100247 32.24963347211302 -305.244 179.52905582818272 180.11864502988269 31.74964052100247 32.24963347211302 -306.244 180.11864502988269 180.70823423158268 31.74964052100247 32.24963347211302 -307.244 180.70823423158268 181.2978234332827 31.74964052100247 32.24963347211302 -308.244 181.2978234332827 181.88741263493267 31.74964052100247 32.24963347211302 -309.244 181.88741263493267 182.4770018365827 31.74964052100247 32.24963347211302 -310.244 182.4770018365827 183.0665910382827 31.74964052100247 32.24963347211302 -311.244 183.0665910382827 183.6561802399827 31.74964052100247 32.24963347211302 -312.244 183.6561802399827 184.24576944168268 31.74964052100247 32.24963347211302 -313.244 184.24576944168268 184.8353586433327 31.74964052100247 32.24963347211302 -314.244 184.8353586433327 185.42494784498268 31.74964052100247 32.24963347211302 -315.244 185.42494784498268 186.01453704668268 31.74964052100247 32.24963347211302 -316.244 186.01453704668268 186.60412624838267 31.74964052100247 32.24963347211302 -317.244 186.60412624838267 187.1937154500827 31.74964052100247 32.24963347211302 -318.244 187.1937154500827 187.7833046517827 31.74964052100247 32.24963347211302 -319.244 187.7833046517827 188.37289385343269 31.74964052100247 32.24963347211302 -320.244 188.37289385343269 188.96248305508269 31.74964052100247 32.24963347211302 -321.244 188.96248305508269 189.5520722567827 31.74964052100247 32.24963347211302 -322.244 189.5520722567827 190.1416614584827 31.74964052100247 32.24963347211302 -323.244 190.1416614584827 190.7312506601827 31.74964052100247 32.24963347211302 -324.244 190.7312506601827 191.3208398618327 31.74964052100247 32.24963347211302 -325.244 191.3208398618327 191.9104290634827 31.74964052100247 32.24963347211302 -326.244 191.9104290634827 192.5000182651827 31.74964052100247 32.24963347211302 -327.244 192.5000182651827 193.08960746688268 31.74964052100247 32.24963347211302 -328.244 193.08960746688268 193.67919666858268 31.74964052100247 32.24963347211302 -329.244 193.67919666858268 194.2687858702327 31.74964052100247 32.24963347211302 -330.244 194.2687858702327 194.85837507188268 31.74964052100247 32.24963347211302 -331.244 194.85837507188268 195.44796427358267 31.74964052100247 32.24963347211302 -332.244 195.44796427358267 196.03755347528266 31.74964052100247 32.24963347211302 -333.244 196.03755347528266 196.6271426769827 31.74964052100247 32.24963347211302 -334.244 196.6271426769827 197.21673187868265 31.74964052100247 32.24963347211302 -335.244 197.21673187868265 197.80632108033268 31.74964052100247 32.24963347211302 -336.244 197.80632108033268 198.39591028198268 31.74964052100247 32.24963347211302 -337.244 198.39591028198268 198.9854994836827 31.74964052100247 32.24963347211302 -338.244 198.9854994836827 199.5750886853827 31.74964052100247 32.24963347211302 -339.244 199.5750886853827 200.1646778870827 31.74964052100247 32.24963347211302 -340.244 200.1646778870827 200.7542670887327 31.74964052100247 32.24963347211302 -341.244 200.7542670887327 201.3438562903827 31.74964052100247 32.24963347211302 -342.244 201.3438562903827 201.93344549208268 31.74964052100247 32.24963347211302 -343.244 201.93344549208268 202.52303469378268 31.74964052100247 32.24963347211302 -344.244 202.52303469378268 203.11262389548267 31.74964052100247 32.24963347211302 -345.244 203.11262389548267 203.70221309713267 31.74964052100247 32.24963347211302 -346.244 203.70221309713267 204.29180229878267 31.74964052100247 32.24963347211302 -347.244 204.29180229878267 204.8813915004827 31.74964052100247 32.24963347211302 -348.244 204.8813915004827 205.4709807021827 31.74964052100247 32.24963347211302 -349.244 205.4709807021827 206.06056990388268 31.74964052100247 32.24963347211302 -350.244 206.06056990388268 206.65015910553268 31.74964052100247 32.24963347211302 -351.244 206.65015910553268 207.23974830718268 31.74964052100247 32.24963347211302 -352.244 207.23974830718268 207.82933750888267 31.74964052100247 32.24963347211302 -353.244 207.82933750888267 208.4189267105827 31.74964052100247 32.24963347211302 -354.244 208.4189267105827 209.01796272362319 31.74964052100247 32.24963347211302 -392.244 230.81386956314216 231.4129055761827 31.74964052100247 32.24963347211302 -393.244 231.4129055761827 232.0024947778327 31.74964052100247 32.24963347211302 -394.244 232.0024947778327 232.59208397948268 31.74964052100247 32.24963347211302 -395.244 232.59208397948268 233.18167318118265 31.74964052100247 32.24963347211302 -396.244 233.18167318118265 233.77126238288267 31.74964052100247 32.24963347211302 -397.244 233.77126238288267 234.36085158458266 31.74964052100247 32.24963347211302 -398.244 234.36085158458266 234.9504407862327 31.74964052100247 32.24963347211302 -399.244 234.9504407862327 235.5400299878827 31.74964052100247 32.24963347211302 -400.244 235.5400299878827 236.12961918958268 31.74964052100247 32.24963347211302 -401.244 236.12961918958268 236.71920839128268 31.74964052100247 32.24963347211302 -402.244 236.71920839128268 237.30879759298267 31.74964052100247 32.24963347211302 -403.244 237.30879759298267 237.89838679463267 31.74964052100247 32.24963347211302 -404.244 237.89838679463267 238.48797599628267 31.74964052100247 32.24963347211302 -405.244 238.48797599628267 239.07756519798266 31.74964052100247 32.24963347211302 -406.244 239.07756519798266 239.6671543996827 31.74964052100247 32.24963347211302 -407.244 239.6671543996827 240.2567436013827 31.74964052100247 32.24963347211302 -408.244 240.2567436013827 240.84633280303268 31.74964052100247 32.24963347211302 -409.244 240.84633280303268 241.43592200468265 31.74964052100247 32.24963347211302 -410.244 241.43592200468265 242.02551120638267 31.74964052100247 32.24963347211302 -411.244 242.02551120638267 242.61510040808267 31.74964052100247 32.24963347211302 -412.244 242.61510040808267 243.2046896097827 31.74964052100247 32.24963347211302 -413.244 243.2046896097827 243.79427881148268 31.74964052100247 32.24963347211302 -414.244 243.79427881148268 244.38386801313268 31.74964052100247 32.24963347211302 -415.244 244.38386801313268 244.97345721478268 31.74964052100247 32.24963347211302 -416.244 244.97345721478268 245.56304641648268 31.74964052100247 32.24963347211302 -417.244 245.56304641648268 246.1526356181827 31.74964052100247 32.24963347211302 -418.244 246.1526356181827 246.74222481988272 31.74964052100247 32.24963347211302 -419.244 246.74222481988272 247.3318140215327 31.74964052100247 32.24963347211302 -420.244 247.3318140215327 247.9214032231827 31.74964052100247 32.24963347211302 -421.244 247.9214032231827 248.51099242488272 31.74964052100247 32.24963347211302 -422.244 248.51099242488272 249.1005816265827 31.74964052100247 32.24963347211302 -423.244 249.1005816265827 249.69017082828265 31.74964052100247 32.24963347211302 -424.244 249.69017082828265 250.27976002993267 31.74964052100247 32.24963347211302 -425.244 250.27976002993267 250.8693492315827 31.74964052100247 32.24963347211302 -426.244 250.8693492315827 251.4589384332827 31.74964052100247 32.24963347211302 -427.244 251.4589384332827 252.0485276349827 31.74964052100247 32.24963347211302 -428.244 252.0485276349827 252.63811683668268 31.74964052100247 32.24963347211302 -429.244 252.63811683668268 253.2277060383327 31.74964052100247 32.24963347211302 -430.244 253.2277060383327 253.81729523998268 31.74964052100247 32.24963347211302 -431.244 253.81729523998268 254.40688444168268 31.74964052100247 32.24963347211302 -432.244 254.40688444168268 254.9964736433827 31.74964052100247 32.24963347211302 -433.244 254.9964736433827 255.5860628450827 31.74964052100247 32.24963347211302 -434.244 255.5860628450827 256.17565204678266 31.74964052100247 32.24963347211302 -435.244 256.17565204678266 256.7652412484327 31.74964052100247 32.24963347211302 -436.244 256.7652412484327 257.3548304500827 31.74964052100247 32.24963347211302 -437.244 257.3548304500827 257.94441965178265 31.74964052100247 32.24963347211302 -438.244 257.94441965178265 258.53400885348265 31.74964052100247 32.24963347211302 -439.244 258.53400885348265 259.1235980551827 31.74964052100247 32.24963347211302 -440.244 259.1235980551827 259.71318725683267 31.74964052100247 32.24963347211302 -441.244 259.71318725683267 260.30277645848264 31.74964052100247 32.24963347211302 -442.244 260.30277645848264 260.8923656601827 31.74964052100247 32.24963347211302 -443.244 260.8923656601827 261.48195486188274 31.74964052100247 32.24963347211302 -444.244 261.48195486188274 262.0715440635827 31.74964052100247 32.24963347211302 -445.244 262.0715440635827 262.6611332652327 31.74964052100247 32.24963347211302 -446.244 262.6611332652327 263.25072246688273 31.74964052100247 32.24963347211302 -447.244 263.25072246688273 263.84031166858273 31.74964052100247 32.24963347211302 -448.244 263.84031166858273 264.42990087028267 31.74964052100247 32.24963347211302 -449.244 264.42990087028267 265.01949007198266 31.74964052100247 32.24963347211302 -450.244 265.01949007198266 265.6090792736827 31.74964052100247 32.24963347211302 -451.244 265.6090792736827 266.1986684753327 31.74964052100247 32.24963347211302 -452.244 266.1986684753327 266.78825767698265 31.74964052100247 32.24963347211302 -453.244 266.78825767698265 267.3778468786827 31.74964052100247 32.24963347211302 -454.244 267.3778468786827 267.9674360803827 31.74964052100247 32.24963347211302 -455.244 267.9674360803827 268.55702528208263 31.74964052100247 32.24963347211302 -456.244 268.55702528208263 269.14661448373266 31.74964052100247 32.24963347211302 -457.244 269.14661448373266 269.7362036853827 31.74964052100247 32.24963347211302 -458.244 269.7362036853827 270.33523969842315 31.74964052100247 32.24963347211302 -579.244 341.0670502774422 341.66608629048267 31.74964052100247 32.24963347211302 -580.244 341.66608629048267 342.2556754921827 31.74964052100247 32.24963347211302 -581.244 342.2556754921827 342.8452646938827 31.74964052100247 32.24963347211302 -582.244 342.8452646938827 343.4348538955827 31.74964052100247 32.24963347211302 -583.244 343.4348538955827 344.0244430972326 31.74964052100247 32.24963347211302 -584.244 344.0244430972326 344.61403229888265 31.74964052100247 32.24963347211302 -585.244 344.61403229888265 345.2036215005827 31.74964052100247 32.24963347211302 -586.244 345.2036215005827 345.7932107022827 31.74964052100247 32.24963347211302 -587.244 345.7932107022827 346.3827999039827 31.74964052100247 32.24963347211302 -588.244 346.3827999039827 346.9723891056327 31.74964052100247 32.24963347211302 -589.244 346.9723891056327 347.56197830728274 31.74964052100247 32.24963347211302 -590.244 347.56197830728274 348.1515675089827 31.74964052100247 32.24963347211302 -591.244 348.1515675089827 348.74115671068273 31.74964052100247 32.24963347211302 -592.244 348.74115671068273 349.3307459123827 31.74964052100247 32.24963347211302 -593.244 349.3307459123827 349.9203351140327 31.74964052100247 32.24963347211302 -594.244 349.9203351140327 350.5099243156827 31.74964052100247 32.24963347211302 -595.244 350.5099243156827 351.0995135173827 31.74964052100247 32.24963347211302 -596.244 351.0995135173827 351.6891027190827 31.74964052100247 32.24963347211302 -597.244 351.6891027190827 352.27869192078265 31.74964052100247 32.24963347211302 -598.244 352.27869192078265 352.8682811224327 31.74964052100247 32.24963347211302 -599.244 352.8682811224327 353.4578703240827 31.74964052100247 32.24963347211302 -600.244 353.4578703240827 354.0474595257827 31.74964052100247 32.24963347211302 -601.244 354.0474595257827 354.63704872748264 31.74964052100247 32.24963347211302 -602.244 354.63704872748264 355.2266379291827 31.74964052100247 32.24963347211302 -603.244 355.2266379291827 355.81622713088274 31.74964052100247 32.24963347211302 -604.244 355.81622713088274 356.4058163325327 31.74964052100247 32.24963347211302 -605.244 356.4058163325327 356.99540553418274 31.74964052100247 32.24963347211302 -606.244 356.99540553418274 357.58499473588273 31.74964052100247 32.24963347211302 -607.244 357.58499473588273 358.1745839375827 31.74964052100247 32.24963347211302 -608.244 358.1745839375827 358.76417313928266 31.74964052100247 32.24963347211302 -609.244 358.76417313928266 359.3537623409327 31.74964052100247 32.24963347211302 -610.244 359.3537623409327 359.82385042903275 31.74964052100247 32.24963347211302 -000.244 359.82385042903275 0.29393851718269515 31.74964052100247 32.24963347211302 -001.245 0.295544643670109 0.8883891673701088 32.24963347211302 32.749626345169645 -002.245 0.8883891673701088 1.4812336911201092 32.24963347211302 32.749626345169645 -003.245 1.4812336911201092 2.074078214870109 32.24963347211302 32.749626345169645 -004.245 2.074078214870109 2.6669227385701086 32.24963347211302 32.749626345169645 -005.245 2.6669227385701086 3.259767262270109 32.24963347211302 32.749626345169645 -006.245 3.259767262270109 3.852611785970109 32.24963347211302 32.749626345169645 -007.245 3.852611785970109 4.445456309670109 32.24963347211302 32.749626345169645 -008.245 4.445456309670109 5.0383008334201085 32.24963347211302 32.749626345169645 -009.245 5.0383008334201085 5.631145357170109 32.24963347211302 32.749626345169645 -010.245 5.631145357170109 6.223989880870109 32.24963347211302 32.749626345169645 -011.245 6.223989880870109 6.81683440457011 32.24963347211302 32.749626345169645 -012.245 6.81683440457011 7.409678928270107 32.24963347211302 32.749626345169645 -013.245 7.409678928270107 8.00252345197011 32.24963347211302 32.749626345169645 -014.245 8.00252345197011 8.595367975720109 32.24963347211302 32.749626345169645 -015.245 8.595367975720109 9.188212499470108 32.24963347211302 32.749626345169645 -016.245 9.188212499470108 9.781057023170108 32.24963347211302 32.749626345169645 -017.245 9.781057023170108 10.373901546870108 32.24963347211302 32.749626345169645 -018.245 10.373901546870108 10.966746070570109 32.24963347211302 32.749626345169645 -019.245 10.966746070570109 11.559590594270109 32.24963347211302 32.749626345169645 -020.245 11.559590594270109 12.152435118020108 32.24963347211302 32.749626345169645 -021.245 12.152435118020108 12.74527964177011 32.24963347211302 32.749626345169645 -022.245 12.74527964177011 13.33812416547011 32.24963347211302 32.749626345169645 -023.245 13.33812416547011 13.930968689170111 32.24963347211302 32.749626345169645 -024.245 13.930968689170111 14.523813212870108 32.24963347211302 32.749626345169645 -025.245 14.523813212870108 15.116657736570108 32.24963347211302 32.749626345169645 -026.245 15.116657736570108 15.709502260320107 32.24963347211302 32.749626345169645 -027.245 15.709502260320107 16.30234678407011 32.24963347211302 32.749626345169645 -028.245 16.30234678407011 16.895191307770112 32.24963347211302 32.749626345169645 -029.245 16.895191307770112 17.488035831470114 32.24963347211302 32.749626345169645 -030.245 17.488035831470114 18.08088035517011 32.24963347211302 32.749626345169645 -031.245 18.08088035517011 18.67372487887011 32.24963347211302 32.749626345169645 -032.245 18.67372487887011 19.266569402620107 32.24963347211302 32.749626345169645 -033.245 19.266569402620107 19.85941392637011 32.24963347211302 32.749626345169645 -034.245 19.85941392637011 20.452258450070108 32.24963347211302 32.749626345169645 -035.245 20.452258450070108 21.045102973770106 32.24963347211302 32.749626345169645 -036.245 21.045102973770106 21.63794749747011 32.24963347211302 32.749626345169645 -037.245 21.63794749747011 22.230792021170107 32.24963347211302 32.749626345169645 -038.245 22.230792021170107 22.823636544920113 32.24963347211302 32.749626345169645 -039.245 22.823636544920113 23.41648106867011 32.24963347211302 32.749626345169645 -040.245 23.41648106867011 24.00932559237011 32.24963347211302 32.749626345169645 -041.245 24.00932559237011 24.60217011607011 32.24963347211302 32.749626345169645 -042.245 24.60217011607011 25.195014639770108 32.24963347211302 32.749626345169645 -043.245 25.195014639770108 25.78785916352011 32.24963347211302 32.749626345169645 -044.245 25.78785916352011 26.380703687270113 32.24963347211302 32.749626345169645 -045.245 26.380703687270113 26.973548210970108 32.24963347211302 32.749626345169645 -046.245 26.973548210970108 27.566392734670107 32.24963347211302 32.749626345169645 -047.245 27.566392734670107 28.15923725837011 32.24963347211302 32.749626345169645 -048.245 28.15923725837011 28.75208178207011 32.24963347211302 32.749626345169645 -049.245 28.75208178207011 29.34492630582011 32.24963347211302 32.749626345169645 -050.245 29.34492630582011 29.937770829570105 32.24963347211302 32.749626345169645 -051.245 29.937770829570105 30.530615353270115 32.24963347211302 32.749626345169645 -052.245 30.530615353270115 31.12345987697011 32.24963347211302 32.749626345169645 -053.245 31.12345987697011 31.716304400670108 32.24963347211302 32.749626345169645 -054.245 31.716304400670108 32.309148924370106 32.24963347211302 32.749626345169645 -055.245 32.309148924370106 32.90199344812011 32.24963347211302 32.749626345169645 -056.245 32.90199344812011 33.49483797187011 32.24963347211302 32.749626345169645 -057.245 33.49483797187011 34.087682495570114 32.24963347211302 32.749626345169645 -058.245 34.087682495570114 34.680527019270116 32.24963347211302 32.749626345169645 -059.245 34.680527019270116 35.27337154297011 32.24963347211302 32.749626345169645 -060.245 35.27337154297011 35.86621606667012 32.24963347211302 32.749626345169645 -061.245 35.86621606667012 36.45906059042011 32.24963347211302 32.749626345169645 -062.245 36.45906059042011 37.05190511417011 32.24963347211302 32.749626345169645 -063.245 37.05190511417011 37.65424867195229 32.24963347211302 32.749626345169645 -194.245 114.70503868698795 115.30738224477011 32.24963347211302 32.749626345169645 -195.245 115.30738224477011 115.9002267684701 32.24963347211302 32.749626345169645 -196.245 115.9002267684701 116.4930712922201 32.24963347211302 32.749626345169645 -197.245 116.4930712922201 117.0859158159701 32.24963347211302 32.749626345169645 -198.245 117.0859158159701 117.6787603396701 32.24963347211302 32.749626345169645 -199.245 117.6787603396701 118.2716048633701 32.24963347211302 32.749626345169645 -200.245 118.2716048633701 118.86444938707012 32.24963347211302 32.749626345169645 -201.245 118.86444938707012 119.45729391077012 32.24963347211302 32.749626345169645 -202.245 119.45729391077012 120.05013843452011 32.24963347211302 32.749626345169645 -203.245 120.05013843452011 120.64298295827011 32.24963347211302 32.749626345169645 -204.245 120.64298295827011 121.2358274819701 32.24963347211302 32.749626345169645 -205.245 121.2358274819701 121.8286720056701 32.24963347211302 32.749626345169645 -206.245 121.8286720056701 122.42151652937011 32.24963347211302 32.749626345169645 -207.245 122.42151652937011 123.0143610531201 32.24963347211302 32.749626345169645 -208.245 123.0143610531201 123.6072055768701 32.24963347211302 32.749626345169645 -209.245 123.6072055768701 124.20005010057011 32.24963347211302 32.749626345169645 -210.245 124.20005010057011 124.79289462427012 32.24963347211302 32.749626345169645 -211.245 124.79289462427012 125.38573914797013 32.24963347211302 32.749626345169645 -212.245 125.38573914797013 125.97858367167011 32.24963347211302 32.749626345169645 -213.245 125.97858367167011 126.57142819542011 32.24963347211302 32.749626345169645 -214.245 126.57142819542011 127.16427271917011 32.24963347211302 32.749626345169645 -215.245 127.16427271917011 127.75711724287011 32.24963347211302 32.749626345169645 -216.245 127.75711724287011 128.34996176657012 32.24963347211302 32.749626345169645 -217.245 128.34996176657012 128.9428062902701 32.24963347211302 32.749626345169645 -218.245 128.9428062902701 129.5356508139701 32.24963347211302 32.749626345169645 -219.245 129.5356508139701 130.1284953377201 32.24963347211302 32.749626345169645 -220.245 130.1284953377201 130.72133986147014 32.24963347211302 32.749626345169645 -221.245 130.72133986147014 131.3141843851701 32.24963347211302 32.749626345169645 -222.245 131.3141843851701 131.90702890887013 32.24963347211302 32.749626345169645 -223.245 131.90702890887013 132.4998734325701 32.24963347211302 32.749626345169645 -224.245 132.4998734325701 133.09271795627012 32.24963347211302 32.749626345169645 -225.245 133.09271795627012 133.6855624800201 32.24963347211302 32.749626345169645 -226.245 133.6855624800201 134.27840700377013 32.24963347211302 32.749626345169645 -227.245 134.27840700377013 134.87125152747012 32.24963347211302 32.749626345169645 -228.245 134.87125152747012 135.46409605117015 32.24963347211302 32.749626345169645 -229.245 135.46409605117015 136.0569405748701 32.24963347211302 32.749626345169645 -230.245 136.0569405748701 136.64978509857013 32.24963347211302 32.749626345169645 -231.245 136.64978509857013 137.24262962232012 32.24963347211302 32.749626345169645 -232.245 137.24262962232012 137.83547414607014 32.24963347211302 32.749626345169645 -233.245 137.83547414607014 138.42831866977014 32.24963347211302 32.749626345169645 -234.245 138.42831866977014 139.02116319347013 32.24963347211302 32.749626345169645 -235.245 139.02116319347013 139.61400771717013 32.24963347211302 32.749626345169645 -236.245 139.61400771717013 140.20685224087012 32.24963347211302 32.749626345169645 -237.245 140.20685224087012 140.7996967646201 32.24963347211302 32.749626345169645 -238.245 140.7996967646201 141.3925412883701 32.24963347211302 32.749626345169645 -239.245 141.3925412883701 141.9853858120701 32.24963347211302 32.749626345169645 -240.245 141.9853858120701 142.57823033577012 32.24963347211302 32.749626345169645 -241.245 142.57823033577012 143.17107485947014 32.24963347211302 32.749626345169645 -242.245 143.17107485947014 143.76391938322013 32.24963347211302 32.749626345169645 -243.245 143.76391938322013 144.35676390697012 32.24963347211302 32.749626345169645 -244.245 144.35676390697012 144.9496084306701 32.24963347211302 32.749626345169645 -245.245 144.9496084306701 145.5424529543701 32.24963347211302 32.749626345169645 -246.245 145.5424529543701 146.1352974780701 32.24963347211302 32.749626345169645 -247.245 146.1352974780701 146.7281420017701 32.24963347211302 32.749626345169645 -248.245 146.7281420017701 147.32098652552008 32.24963347211302 32.749626345169645 -249.245 147.32098652552008 147.9138310492701 32.24963347211302 32.749626345169645 -250.245 147.9138310492701 148.5066755729701 32.24963347211302 32.749626345169645 -251.245 148.5066755729701 149.0995200966701 32.24963347211302 32.749626345169645 -252.245 149.0995200966701 149.69236462037009 32.24963347211302 32.749626345169645 -253.245 149.69236462037009 150.2852091440701 32.24963347211302 32.749626345169645 -254.245 150.2852091440701 150.8780536678201 32.24963347211302 32.749626345169645 -255.245 150.8780536678201 151.4708981915701 32.24963347211302 32.749626345169645 -256.245 151.4708981915701 152.0637427152701 32.24963347211302 32.749626345169645 -257.245 152.0637427152701 152.6565872389701 32.24963347211302 32.749626345169645 -258.245 152.6565872389701 153.2494317626701 32.24963347211302 32.749626345169645 -259.245 153.2494317626701 153.8422762863701 32.24963347211302 32.749626345169645 -260.245 153.8422762863701 154.4351208101201 32.24963347211302 32.749626345169645 -261.245 154.4351208101201 155.0279653338701 32.24963347211302 32.749626345169645 -262.245 155.0279653338701 155.6208098575701 32.24963347211302 32.749626345169645 -263.245 155.6208098575701 156.2136543812701 32.24963347211302 32.749626345169645 -264.245 156.2136543812701 156.81599793905227 32.24963347211302 32.749626345169645 -268.245 158.57553344208796 159.1778769998701 32.24963347211302 32.749626345169645 -269.245 159.1778769998701 159.7707215235701 32.24963347211302 32.749626345169645 -270.245 159.7707215235701 160.3635660472701 32.24963347211302 32.749626345169645 -271.245 160.3635660472701 160.9564105709701 32.24963347211302 32.749626345169645 -272.245 160.9564105709701 161.5492550947201 32.24963347211302 32.749626345169645 -273.245 161.5492550947201 162.14209961847013 32.24963347211302 32.749626345169645 -274.245 162.14209961847013 162.7349441421701 32.24963347211302 32.749626345169645 -275.245 162.7349441421701 163.32778866587012 32.24963347211302 32.749626345169645 -276.245 163.32778866587012 163.9206331895701 32.24963347211302 32.749626345169645 -277.245 163.9206331895701 164.5134777132701 32.24963347211302 32.749626345169645 -278.245 164.5134777132701 165.10632223702012 32.24963347211302 32.749626345169645 -279.245 165.10632223702012 165.69916676077014 32.24963347211302 32.749626345169645 -280.245 165.69916676077014 166.2920112844701 32.24963347211302 32.749626345169645 -281.245 166.2920112844701 166.88485580817013 32.24963347211302 32.749626345169645 -282.245 166.88485580817013 167.4777003318701 32.24963347211302 32.749626345169645 -283.245 167.4777003318701 168.0705448556201 32.24963347211302 32.749626345169645 -284.245 168.0705448556201 168.66338937937013 32.24963347211302 32.749626345169645 -285.245 168.66338937937013 169.25623390307013 32.24963347211302 32.749626345169645 -286.245 169.25623390307013 169.84907842677012 32.24963347211302 32.749626345169645 -287.245 169.84907842677012 170.44192295047011 32.24963347211302 32.749626345169645 -288.245 170.44192295047011 171.0347674741701 32.24963347211302 32.749626345169645 -289.245 171.0347674741701 171.6276119979201 32.24963347211302 32.749626345169645 -290.245 171.6276119979201 172.22045652167014 32.24963347211302 32.749626345169645 -291.245 172.22045652167014 172.81330104537014 32.24963347211302 32.749626345169645 -292.245 172.81330104537014 173.40614556907013 32.24963347211302 32.749626345169645 -293.245 173.40614556907013 173.9989900927701 32.24963347211302 32.749626345169645 -294.245 173.9989900927701 174.59183461647012 32.24963347211302 32.749626345169645 -295.245 174.59183461647012 175.1846791402201 32.24963347211302 32.749626345169645 -296.245 175.1846791402201 175.7775236639701 32.24963347211302 32.749626345169645 -297.245 175.7775236639701 176.37036818767012 32.24963347211302 32.749626345169645 -298.245 176.37036818767012 176.96321271137012 32.24963347211302 32.749626345169645 -299.245 176.96321271137012 177.5560572350701 32.24963347211302 32.749626345169645 -300.245 177.5560572350701 178.14890175877014 32.24963347211302 32.749626345169645 -301.245 178.14890175877014 178.7417462825201 32.24963347211302 32.749626345169645 -302.245 178.7417462825201 179.3345908062701 32.24963347211302 32.749626345169645 -303.245 179.3345908062701 179.9274353299701 32.24963347211302 32.749626345169645 -304.245 179.9274353299701 180.5202798536701 32.24963347211302 32.749626345169645 -305.245 180.5202798536701 181.11312437737013 32.24963347211302 32.749626345169645 -306.245 181.11312437737013 181.7059689010701 32.24963347211302 32.749626345169645 -307.245 181.7059689010701 182.29881342482008 32.24963347211302 32.749626345169645 -308.245 182.29881342482008 182.89165794857007 32.24963347211302 32.749626345169645 -309.245 182.89165794857007 183.4845024722701 32.24963347211302 32.749626345169645 -310.245 183.4845024722701 184.0773469959701 32.24963347211302 32.749626345169645 -311.245 184.0773469959701 184.67019151967008 32.24963347211302 32.749626345169645 -312.245 184.67019151967008 185.2630360433701 32.24963347211302 32.749626345169645 -313.245 185.2630360433701 185.8558805671201 32.24963347211302 32.749626345169645 -314.245 185.8558805671201 186.44872509087008 32.24963347211302 32.749626345169645 -315.245 186.44872509087008 187.0415696145701 32.24963347211302 32.749626345169645 -316.245 187.0415696145701 187.63441413827007 32.24963347211302 32.749626345169645 -317.245 187.63441413827007 188.2272586619701 32.24963347211302 32.749626345169645 -318.245 188.2272586619701 188.82010318567006 32.24963347211302 32.749626345169645 -319.245 188.82010318567006 189.4129477094201 32.24963347211302 32.749626345169645 -320.245 189.4129477094201 190.0057922331701 32.24963347211302 32.749626345169645 -321.245 190.0057922331701 190.5986367568701 32.24963347211302 32.749626345169645 -322.245 190.5986367568701 191.1914812805701 32.24963347211302 32.749626345169645 -323.245 191.1914812805701 191.7843258042701 32.24963347211302 32.749626345169645 -324.245 191.7843258042701 192.3771703280201 32.24963347211302 32.749626345169645 -325.245 192.3771703280201 192.9700148517701 32.24963347211302 32.749626345169645 -326.245 192.9700148517701 193.5628593754701 32.24963347211302 32.749626345169645 -327.245 193.5628593754701 194.15570389917008 32.24963347211302 32.749626345169645 -328.245 194.15570389917008 194.7485484228701 32.24963347211302 32.749626345169645 -329.245 194.7485484228701 195.3413929465701 32.24963347211302 32.749626345169645 -330.245 195.3413929465701 195.93423747032008 32.24963347211302 32.749626345169645 -331.245 195.93423747032008 196.5270819940701 32.24963347211302 32.749626345169645 -332.245 196.5270819940701 197.11992651777012 32.24963347211302 32.749626345169645 -333.245 197.11992651777012 197.7127710414701 32.24963347211302 32.749626345169645 -334.245 197.7127710414701 198.30561556517011 32.24963347211302 32.749626345169645 -335.245 198.30561556517011 198.8984600888701 32.24963347211302 32.749626345169645 -336.245 198.8984600888701 199.4913046126201 32.24963347211302 32.749626345169645 -337.245 199.4913046126201 200.08414913637012 32.24963347211302 32.749626345169645 -338.245 200.08414913637012 200.6769936600701 32.24963347211302 32.749626345169645 -339.245 200.6769936600701 201.2698381837701 32.24963347211302 32.749626345169645 -340.245 201.2698381837701 201.8626827074701 32.24963347211302 32.749626345169645 -341.245 201.8626827074701 202.4555272311701 32.24963347211302 32.749626345169645 -342.245 202.4555272311701 203.04837175492008 32.24963347211302 32.749626345169645 -343.245 203.04837175492008 203.6412162786701 32.24963347211302 32.749626345169645 -344.245 203.6412162786701 204.2340608023701 32.24963347211302 32.749626345169645 -345.245 204.2340608023701 204.8269053260701 32.24963347211302 32.749626345169645 -346.245 204.8269053260701 205.4197498497701 32.24963347211302 32.749626345169645 -347.245 205.4197498497701 206.0125943734701 32.24963347211302 32.749626345169645 -348.245 206.0125943734701 206.6054388972201 32.24963347211302 32.749626345169645 -349.245 206.6054388972201 207.19828342097014 32.24963347211302 32.749626345169645 -350.245 207.19828342097014 207.7911279446701 32.24963347211302 32.749626345169645 -351.245 207.7911279446701 208.3934715024523 32.24963347211302 32.749626345169645 -390.245 230.90256533558795 231.5049088933701 32.24963347211302 32.749626345169645 -391.245 231.5049088933701 232.09775341707007 32.24963347211302 32.749626345169645 -392.245 232.09775341707007 232.69059794077012 32.24963347211302 32.749626345169645 -393.245 232.69059794077012 233.2834424644701 32.24963347211302 32.749626345169645 -394.245 233.2834424644701 233.87628698817014 32.24963347211302 32.749626345169645 -395.245 233.87628698817014 234.46913151192007 32.24963347211302 32.749626345169645 -396.245 234.46913151192007 235.06197603567009 32.24963347211302 32.749626345169645 -397.245 235.06197603567009 235.65482055937014 32.24963347211302 32.749626345169645 -398.245 235.65482055937014 236.2476650830701 32.24963347211302 32.749626345169645 -399.245 236.2476650830701 236.84050960677013 32.24963347211302 32.749626345169645 -400.245 236.84050960677013 237.4333541304701 32.24963347211302 32.749626345169645 -401.245 237.4333541304701 238.02619865422008 32.24963347211302 32.749626345169645 -402.245 238.02619865422008 238.6190431779701 32.24963347211302 32.749626345169645 -403.245 238.6190431779701 239.2118877016701 32.24963347211302 32.749626345169645 -404.245 239.2118877016701 239.8047322253701 32.24963347211302 32.749626345169645 -405.245 239.8047322253701 240.3975767490701 32.24963347211302 32.749626345169645 -406.245 240.3975767490701 240.9904212728201 32.24963347211302 32.749626345169645 -407.245 240.9904212728201 241.5832657965701 32.24963347211302 32.749626345169645 -408.245 241.5832657965701 242.17611032027008 32.24963347211302 32.749626345169645 -409.245 242.17611032027008 242.7689548439701 32.24963347211302 32.749626345169645 -410.245 242.7689548439701 243.36179936767007 32.24963347211302 32.749626345169645 -411.245 243.36179936767007 243.9546438913701 32.24963347211302 32.749626345169645 -412.245 243.9546438913701 244.54748841512009 32.24963347211302 32.749626345169645 -413.245 244.54748841512009 245.1403329388701 32.24963347211302 32.749626345169645 -414.245 245.1403329388701 245.7331774625701 32.24963347211302 32.749626345169645 -415.245 245.7331774625701 246.3260219862701 32.24963347211302 32.749626345169645 -416.245 246.3260219862701 246.9188665099701 32.24963347211302 32.749626345169645 -417.245 246.9188665099701 247.5117110336701 32.24963347211302 32.749626345169645 -418.245 247.5117110336701 248.1045555574201 32.24963347211302 32.749626345169645 -419.245 248.1045555574201 248.69740008117012 32.24963347211302 32.749626345169645 -420.245 248.69740008117012 249.2902446048701 32.24963347211302 32.749626345169645 -421.245 249.2902446048701 249.8830891285701 32.24963347211302 32.749626345169645 -422.245 249.8830891285701 250.4759336522701 32.24963347211302 32.749626345169645 -423.245 250.4759336522701 251.0687781759701 32.24963347211302 32.749626345169645 -424.245 251.0687781759701 251.6616226997201 32.24963347211302 32.749626345169645 -425.245 251.6616226997201 252.2544672234701 32.24963347211302 32.749626345169645 -426.245 252.2544672234701 252.8473117471701 32.24963347211302 32.749626345169645 -427.245 252.8473117471701 253.4401562708701 32.24963347211302 32.749626345169645 -428.245 253.4401562708701 254.03300079457009 32.24963347211302 32.749626345169645 -429.245 254.03300079457009 254.6258453182701 32.24963347211302 32.749626345169645 -430.245 254.6258453182701 255.2186898420201 32.24963347211302 32.749626345169645 -431.245 255.2186898420201 255.8115343657701 32.24963347211302 32.749626345169645 -432.245 255.8115343657701 256.4043788894701 32.24963347211302 32.749626345169645 -433.245 256.4043788894701 256.9972234131701 32.24963347211302 32.749626345169645 -434.245 256.9972234131701 257.5900679368701 32.24963347211302 32.749626345169645 -435.245 257.5900679368701 258.18291246057015 32.24963347211302 32.749626345169645 -436.245 258.18291246057015 258.7757569843201 32.24963347211302 32.749626345169645 -437.245 258.7757569843201 259.3686015080701 32.24963347211302 32.749626345169645 -438.245 259.3686015080701 259.96144603177015 32.24963347211302 32.749626345169645 -439.245 259.96144603177015 260.5542905554701 32.24963347211302 32.749626345169645 -440.245 260.5542905554701 261.1471350791701 32.24963347211302 32.749626345169645 -441.245 261.1471350791701 261.7399796028701 32.24963347211302 32.749626345169645 -442.245 261.7399796028701 262.3328241266201 32.24963347211302 32.749626345169645 -443.245 262.3328241266201 262.9256686503701 32.24963347211302 32.749626345169645 -444.245 262.9256686503701 263.5185131740701 32.24963347211302 32.749626345169645 -445.245 263.5185131740701 264.11135769777013 32.24963347211302 32.749626345169645 -446.245 264.11135769777013 264.70420222147015 32.24963347211302 32.749626345169645 -447.245 264.70420222147015 265.2970467452201 32.24963347211302 32.749626345169645 -448.245 265.2970467452201 265.88989126897013 32.24963347211302 32.749626345169645 -449.245 265.88989126897013 266.48273579267016 32.24963347211302 32.749626345169645 -450.245 266.48273579267016 267.0755803163701 32.24963347211302 32.749626345169645 -451.245 267.0755803163701 267.6684248400701 32.24963347211302 32.749626345169645 -452.245 267.6684248400701 268.2612693637701 32.24963347211302 32.749626345169645 -453.245 268.2612693637701 268.8541138875201 32.24963347211302 32.749626345169645 -454.245 268.8541138875201 269.4469584112701 32.24963347211302 32.749626345169645 -455.245 269.4469584112701 270.0398029349701 32.24963347211302 32.749626345169645 -456.245 270.0398029349701 270.64214649275226 32.24963347211302 32.749626345169645 -578.245 342.35733579438795 342.95967935217016 32.24963347211302 32.749626345169645 -579.245 342.95967935217016 343.5525238758701 32.24963347211302 32.749626345169645 -580.245 343.5525238758701 344.1453683995701 32.24963347211302 32.749626345169645 -581.245 344.1453683995701 344.7382129232701 32.24963347211302 32.749626345169645 -582.245 344.7382129232701 345.3310574470201 32.24963347211302 32.749626345169645 -583.245 345.3310574470201 345.9239019707701 32.24963347211302 32.749626345169645 -584.245 345.9239019707701 346.5167464944701 32.24963347211302 32.749626345169645 -585.245 346.5167464944701 347.10959101817014 32.24963347211302 32.749626345169645 -586.245 347.10959101817014 347.70243554187016 32.24963347211302 32.749626345169645 -587.245 347.70243554187016 348.2952800655701 32.24963347211302 32.749626345169645 -588.245 348.2952800655701 348.8881245893201 32.24963347211302 32.749626345169645 -589.245 348.8881245893201 349.48096911307016 32.24963347211302 32.749626345169645 -590.245 349.48096911307016 350.0738136367701 32.24963347211302 32.749626345169645 -591.245 350.0738136367701 350.6666581604701 32.24963347211302 32.749626345169645 -592.245 350.6666581604701 351.2595026841701 32.24963347211302 32.749626345169645 -593.245 351.2595026841701 351.85234720787014 32.24963347211302 32.749626345169645 -594.245 351.85234720787014 352.4451917316201 32.24963347211302 32.749626345169645 -595.245 352.4451917316201 353.0380362553701 32.24963347211302 32.749626345169645 -596.245 353.0380362553701 353.63088077907014 32.24963347211302 32.749626345169645 -597.245 353.63088077907014 354.2237253027701 32.24963347211302 32.749626345169645 -598.245 354.2237253027701 354.8165698264701 32.24963347211302 32.749626345169645 -599.245 354.8165698264701 355.4094143501701 32.24963347211302 32.749626345169645 -600.245 355.4094143501701 356.0022588739201 32.24963347211302 32.749626345169645 -601.245 356.0022588739201 356.5951033976701 32.24963347211302 32.749626345169645 -602.245 356.5951033976701 357.1879479213701 32.24963347211302 32.749626345169645 -603.245 357.1879479213701 357.7807924450701 32.24963347211302 32.749626345169645 -604.245 357.7807924450701 358.37363696877014 32.24963347211302 32.749626345169645 -605.245 358.37363696877014 358.9664814924701 32.24963347211302 32.749626345169645 -606.245 358.9664814924701 359.56882505025226 32.24963347211302 32.749626345169645 -000.245 359.69320108588795 0.295544643670109 32.24963347211302 32.749626345169645 -001.246 0.29719117351806723 0.8933728199180672 32.749626345169645 33.249619137764846 -002.246 0.8933728199180672 1.489554466368067 32.749626345169645 33.249619137764846 -003.246 1.489554466368067 2.0857361128180667 32.749626345169645 33.249619137764846 -004.246 2.0857361128180667 2.6819177592180665 32.749626345169645 33.249619137764846 -005.246 2.6819177592180665 3.278099405618067 32.749626345169645 33.249619137764846 -006.246 3.278099405618067 3.874281052018066 32.749626345169645 33.249619137764846 -007.246 3.874281052018066 4.470462698418066 32.749626345169645 33.249619137764846 -008.246 4.470462698418066 5.066644344868067 32.749626345169645 33.249619137764846 -009.246 5.066644344868067 5.662825991318067 32.749626345169645 33.249619137764846 -010.246 5.662825991318067 6.259007637718067 32.749626345169645 33.249619137764846 -011.246 6.259007637718067 6.855189284118066 32.749626345169645 33.249619137764846 -012.246 6.855189284118066 7.451370930518067 32.749626345169645 33.249619137764846 -013.246 7.451370930518067 8.047552576968066 32.749626345169645 33.249619137764846 -014.246 8.047552576968066 8.643734223418067 32.749626345169645 33.249619137764846 -015.246 8.643734223418067 9.239915869818068 32.749626345169645 33.249619137764846 -016.246 9.239915869818068 9.836097516218068 32.749626345169645 33.249619137764846 -017.246 9.836097516218068 10.43227916261807 32.749626345169645 33.249619137764846 -018.246 10.43227916261807 11.028460809018068 32.749626345169645 33.249619137764846 -019.246 11.028460809018068 11.624642455468067 32.749626345169645 33.249619137764846 -020.246 11.624642455468067 12.220824101918067 32.749626345169645 33.249619137764846 -021.246 12.220824101918067 12.817005748318067 32.749626345169645 33.249619137764846 -022.246 12.817005748318067 13.413187394718069 32.749626345169645 33.249619137764846 -023.246 13.413187394718069 14.009369041118067 32.749626345169645 33.249619137764846 -024.246 14.009369041118067 14.605550687518068 32.749626345169645 33.249619137764846 -025.246 14.605550687518068 15.201732333968069 32.749626345169645 33.249619137764846 -026.246 15.201732333968069 15.797913980418064 32.749626345169645 33.249619137764846 -027.246 15.797913980418064 16.394095626818068 32.749626345169645 33.249619137764846 -028.246 16.394095626818068 16.99027727321807 32.749626345169645 33.249619137764846 -029.246 16.99027727321807 17.586458919618067 32.749626345169645 33.249619137764846 -030.246 17.586458919618067 18.182640566068066 32.749626345169645 33.249619137764846 -031.246 18.182640566068066 18.778822212518065 32.749626345169645 33.249619137764846 -032.246 18.778822212518065 19.37500385891807 32.749626345169645 33.249619137764846 -033.246 19.37500385891807 19.97118550531807 32.749626345169645 33.249619137764846 -034.246 19.97118550531807 20.567367151718067 32.749626345169645 33.249619137764846 -035.246 20.567367151718067 21.163548798118068 32.749626345169645 33.249619137764846 -036.246 21.163548798118068 21.75973044456807 32.749626345169645 33.249619137764846 -037.246 21.75973044456807 22.35591209101807 32.749626345169645 33.249619137764846 -038.246 22.35591209101807 22.952093737418068 32.749626345169645 33.249619137764846 -039.246 22.952093737418068 23.548275383818066 32.749626345169645 33.249619137764846 -040.246 23.548275383818066 24.14445703021807 32.749626345169645 33.249619137764846 -041.246 24.14445703021807 24.74063867666807 32.749626345169645 33.249619137764846 -042.246 24.74063867666807 25.33682032311807 32.749626345169645 33.249619137764846 -043.246 25.33682032311807 25.933001969518067 32.749626345169645 33.249619137764846 -044.246 25.933001969518067 26.529183615918065 32.749626345169645 33.249619137764846 -045.246 26.529183615918065 27.12536526231807 32.749626345169645 33.249619137764846 -046.246 27.12536526231807 27.721546908718068 32.749626345169645 33.249619137764846 -047.246 27.721546908718068 28.317728555168067 32.749626345169645 33.249619137764846 -048.246 28.317728555168067 28.91391020161807 32.749626345169645 33.249619137764846 -049.246 28.91391020161807 29.510091848018064 32.749626345169645 33.249619137764846 -050.246 29.510091848018064 30.10627349441807 32.749626345169645 33.249619137764846 -051.246 30.10627349441807 30.702455140818067 32.749626345169645 33.249619137764846 -052.246 30.702455140818067 31.298636787268066 32.749626345169645 33.249619137764846 -053.246 31.298636787268066 31.89481843371806 32.749626345169645 33.249619137764846 -054.246 31.89481843371806 32.49100008011807 32.749626345169645 33.249619137764846 -055.246 32.49100008011807 33.087181726518075 32.749626345169645 33.249619137764846 -056.246 33.087181726518075 33.683363372918066 32.749626345169645 33.249619137764846 -057.246 33.683363372918066 34.279545019318064 32.749626345169645 33.249619137764846 -058.246 34.279545019318064 34.875726665768056 32.749626345169645 33.249619137764846 -059.246 34.875726665768056 35.47190831221807 32.749626345169645 33.249619137764846 -060.246 35.47190831221807 36.068089958618074 32.749626345169645 33.249619137764846 -061.246 36.068089958618074 36.66427160501807 32.749626345169645 33.249619137764846 -062.246 36.66427160501807 37.26045325141808 32.749626345169645 33.249619137764846 -063.246 37.26045325141808 37.86618746798366 32.749626345169645 33.249619137764846 -193.246 114.75451471565249 115.36024893221807 32.749626345169645 33.249619137764846 -194.246 115.36024893221807 115.95643057861808 32.749626345169645 33.249619137764846 -195.246 115.95643057861808 116.55261222501807 32.749626345169645 33.249619137764846 -196.246 116.55261222501807 117.14879387141808 32.749626345169645 33.249619137764846 -197.246 117.14879387141808 117.74497551786806 32.749626345169645 33.249619137764846 -198.246 117.74497551786806 118.34115716431806 32.749626345169645 33.249619137764846 -199.246 118.34115716431806 118.93733881071809 32.749626345169645 33.249619137764846 -200.246 118.93733881071809 119.53352045711807 32.749626345169645 33.249619137764846 -201.246 119.53352045711807 120.12970210351806 32.749626345169645 33.249619137764846 -202.246 120.12970210351806 120.72588374991808 32.749626345169645 33.249619137764846 -203.246 120.72588374991808 121.32206539636806 32.749626345169645 33.249619137764846 -204.246 121.32206539636806 121.91824704281807 32.749626345169645 33.249619137764846 -205.246 121.91824704281807 122.51442868921808 32.749626345169645 33.249619137764846 -206.246 122.51442868921808 123.11061033561808 32.749626345169645 33.249619137764846 -207.246 123.11061033561808 123.70679198201809 32.749626345169645 33.249619137764846 -208.246 123.70679198201809 124.30297362846808 32.749626345169645 33.249619137764846 -209.246 124.30297362846808 124.89915527491807 32.749626345169645 33.249619137764846 -210.246 124.89915527491807 125.49533692131808 32.749626345169645 33.249619137764846 -211.246 125.49533692131808 126.09151856771805 32.749626345169645 33.249619137764846 -212.246 126.09151856771805 126.68770021411807 32.749626345169645 33.249619137764846 -213.246 126.68770021411807 127.28388186051808 32.749626345169645 33.249619137764846 -214.246 127.28388186051808 127.88006350696807 32.749626345169645 33.249619137764846 -215.246 127.88006350696807 128.47624515341806 32.749626345169645 33.249619137764846 -216.246 128.47624515341806 129.0724267998181 32.749626345169645 33.249619137764846 -217.246 129.0724267998181 129.66860844621806 32.749626345169645 33.249619137764846 -218.246 129.66860844621806 130.26479009261806 32.749626345169645 33.249619137764846 -219.246 130.26479009261806 130.86097173906808 32.749626345169645 33.249619137764846 -220.246 130.86097173906808 131.4571533855181 32.749626345169645 33.249619137764846 -221.246 131.4571533855181 132.0533350319181 32.749626345169645 33.249619137764846 -222.246 132.0533350319181 132.6495166783181 32.749626345169645 33.249619137764846 -223.246 132.6495166783181 133.2456983247181 32.749626345169645 33.249619137764846 -224.246 133.2456983247181 133.8418799711181 32.749626345169645 33.249619137764846 -225.246 133.8418799711181 134.43806161756808 32.749626345169645 33.249619137764846 -226.246 134.43806161756808 135.03424326401807 32.749626345169645 33.249619137764846 -227.246 135.03424326401807 135.63042491041807 32.749626345169645 33.249619137764846 -228.246 135.63042491041807 136.22660655681807 32.749626345169645 33.249619137764846 -229.246 136.22660655681807 136.8227882032181 32.749626345169645 33.249619137764846 -230.246 136.8227882032181 137.4189698496681 32.749626345169645 33.249619137764846 -231.246 137.4189698496681 138.01515149611805 32.749626345169645 33.249619137764846 -232.246 138.01515149611805 138.61133314251805 32.749626345169645 33.249619137764846 -233.246 138.61133314251805 139.20751478891808 32.749626345169645 33.249619137764846 -234.246 139.20751478891808 139.8036964353181 32.749626345169645 33.249619137764846 -235.246 139.8036964353181 140.39987808171807 32.749626345169645 33.249619137764846 -236.246 140.39987808171807 140.99605972816806 32.749626345169645 33.249619137764846 -237.246 140.99605972816806 141.59224137461808 32.749626345169645 33.249619137764846 -238.246 141.59224137461808 142.18842302101805 32.749626345169645 33.249619137764846 -239.246 142.18842302101805 142.78460466741808 32.749626345169645 33.249619137764846 -240.246 142.78460466741808 143.38078631381808 32.749626345169645 33.249619137764846 -241.246 143.38078631381808 143.97696796021808 32.749626345169645 33.249619137764846 -242.246 143.97696796021808 144.57314960666807 32.749626345169645 33.249619137764846 -243.246 144.57314960666807 145.1693312531181 32.749626345169645 33.249619137764846 -244.246 145.1693312531181 145.7655128995181 32.749626345169645 33.249619137764846 -245.246 145.7655128995181 146.36169454591806 32.749626345169645 33.249619137764846 -246.246 146.36169454591806 146.95787619231805 32.749626345169645 33.249619137764846 -247.246 146.95787619231805 147.55405783876807 32.749626345169645 33.249619137764846 -248.246 147.55405783876807 148.1502394852181 32.749626345169645 33.249619137764846 -249.246 148.1502394852181 148.7464211316181 32.749626345169645 33.249619137764846 -250.246 148.7464211316181 149.3426027780181 32.749626345169645 33.249619137764846 -251.246 149.3426027780181 149.9387844244181 32.749626345169645 33.249619137764846 -252.246 149.9387844244181 150.53496607081806 32.749626345169645 33.249619137764846 -253.246 150.53496607081806 151.1311477172681 32.749626345169645 33.249619137764846 -254.246 151.1311477172681 151.7273293637181 32.749626345169645 33.249619137764846 -255.246 151.7273293637181 152.32351101011807 32.749626345169645 33.249619137764846 -256.246 152.32351101011807 152.91969265651807 32.749626345169645 33.249619137764846 -257.246 152.91969265651807 153.51587430291806 32.749626345169645 33.249619137764846 -258.246 153.51587430291806 154.11205594936806 32.749626345169645 33.249619137764846 -259.246 154.11205594936806 154.70823759581805 32.749626345169645 33.249619137764846 -260.246 154.70823759581805 155.30441924221807 32.749626345169645 33.249619137764846 -261.246 155.30441924221807 155.9006008886181 32.749626345169645 33.249619137764846 -262.246 155.9006008886181 156.49678253501807 32.749626345169645 33.249619137764846 -263.246 156.49678253501807 157.09296418141807 32.749626345169645 33.249619137764846 -264.246 157.09296418141807 157.69869839798366 32.749626345169645 33.249619137764846 -267.246 158.87195655055248 159.47769076711805 32.749626345169645 33.249619137764846 -268.246 159.47769076711805 160.07387241351807 32.749626345169645 33.249619137764846 -269.246 160.07387241351807 160.6700540599681 32.749626345169645 33.249619137764846 -270.246 160.6700540599681 161.26623570641806 32.749626345169645 33.249619137764846 -271.246 161.26623570641806 161.86241735281808 32.749626345169645 33.249619137764846 -272.246 161.86241735281808 162.45859899921805 32.749626345169645 33.249619137764846 -273.246 162.45859899921805 163.05478064561805 32.749626345169645 33.249619137764846 -274.246 163.05478064561805 163.65096229201808 32.749626345169645 33.249619137764846 -275.246 163.65096229201808 164.24714393846807 32.749626345169645 33.249619137764846 -276.246 164.24714393846807 164.8433255849181 32.749626345169645 33.249619137764846 -277.246 164.8433255849181 165.4395072313181 32.749626345169645 33.249619137764846 -278.246 165.4395072313181 166.0356888777181 32.749626345169645 33.249619137764846 -279.246 166.0356888777181 166.63187052411809 32.749626345169645 33.249619137764846 -280.246 166.63187052411809 167.22805217051805 32.749626345169645 33.249619137764846 -281.246 167.22805217051805 167.82423381696807 32.749626345169645 33.249619137764846 -282.246 167.82423381696807 168.42041546341807 32.749626345169645 33.249619137764846 -283.246 168.42041546341807 169.01659710981806 32.749626345169645 33.249619137764846 -284.246 169.01659710981806 169.6127787562181 32.749626345169645 33.249619137764846 -285.246 169.6127787562181 170.20896040261806 32.749626345169645 33.249619137764846 -286.246 170.20896040261806 170.80514204906808 32.749626345169645 33.249619137764846 -287.246 170.80514204906808 171.40132369551807 32.749626345169645 33.249619137764846 -288.246 171.40132369551807 171.9975053419181 32.749626345169645 33.249619137764846 -289.246 171.9975053419181 172.5936869883181 32.749626345169645 33.249619137764846 -290.246 172.5936869883181 173.1898686347181 32.749626345169645 33.249619137764846 -291.246 173.1898686347181 173.7860502811181 32.749626345169645 33.249619137764846 -292.246 173.7860502811181 174.38223192756809 32.749626345169645 33.249619137764846 -293.246 174.38223192756809 174.97841357401808 32.749626345169645 33.249619137764846 -294.246 174.97841357401808 175.57459522041808 32.749626345169645 33.249619137764846 -295.246 175.57459522041808 176.17077686681807 32.749626345169645 33.249619137764846 -296.246 176.17077686681807 176.7669585132181 32.749626345169645 33.249619137764846 -297.246 176.7669585132181 177.3631401596681 32.749626345169645 33.249619137764846 -298.246 177.3631401596681 177.95932180611808 32.749626345169645 33.249619137764846 -299.246 177.95932180611808 178.55550345251808 32.749626345169645 33.249619137764846 -300.246 178.55550345251808 179.15168509891805 32.749626345169645 33.249619137764846 -301.246 179.15168509891805 179.74786674531805 32.749626345169645 33.249619137764846 -302.246 179.74786674531805 180.34404839171805 32.749626345169645 33.249619137764846 -303.246 180.34404839171805 180.94023003816807 32.749626345169645 33.249619137764846 -304.246 180.94023003816807 181.53641168461806 32.749626345169645 33.249619137764846 -305.246 181.53641168461806 182.13259333101803 32.749626345169645 33.249619137764846 -306.246 182.13259333101803 182.72877497741806 32.749626345169645 33.249619137764846 -307.246 182.72877497741806 183.32495662381803 32.749626345169645 33.249619137764846 -308.246 183.32495662381803 183.92113827026805 32.749626345169645 33.249619137764846 -309.246 183.92113827026805 184.51731991671807 32.749626345169645 33.249619137764846 -310.246 184.51731991671807 185.11350156311806 32.749626345169645 33.249619137764846 -311.246 185.11350156311806 185.70968320951806 32.749626345169645 33.249619137764846 -312.246 185.70968320951806 186.30586485591806 32.749626345169645 33.249619137764846 -313.246 186.30586485591806 186.90204650231806 32.749626345169645 33.249619137764846 -314.246 186.90204650231806 187.49822814876808 32.749626345169645 33.249619137764846 -315.246 187.49822814876808 188.09440979521804 32.749626345169645 33.249619137764846 -316.246 188.09440979521804 188.69059144161807 32.749626345169645 33.249619137764846 -317.246 188.69059144161807 189.28677308801804 32.749626345169645 33.249619137764846 -318.246 189.28677308801804 189.88295473441806 32.749626345169645 33.249619137764846 -319.246 189.88295473441806 190.47913638086806 32.749626345169645 33.249619137764846 -320.246 190.47913638086806 191.07531802731805 32.749626345169645 33.249619137764846 -321.246 191.07531802731805 191.67149967371807 32.749626345169645 33.249619137764846 -322.246 191.67149967371807 192.26768132011807 32.749626345169645 33.249619137764846 -323.246 192.26768132011807 192.86386296651807 32.749626345169645 33.249619137764846 -324.246 192.86386296651807 193.46004461291807 32.749626345169645 33.249619137764846 -325.246 193.46004461291807 194.05622625936806 32.749626345169645 33.249619137764846 -326.246 194.05622625936806 194.65240790581805 32.749626345169645 33.249619137764846 -327.246 194.65240790581805 195.24858955221805 32.749626345169645 33.249619137764846 -328.246 195.24858955221805 195.84477119861805 32.749626345169645 33.249619137764846 -329.246 195.84477119861805 196.44095284501805 32.749626345169645 33.249619137764846 -330.246 196.44095284501805 197.03713449141804 32.749626345169645 33.249619137764846 -331.246 197.03713449141804 197.63331613786806 32.749626345169645 33.249619137764846 -332.246 197.63331613786806 198.22949778431803 32.749626345169645 33.249619137764846 -333.246 198.22949778431803 198.82567943071805 32.749626345169645 33.249619137764846 -334.246 198.82567943071805 199.42186107711805 32.749626345169645 33.249619137764846 -335.246 199.42186107711805 200.01804272351802 32.749626345169645 33.249619137764846 -336.246 200.01804272351802 200.61422436996804 32.749626345169645 33.249619137764846 -337.246 200.61422436996804 201.21995858658363 32.749626345169645 33.249619137764846 -388.246 231.00993576715248 231.61566998371808 32.749626345169645 33.249619137764846 -389.246 231.61566998371808 232.21185163011808 32.749626345169645 33.249619137764846 -390.246 232.21185163011808 232.80803327651807 32.749626345169645 33.249619137764846 -391.246 232.80803327651807 233.40421492291807 32.749626345169645 33.249619137764846 -392.246 233.40421492291807 234.00039656936804 32.749626345169645 33.249619137764846 -393.246 234.00039656936804 234.59657821581806 32.749626345169645 33.249619137764846 -394.246 234.59657821581806 235.19275986221805 32.749626345169645 33.249619137764846 -395.246 235.19275986221805 235.78894150861805 32.749626345169645 33.249619137764846 -396.246 235.78894150861805 236.38512315501805 32.749626345169645 33.249619137764846 -397.246 236.38512315501805 236.98130480146807 32.749626345169645 33.249619137764846 -398.246 236.98130480146807 237.57748644791806 32.749626345169645 33.249619137764846 -399.246 237.57748644791806 238.1736680943181 32.749626345169645 33.249619137764846 -400.246 238.1736680943181 238.76984974071806 32.749626345169645 33.249619137764846 -401.246 238.76984974071806 239.36603138711803 32.749626345169645 33.249619137764846 -402.246 239.36603138711803 239.96221303351803 32.749626345169645 33.249619137764846 -403.246 239.96221303351803 240.55839467996805 32.749626345169645 33.249619137764846 -404.246 240.55839467996805 241.15457632641807 32.749626345169645 33.249619137764846 -405.246 241.15457632641807 241.75075797281806 32.749626345169645 33.249619137764846 -406.246 241.75075797281806 242.34693961921806 32.749626345169645 33.249619137764846 -407.246 242.34693961921806 242.94312126561806 32.749626345169645 33.249619137764846 -408.246 242.94312126561806 243.53930291201806 32.749626345169645 33.249619137764846 -409.246 243.53930291201806 244.13548455846808 32.749626345169645 33.249619137764846 -410.246 244.13548455846808 244.73166620491807 32.749626345169645 33.249619137764846 -411.246 244.73166620491807 245.32784785131804 32.749626345169645 33.249619137764846 -412.246 245.32784785131804 245.92402949771807 32.749626345169645 33.249619137764846 -413.246 245.92402949771807 246.52021114411806 32.749626345169645 33.249619137764846 -414.246 246.52021114411806 247.11639279056806 32.749626345169645 33.249619137764846 -415.246 247.11639279056806 247.71257443701805 32.749626345169645 33.249619137764846 -416.246 247.71257443701805 248.30875608341802 32.749626345169645 33.249619137764846 -417.246 248.30875608341802 248.90493772981807 32.749626345169645 33.249619137764846 -418.246 248.90493772981807 249.50111937621807 32.749626345169645 33.249619137764846 -419.246 249.50111937621807 250.09730102261807 32.749626345169645 33.249619137764846 -420.246 250.09730102261807 250.69348266906806 32.749626345169645 33.249619137764846 -421.246 250.69348266906806 251.28966431551805 32.749626345169645 33.249619137764846 -422.246 251.28966431551805 251.88584596191805 32.749626345169645 33.249619137764846 -423.246 251.88584596191805 252.48202760831805 32.749626345169645 33.249619137764846 -424.246 252.48202760831805 253.07820925471805 32.749626345169645 33.249619137764846 -425.246 253.07820925471805 253.67439090116804 32.749626345169645 33.249619137764846 -426.246 253.67439090116804 254.27057254761803 32.749626345169645 33.249619137764846 -427.246 254.27057254761803 254.86675419401803 32.749626345169645 33.249619137764846 -428.246 254.86675419401803 255.46293584041806 32.749626345169645 33.249619137764846 -429.246 255.46293584041806 256.0591174868181 32.749626345169645 33.249619137764846 -430.246 256.0591174868181 256.6552991332181 32.749626345169645 33.249619137764846 -431.246 256.6552991332181 257.2514807796681 32.749626345169645 33.249619137764846 -432.246 257.2514807796681 257.84766242611806 32.749626345169645 33.249619137764846 -433.246 257.84766242611806 258.44384407251806 32.749626345169645 33.249619137764846 -434.246 258.44384407251806 259.04002571891806 32.749626345169645 33.249619137764846 -435.246 259.04002571891806 259.63620736531806 32.749626345169645 33.249619137764846 -436.246 259.63620736531806 260.2323890117681 32.749626345169645 33.249619137764846 -437.246 260.2323890117681 260.82857065821804 32.749626345169645 33.249619137764846 -438.246 260.82857065821804 261.42475230461804 32.749626345169645 33.249619137764846 -439.246 261.42475230461804 262.02093395101804 32.749626345169645 33.249619137764846 -440.246 262.02093395101804 262.61711559741804 32.749626345169645 33.249619137764846 -441.246 262.61711559741804 263.21329724381803 32.749626345169645 33.249619137764846 -442.246 263.21329724381803 263.80947889026805 32.749626345169645 33.249619137764846 -443.246 263.80947889026805 264.4056605367181 32.749626345169645 33.249619137764846 -444.246 264.4056605367181 265.0018421831181 32.749626345169645 33.249619137764846 -445.246 265.0018421831181 265.59802382951807 32.749626345169645 33.249619137764846 -446.246 265.59802382951807 266.19420547591807 32.749626345169645 33.249619137764846 -447.246 266.19420547591807 266.79038712231807 32.749626345169645 33.249619137764846 -448.246 266.79038712231807 267.38656876876803 32.749626345169645 33.249619137764846 -449.246 267.38656876876803 267.98275041521805 32.749626345169645 33.249619137764846 -450.246 267.98275041521805 268.57893206161805 32.749626345169645 33.249619137764846 -451.246 268.57893206161805 269.17511370801805 32.749626345169645 33.249619137764846 -452.246 269.17511370801805 269.77129535441804 32.749626345169645 33.249619137764846 -453.246 269.77129535441804 270.367477000868 32.749626345169645 33.249619137764846 -454.246 270.367477000868 270.9636586473181 32.749626345169645 33.249619137764846 -455.246 270.9636586473181 271.56939286388365 32.749626345169645 33.249619137764846 -576.246 343.0920852936525 343.69781951026806 32.749626345169645 33.249619137764846 -577.246 343.69781951026806 344.2940011567181 32.749626345169645 33.249619137764846 -578.246 344.2940011567181 344.8901828031181 32.749626345169645 33.249619137764846 -579.246 344.8901828031181 345.4863644495181 32.749626345169645 33.249619137764846 -580.246 345.4863644495181 346.0825460959181 32.749626345169645 33.249619137764846 -581.246 346.0825460959181 346.6787277423681 32.749626345169645 33.249619137764846 -582.246 346.6787277423681 347.27490938881806 32.749626345169645 33.249619137764846 -583.246 347.27490938881806 347.87109103521806 32.749626345169645 33.249619137764846 -584.246 347.87109103521806 348.46727268161806 32.749626345169645 33.249619137764846 -585.246 348.46727268161806 349.06345432801805 32.749626345169645 33.249619137764846 -586.246 349.06345432801805 349.65963597441805 32.749626345169645 33.249619137764846 -587.246 349.65963597441805 350.255817620868 32.749626345169645 33.249619137764846 -588.246 350.255817620868 350.85199926731804 32.749626345169645 33.249619137764846 -589.246 350.85199926731804 351.44818091371803 32.749626345169645 33.249619137764846 -590.246 351.44818091371803 352.0443625601181 32.749626345169645 33.249619137764846 -591.246 352.0443625601181 352.6405442065181 32.749626345169645 33.249619137764846 -592.246 352.6405442065181 353.2367258529681 32.749626345169645 33.249619137764846 -593.246 353.2367258529681 353.83290749941807 32.749626345169645 33.249619137764846 -594.246 353.83290749941807 354.42908914581807 32.749626345169645 33.249619137764846 -595.246 354.42908914581807 355.02527079221807 32.749626345169645 33.249619137764846 -596.246 355.02527079221807 355.62145243861806 32.749626345169645 33.249619137764846 -597.246 355.62145243861806 356.21763408501806 32.749626345169645 33.249619137764846 -598.246 356.21763408501806 356.813815731468 32.749626345169645 33.249619137764846 -599.246 356.813815731468 357.40999737791805 32.749626345169645 33.249619137764846 -600.246 357.40999737791805 358.00617902431804 32.749626345169645 33.249619137764846 -601.246 358.00617902431804 358.60236067071804 32.749626345169645 33.249619137764846 -602.246 358.60236067071804 359.19854231711804 32.749626345169645 33.249619137764846 -603.246 359.19854231711804 359.7478667453181 32.749626345169645 33.249619137764846 -000.246 359.7478667453181 0.29719117351806723 32.749626345169645 33.249619137764846 -001.247 0.29887903867390936 0.8984815103239094 33.249619137764846 33.749611847411686 -002.247 0.8984815103239094 1.4980839819739091 33.249619137764846 33.749611847411686 -003.247 1.4980839819739091 2.0976864536739086 33.249619137764846 33.749611847411686 -004.247 2.0976864536739086 2.6972889253239094 33.249619137764846 33.749611847411686 -005.247 2.6972889253239094 3.2968913969739093 33.249619137764846 33.749611847411686 -006.247 3.2968913969739093 3.8964938686739092 33.249619137764846 33.749611847411686 -007.247 3.8964938686739092 4.496096340323909 33.249619137764846 33.749611847411686 -008.247 4.496096340323909 5.095698811973909 33.249619137764846 33.749611847411686 -009.247 5.095698811973909 5.69530128367391 33.249619137764846 33.749611847411686 -010.247 5.69530128367391 6.294903755323909 33.249619137764846 33.749611847411686 -011.247 6.294903755323909 6.894506226973909 33.249619137764846 33.749611847411686 -012.247 6.894506226973909 7.494108698673909 33.249619137764846 33.749611847411686 -013.247 7.494108698673909 8.09371117032391 33.249619137764846 33.749611847411686 -014.247 8.09371117032391 8.693313641973909 33.249619137764846 33.749611847411686 -015.247 8.693313641973909 9.29291611367391 33.249619137764846 33.749611847411686 -016.247 9.29291611367391 9.89251858532391 33.249619137764846 33.749611847411686 -017.247 9.89251858532391 10.492121056973911 33.249619137764846 33.749611847411686 -018.247 10.492121056973911 11.091723528673912 33.249619137764846 33.749611847411686 -019.247 11.091723528673912 11.69132600037391 33.249619137764846 33.749611847411686 -020.247 11.69132600037391 12.290928472023909 33.249619137764846 33.749611847411686 -021.247 12.290928472023909 12.890530943673909 33.249619137764846 33.749611847411686 -022.247 12.890530943673909 13.490133415373911 33.249619137764846 33.749611847411686 -023.247 13.490133415373911 14.08973588702391 33.249619137764846 33.749611847411686 -024.247 14.08973588702391 14.689338358673908 33.249619137764846 33.749611847411686 -025.247 14.689338358673908 15.28894083037391 33.249619137764846 33.749611847411686 -026.247 15.28894083037391 15.888543302023908 33.249619137764846 33.749611847411686 -027.247 15.888543302023908 16.488145773673907 33.249619137764846 33.749611847411686 -028.247 16.488145773673907 17.08774824537391 33.249619137764846 33.749611847411686 -029.247 17.08774824537391 17.68735071702391 33.249619137764846 33.749611847411686 -030.247 17.68735071702391 18.286953188673905 33.249619137764846 33.749611847411686 -031.247 18.286953188673905 18.886555660373908 33.249619137764846 33.749611847411686 -032.247 18.886555660373908 19.48615813202391 33.249619137764846 33.749611847411686 -033.247 19.48615813202391 20.085760603673908 33.249619137764846 33.749611847411686 -034.247 20.085760603673908 20.68536307537391 33.249619137764846 33.749611847411686 -035.247 20.68536307537391 21.28496554702391 33.249619137764846 33.749611847411686 -036.247 21.28496554702391 21.88456801867391 33.249619137764846 33.749611847411686 -037.247 21.88456801867391 22.484170490373913 33.249619137764846 33.749611847411686 -038.247 22.484170490373913 23.083772962023907 33.249619137764846 33.749611847411686 -039.247 23.083772962023907 23.68337543367391 33.249619137764846 33.749611847411686 -040.247 23.68337543367391 24.28297790537391 33.249619137764846 33.749611847411686 -041.247 24.28297790537391 24.882580377023913 33.249619137764846 33.749611847411686 -042.247 24.882580377023913 25.48218284867391 33.249619137764846 33.749611847411686 -043.247 25.48218284867391 26.08178532037391 33.249619137764846 33.749611847411686 -044.247 26.08178532037391 26.681387792023912 33.249619137764846 33.749611847411686 -045.247 26.681387792023912 27.280990263673907 33.249619137764846 33.749611847411686 -046.247 27.280990263673907 27.880592735373902 33.249619137764846 33.749611847411686 -047.247 27.880592735373902 28.480195207023907 33.249619137764846 33.749611847411686 -048.247 28.480195207023907 29.079797678673906 33.249619137764846 33.749611847411686 -049.247 29.079797678673906 29.67940015037391 33.249619137764846 33.749611847411686 -050.247 29.67940015037391 30.279002622023906 33.249619137764846 33.749611847411686 -051.247 30.279002622023906 30.878605093673908 33.249619137764846 33.749611847411686 -052.247 30.878605093673908 31.47820756537391 33.249619137764846 33.749611847411686 -053.247 31.47820756537391 32.07781003702391 33.249619137764846 33.749611847411686 -054.247 32.07781003702391 32.67741250867391 33.249619137764846 33.749611847411686 -055.247 32.67741250867391 33.277014980373906 33.249619137764846 33.749611847411686 -056.247 33.277014980373906 33.87661745207391 33.249619137764846 33.749611847411686 -057.247 33.87661745207391 34.47621992372392 33.249619137764846 33.749611847411686 -058.247 34.47621992372392 35.075822395373905 33.249619137764846 33.749611847411686 -059.247 35.075822395373905 35.675424867073914 33.249619137764846 33.749611847411686 -060.247 35.675424867073914 36.275027338723916 33.249619137764846 33.749611847411686 -061.247 36.275027338723916 36.87462981037391 33.249619137764846 33.749611847411686 -062.247 36.87462981037391 37.4742322820739 33.249619137764846 33.749611847411686 -063.247 37.4742322820739 38.08344220395638 33.249619137764846 33.749611847411686 -193.247 115.41294614859143 116.02215607047391 33.249619137764846 33.749611847411686 -194.247 116.02215607047391 116.62175854217391 33.249619137764846 33.749611847411686 -195.247 116.62175854217391 117.2213610138239 33.249619137764846 33.749611847411686 -196.247 117.2213610138239 117.8209634854739 33.249619137764846 33.749611847411686 -197.247 117.8209634854739 118.4205659571739 33.249619137764846 33.749611847411686 -198.247 118.4205659571739 119.02016842882392 33.249619137764846 33.749611847411686 -199.247 119.02016842882392 119.61977090047392 33.249619137764846 33.749611847411686 -200.247 119.61977090047392 120.2193733721739 33.249619137764846 33.749611847411686 -201.247 120.2193733721739 120.81897584382392 33.249619137764846 33.749611847411686 -202.247 120.81897584382392 121.41857831547392 33.249619137764846 33.749611847411686 -203.247 121.41857831547392 122.01818078717392 33.249619137764846 33.749611847411686 -204.247 122.01818078717392 122.61778325882392 33.249619137764846 33.749611847411686 -205.247 122.61778325882392 123.21738573047392 33.249619137764846 33.749611847411686 -206.247 123.21738573047392 123.81698820217392 33.249619137764846 33.749611847411686 -207.247 123.81698820217392 124.41659067387391 33.249619137764846 33.749611847411686 -208.247 124.41659067387391 125.01619314552391 33.249619137764846 33.749611847411686 -209.247 125.01619314552391 125.61579561717392 33.249619137764846 33.749611847411686 -210.247 125.61579561717392 126.21539808887391 33.249619137764846 33.749611847411686 -211.247 126.21539808887391 126.81500056052391 33.249619137764846 33.749611847411686 -212.247 126.81500056052391 127.41460303217391 33.249619137764846 33.749611847411686 -213.247 127.41460303217391 128.0142055038739 33.249619137764846 33.749611847411686 -214.247 128.0142055038739 128.6138079755239 33.249619137764846 33.749611847411686 -215.247 128.6138079755239 129.2134104471739 33.249619137764846 33.749611847411686 -216.247 129.2134104471739 129.81301291887388 33.249619137764846 33.749611847411686 -217.247 129.81301291887388 130.4126153905239 33.249619137764846 33.749611847411686 -218.247 130.4126153905239 131.01221786217394 33.249619137764846 33.749611847411686 -219.247 131.01221786217394 131.6118203338739 33.249619137764846 33.749611847411686 -220.247 131.6118203338739 132.2114228055239 33.249619137764846 33.749611847411686 -221.247 132.2114228055239 132.81102527717394 33.249619137764846 33.749611847411686 -222.247 132.81102527717394 133.4106277488739 33.249619137764846 33.749611847411686 -223.247 133.4106277488739 134.0102302205239 33.249619137764846 33.749611847411686 -224.247 134.0102302205239 134.60983269217394 33.249619137764846 33.749611847411686 -225.247 134.60983269217394 135.20943516387393 33.249619137764846 33.749611847411686 -226.247 135.20943516387393 135.8090376355239 33.249619137764846 33.749611847411686 -227.247 135.8090376355239 136.40864010717394 33.249619137764846 33.749611847411686 -228.247 136.40864010717394 137.00824257887393 33.249619137764846 33.749611847411686 -229.247 137.00824257887393 137.6078450505239 33.249619137764846 33.749611847411686 -230.247 137.6078450505239 138.20744752217394 33.249619137764846 33.749611847411686 -231.247 138.20744752217394 138.80704999387393 33.249619137764846 33.749611847411686 -232.247 138.80704999387393 139.4066524655239 33.249619137764846 33.749611847411686 -233.247 139.4066524655239 140.0062549371739 33.249619137764846 33.749611847411686 -234.247 140.0062549371739 140.60585740887393 33.249619137764846 33.749611847411686 -235.247 140.60585740887393 141.2054598805239 33.249619137764846 33.749611847411686 -236.247 141.2054598805239 141.8050623521739 33.249619137764846 33.749611847411686 -237.247 141.8050623521739 142.40466482387393 33.249619137764846 33.749611847411686 -238.247 142.40466482387393 143.0042672955239 33.249619137764846 33.749611847411686 -239.247 143.0042672955239 143.6038697671739 33.249619137764846 33.749611847411686 -240.247 143.6038697671739 144.2034722388739 33.249619137764846 33.749611847411686 -241.247 144.2034722388739 144.8030747105239 33.249619137764846 33.749611847411686 -242.247 144.8030747105239 145.4026771821739 33.249619137764846 33.749611847411686 -243.247 145.4026771821739 146.0022796538739 33.249619137764846 33.749611847411686 -244.247 146.0022796538739 146.6018821255239 33.249619137764846 33.749611847411686 -245.247 146.6018821255239 147.20148459717393 33.249619137764846 33.749611847411686 -246.247 147.20148459717393 147.8010870688739 33.249619137764846 33.749611847411686 -247.247 147.8010870688739 148.4006895405739 33.249619137764846 33.749611847411686 -248.247 148.4006895405739 149.0002920122239 33.249619137764846 33.749611847411686 -249.247 149.0002920122239 149.5998944838739 33.249619137764846 33.749611847411686 -250.247 149.5998944838739 150.19949695557392 33.249619137764846 33.749611847411686 -251.247 150.19949695557392 150.79909942722392 33.249619137764846 33.749611847411686 -252.247 150.79909942722392 151.39870189887392 33.249619137764846 33.749611847411686 -253.247 151.39870189887392 151.99830437057392 33.249619137764846 33.749611847411686 -254.247 151.99830437057392 152.59790684222392 33.249619137764846 33.749611847411686 -255.247 152.59790684222392 153.19750931387392 33.249619137764846 33.749611847411686 -256.247 153.19750931387392 153.79711178557392 33.249619137764846 33.749611847411686 -257.247 153.79711178557392 154.3967142572239 33.249619137764846 33.749611847411686 -258.247 154.3967142572239 154.99631672887392 33.249619137764846 33.749611847411686 -259.247 154.99631672887392 155.59591920057392 33.249619137764846 33.749611847411686 -260.247 155.59591920057392 156.1955216722239 33.249619137764846 33.749611847411686 -261.247 156.1955216722239 156.79512414387392 33.249619137764846 33.749611847411686 -262.247 156.79512414387392 157.39472661557392 33.249619137764846 33.749611847411686 -263.247 157.39472661557392 158.0039365374564 33.249619137764846 33.749611847411686 -266.247 159.18392658039144 159.79313650222392 33.249619137764846 33.749611847411686 -267.247 159.79313650222392 160.39273897387392 33.249619137764846 33.749611847411686 -268.247 160.39273897387392 160.9923414455739 33.249619137764846 33.749611847411686 -269.247 160.9923414455739 161.59194391722394 33.249619137764846 33.749611847411686 -270.247 161.59194391722394 162.19154638887392 33.249619137764846 33.749611847411686 -271.247 162.19154638887392 162.7911488605739 33.249619137764846 33.749611847411686 -272.247 162.7911488605739 163.3907513322239 33.249619137764846 33.749611847411686 -273.247 163.3907513322239 163.99035380387392 33.249619137764846 33.749611847411686 -274.247 163.99035380387392 164.5899562755739 33.249619137764846 33.749611847411686 -275.247 164.5899562755739 165.1895587472239 33.249619137764846 33.749611847411686 -276.247 165.1895587472239 165.78916121887391 33.249619137764846 33.749611847411686 -277.247 165.78916121887391 166.3887636905739 33.249619137764846 33.749611847411686 -278.247 166.3887636905739 166.98836616222394 33.249619137764846 33.749611847411686 -279.247 166.98836616222394 167.5879686338739 33.249619137764846 33.749611847411686 -280.247 167.5879686338739 168.1875711055739 33.249619137764846 33.749611847411686 -281.247 168.1875711055739 168.78717357722394 33.249619137764846 33.749611847411686 -282.247 168.78717357722394 169.3867760488739 33.249619137764846 33.749611847411686 -283.247 169.3867760488739 169.9863785205739 33.249619137764846 33.749611847411686 -284.247 169.9863785205739 170.5859809922739 33.249619137764846 33.749611847411686 -285.247 170.5859809922739 171.18558346392393 33.249619137764846 33.749611847411686 -286.247 171.18558346392393 171.7851859355739 33.249619137764846 33.749611847411686 -287.247 171.7851859355739 172.3847884072739 33.249619137764846 33.749611847411686 -288.247 172.3847884072739 172.98439087892393 33.249619137764846 33.749611847411686 -289.247 172.98439087892393 173.5839933505739 33.249619137764846 33.749611847411686 -290.247 173.5839933505739 174.1835958222739 33.249619137764846 33.749611847411686 -291.247 174.1835958222739 174.7831982939239 33.249619137764846 33.749611847411686 -292.247 174.7831982939239 175.3828007655739 33.249619137764846 33.749611847411686 -293.247 175.3828007655739 175.9824032372739 33.249619137764846 33.749611847411686 -294.247 175.9824032372739 176.5820057089239 33.249619137764846 33.749611847411686 -295.247 176.5820057089239 177.1816081805739 33.249619137764846 33.749611847411686 -296.247 177.1816081805739 177.7812106522739 33.249619137764846 33.749611847411686 -297.247 177.7812106522739 178.38081312392393 33.249619137764846 33.749611847411686 -298.247 178.38081312392393 178.9804155955739 33.249619137764846 33.749611847411686 -299.247 178.9804155955739 179.5800180672739 33.249619137764846 33.749611847411686 -300.247 179.5800180672739 180.1796205389239 33.249619137764846 33.749611847411686 -301.247 180.1796205389239 180.7792230105739 33.249619137764846 33.749611847411686 -302.247 180.7792230105739 181.3788254822739 33.249619137764846 33.749611847411686 -303.247 181.3788254822739 181.9784279539239 33.249619137764846 33.749611847411686 -304.247 181.9784279539239 182.5780304255739 33.249619137764846 33.749611847411686 -305.247 182.5780304255739 183.1776328972739 33.249619137764846 33.749611847411686 -306.247 183.1776328972739 183.77723536892387 33.249619137764846 33.749611847411686 -307.247 183.77723536892387 184.3768378405739 33.249619137764846 33.749611847411686 -308.247 184.3768378405739 184.9764403122739 33.249619137764846 33.749611847411686 -309.247 184.9764403122739 185.57604278392387 33.249619137764846 33.749611847411686 -310.247 185.57604278392387 186.1756452555739 33.249619137764846 33.749611847411686 -311.247 186.1756452555739 186.7752477272739 33.249619137764846 33.749611847411686 -312.247 186.7752477272739 187.37485019892392 33.249619137764846 33.749611847411686 -313.247 187.37485019892392 187.9744526705739 33.249619137764846 33.749611847411686 -314.247 187.9744526705739 188.5740551422739 33.249619137764846 33.749611847411686 -315.247 188.5740551422739 189.17365761392392 33.249619137764846 33.749611847411686 -316.247 189.17365761392392 189.7732600855739 33.249619137764846 33.749611847411686 -317.247 189.7732600855739 190.3728625572739 33.249619137764846 33.749611847411686 -318.247 190.3728625572739 190.97246502892392 33.249619137764846 33.749611847411686 -319.247 190.97246502892392 191.5720675005739 33.249619137764846 33.749611847411686 -320.247 191.5720675005739 192.1716699722739 33.249619137764846 33.749611847411686 -321.247 192.1716699722739 192.7712724439739 33.249619137764846 33.749611847411686 -322.247 192.7712724439739 193.37087491562392 33.249619137764846 33.749611847411686 -323.247 193.37087491562392 193.9704773872739 33.249619137764846 33.749611847411686 -324.247 193.9704773872739 194.5700798589739 33.249619137764846 33.749611847411686 -325.247 194.5700798589739 195.1696823306239 33.249619137764846 33.749611847411686 -326.247 195.1696823306239 195.76928480227392 33.249619137764846 33.749611847411686 -327.247 195.76928480227392 196.36888727397388 33.249619137764846 33.749611847411686 -328.247 196.36888727397388 196.9684897456239 33.249619137764846 33.749611847411686 -329.247 196.9684897456239 197.56809221727391 33.249619137764846 33.749611847411686 -330.247 197.56809221727391 198.16769468897388 33.249619137764846 33.749611847411686 -331.247 198.16769468897388 198.7672971606239 33.249619137764846 33.749611847411686 -332.247 198.7672971606239 199.36689963227388 33.249619137764846 33.749611847411686 -333.247 199.36689963227388 199.9665021039739 33.249619137764846 33.749611847411686 -334.247 199.9665021039739 200.5661045756239 33.249619137764846 33.749611847411686 -335.247 200.5661045756239 201.17531449745638 33.249619137764846 33.749611847411686 -387.247 231.73582565209145 232.3450355739739 33.249619137764846 33.749611847411686 -388.247 232.3450355739739 232.94463804567388 33.249619137764846 33.749611847411686 -389.247 232.94463804567388 233.54424051732389 33.249619137764846 33.749611847411686 -390.247 233.54424051732389 234.14384298897394 33.249619137764846 33.749611847411686 -391.247 234.14384298897394 234.7434454606739 33.249619137764846 33.749611847411686 -392.247 234.7434454606739 235.3430479323239 33.249619137764846 33.749611847411686 -393.247 235.3430479323239 235.94265040397391 33.249619137764846 33.749611847411686 -394.247 235.94265040397391 236.54225287567388 33.249619137764846 33.749611847411686 -395.247 236.54225287567388 237.1418553473239 33.249619137764846 33.749611847411686 -396.247 237.1418553473239 237.74145781897394 33.249619137764846 33.749611847411686 -397.247 237.74145781897394 238.3410602906739 33.249619137764846 33.749611847411686 -398.247 238.3410602906739 238.9406627623739 33.249619137764846 33.749611847411686 -399.247 238.9406627623739 239.54026523402393 33.249619137764846 33.749611847411686 -400.247 239.54026523402393 240.1398677056739 33.249619137764846 33.749611847411686 -401.247 240.1398677056739 240.73947017737387 33.249619137764846 33.749611847411686 -402.247 240.73947017737387 241.3390726490239 33.249619137764846 33.749611847411686 -403.247 241.3390726490239 241.93867512067393 33.249619137764846 33.749611847411686 -404.247 241.93867512067393 242.53827759237393 33.249619137764846 33.749611847411686 -405.247 242.53827759237393 243.13788006402393 33.249619137764846 33.749611847411686 -406.247 243.13788006402393 243.7374825356739 33.249619137764846 33.749611847411686 -407.247 243.7374825356739 244.3370850073739 33.249619137764846 33.749611847411686 -408.247 244.3370850073739 244.93668747902387 33.249619137764846 33.749611847411686 -409.247 244.93668747902387 245.5362899506739 33.249619137764846 33.749611847411686 -410.247 245.5362899506739 246.1358924223739 33.249619137764846 33.749611847411686 -411.247 246.1358924223739 246.7354948940239 33.249619137764846 33.749611847411686 -412.247 246.7354948940239 247.3350973656739 33.249619137764846 33.749611847411686 -413.247 247.3350973656739 247.9346998373739 33.249619137764846 33.749611847411686 -414.247 247.9346998373739 248.5343023090239 33.249619137764846 33.749611847411686 -415.247 248.5343023090239 249.13390478067387 33.249619137764846 33.749611847411686 -416.247 249.13390478067387 249.73350725237387 33.249619137764846 33.749611847411686 -417.247 249.73350725237387 250.33310972402387 33.249619137764846 33.749611847411686 -418.247 250.33310972402387 250.9327121956739 33.249619137764846 33.749611847411686 -419.247 250.9327121956739 251.5323146673739 33.249619137764846 33.749611847411686 -420.247 251.5323146673739 252.1319171390239 33.249619137764846 33.749611847411686 -421.247 252.1319171390239 252.73151961067387 33.249619137764846 33.749611847411686 -422.247 252.73151961067387 253.3311220823739 33.249619137764846 33.749611847411686 -423.247 253.3311220823739 253.93072455402387 33.249619137764846 33.749611847411686 -424.247 253.93072455402387 254.5303270256739 33.249619137764846 33.749611847411686 -425.247 254.5303270256739 255.1299294973739 33.249619137764846 33.749611847411686 -426.247 255.1299294973739 255.72953196902392 33.249619137764846 33.749611847411686 -427.247 255.72953196902392 256.3291344406739 33.249619137764846 33.749611847411686 -428.247 256.3291344406739 256.92873691237395 33.249619137764846 33.749611847411686 -429.247 256.92873691237395 257.52833938402387 33.249619137764846 33.749611847411686 -430.247 257.52833938402387 258.1279418556739 33.249619137764846 33.749611847411686 -431.247 258.1279418556739 258.7275443273739 33.249619137764846 33.749611847411686 -432.247 258.7275443273739 259.3271467990239 33.249619137764846 33.749611847411686 -433.247 259.3271467990239 259.92674927067395 33.249619137764846 33.749611847411686 -434.247 259.92674927067395 260.52635174237395 33.249619137764846 33.749611847411686 -435.247 260.52635174237395 261.125954214024 33.249619137764846 33.749611847411686 -436.247 261.125954214024 261.72555668567395 33.249619137764846 33.749611847411686 -437.247 261.72555668567395 262.3251591573739 33.249619137764846 33.749611847411686 -438.247 262.3251591573739 262.9247616290739 33.249619137764846 33.749611847411686 -439.247 262.9247616290739 263.5243641007239 33.249619137764846 33.749611847411686 -440.247 263.5243641007239 264.12396657237394 33.249619137764846 33.749611847411686 -441.247 264.12396657237394 264.72356904407394 33.249619137764846 33.749611847411686 -442.247 264.72356904407394 265.32317151572397 33.249619137764846 33.749611847411686 -443.247 265.32317151572397 265.92277398737394 33.249619137764846 33.749611847411686 -444.247 265.92277398737394 266.5223764590739 33.249619137764846 33.749611847411686 -445.247 266.5223764590739 267.1219789307239 33.249619137764846 33.749611847411686 -446.247 267.1219789307239 267.7215814023739 33.249619137764846 33.749611847411686 -447.247 267.7215814023739 268.32118387407394 33.249619137764846 33.749611847411686 -448.247 268.32118387407394 268.92078634572397 33.249619137764846 33.749611847411686 -449.247 268.92078634572397 269.52038881737394 33.249619137764846 33.749611847411686 -450.247 269.52038881737394 270.11999128907394 33.249619137764846 33.749611847411686 -451.247 270.11999128907394 270.7195937607239 33.249619137764846 33.749611847411686 -452.247 270.7195937607239 271.3288036825564 33.249619137764846 33.749611847411686 -575.247 344.46109032559144 345.07030024747394 33.249619137764846 33.749611847411686 -576.247 345.07030024747394 345.66990271917393 33.249619137764846 33.749611847411686 -577.247 345.66990271917393 346.2695051908239 33.249619137764846 33.749611847411686 -578.247 346.2695051908239 346.8691076624739 33.249619137764846 33.749611847411686 -579.247 346.8691076624739 347.4687101341739 33.249619137764846 33.749611847411686 -580.247 347.4687101341739 348.0683126058239 33.249619137764846 33.749611847411686 -581.247 348.0683126058239 348.66791507747394 33.249619137764846 33.749611847411686 -582.247 348.66791507747394 349.26751754917393 33.249619137764846 33.749611847411686 -583.247 349.26751754917393 349.8671200208239 33.249619137764846 33.749611847411686 -584.247 349.8671200208239 350.4667224924739 33.249619137764846 33.749611847411686 -585.247 350.4667224924739 351.0663249641739 33.249619137764846 33.749611847411686 -586.247 351.0663249641739 351.66592743582385 33.249619137764846 33.749611847411686 -587.247 351.66592743582385 352.26552990747393 33.249619137764846 33.749611847411686 -588.247 352.26552990747393 352.86513237917393 33.249619137764846 33.749611847411686 -589.247 352.86513237917393 353.4647348508739 33.249619137764846 33.749611847411686 -590.247 353.4647348508739 354.0643373225239 33.249619137764846 33.749611847411686 -591.247 354.0643373225239 354.66393979417387 33.249619137764846 33.749611847411686 -592.247 354.66393979417387 355.26354226587387 33.249619137764846 33.749611847411686 -593.247 355.26354226587387 355.86314473752384 33.249619137764846 33.749611847411686 -594.247 355.86314473752384 356.4627472091739 33.249619137764846 33.749611847411686 -595.247 356.4627472091739 357.0623496808739 33.249619137764846 33.749611847411686 -596.247 357.0623496808739 357.6619521525239 33.249619137764846 33.749611847411686 -597.247 357.6619521525239 358.26155462417387 33.249619137764846 33.749611847411686 -598.247 358.26155462417387 358.86115709587386 33.249619137764846 33.749611847411686 -599.247 358.86115709587386 359.47036701775636 33.249619137764846 33.749611847411686 -000.247 359.68966911679144 0.29887903867390936 33.249619137764846 33.749611847411686 -001.248 0.3006092066588345 0.9037181809088344 33.749611847411686 34.249604471540096 -002.248 0.9037181809088344 1.5068271551588346 33.749611847411686 34.249604471540096 -003.248 1.5068271551588346 2.1099361294088346 33.749611847411686 34.249604471540096 -004.248 2.1099361294088346 2.713045103658835 33.749611847411686 34.249604471540096 -005.248 2.713045103658835 3.316154077908834 33.749611847411686 34.249604471540096 -006.248 3.316154077908834 3.9192630521588345 33.749611847411686 34.249604471540096 -007.248 3.9192630521588345 4.522372026408834 33.749611847411686 34.249604471540096 -008.248 4.522372026408834 5.125481000658835 33.749611847411686 34.249604471540096 -009.248 5.125481000658835 5.728589974908836 33.749611847411686 34.249604471540096 -010.248 5.728589974908836 6.3316989491588345 33.749611847411686 34.249604471540096 -011.248 6.3316989491588345 6.934807923408835 33.749611847411686 34.249604471540096 -012.248 6.934807923408835 7.5379168976588335 33.749611847411686 34.249604471540096 -013.248 7.5379168976588335 8.141025871908834 33.749611847411686 34.249604471540096 -014.248 8.141025871908834 8.744134846158833 33.749611847411686 34.249604471540096 -015.248 8.744134846158833 9.347243820408835 33.749611847411686 34.249604471540096 -016.248 9.347243820408835 9.950352794658833 33.749611847411686 34.249604471540096 -017.248 9.950352794658833 10.553461768908836 33.749611847411686 34.249604471540096 -018.248 10.553461768908836 11.156570743158834 33.749611847411686 34.249604471540096 -019.248 11.156570743158834 11.759679717408837 33.749611847411686 34.249604471540096 -020.248 11.759679717408837 12.362788691658835 33.749611847411686 34.249604471540096 -021.248 12.362788691658835 12.965897665908834 33.749611847411686 34.249604471540096 -022.248 12.965897665908834 13.569006640158838 33.749611847411686 34.249604471540096 -023.248 13.569006640158838 14.172115614408836 33.749611847411686 34.249604471540096 -024.248 14.172115614408836 14.775224588658835 33.749611847411686 34.249604471540096 -025.248 14.775224588658835 15.378333562958836 33.749611847411686 34.249604471540096 -026.248 15.378333562958836 15.981442537208835 33.749611847411686 34.249604471540096 -027.248 15.981442537208835 16.58455151145884 33.749611847411686 34.249604471540096 -028.248 16.58455151145884 17.187660485708836 33.749611847411686 34.249604471540096 -029.248 17.187660485708836 17.79076945995883 33.749611847411686 34.249604471540096 -030.248 17.79076945995883 18.393878434208837 33.749611847411686 34.249604471540096 -031.248 18.393878434208837 18.996987408458835 33.749611847411686 34.249604471540096 -032.248 18.996987408458835 19.600096382708834 33.749611847411686 34.249604471540096 -033.248 19.600096382708834 20.203205356958833 33.749611847411686 34.249604471540096 -034.248 20.203205356958833 20.80631433120883 33.749611847411686 34.249604471540096 -035.248 20.80631433120883 21.409423305458834 33.749611847411686 34.249604471540096 -036.248 21.409423305458834 22.01253227970883 33.749611847411686 34.249604471540096 -037.248 22.01253227970883 22.615641253958838 33.749611847411686 34.249604471540096 -038.248 22.615641253958838 23.21875022820884 33.749611847411686 34.249604471540096 -039.248 23.21875022820884 23.82185920245884 33.749611847411686 34.249604471540096 -040.248 23.82185920245884 24.424968176708838 33.749611847411686 34.249604471540096 -041.248 24.424968176708838 25.028077150958836 33.749611847411686 34.249604471540096 -042.248 25.028077150958836 25.63118612520884 33.749611847411686 34.249604471540096 -043.248 25.63118612520884 26.234295099458834 33.749611847411686 34.249604471540096 -044.248 26.234295099458834 26.83740407370884 33.749611847411686 34.249604471540096 -045.248 26.83740407370884 27.440513047958845 33.749611847411686 34.249604471540096 -046.248 27.440513047958845 28.043622022208837 33.749611847411686 34.249604471540096 -047.248 28.043622022208837 28.646730996458835 33.749611847411686 34.249604471540096 -048.248 28.646730996458835 29.249839970708834 33.749611847411686 34.249604471540096 -049.248 29.249839970708834 29.852948944958833 33.749611847411686 34.249604471540096 -050.248 29.852948944958833 30.45605791920883 33.749611847411686 34.249604471540096 -051.248 30.45605791920883 31.059166893458837 33.749611847411686 34.249604471540096 -052.248 31.059166893458837 31.662275867758837 33.749611847411686 34.249604471540096 -053.248 31.662275867758837 32.26538484200883 33.749611847411686 34.249604471540096 -054.248 32.26538484200883 32.868493816258834 33.749611847411686 34.249604471540096 -055.248 32.868493816258834 33.47160279050884 33.749611847411686 34.249604471540096 -056.248 33.47160279050884 34.07471176475883 33.749611847411686 34.249604471540096 -057.248 34.07471176475883 34.67782073900884 33.749611847411686 34.249604471540096 -058.248 34.67782073900884 35.28092971325884 33.749611847411686 34.249604471540096 -059.248 35.28092971325884 35.884038687508834 33.749611847411686 34.249604471540096 -060.248 35.884038687508834 36.487147661758826 33.749611847411686 34.249604471540096 -061.248 36.487147661758826 37.09025663600884 33.749611847411686 34.249604471540096 -062.248 37.09025663600884 37.70302931620984 33.749611847411686 34.249604471540096 -191.248 114.88165060850785 115.49442328875887 33.749611847411686 34.249604471540096 -192.248 115.49442328875887 116.09753226300884 33.749611847411686 34.249604471540096 -193.248 116.09753226300884 116.70064123725885 33.749611847411686 34.249604471540096 -194.248 116.70064123725885 117.30375021150884 33.749611847411686 34.249604471540096 -195.248 117.30375021150884 117.90685918575885 33.749611847411686 34.249604471540096 -196.248 117.90685918575885 118.50996816000882 33.749611847411686 34.249604471540096 -197.248 118.50996816000882 119.11307713425884 33.749611847411686 34.249604471540096 -198.248 119.11307713425884 119.71618610850885 33.749611847411686 34.249604471540096 -199.248 119.71618610850885 120.31929508275883 33.749611847411686 34.249604471540096 -200.248 120.31929508275883 120.92240405700885 33.749611847411686 34.249604471540096 -201.248 120.92240405700885 121.52551303125884 33.749611847411686 34.249604471540096 -202.248 121.52551303125884 122.12862200550884 33.749611847411686 34.249604471540096 -203.248 122.12862200550884 122.73173097975884 33.749611847411686 34.249604471540096 -204.248 122.73173097975884 123.33483995405884 33.749611847411686 34.249604471540096 -205.248 123.33483995405884 123.93794892830884 33.749611847411686 34.249604471540096 -206.248 123.93794892830884 124.54105790255885 33.749611847411686 34.249604471540096 -207.248 124.54105790255885 125.14416687680885 33.749611847411686 34.249604471540096 -208.248 125.14416687680885 125.74727585105883 33.749611847411686 34.249604471540096 -209.248 125.74727585105883 126.35038482530882 33.749611847411686 34.249604471540096 -210.248 126.35038482530882 126.95349379955884 33.749611847411686 34.249604471540096 -211.248 126.95349379955884 127.55660277380886 33.749611847411686 34.249604471540096 -212.248 127.55660277380886 128.15971174805884 33.749611847411686 34.249604471540096 -213.248 128.15971174805884 128.76282072230885 33.749611847411686 34.249604471540096 -214.248 128.76282072230885 129.36592969655882 33.749611847411686 34.249604471540096 -215.248 129.36592969655882 129.96903867080883 33.749611847411686 34.249604471540096 -216.248 129.96903867080883 130.57214764505883 33.749611847411686 34.249604471540096 -217.248 130.57214764505883 131.17525661930887 33.749611847411686 34.249604471540096 -218.248 131.17525661930887 131.77836559355885 33.749611847411686 34.249604471540096 -219.248 131.77836559355885 132.38147456780885 33.749611847411686 34.249604471540096 -220.248 132.38147456780885 132.98458354205883 33.749611847411686 34.249604471540096 -221.248 132.98458354205883 133.58769251630883 33.749611847411686 34.249604471540096 -222.248 133.58769251630883 134.19080149055884 33.749611847411686 34.249604471540096 -223.248 134.19080149055884 134.79391046480885 33.749611847411686 34.249604471540096 -224.248 134.79391046480885 135.39701943905882 33.749611847411686 34.249604471540096 -225.248 135.39701943905882 136.00012841330886 33.749611847411686 34.249604471540096 -226.248 136.00012841330886 136.60323738755886 33.749611847411686 34.249604471540096 -227.248 136.60323738755886 137.20634636180884 33.749611847411686 34.249604471540096 -228.248 137.20634636180884 137.80945533605882 33.749611847411686 34.249604471540096 -229.248 137.80945533605882 138.41256431030882 33.749611847411686 34.249604471540096 -230.248 138.41256431030882 139.01567328455883 33.749611847411686 34.249604471540096 -231.248 139.01567328455883 139.61878225885883 33.749611847411686 34.249604471540096 -232.248 139.61878225885883 140.22189123310886 33.749611847411686 34.249604471540096 -233.248 140.22189123310886 140.8250002073588 33.749611847411686 34.249604471540096 -234.248 140.8250002073588 141.42810918160885 33.749611847411686 34.249604471540096 -235.248 141.42810918160885 142.03121815585882 33.749611847411686 34.249604471540096 -236.248 142.03121815585882 142.63432713010886 33.749611847411686 34.249604471540096 -237.248 142.63432713010886 143.23743610435884 33.749611847411686 34.249604471540096 -238.248 143.23743610435884 143.84054507860884 33.749611847411686 34.249604471540096 -239.248 143.84054507860884 144.44365405285885 33.749611847411686 34.249604471540096 -240.248 144.44365405285885 145.04676302710885 33.749611847411686 34.249604471540096 -241.248 145.04676302710885 145.64987200135886 33.749611847411686 34.249604471540096 -242.248 145.64987200135886 146.25298097560886 33.749611847411686 34.249604471540096 -243.248 146.25298097560886 146.85608994985887 33.749611847411686 34.249604471540096 -244.248 146.85608994985887 147.45919892410888 33.749611847411686 34.249604471540096 -245.248 147.45919892410888 148.06230789835882 33.749611847411686 34.249604471540096 -246.248 148.06230789835882 148.66541687260883 33.749611847411686 34.249604471540096 -247.248 148.66541687260883 149.26852584685884 33.749611847411686 34.249604471540096 -248.248 149.26852584685884 149.87163482110884 33.749611847411686 34.249604471540096 -249.248 149.87163482110884 150.47474379535885 33.749611847411686 34.249604471540096 -250.248 150.47474379535885 151.07785276960885 33.749611847411686 34.249604471540096 -251.248 151.07785276960885 151.68096174385883 33.749611847411686 34.249604471540096 -252.248 151.68096174385883 152.28407071810884 33.749611847411686 34.249604471540096 -253.248 152.28407071810884 152.88717969235884 33.749611847411686 34.249604471540096 -254.248 152.88717969235884 153.49028866660882 33.749611847411686 34.249604471540096 -255.248 153.49028866660882 154.09339764085883 33.749611847411686 34.249604471540096 -256.248 154.09339764085883 154.69650661515882 33.749611847411686 34.249604471540096 -257.248 154.69650661515882 155.29961558940883 33.749611847411686 34.249604471540096 -258.248 155.29961558940883 155.90272456365884 33.749611847411686 34.249604471540096 -259.248 155.90272456365884 156.50583353790884 33.749611847411686 34.249604471540096 -260.248 156.50583353790884 157.10894251215885 33.749611847411686 34.249604471540096 -261.248 157.10894251215885 157.71205148640885 33.749611847411686 34.249604471540096 -262.248 157.71205148640885 158.32482416660986 33.749611847411686 34.249604471540096 -265.248 159.51171470320784 160.12448738340885 33.749611847411686 34.249604471540096 -266.248 160.12448738340885 160.72759635765883 33.749611847411686 34.249604471540096 -267.248 160.72759635765883 161.33070533190886 33.749611847411686 34.249604471540096 -268.248 161.33070533190886 161.93381430615887 33.749611847411686 34.249604471540096 -269.248 161.93381430615887 162.53692328040884 33.749611847411686 34.249604471540096 -270.248 162.53692328040884 163.14003225465882 33.749611847411686 34.249604471540096 -271.248 163.14003225465882 163.74314122890885 33.749611847411686 34.249604471540096 -272.248 163.74314122890885 164.34625020315883 33.749611847411686 34.249604471540096 -273.248 164.34625020315883 164.94935917740884 33.749611847411686 34.249604471540096 -274.248 164.94935917740884 165.55246815165884 33.749611847411686 34.249604471540096 -275.248 165.55246815165884 166.15557712590885 33.749611847411686 34.249604471540096 -276.248 166.15557712590885 166.75868610015885 33.749611847411686 34.249604471540096 -277.248 166.75868610015885 167.36179507440883 33.749611847411686 34.249604471540096 -278.248 167.36179507440883 167.96490404865887 33.749611847411686 34.249604471540096 -279.248 167.96490404865887 168.56801302290881 33.749611847411686 34.249604471540096 -280.248 168.56801302290881 169.17112199715882 33.749611847411686 34.249604471540096 -281.248 169.17112199715882 169.77423097145882 33.749611847411686 34.249604471540096 -282.248 169.77423097145882 170.37733994570883 33.749611847411686 34.249604471540096 -283.248 170.37733994570883 170.9804489199588 33.749611847411686 34.249604471540096 -284.248 170.9804489199588 171.58355789420887 33.749611847411686 34.249604471540096 -285.248 171.58355789420887 172.18666686845887 33.749611847411686 34.249604471540096 -286.248 172.18666686845887 172.78977584270885 33.749611847411686 34.249604471540096 -287.248 172.78977584270885 173.39288481695883 33.749611847411686 34.249604471540096 -288.248 173.39288481695883 173.99599379120886 33.749611847411686 34.249604471540096 -289.248 173.99599379120886 174.59910276545884 33.749611847411686 34.249604471540096 -290.248 174.59910276545884 175.20221173970884 33.749611847411686 34.249604471540096 -291.248 175.20221173970884 175.80532071395885 33.749611847411686 34.249604471540096 -292.248 175.80532071395885 176.40842968820886 33.749611847411686 34.249604471540096 -293.248 176.40842968820886 177.01153866245886 33.749611847411686 34.249604471540096 -294.248 177.01153866245886 177.61464763670887 33.749611847411686 34.249604471540096 -295.248 177.61464763670887 178.21775661095887 33.749611847411686 34.249604471540096 -296.248 178.21775661095887 178.82086558520885 33.749611847411686 34.249604471540096 -297.248 178.82086558520885 179.42397455945883 33.749611847411686 34.249604471540096 -298.248 179.42397455945883 180.02708353370883 33.749611847411686 34.249604471540096 -299.248 180.02708353370883 180.63019250795884 33.749611847411686 34.249604471540096 -300.248 180.63019250795884 181.23330148220884 33.749611847411686 34.249604471540096 -301.248 181.23330148220884 181.8364104564588 33.749611847411686 34.249604471540096 -302.248 181.8364104564588 182.4395194307088 33.749611847411686 34.249604471540096 -303.248 182.4395194307088 183.0426284049588 33.749611847411686 34.249604471540096 -304.248 183.0426284049588 183.6457373792088 33.749611847411686 34.249604471540096 -305.248 183.6457373792088 184.24884635345882 33.749611847411686 34.249604471540096 -306.248 184.24884635345882 184.85195532775884 33.749611847411686 34.249604471540096 -307.248 184.85195532775884 185.45506430200882 33.749611847411686 34.249604471540096 -308.248 185.45506430200882 186.0581732762588 33.749611847411686 34.249604471540096 -309.248 186.0581732762588 186.66128225050883 33.749611847411686 34.249604471540096 -310.248 186.66128225050883 187.26439122475884 33.749611847411686 34.249604471540096 -311.248 187.26439122475884 187.86750019900882 33.749611847411686 34.249604471540096 -312.248 187.86750019900882 188.47060917325882 33.749611847411686 34.249604471540096 -313.248 188.47060917325882 189.07371814750883 33.749611847411686 34.249604471540096 -314.248 189.07371814750883 189.67682712175883 33.749611847411686 34.249604471540096 -315.248 189.67682712175883 190.27993609600884 33.749611847411686 34.249604471540096 -316.248 190.27993609600884 190.88304507025885 33.749611847411686 34.249604471540096 -317.248 190.88304507025885 191.48615404450885 33.749611847411686 34.249604471540096 -318.248 191.48615404450885 192.0892630187588 33.749611847411686 34.249604471540096 -319.248 192.0892630187588 192.69237199300883 33.749611847411686 34.249604471540096 -320.248 192.69237199300883 193.2954809672588 33.749611847411686 34.249604471540096 -321.248 193.2954809672588 193.89858994150882 33.749611847411686 34.249604471540096 -322.248 193.89858994150882 194.50169891575882 33.749611847411686 34.249604471540096 -323.248 194.50169891575882 195.10480789000883 33.749611847411686 34.249604471540096 -324.248 195.10480789000883 195.70791686425883 33.749611847411686 34.249604471540096 -325.248 195.70791686425883 196.31102583850884 33.749611847411686 34.249604471540096 -326.248 196.31102583850884 196.91413481275885 33.749611847411686 34.249604471540096 -327.248 196.91413481275885 197.51724378700882 33.749611847411686 34.249604471540096 -328.248 197.51724378700882 198.1203527612588 33.749611847411686 34.249604471540096 -329.248 198.1203527612588 198.7234617355088 33.749611847411686 34.249604471540096 -330.248 198.7234617355088 199.3265707097588 33.749611847411686 34.249604471540096 -331.248 199.3265707097588 199.92967968400882 33.749611847411686 34.249604471540096 -332.248 199.92967968400882 200.54245236420982 33.749611847411686 34.249604471540096 -375.248 225.8537018709078 226.46647455110883 33.749611847411686 34.249604471540096 -376.248 226.46647455110883 227.06958352535884 33.749611847411686 34.249604471540096 -377.248 227.06958352535884 227.67269249960881 33.749611847411686 34.249604471540096 -378.248 227.67269249960881 228.2758014738588 33.749611847411686 34.249604471540096 -379.248 228.2758014738588 228.8789104481088 33.749611847411686 34.249604471540096 -380.248 228.8789104481088 229.48201942235883 33.749611847411686 34.249604471540096 -381.248 229.48201942235883 230.08512839660884 33.749611847411686 34.249604471540096 -382.248 230.08512839660884 230.68823737085884 33.749611847411686 34.249604471540096 -383.248 230.68823737085884 231.29134634515884 33.749611847411686 34.249604471540096 -384.248 231.29134634515884 231.89445531940882 33.749611847411686 34.249604471540096 -385.248 231.89445531940882 232.49756429365883 33.749611847411686 34.249604471540096 -386.248 232.49756429365883 233.10067326790883 33.749611847411686 34.249604471540096 -387.248 233.10067326790883 233.70378224215884 33.749611847411686 34.249604471540096 -388.248 233.70378224215884 234.30689121640884 33.749611847411686 34.249604471540096 -389.248 234.30689121640884 234.91000019065882 33.749611847411686 34.249604471540096 -390.248 234.91000019065882 235.51310916490883 33.749611847411686 34.249604471540096 -391.248 235.51310916490883 236.1162181391588 33.749611847411686 34.249604471540096 -392.248 236.1162181391588 236.71932711340884 33.749611847411686 34.249604471540096 -393.248 236.71932711340884 237.32243608765884 33.749611847411686 34.249604471540096 -394.248 237.32243608765884 237.92554506190882 33.749611847411686 34.249604471540096 -395.248 237.92554506190882 238.52865403615883 33.749611847411686 34.249604471540096 -396.248 238.52865403615883 239.13176301040883 33.749611847411686 34.249604471540096 -397.248 239.13176301040883 239.7348719846588 33.749611847411686 34.249604471540096 -398.248 239.7348719846588 240.3379809589088 33.749611847411686 34.249604471540096 -399.248 240.3379809589088 240.9410899331588 33.749611847411686 34.249604471540096 -400.248 240.9410899331588 241.54419890740883 33.749611847411686 34.249604471540096 -401.248 241.54419890740883 242.14730788165883 33.749611847411686 34.249604471540096 -402.248 242.14730788165883 242.75041685590884 33.749611847411686 34.249604471540096 -403.248 242.75041685590884 243.35352583015884 33.749611847411686 34.249604471540096 -404.248 243.35352583015884 243.95663480440885 33.749611847411686 34.249604471540096 -405.248 243.95663480440885 244.5597437786588 33.749611847411686 34.249604471540096 -406.248 244.5597437786588 245.1628527529088 33.749611847411686 34.249604471540096 -407.248 245.1628527529088 245.76596172715884 33.749611847411686 34.249604471540096 -408.248 245.76596172715884 246.36907070145884 33.749611847411686 34.249604471540096 -409.248 246.36907070145884 246.97217967570882 33.749611847411686 34.249604471540096 -410.248 246.97217967570882 247.5752886499588 33.749611847411686 34.249604471540096 -411.248 247.5752886499588 248.1783976242088 33.749611847411686 34.249604471540096 -412.248 248.1783976242088 248.78150659845883 33.749611847411686 34.249604471540096 -413.248 248.78150659845883 249.3846155727088 33.749611847411686 34.249604471540096 -414.248 249.3846155727088 249.98772454695884 33.749611847411686 34.249604471540096 -415.248 249.98772454695884 250.59083352120885 33.749611847411686 34.249604471540096 -416.248 250.59083352120885 251.19394249545883 33.749611847411686 34.249604471540096 -417.248 251.19394249545883 251.7970514697088 33.749611847411686 34.249604471540096 -418.248 251.7970514697088 252.4001604439588 33.749611847411686 34.249604471540096 -419.248 252.4001604439588 253.00326941820882 33.749611847411686 34.249604471540096 -420.248 253.00326941820882 253.6063783924588 33.749611847411686 34.249604471540096 -421.248 253.6063783924588 254.2094873667088 33.749611847411686 34.249604471540096 -422.248 254.2094873667088 254.81259634095883 33.749611847411686 34.249604471540096 -423.248 254.81259634095883 255.41570531520887 33.749611847411686 34.249604471540096 -424.248 255.41570531520887 256.0188142894588 33.749611847411686 34.249604471540096 -425.248 256.0188142894588 256.6219232637088 33.749611847411686 34.249604471540096 -426.248 256.6219232637088 257.2250322379588 33.749611847411686 34.249604471540096 -427.248 257.2250322379588 257.82814121220883 33.749611847411686 34.249604471540096 -428.248 257.82814121220883 258.43125018645884 33.749611847411686 34.249604471540096 -429.248 258.43125018645884 259.03435916070885 33.749611847411686 34.249604471540096 -430.248 259.03435916070885 259.6374681349588 33.749611847411686 34.249604471540096 -431.248 259.6374681349588 260.24057710920886 33.749611847411686 34.249604471540096 -432.248 260.24057710920886 260.8436860834588 33.749611847411686 34.249604471540096 -433.248 260.8436860834588 261.4467950577588 33.749611847411686 34.249604471540096 -434.248 261.4467950577588 262.04990403200884 33.749611847411686 34.249604471540096 -435.248 262.04990403200884 262.65301300625885 33.749611847411686 34.249604471540096 -436.248 262.65301300625885 263.25612198050885 33.749611847411686 34.249604471540096 -437.248 263.25612198050885 263.8592309547588 33.749611847411686 34.249604471540096 -438.248 263.8592309547588 264.46233992900886 33.749611847411686 34.249604471540096 -439.248 264.46233992900886 265.0654489032588 33.749611847411686 34.249604471540096 -440.248 265.0654489032588 265.6685578775089 33.749611847411686 34.249604471540096 -441.248 265.6685578775089 266.2716668517588 33.749611847411686 34.249604471540096 -442.248 266.2716668517588 266.8747758260088 33.749611847411686 34.249604471540096 -443.248 266.8747758260088 267.47788480025883 33.749611847411686 34.249604471540096 -444.248 267.47788480025883 268.0809937745088 33.749611847411686 34.249604471540096 -445.248 268.0809937745088 268.68410274875885 33.749611847411686 34.249604471540096 -446.248 268.68410274875885 269.2872117230088 33.749611847411686 34.249604471540096 -447.248 269.2872117230088 269.89032069725886 33.749611847411686 34.249604471540096 -448.248 269.89032069725886 270.4934296715088 33.749611847411686 34.249604471540096 -449.248 270.4934296715088 271.10620235170984 33.749611847411686 34.249604471540096 -573.248 345.2692787728078 345.88205145300884 33.749611847411686 34.249604471540096 -574.248 345.88205145300884 346.48516042725885 33.749611847411686 34.249604471540096 -575.248 346.48516042725885 347.0882694015088 33.749611847411686 34.249604471540096 -576.248 347.0882694015088 347.69137837575886 33.749611847411686 34.249604471540096 -577.248 347.69137837575886 348.29448735000886 33.749611847411686 34.249604471540096 -578.248 348.29448735000886 348.89759632425887 33.749611847411686 34.249604471540096 -579.248 348.89759632425887 349.5007052985088 33.749611847411686 34.249604471540096 -580.248 349.5007052985088 350.1038142727588 33.749611847411686 34.249604471540096 -581.248 350.1038142727588 350.70692324700883 33.749611847411686 34.249604471540096 -582.248 350.70692324700883 351.3100322212588 33.749611847411686 34.249604471540096 -583.248 351.3100322212588 351.91314119550884 33.749611847411686 34.249604471540096 -584.248 351.91314119550884 352.5162501697588 33.749611847411686 34.249604471540096 -585.248 352.5162501697588 353.11935914400885 33.749611847411686 34.249604471540096 -586.248 353.11935914400885 353.7224681182588 33.749611847411686 34.249604471540096 -587.248 353.7224681182588 354.32557709250887 33.749611847411686 34.249604471540096 -588.248 354.32557709250887 354.9286860667588 33.749611847411686 34.249604471540096 -589.248 354.9286860667588 355.53179504105884 33.749611847411686 34.249604471540096 -590.248 355.53179504105884 356.13490401530885 33.749611847411686 34.249604471540096 -591.248 356.13490401530885 356.7380129895588 33.749611847411686 34.249604471540096 -592.248 356.7380129895588 357.34112196380886 33.749611847411686 34.249604471540096 -593.248 357.34112196380886 357.9442309380588 33.749611847411686 34.249604471540096 -594.248 357.9442309380588 358.5473399123088 33.749611847411686 34.249604471540096 -595.248 358.5473399123088 359.1504488865588 33.749611847411686 34.249604471540096 -596.248 359.1504488865588 359.7255290466088 33.749611847411686 34.249604471540096 -000.248 359.7255290466088 0.3006092066588345 33.749611847411686 34.249604471540096 -001.249 0.3023826821723936 0.9090858872223936 34.249604471540096 34.74959700749294 -002.249 0.9090858872223936 1.5157890922723938 34.249604471540096 34.74959700749294 -003.249 1.5157890922723938 2.1224922973223936 34.249604471540096 34.74959700749294 -004.249 2.1224922973223936 2.7291955023723937 34.249604471540096 34.74959700749294 -005.249 2.7291955023723937 3.335898707422394 34.249604471540096 34.74959700749294 -006.249 3.335898707422394 3.9426019124723934 34.249604471540096 34.74959700749294 -007.249 3.9426019124723934 4.549305117522394 34.249604471540096 34.74959700749294 -008.249 4.549305117522394 5.156008322572394 34.249604471540096 34.74959700749294 -009.249 5.156008322572394 5.762711527622393 34.249604471540096 34.74959700749294 -010.249 5.762711527622393 6.369414732672393 34.249604471540096 34.74959700749294 -011.249 6.369414732672393 6.976117937722394 34.249604471540096 34.74959700749294 -012.249 6.976117937722394 7.582821142772394 34.249604471540096 34.74959700749294 -013.249 7.582821142772394 8.189524347822394 34.249604471540096 34.74959700749294 -014.249 8.189524347822394 8.796227552872391 34.249604471540096 34.74959700749294 -015.249 8.796227552872391 9.402930757872394 34.249604471540096 34.74959700749294 -016.249 9.402930757872394 10.009633962922393 34.249604471540096 34.74959700749294 -017.249 10.009633962922393 10.616337167972395 34.249604471540096 34.74959700749294 -018.249 10.616337167972395 11.223040373022394 34.249604471540096 34.74959700749294 -019.249 11.223040373022394 11.829743578072394 34.249604471540096 34.74959700749294 -020.249 11.829743578072394 12.436446783122395 34.249604471540096 34.74959700749294 -021.249 12.436446783122395 13.043149988172395 34.249604471540096 34.74959700749294 -022.249 13.043149988172395 13.649853193222391 34.249604471540096 34.74959700749294 -023.249 13.649853193222391 14.256556398272396 34.249604471540096 34.74959700749294 -024.249 14.256556398272396 14.863259603322396 34.249604471540096 34.74959700749294 -025.249 14.863259603322396 15.46996280837239 34.249604471540096 34.74959700749294 -026.249 15.46996280837239 16.076666013422393 34.249604471540096 34.74959700749294 -027.249 16.076666013422393 16.683369218472393 34.249604471540096 34.74959700749294 -028.249 16.683369218472393 17.29007242352239 34.249604471540096 34.74959700749294 -029.249 17.29007242352239 17.896775628572392 34.249604471540096 34.74959700749294 -030.249 17.896775628572392 18.503478833622395 34.249604471540096 34.74959700749294 -031.249 18.503478833622395 19.11018203867239 34.249604471540096 34.74959700749294 -032.249 19.11018203867239 19.716885243672394 34.249604471540096 34.74959700749294 -033.249 19.716885243672394 20.323588448722397 34.249604471540096 34.74959700749294 -034.249 20.323588448722397 20.930291653772393 34.249604471540096 34.74959700749294 -035.249 20.930291653772393 21.536994858822393 34.249604471540096 34.74959700749294 -036.249 21.536994858822393 22.143698063872392 34.249604471540096 34.74959700749294 -037.249 22.143698063872392 22.75040126892239 34.249604471540096 34.74959700749294 -038.249 22.75040126892239 23.35710447397239 34.249604471540096 34.74959700749294 -039.249 23.35710447397239 23.963807679022395 34.249604471540096 34.74959700749294 -040.249 23.963807679022395 24.57051088407239 34.249604471540096 34.74959700749294 -041.249 24.57051088407239 25.177214089122394 34.249604471540096 34.74959700749294 -042.249 25.177214089122394 25.783917294172397 34.249604471540096 34.74959700749294 -043.249 25.783917294172397 26.390620499222393 34.249604471540096 34.74959700749294 -044.249 26.390620499222393 26.99732370427239 34.249604471540096 34.74959700749294 -045.249 26.99732370427239 27.604026909322396 34.249604471540096 34.74959700749294 -046.249 27.604026909322396 28.210730114372396 34.249604471540096 34.74959700749294 -047.249 28.210730114372396 28.817433319372398 34.249604471540096 34.74959700749294 -048.249 28.817433319372398 29.424136524422394 34.249604471540096 34.74959700749294 -049.249 29.424136524422394 30.03083972947239 34.249604471540096 34.74959700749294 -050.249 30.03083972947239 30.637542934522394 34.249604471540096 34.74959700749294 -051.249 30.637542934522394 31.24424613957239 34.249604471540096 34.74959700749294 -052.249 31.24424613957239 31.850949344622393 34.249604471540096 34.74959700749294 -053.249 31.850949344622393 32.457652549672396 34.249604471540096 34.74959700749294 -054.249 32.457652549672396 33.06435575472239 34.249604471540096 34.74959700749294 -055.249 33.06435575472239 33.671058959772395 34.249604471540096 34.74959700749294 -056.249 33.671058959772395 34.27776216482239 34.249604471540096 34.74959700749294 -057.249 34.27776216482239 34.88446536987239 34.249604471540096 34.74959700749294 -058.249 34.88446536987239 35.49116857492238 34.249604471540096 34.74959700749294 -059.249 35.49116857492238 36.097871779972394 34.249604471540096 34.74959700749294 -060.249 36.097871779972394 36.714296355483185 34.249604471540096 34.74959700749294 -189.249 114.3528638605616 114.96928843607239 34.249604471540096 34.74959700749294 -190.249 114.96928843607239 115.57599164107239 34.249604471540096 34.74959700749294 -191.249 115.57599164107239 116.18269484612239 34.249604471540096 34.74959700749294 -192.249 116.18269484612239 116.78939805117238 34.249604471540096 34.74959700749294 -193.249 116.78939805117238 117.39610125622238 34.249604471540096 34.74959700749294 -194.249 117.39610125622238 118.0028044612724 34.249604471540096 34.74959700749294 -195.249 118.0028044612724 118.60950766632239 34.249604471540096 34.74959700749294 -196.249 118.60950766632239 119.2162108713724 34.249604471540096 34.74959700749294 -197.249 119.2162108713724 119.8229140764224 34.249604471540096 34.74959700749294 -198.249 119.8229140764224 120.42961728147239 34.249604471540096 34.74959700749294 -199.249 120.42961728147239 121.0363204865224 34.249604471540096 34.74959700749294 -200.249 121.0363204865224 121.64302369157241 34.249604471540096 34.74959700749294 -201.249 121.64302369157241 122.2497268966224 34.249604471540096 34.74959700749294 -202.249 122.2497268966224 122.8564301016724 34.249604471540096 34.74959700749294 -203.249 122.8564301016724 123.4631333067224 34.249604471540096 34.74959700749294 -204.249 123.4631333067224 124.0698365117724 34.249604471540096 34.74959700749294 -205.249 124.0698365117724 124.6765397167724 34.249604471540096 34.74959700749294 -206.249 124.6765397167724 125.2832429218224 34.249604471540096 34.74959700749294 -207.249 125.2832429218224 125.88994612687239 34.249604471540096 34.74959700749294 -208.249 125.88994612687239 126.49664933192241 34.249604471540096 34.74959700749294 -209.249 126.49664933192241 127.10335253697241 34.249604471540096 34.74959700749294 -210.249 127.10335253697241 127.7100557420224 34.249604471540096 34.74959700749294 -211.249 127.7100557420224 128.3167589470724 34.249604471540096 34.74959700749294 -212.249 128.3167589470724 128.9234621521224 34.249604471540096 34.74959700749294 -213.249 128.9234621521224 129.5301653571724 34.249604471540096 34.74959700749294 -214.249 129.5301653571724 130.1368685622224 34.249604471540096 34.74959700749294 -215.249 130.1368685622224 130.74357176727239 34.249604471540096 34.74959700749294 -216.249 130.74357176727239 131.35027497232238 34.249604471540096 34.74959700749294 -217.249 131.35027497232238 131.95697817737238 34.249604471540096 34.74959700749294 -218.249 131.95697817737238 132.56368138242237 34.249604471540096 34.74959700749294 -219.249 132.56368138242237 133.1703845874724 34.249604471540096 34.74959700749294 -220.249 133.1703845874724 133.7770877924724 34.249604471540096 34.74959700749294 -221.249 133.7770877924724 134.3837909975224 34.249604471540096 34.74959700749294 -222.249 134.3837909975224 134.9904942025724 34.249604471540096 34.74959700749294 -223.249 134.9904942025724 135.5971974076224 34.249604471540096 34.74959700749294 -224.249 135.5971974076224 136.2039006126724 34.249604471540096 34.74959700749294 -225.249 136.2039006126724 136.8106038177224 34.249604471540096 34.74959700749294 -226.249 136.8106038177224 137.41730702277238 34.249604471540096 34.74959700749294 -227.249 137.41730702277238 138.02401022782237 34.249604471540096 34.74959700749294 -228.249 138.02401022782237 138.63071343287237 34.249604471540096 34.74959700749294 -229.249 138.63071343287237 139.2374166379224 34.249604471540096 34.74959700749294 -230.249 139.2374166379224 139.84411984297242 34.249604471540096 34.74959700749294 -231.249 139.84411984297242 140.45082304802241 34.249604471540096 34.74959700749294 -232.249 140.45082304802241 141.0575262530724 34.249604471540096 34.74959700749294 -233.249 141.0575262530724 141.6642294581224 34.249604471540096 34.74959700749294 -234.249 141.6642294581224 142.2709326631724 34.249604471540096 34.74959700749294 -235.249 142.2709326631724 142.87763586822237 34.249604471540096 34.74959700749294 -236.249 142.87763586822237 143.48433907327237 34.249604471540096 34.74959700749294 -237.249 143.48433907327237 144.0910422782724 34.249604471540096 34.74959700749294 -238.249 144.0910422782724 144.6977454833224 34.249604471540096 34.74959700749294 -239.249 144.6977454833224 145.30444868837242 34.249604471540096 34.74959700749294 -240.249 145.30444868837242 145.9111518934224 34.249604471540096 34.74959700749294 -241.249 145.9111518934224 146.5178550984724 34.249604471540096 34.74959700749294 -242.249 146.5178550984724 147.1245583035224 34.249604471540096 34.74959700749294 -243.249 147.1245583035224 147.7312615085724 34.249604471540096 34.74959700749294 -244.249 147.7312615085724 148.3379647136224 34.249604471540096 34.74959700749294 -245.249 148.3379647136224 148.9446679186724 34.249604471540096 34.74959700749294 -246.249 148.9446679186724 149.5513711237224 34.249604471540096 34.74959700749294 -247.249 149.5513711237224 150.1580743287724 34.249604471540096 34.74959700749294 -248.249 150.1580743287724 150.76477753382238 34.249604471540096 34.74959700749294 -249.249 150.76477753382238 151.37148073887238 34.249604471540096 34.74959700749294 -250.249 151.37148073887238 151.9781839439224 34.249604471540096 34.74959700749294 -251.249 151.9781839439224 152.5848871489724 34.249604471540096 34.74959700749294 -252.249 152.5848871489724 153.1915903539724 34.249604471540096 34.74959700749294 -253.249 153.1915903539724 153.79829355902237 34.249604471540096 34.74959700749294 -254.249 153.79829355902237 154.4049967640724 34.249604471540096 34.74959700749294 -255.249 154.4049967640724 155.0116999691224 34.249604471540096 34.74959700749294 -256.249 155.0116999691224 155.61840317417239 34.249604471540096 34.74959700749294 -257.249 155.61840317417239 156.22510637922238 34.249604471540096 34.74959700749294 -258.249 156.22510637922238 156.83180958427238 34.249604471540096 34.74959700749294 -259.249 156.83180958427238 157.4385127893224 34.249604471540096 34.74959700749294 -260.249 157.4385127893224 158.0549373648832 34.249604471540096 34.74959700749294 -263.249 159.2489010339616 159.86532560952242 34.249604471540096 34.74959700749294 -264.249 159.86532560952242 160.4720288145724 34.249604471540096 34.74959700749294 -265.249 160.4720288145724 161.0787320196224 34.249604471540096 34.74959700749294 -266.249 161.0787320196224 161.6854352246724 34.249604471540096 34.74959700749294 -267.249 161.6854352246724 162.29213842967238 34.249604471540096 34.74959700749294 -268.249 162.29213842967238 162.8988416347224 34.249604471540096 34.74959700749294 -269.249 162.8988416347224 163.5055448397724 34.249604471540096 34.74959700749294 -270.249 163.5055448397724 164.11224804482242 34.249604471540096 34.74959700749294 -271.249 164.11224804482242 164.71895124987242 34.249604471540096 34.74959700749294 -272.249 164.71895124987242 165.32565445492241 34.249604471540096 34.74959700749294 -273.249 165.32565445492241 165.9323576599724 34.249604471540096 34.74959700749294 -274.249 165.9323576599724 166.5390608650224 34.249604471540096 34.74959700749294 -275.249 166.5390608650224 167.1457640700724 34.249604471540096 34.74959700749294 -276.249 167.1457640700724 167.7524672751224 34.249604471540096 34.74959700749294 -277.249 167.7524672751224 168.3591704801724 34.249604471540096 34.74959700749294 -278.249 168.3591704801724 168.9658736852224 34.249604471540096 34.74959700749294 -279.249 168.9658736852224 169.57257689027242 34.249604471540096 34.74959700749294 -280.249 169.57257689027242 170.17928009532238 34.249604471540096 34.74959700749294 -281.249 170.17928009532238 170.7859833003724 34.249604471540096 34.74959700749294 -282.249 170.7859833003724 171.39268650542238 34.249604471540096 34.74959700749294 -283.249 171.39268650542238 171.9993897104724 34.249604471540096 34.74959700749294 -284.249 171.9993897104724 172.6060929154724 34.249604471540096 34.74959700749294 -285.249 172.6060929154724 173.2127961205224 34.249604471540096 34.74959700749294 -286.249 173.2127961205224 173.8194993255724 34.249604471540096 34.74959700749294 -287.249 173.8194993255724 174.4262025306224 34.249604471540096 34.74959700749294 -288.249 174.4262025306224 175.03290573567241 34.249604471540096 34.74959700749294 -289.249 175.03290573567241 175.63960894072238 34.249604471540096 34.74959700749294 -290.249 175.63960894072238 176.2463121457724 34.249604471540096 34.74959700749294 -291.249 176.2463121457724 176.85301535082237 34.249604471540096 34.74959700749294 -292.249 176.85301535082237 177.4597185558724 34.249604471540096 34.74959700749294 -293.249 177.4597185558724 178.0664217609224 34.249604471540096 34.74959700749294 -294.249 178.0664217609224 178.67312496597242 34.249604471540096 34.74959700749294 -295.249 178.67312496597242 179.2798281710224 34.249604471540096 34.74959700749294 -296.249 179.2798281710224 179.8865313760724 34.249604471540096 34.74959700749294 -297.249 179.8865313760724 180.49323458112238 34.249604471540096 34.74959700749294 -298.249 180.49323458112238 181.09993778617238 34.249604471540096 34.74959700749294 -299.249 181.09993778617238 181.70664099117238 34.249604471540096 34.74959700749294 -300.249 181.70664099117238 182.31334419622237 34.249604471540096 34.74959700749294 -301.249 182.31334419622237 182.92004740127237 34.249604471540096 34.74959700749294 -302.249 182.92004740127237 183.52675060632237 34.249604471540096 34.74959700749294 -303.249 183.52675060632237 184.1334538113724 34.249604471540096 34.74959700749294 -304.249 184.1334538113724 184.74015701642236 34.249604471540096 34.74959700749294 -305.249 184.74015701642236 185.3468602214724 34.249604471540096 34.74959700749294 -306.249 185.3468602214724 185.95356342652238 34.249604471540096 34.74959700749294 -307.249 185.95356342652238 186.56026663157238 34.249604471540096 34.74959700749294 -308.249 186.56026663157238 187.16696983662237 34.249604471540096 34.74959700749294 -309.249 187.16696983662237 187.77367304167237 34.249604471540096 34.74959700749294 -310.249 187.77367304167237 188.3803762467224 34.249604471540096 34.74959700749294 -311.249 188.3803762467224 188.9870794517724 34.249604471540096 34.74959700749294 -312.249 188.9870794517724 189.59378265682238 34.249604471540096 34.74959700749294 -313.249 189.59378265682238 190.20048586187238 34.249604471540096 34.74959700749294 -314.249 190.20048586187238 190.8071890668724 34.249604471540096 34.74959700749294 -315.249 190.8071890668724 191.41389227192238 34.249604471540096 34.74959700749294 -316.249 191.41389227192238 192.02059547697237 34.249604471540096 34.74959700749294 -317.249 192.02059547697237 192.62729868202237 34.249604471540096 34.74959700749294 -318.249 192.62729868202237 193.23400188707237 34.249604471540096 34.74959700749294 -319.249 193.23400188707237 193.8407050921224 34.249604471540096 34.74959700749294 -320.249 193.8407050921224 194.4571296676832 34.249604471540096 34.74959700749294 -372.249 225.3795503840616 225.99597495962237 34.249604471540096 34.74959700749294 -373.249 225.99597495962237 226.60267816467237 34.249604471540096 34.74959700749294 -374.249 226.60267816467237 227.2093813697224 34.249604471540096 34.74959700749294 -375.249 227.2093813697224 227.8160845747724 34.249604471540096 34.74959700749294 -376.249 227.8160845747724 228.4227877798224 34.249604471540096 34.74959700749294 -377.249 228.4227877798224 229.02949098487238 34.249604471540096 34.74959700749294 -378.249 229.02949098487238 229.63619418987238 34.249604471540096 34.74959700749294 -379.249 229.63619418987238 230.2428973949224 34.249604471540096 34.74959700749294 -380.249 230.2428973949224 230.8496005999724 34.249604471540096 34.74959700749294 -381.249 230.8496005999724 231.4563038050224 34.249604471540096 34.74959700749294 -382.249 231.4563038050224 232.06300701007237 34.249604471540096 34.74959700749294 -383.249 232.06300701007237 232.6697102151224 34.249604471540096 34.74959700749294 -384.249 232.6697102151224 233.2764134201724 34.249604471540096 34.74959700749294 -385.249 233.2764134201724 233.88311662522239 34.249604471540096 34.74959700749294 -386.249 233.88311662522239 234.4898198302724 34.249604471540096 34.74959700749294 -387.249 234.4898198302724 235.09652303532238 34.249604471540096 34.74959700749294 -388.249 235.09652303532238 235.70322624037237 34.249604471540096 34.74959700749294 -389.249 235.70322624037237 236.30992944542237 34.249604471540096 34.74959700749294 -390.249 236.30992944542237 236.9166326504724 34.249604471540096 34.74959700749294 -391.249 236.9166326504724 237.52333585552242 34.249604471540096 34.74959700749294 -392.249 237.52333585552242 238.13003906057241 34.249604471540096 34.74959700749294 -393.249 238.13003906057241 238.7367422655724 34.249604471540096 34.74959700749294 -394.249 238.7367422655724 239.34344547062238 34.249604471540096 34.74959700749294 -395.249 239.34344547062238 239.95014867567238 34.249604471540096 34.74959700749294 -396.249 239.95014867567238 240.55685188072238 34.249604471540096 34.74959700749294 -397.249 240.55685188072238 241.1635550857724 34.249604471540096 34.74959700749294 -398.249 241.1635550857724 241.77025829082237 34.249604471540096 34.74959700749294 -399.249 241.77025829082237 242.37696149587234 34.249604471540096 34.74959700749294 -400.249 242.37696149587234 242.98366470092236 34.249604471540096 34.74959700749294 -401.249 242.98366470092236 243.59036790597236 34.249604471540096 34.74959700749294 -402.249 243.59036790597236 244.1970711110224 34.249604471540096 34.74959700749294 -403.249 244.1970711110224 244.8037743160724 34.249604471540096 34.74959700749294 -404.249 244.8037743160724 245.4104775211224 34.249604471540096 34.74959700749294 -405.249 245.4104775211224 246.0171807261724 34.249604471540096 34.74959700749294 -406.249 246.0171807261724 246.6238839312224 34.249604471540096 34.74959700749294 -407.249 246.6238839312224 247.2305871362724 34.249604471540096 34.74959700749294 -408.249 247.2305871362724 247.8372903412724 34.249604471540096 34.74959700749294 -409.249 247.8372903412724 248.4439935463224 34.249604471540096 34.74959700749294 -410.249 248.4439935463224 249.05069675137239 34.249604471540096 34.74959700749294 -411.249 249.05069675137239 249.65739995642238 34.249604471540096 34.74959700749294 -412.249 249.65739995642238 250.26410316147238 34.249604471540096 34.74959700749294 -413.249 250.26410316147238 250.87080636652237 34.249604471540096 34.74959700749294 -414.249 250.87080636652237 251.47750957157237 34.249604471540096 34.74959700749294 -415.249 251.47750957157237 252.0842127766224 34.249604471540096 34.74959700749294 -416.249 252.0842127766224 252.6909159816724 34.249604471540096 34.74959700749294 -417.249 252.6909159816724 253.2976191867224 34.249604471540096 34.74959700749294 -418.249 253.2976191867224 253.90432239177238 34.249604471540096 34.74959700749294 -419.249 253.90432239177238 254.51102559682238 34.249604471540096 34.74959700749294 -420.249 254.51102559682238 255.11772880187237 34.249604471540096 34.74959700749294 -421.249 255.11772880187237 255.72443200692237 34.249604471540096 34.74959700749294 -422.249 255.72443200692237 256.3311352119724 34.249604471540096 34.74959700749294 -423.249 256.3311352119724 256.93783841702236 34.249604471540096 34.74959700749294 -424.249 256.93783841702236 257.5445416220724 34.249604471540096 34.74959700749294 -425.249 257.5445416220724 258.1512448270724 34.249604471540096 34.74959700749294 -426.249 258.1512448270724 258.7579480321224 34.249604471540096 34.74959700749294 -427.249 258.7579480321224 259.3646512371724 34.249604471540096 34.74959700749294 -428.249 259.3646512371724 259.9713544422224 34.249604471540096 34.74959700749294 -429.249 259.9713544422224 260.57805764727243 34.249604471540096 34.74959700749294 -430.249 260.57805764727243 261.18476085232237 34.249604471540096 34.74959700749294 -431.249 261.18476085232237 261.7914640573724 34.249604471540096 34.74959700749294 -432.249 261.7914640573724 262.39816726242236 34.249604471540096 34.74959700749294 -433.249 262.39816726242236 263.0048704674724 34.249604471540096 34.74959700749294 -434.249 263.0048704674724 263.6115736725224 34.249604471540096 34.74959700749294 -435.249 263.6115736725224 264.2182768775724 34.249604471540096 34.74959700749294 -436.249 264.2182768775724 264.8249800826224 34.249604471540096 34.74959700749294 -437.249 264.8249800826224 265.4316832876724 34.249604471540096 34.74959700749294 -438.249 265.4316832876724 266.0383864927224 34.249604471540096 34.74959700749294 -439.249 266.0383864927224 266.6450896977724 34.249604471540096 34.74959700749294 -440.249 266.6450896977724 267.2517929027724 34.249604471540096 34.74959700749294 -441.249 267.2517929027724 267.85849610782236 34.249604471540096 34.74959700749294 -442.249 267.85849610782236 268.4651993128724 34.249604471540096 34.74959700749294 -443.249 268.4651993128724 269.0719025179224 34.249604471540096 34.74959700749294 -444.249 269.0719025179224 269.6786057229724 34.249604471540096 34.74959700749294 -445.249 269.6786057229724 270.2853089280224 34.249604471540096 34.74959700749294 -446.249 270.2853089280224 270.90173350358316 34.249604471540096 34.74959700749294 -574.249 347.9335978035616 348.5500223790724 34.249604471540096 34.74959700749294 -575.249 348.5500223790724 349.1567255841224 34.249604471540096 34.74959700749294 -576.249 349.1567255841224 349.7634287891724 34.249604471540096 34.74959700749294 -577.249 349.7634287891724 350.3701319942224 34.249604471540096 34.74959700749294 -578.249 350.3701319942224 350.9768351992724 34.249604471540096 34.74959700749294 -579.249 350.9768351992724 351.5835384043224 34.249604471540096 34.74959700749294 -580.249 351.5835384043224 352.1902416093724 34.249604471540096 34.74959700749294 -581.249 352.1902416093724 352.79694481437235 34.249604471540096 34.74959700749294 -582.249 352.79694481437235 353.4036480194224 34.249604471540096 34.74959700749294 -583.249 353.4036480194224 354.0103512244724 34.249604471540096 34.74959700749294 -584.249 354.0103512244724 354.6170544295224 34.249604471540096 34.74959700749294 -585.249 354.6170544295224 355.2237576345724 34.249604471540096 34.74959700749294 -586.249 355.2237576345724 355.8304608396224 34.249604471540096 34.74959700749294 -587.249 355.8304608396224 356.4371640446724 34.249604471540096 34.74959700749294 -588.249 356.4371640446724 357.0438672497224 34.249604471540096 34.74959700749294 -589.249 357.0438672497224 357.6505704547724 34.249604471540096 34.74959700749294 -590.249 357.6505704547724 358.2572736598224 34.249604471540096 34.74959700749294 -591.249 358.2572736598224 358.86397686487237 34.249604471540096 34.74959700749294 -592.249 358.86397686487237 359.48040144038316 34.249604471540096 34.74959700749294 -000.249 359.6859581066616 0.3023826821723936 34.249604471540096 34.74959700749294 -001.250 0.30420050889409045 0.9145878032940904 34.74959700749294 35.24958945252204 -002.250 0.9145878032940904 1.5249750976440906 34.74959700749294 35.24958945252204 -003.250 1.5249750976440906 2.1353623919940903 34.74959700749294 35.24958945252204 -004.250 2.1353623919940903 2.745749686394091 34.74959700749294 35.24958945252204 -005.250 2.745749686394091 3.356136980794091 34.74959700749294 35.24958945252204 -006.250 3.356136980794091 3.9665242751940903 34.74959700749294 35.24958945252204 -007.250 3.9665242751940903 4.576911569544091 34.74959700749294 35.24958945252204 -008.250 4.576911569544091 5.187298863894091 34.74959700749294 35.24958945252204 -009.250 5.187298863894091 5.7976861582940895 34.74959700749294 35.24958945252204 -010.250 5.7976861582940895 6.40807345269409 34.74959700749294 35.24958945252204 -011.250 6.40807345269409 7.018460747094091 34.74959700749294 35.24958945252204 -012.250 7.018460747094091 7.6288480414440905 34.74959700749294 35.24958945252204 -013.250 7.6288480414440905 8.239235335794088 34.74959700749294 35.24958945252204 -014.250 8.239235335794088 8.84962263019409 34.74959700749294 35.24958945252204 -015.250 8.84962263019409 9.46000992459409 34.74959700749294 35.24958945252204 -016.250 9.46000992459409 10.070397218994088 34.74959700749294 35.24958945252204 -017.250 10.070397218994088 10.68078451339409 34.74959700749294 35.24958945252204 -018.250 10.68078451339409 11.291171807744089 34.74959700749294 35.24958945252204 -019.250 11.291171807744089 11.90155910209409 34.74959700749294 35.24958945252204 -020.250 11.90155910209409 12.511946396494093 34.74959700749294 35.24958945252204 -021.250 12.511946396494093 13.122333690894092 34.74959700749294 35.24958945252204 -022.250 13.122333690894092 13.73272098529409 34.74959700749294 35.24958945252204 -023.250 13.73272098529409 14.343108279644088 34.74959700749294 35.24958945252204 -024.250 14.343108279644088 14.953495573994092 34.74959700749294 35.24958945252204 -025.250 14.953495573994092 15.563882868394089 34.74959700749294 35.24958945252204 -026.250 15.563882868394089 16.174270162794095 34.74959700749294 35.24958945252204 -027.250 16.174270162794095 16.784657457194093 34.74959700749294 35.24958945252204 -028.250 16.784657457194093 17.395044751544095 34.74959700749294 35.24958945252204 -029.250 17.395044751544095 18.00543204589409 34.74959700749294 35.24958945252204 -030.250 18.00543204589409 18.615819340294088 34.74959700749294 35.24958945252204 -031.250 18.615819340294088 19.22620663469409 34.74959700749294 35.24958945252204 -032.250 19.22620663469409 19.836593929094093 34.74959700749294 35.24958945252204 -033.250 19.836593929094093 20.44698122344409 34.74959700749294 35.24958945252204 -034.250 20.44698122344409 21.05736851779409 34.74959700749294 35.24958945252204 -035.250 21.05736851779409 21.66775581219409 34.74959700749294 35.24958945252204 -036.250 21.66775581219409 22.27814310659409 34.74959700749294 35.24958945252204 -037.250 22.27814310659409 22.888530400994092 34.74959700749294 35.24958945252204 -038.250 22.888530400994092 23.49891769534409 34.74959700749294 35.24958945252204 -039.250 23.49891769534409 24.10930498969409 34.74959700749294 35.24958945252204 -040.250 24.10930498969409 24.71969228409409 34.74959700749294 35.24958945252204 -041.250 24.71969228409409 25.330079578494093 34.74959700749294 35.24958945252204 -042.250 25.330079578494093 25.940466872894092 34.74959700749294 35.24958945252204 -043.250 25.940466872894092 26.55085416729409 34.74959700749294 35.24958945252204 -044.250 26.55085416729409 27.16124146164409 34.74959700749294 35.24958945252204 -045.250 27.16124146164409 27.77162875599409 34.74959700749294 35.24958945252204 -046.250 27.77162875599409 28.382016050394093 34.74959700749294 35.24958945252204 -047.250 28.382016050394093 28.992403344794095 34.74959700749294 35.24958945252204 -048.250 28.992403344794095 29.60279063919409 34.74959700749294 35.24958945252204 -049.250 29.60279063919409 30.21317793354409 34.74959700749294 35.24958945252204 -050.250 30.21317793354409 30.823565227894086 34.74959700749294 35.24958945252204 -051.250 30.823565227894086 31.43395252229409 34.74959700749294 35.24958945252204 -052.250 31.43395252229409 32.044339816694084 34.74959700749294 35.24958945252204 -053.250 32.044339816694084 32.65472711109409 34.74959700749294 35.24958945252204 -054.250 32.65472711109409 33.265114405444095 34.74959700749294 35.24958945252204 -055.250 33.265114405444095 33.8755016997941 34.74959700749294 35.24958945252204 -056.250 33.8755016997941 34.485888994194084 34.74959700749294 35.24958945252204 -057.250 34.485888994194084 35.09627628859409 34.74959700749294 35.24958945252204 -058.250 35.09627628859409 35.70666358299408 34.74959700749294 35.24958945252204 -059.250 35.70666358299408 36.32683135540318 34.74959700749294 35.24958945252204 -187.250 113.82645678568501 114.4466245580941 34.74959700749294 35.24958945252204 -188.250 114.4466245580941 115.0570118524941 34.74959700749294 35.24958945252204 -189.250 115.0570118524941 115.6673991468441 34.74959700749294 35.24958945252204 -190.250 115.6673991468441 116.2777864411941 34.74959700749294 35.24958945252204 -191.250 116.2777864411941 116.88817373559408 34.74959700749294 35.24958945252204 -192.250 116.88817373559408 117.49856102999408 34.74959700749294 35.24958945252204 -193.250 117.49856102999408 118.10894832439409 34.74959700749294 35.24958945252204 -194.250 118.10894832439409 118.71933561874411 34.74959700749294 35.24958945252204 -195.250 118.71933561874411 119.32972291309409 34.74959700749294 35.24958945252204 -196.250 119.32972291309409 119.94011020749409 34.74959700749294 35.24958945252204 -197.250 119.94011020749409 120.55049750189409 34.74959700749294 35.24958945252204 -198.250 120.55049750189409 121.16088479629408 34.74959700749294 35.24958945252204 -199.250 121.16088479629408 121.7712720906441 34.74959700749294 35.24958945252204 -200.250 121.7712720906441 122.3816593849941 34.74959700749294 35.24958945252204 -201.250 122.3816593849941 122.99204667939408 34.74959700749294 35.24958945252204 -202.250 122.99204667939408 123.60243397379409 34.74959700749294 35.24958945252204 -203.250 123.60243397379409 124.21282126819412 34.74959700749294 35.24958945252204 -204.250 124.21282126819412 124.8232085625441 34.74959700749294 35.24958945252204 -205.250 124.8232085625441 125.4335958568941 34.74959700749294 35.24958945252204 -206.250 125.4335958568941 126.0439831512941 34.74959700749294 35.24958945252204 -207.250 126.0439831512941 126.6543704456941 34.74959700749294 35.24958945252204 -208.250 126.6543704456941 127.26475774009408 34.74959700749294 35.24958945252204 -209.250 127.26475774009408 127.8751450344941 34.74959700749294 35.24958945252204 -210.250 127.8751450344941 128.4855323288441 34.74959700749294 35.24958945252204 -211.250 128.4855323288441 129.0959196231941 34.74959700749294 35.24958945252204 -212.250 129.0959196231941 129.70630691759408 34.74959700749294 35.24958945252204 -213.250 129.70630691759408 130.3166942119941 34.74959700749294 35.24958945252204 -214.250 130.3166942119941 130.92708150639413 34.74959700749294 35.24958945252204 -215.250 130.92708150639413 131.53746880074408 34.74959700749294 35.24958945252204 -216.250 131.53746880074408 132.14785609509408 34.74959700749294 35.24958945252204 -217.250 132.14785609509408 132.7582433894941 34.74959700749294 35.24958945252204 -218.250 132.7582433894941 133.36863068389414 34.74959700749294 35.24958945252204 -219.250 133.36863068389414 133.9790179782941 34.74959700749294 35.24958945252204 -220.250 133.9790179782941 134.58940527264411 34.74959700749294 35.24958945252204 -221.250 134.58940527264411 135.19979256699406 34.74959700749294 35.24958945252204 -222.250 135.19979256699406 135.8101798613941 34.74959700749294 35.24958945252204 -223.250 135.8101798613941 136.42056715579412 34.74959700749294 35.24958945252204 -224.250 136.42056715579412 137.0309544501941 34.74959700749294 35.24958945252204 -225.250 137.0309544501941 137.6413417445441 34.74959700749294 35.24958945252204 -226.250 137.6413417445441 138.2517290388941 34.74959700749294 35.24958945252204 -227.250 138.2517290388941 138.86211633329413 34.74959700749294 35.24958945252204 -228.250 138.86211633329413 139.4725036276941 34.74959700749294 35.24958945252204 -229.250 139.4725036276941 140.08289092209407 34.74959700749294 35.24958945252204 -230.250 140.08289092209407 140.6932782164441 34.74959700749294 35.24958945252204 -231.250 140.6932782164441 141.3036655107941 34.74959700749294 35.24958945252204 -232.250 141.3036655107941 141.9140528051941 34.74959700749294 35.24958945252204 -233.250 141.9140528051941 142.52444009959407 34.74959700749294 35.24958945252204 -234.250 142.52444009959407 143.1348273939941 34.74959700749294 35.24958945252204 -235.250 143.1348273939941 143.74521468839407 34.74959700749294 35.24958945252204 -236.250 143.74521468839407 144.35560198274408 34.74959700749294 35.24958945252204 -237.250 144.35560198274408 144.96598927709408 34.74959700749294 35.24958945252204 -238.250 144.96598927709408 145.5763765714941 34.74959700749294 35.24958945252204 -239.250 145.5763765714941 146.1867638658941 34.74959700749294 35.24958945252204 -240.250 146.1867638658941 146.7971511602941 34.74959700749294 35.24958945252204 -241.250 146.7971511602941 147.4075384546441 34.74959700749294 35.24958945252204 -242.250 147.4075384546441 148.01792574899406 34.74959700749294 35.24958945252204 -243.250 148.01792574899406 148.6283130433941 34.74959700749294 35.24958945252204 -244.250 148.6283130433941 149.23870033779409 34.74959700749294 35.24958945252204 -245.250 149.23870033779409 149.84908763219408 34.74959700749294 35.24958945252204 -246.250 149.84908763219408 150.4594749265441 34.74959700749294 35.24958945252204 -247.250 150.4594749265441 151.0698622208941 34.74959700749294 35.24958945252204 -248.250 151.0698622208941 151.6802495152941 34.74959700749294 35.24958945252204 -249.250 151.6802495152941 152.2906368096941 34.74959700749294 35.24958945252204 -250.250 152.2906368096941 152.9010241040941 34.74959700749294 35.24958945252204 -251.250 152.9010241040941 153.5114113984441 34.74959700749294 35.24958945252204 -252.250 153.5114113984441 154.1217986927941 34.74959700749294 35.24958945252204 -253.250 154.1217986927941 154.7321859871941 34.74959700749294 35.24958945252204 -254.250 154.7321859871941 155.3425732815941 34.74959700749294 35.24958945252204 -255.250 155.3425732815941 155.9529605759941 34.74959700749294 35.24958945252204 -256.250 155.9529605759941 156.5633478703441 34.74959700749294 35.24958945252204 -257.250 156.5633478703441 157.1737351646941 34.74959700749294 35.24958945252204 -258.250 157.1737351646941 157.7939029371032 34.74959700749294 35.24958945252204 -261.250 158.995116569885 159.6152843422941 34.74959700749294 35.24958945252204 -262.250 159.6152843422941 160.2256716366441 34.74959700749294 35.24958945252204 -263.250 160.2256716366441 160.8360589309941 34.74959700749294 35.24958945252204 -264.250 160.8360589309941 161.44644622539408 34.74959700749294 35.24958945252204 -265.250 161.44644622539408 162.0568335197941 34.74959700749294 35.24958945252204 -266.250 162.0568335197941 162.6672208141941 34.74959700749294 35.24958945252204 -267.250 162.6672208141941 163.2776081085441 34.74959700749294 35.24958945252204 -268.250 163.2776081085441 163.8879954028941 34.74959700749294 35.24958945252204 -269.250 163.8879954028941 164.49838269729406 34.74959700749294 35.24958945252204 -270.250 164.49838269729406 165.1087699916941 34.74959700749294 35.24958945252204 -271.250 165.1087699916941 165.7191572860941 34.74959700749294 35.24958945252204 -272.250 165.7191572860941 166.3295445804441 34.74959700749294 35.24958945252204 -273.250 166.3295445804441 166.93993187479407 34.74959700749294 35.24958945252204 -274.250 166.93993187479407 167.5503191691941 34.74959700749294 35.24958945252204 -275.250 167.5503191691941 168.1607064635941 34.74959700749294 35.24958945252204 -276.250 168.1607064635941 168.7710937579941 34.74959700749294 35.24958945252204 -277.250 168.7710937579941 169.3814810523441 34.74959700749294 35.24958945252204 -278.250 169.3814810523441 169.9918683466941 34.74959700749294 35.24958945252204 -279.250 169.9918683466941 170.60225564109413 34.74959700749294 35.24958945252204 -280.250 170.60225564109413 171.2126429354941 34.74959700749294 35.24958945252204 -281.250 171.2126429354941 171.8230302298941 34.74959700749294 35.24958945252204 -282.250 171.8230302298941 172.4334175242441 34.74959700749294 35.24958945252204 -283.250 172.4334175242441 173.04380481859414 34.74959700749294 35.24958945252204 -284.250 173.04380481859414 173.6541921129941 34.74959700749294 35.24958945252204 -285.250 173.6541921129941 174.2645794073941 34.74959700749294 35.24958945252204 -286.250 174.2645794073941 174.8749667017941 34.74959700749294 35.24958945252204 -287.250 174.8749667017941 175.4853539961441 34.74959700749294 35.24958945252204 -288.250 175.4853539961441 176.09574129049412 34.74959700749294 35.24958945252204 -289.250 176.09574129049412 176.7061285848941 34.74959700749294 35.24958945252204 -290.250 176.7061285848941 177.3165158792941 34.74959700749294 35.24958945252204 -291.250 177.3165158792941 177.9269031736941 34.74959700749294 35.24958945252204 -292.250 177.9269031736941 178.5372904680941 34.74959700749294 35.24958945252204 -293.250 178.5372904680941 179.14767776244412 34.74959700749294 35.24958945252204 -294.250 179.14767776244412 179.7580650567941 34.74959700749294 35.24958945252204 -295.250 179.7580650567941 180.36845235119407 34.74959700749294 35.24958945252204 -296.250 180.36845235119407 180.97883964559406 34.74959700749294 35.24958945252204 -297.250 180.97883964559406 181.58922693999406 34.74959700749294 35.24958945252204 -298.250 181.58922693999406 182.19961423434407 34.74959700749294 35.24958945252204 -299.250 182.19961423434407 182.81000152869407 34.74959700749294 35.24958945252204 -300.250 182.81000152869407 183.42038882309407 34.74959700749294 35.24958945252204 -301.250 183.42038882309407 184.03077611749407 34.74959700749294 35.24958945252204 -302.250 184.03077611749407 184.64116341189407 34.74959700749294 35.24958945252204 -303.250 184.64116341189407 185.25155070624407 34.74959700749294 35.24958945252204 -304.250 185.25155070624407 185.86193800059408 34.74959700749294 35.24958945252204 -305.250 185.86193800059408 186.47232529499408 34.74959700749294 35.24958945252204 -306.250 186.47232529499408 187.08271258939408 34.74959700749294 35.24958945252204 -307.250 187.08271258939408 187.6930998837941 34.74959700749294 35.24958945252204 -308.250 187.6930998837941 188.30348717814405 34.74959700749294 35.24958945252204 -309.250 188.30348717814405 188.91387447249406 34.74959700749294 35.24958945252204 -310.250 188.91387447249406 189.52426176689409 34.74959700749294 35.24958945252204 -311.250 189.52426176689409 190.13464906129408 34.74959700749294 35.24958945252204 -312.250 190.13464906129408 190.74503635569408 34.74959700749294 35.24958945252204 -313.250 190.74503635569408 191.3554236500441 34.74959700749294 35.24958945252204 -314.250 191.3554236500441 191.9658109443941 34.74959700749294 35.24958945252204 -315.250 191.9658109443941 192.5761982387941 34.74959700749294 35.24958945252204 -316.250 192.5761982387941 193.1865855331941 34.74959700749294 35.24958945252204 -317.250 193.1865855331941 193.79697282759406 34.74959700749294 35.24958945252204 -318.250 193.79697282759406 194.41714060000314 34.74959700749294 35.24958945252204 -370.250 225.527331657385 226.1474994297941 34.74959700749294 35.24958945252204 -371.250 226.1474994297941 226.7578867241441 34.74959700749294 35.24958945252204 -372.250 226.7578867241441 227.3682740184941 34.74959700749294 35.24958945252204 -373.250 227.3682740184941 227.9786613128941 34.74959700749294 35.24958945252204 -374.250 227.9786613128941 228.58904860729407 34.74959700749294 35.24958945252204 -375.250 228.58904860729407 229.1994359016941 34.74959700749294 35.24958945252204 -376.250 229.1994359016941 229.80982319604408 34.74959700749294 35.24958945252204 -377.250 229.80982319604408 230.42021049039408 34.74959700749294 35.24958945252204 -378.250 230.42021049039408 231.0305977847941 34.74959700749294 35.24958945252204 -379.250 231.0305977847941 231.64098507919408 34.74959700749294 35.24958945252204 -380.250 231.64098507919408 232.2513723735941 34.74959700749294 35.24958945252204 -381.250 232.2513723735941 232.86175966794406 34.74959700749294 35.24958945252204 -382.250 232.86175966794406 233.47214696229406 34.74959700749294 35.24958945252204 -383.250 233.47214696229406 234.08253425669406 34.74959700749294 35.24958945252204 -384.250 234.08253425669406 234.69292155109406 34.74959700749294 35.24958945252204 -385.250 234.69292155109406 235.30330884549406 34.74959700749294 35.24958945252204 -386.250 235.30330884549406 235.9136961398441 34.74959700749294 35.24958945252204 -387.250 235.9136961398441 236.5240834341941 34.74959700749294 35.24958945252204 -388.250 236.5240834341941 237.13447072859407 34.74959700749294 35.24958945252204 -389.250 237.13447072859407 237.7448580229941 34.74959700749294 35.24958945252204 -390.250 237.7448580229941 238.35524531739406 34.74959700749294 35.24958945252204 -391.250 238.35524531739406 238.96563261174407 34.74959700749294 35.24958945252204 -392.250 238.96563261174407 239.57601990609407 34.74959700749294 35.24958945252204 -393.250 239.57601990609407 240.1864072004941 34.74959700749294 35.24958945252204 -394.250 240.1864072004941 240.79679449489407 34.74959700749294 35.24958945252204 -395.250 240.79679449489407 241.40718178929407 34.74959700749294 35.24958945252204 -396.250 241.40718178929407 242.01756908364405 34.74959700749294 35.24958945252204 -397.250 242.01756908364405 242.6279563779941 34.74959700749294 35.24958945252204 -398.250 242.6279563779941 243.23834367239408 34.74959700749294 35.24958945252204 -399.250 243.23834367239408 243.84873096679408 34.74959700749294 35.24958945252204 -400.250 243.84873096679408 244.45911826119408 34.74959700749294 35.24958945252204 -401.250 244.45911826119408 245.06950555559408 34.74959700749294 35.24958945252204 -402.250 245.06950555559408 245.67989284994405 34.74959700749294 35.24958945252204 -403.250 245.67989284994405 246.29028014429406 34.74959700749294 35.24958945252204 -404.250 246.29028014429406 246.90066743869406 34.74959700749294 35.24958945252204 -405.250 246.90066743869406 247.51105473309406 34.74959700749294 35.24958945252204 -406.250 247.51105473309406 248.1214420274941 34.74959700749294 35.24958945252204 -407.250 248.1214420274941 248.7318293218441 34.74959700749294 35.24958945252204 -408.250 248.7318293218441 249.34221661619407 34.74959700749294 35.24958945252204 -409.250 249.34221661619407 249.95260391059406 34.74959700749294 35.24958945252204 -410.250 249.95260391059406 250.56299120499406 34.74959700749294 35.24958945252204 -411.250 250.56299120499406 251.17337849939406 34.74959700749294 35.24958945252204 -412.250 251.17337849939406 251.7837657937441 34.74959700749294 35.24958945252204 -413.250 251.7837657937441 252.3941530880941 34.74959700749294 35.24958945252204 -414.250 252.3941530880941 253.0045403824941 34.74959700749294 35.24958945252204 -415.250 253.0045403824941 253.61492767689407 34.74959700749294 35.24958945252204 -416.250 253.61492767689407 254.2253149712941 34.74959700749294 35.24958945252204 -417.250 254.2253149712941 254.8357022656441 34.74959700749294 35.24958945252204 -418.250 254.8357022656441 255.4460895599941 34.74959700749294 35.24958945252204 -419.250 255.4460895599941 256.0564768543941 34.74959700749294 35.24958945252204 -420.250 256.0564768543941 256.66686414879405 34.74959700749294 35.24958945252204 -421.250 256.66686414879405 257.2772514431941 34.74959700749294 35.24958945252204 -422.250 257.2772514431941 257.8876387375441 34.74959700749294 35.24958945252204 -423.250 257.8876387375441 258.4980260318941 34.74959700749294 35.24958945252204 -424.250 258.4980260318941 259.1084133262941 34.74959700749294 35.24958945252204 -425.250 259.1084133262941 259.7188006206941 34.74959700749294 35.24958945252204 -426.250 259.7188006206941 260.32918791509405 34.74959700749294 35.24958945252204 -427.250 260.32918791509405 260.9395752094941 34.74959700749294 35.24958945252204 -428.250 260.9395752094941 261.5499625038441 34.74959700749294 35.24958945252204 -429.250 261.5499625038441 262.1603497981941 34.74959700749294 35.24958945252204 -430.250 262.1603497981941 262.7707370925941 34.74959700749294 35.24958945252204 -431.250 262.7707370925941 263.3811243869941 34.74959700749294 35.24958945252204 -432.250 263.3811243869941 263.99151168139406 34.74959700749294 35.24958945252204 -433.250 263.99151168139406 264.60189897574406 34.74959700749294 35.24958945252204 -434.250 264.60189897574406 265.21228627009407 34.74959700749294 35.24958945252204 -435.250 265.21228627009407 265.8226735644941 34.74959700749294 35.24958945252204 -436.250 265.8226735644941 266.4330608588941 34.74959700749294 35.24958945252204 -437.250 266.4330608588941 267.0434481532941 34.74959700749294 35.24958945252204 -438.250 267.0434481532941 267.6538354476441 34.74959700749294 35.24958945252204 -439.250 267.6538354476441 268.2642227419941 34.74959700749294 35.24958945252204 -440.250 268.2642227419941 268.8746100363941 34.74959700749294 35.24958945252204 -441.250 268.8746100363941 269.48499733079404 34.74959700749294 35.24958945252204 -442.250 269.48499733079404 270.0953846251941 34.74959700749294 35.24958945252204 -443.250 270.0953846251941 270.7057719195441 34.74959700749294 35.24958945252204 -444.250 270.7057719195441 271.32593969190316 34.74959700749294 35.24958945252204 -571.250 348.215177827885 348.8353456002941 34.74959700749294 35.24958945252204 -572.250 348.8353456002941 349.44573289469406 34.74959700749294 35.24958945252204 -573.250 349.44573289469406 350.05612018904407 34.74959700749294 35.24958945252204 -574.250 350.05612018904407 350.66650748339407 34.74959700749294 35.24958945252204 -575.250 350.66650748339407 351.2768947777941 34.74959700749294 35.24958945252204 -576.250 351.2768947777941 351.8872820721941 34.74959700749294 35.24958945252204 -577.250 351.8872820721941 352.4976693665941 34.74959700749294 35.24958945252204 -578.250 352.4976693665941 353.1080566609441 34.74959700749294 35.24958945252204 -579.250 353.1080566609441 353.7184439552941 34.74959700749294 35.24958945252204 -580.250 353.7184439552941 354.3288312496941 34.74959700749294 35.24958945252204 -581.250 354.3288312496941 354.93921854409405 34.74959700749294 35.24958945252204 -582.250 354.93921854409405 355.5496058384941 34.74959700749294 35.24958945252204 -583.250 355.5496058384941 356.1599931328441 34.74959700749294 35.24958945252204 -584.250 356.1599931328441 356.7703804271941 34.74959700749294 35.24958945252204 -585.250 356.7703804271941 357.3807677215941 34.74959700749294 35.24958945252204 -586.250 357.3807677215941 357.9911550159941 34.74959700749294 35.24958945252204 -587.250 357.9911550159941 358.60154231039405 34.74959700749294 35.24958945252204 -588.250 358.60154231039405 359.2119296047441 34.74959700749294 35.24958945252204 -589.250 359.2119296047441 359.75806505679407 34.74959700749294 35.24958945252204 -000.250 359.75806505679407 0.30420050889409045 34.74959700749294 35.24958945252204 -001.251 0.30606377078187835 0.9202272263818784 35.24958945252204 35.74958180378378 -002.251 0.9202272263818784 1.5343906819818782 35.24958945252204 35.74958180378378 -003.251 1.5343906819818782 2.148554137531878 35.24958945252204 35.74958180378378 -004.251 2.148554137531878 2.7627175930818786 35.24958945252204 35.74958180378378 -005.251 2.7627175930818786 3.376881048681879 35.24958945252204 35.74958180378378 -006.251 3.376881048681879 3.991044504281878 35.24958945252204 35.74958180378378 -007.251 3.991044504281878 4.605207959881879 35.24958945252204 35.74958180378378 -008.251 4.605207959881879 5.219371415481879 35.24958945252204 35.74958180378378 -009.251 5.219371415481879 5.833534871081879 35.24958945252204 35.74958180378378 -010.251 5.833534871081879 6.447698326631878 35.24958945252204 35.74958180378378 -011.251 6.447698326631878 7.061861782181879 35.24958945252204 35.74958180378378 -012.251 7.061861782181879 7.6760252377818805 35.24958945252204 35.74958180378378 -013.251 7.6760252377818805 8.290188693381879 35.24958945252204 35.74958180378378 -014.251 8.290188693381879 8.904352148981879 35.24958945252204 35.74958180378378 -015.251 8.904352148981879 9.518515604581879 35.24958945252204 35.74958180378378 -016.251 9.518515604581879 10.132679060181877 35.24958945252204 35.74958180378378 -017.251 10.132679060181877 10.746842515781879 35.24958945252204 35.74958180378378 -018.251 10.746842515781879 11.361005971331878 35.24958945252204 35.74958180378378 -019.251 11.361005971331878 11.975169426881877 35.24958945252204 35.74958180378378 -020.251 11.975169426881877 12.589332882481878 35.24958945252204 35.74958180378378 -021.251 12.589332882481878 13.203496338081878 35.24958945252204 35.74958180378378 -022.251 13.203496338081878 13.81765979368188 35.24958945252204 35.74958180378378 -023.251 13.81765979368188 14.431823249281878 35.24958945252204 35.74958180378378 -024.251 14.431823249281878 15.04598670488188 35.24958945252204 35.74958180378378 -025.251 15.04598670488188 15.660150160431881 35.24958945252204 35.74958180378378 -026.251 15.660150160431881 16.274313615981875 35.24958945252204 35.74958180378378 -027.251 16.274313615981875 16.888477071581875 35.24958945252204 35.74958180378378 -028.251 16.888477071581875 17.502640527181875 35.24958945252204 35.74958180378378 -029.251 17.502640527181875 18.116803982781875 35.24958945252204 35.74958180378378 -030.251 18.116803982781875 18.730967438381875 35.24958945252204 35.74958180378378 -031.251 18.730967438381875 19.345130893981878 35.24958945252204 35.74958180378378 -032.251 19.345130893981878 19.959294349531874 35.24958945252204 35.74958180378378 -033.251 19.959294349531874 20.57345780508188 35.24958945252204 35.74958180378378 -034.251 20.57345780508188 21.18762126068188 35.24958945252204 35.74958180378378 -035.251 21.18762126068188 21.80178471628188 35.24958945252204 35.74958180378378 -036.251 21.80178471628188 22.41594817188188 35.24958945252204 35.74958180378378 -037.251 22.41594817188188 23.03011162748188 35.24958945252204 35.74958180378378 -038.251 23.03011162748188 23.64427508308188 35.24958945252204 35.74958180378378 -039.251 23.64427508308188 24.25843853863188 35.24958945252204 35.74958180378378 -040.251 24.25843853863188 24.872601994181878 35.24958945252204 35.74958180378378 -041.251 24.872601994181878 25.486765449781878 35.24958945252204 35.74958180378378 -042.251 25.486765449781878 26.100928905381878 35.24958945252204 35.74958180378378 -043.251 26.100928905381878 26.715092360981878 35.24958945252204 35.74958180378378 -044.251 26.715092360981878 27.329255816581874 35.24958945252204 35.74958180378378 -045.251 27.329255816581874 27.943419272181877 35.24958945252204 35.74958180378378 -046.251 27.943419272181877 28.55758272773188 35.24958945252204 35.74958180378378 -047.251 28.55758272773188 29.171746183281876 35.24958945252204 35.74958180378378 -048.251 29.171746183281876 29.78590963888188 35.24958945252204 35.74958180378378 -049.251 29.78590963888188 30.40007309448188 35.24958945252204 35.74958180378378 -050.251 30.40007309448188 31.024077614265543 35.24958945252204 35.74958180378378 -185.251 113.30229853439822 113.92630305418189 35.24958945252204 35.74958180378378 -186.251 113.92630305418189 114.54046650978188 35.24958945252204 35.74958180378378 -187.251 114.54046650978188 115.15462996538189 35.24958945252204 35.74958180378378 -188.251 115.15462996538189 115.76879342098188 35.24958945252204 35.74958180378378 -189.251 115.76879342098188 116.38295687658189 35.24958945252204 35.74958180378378 -190.251 116.38295687658189 116.99712033213189 35.24958945252204 35.74958180378378 -191.251 116.99712033213189 117.61128378768188 35.24958945252204 35.74958180378378 -192.251 117.61128378768188 118.22544724328186 35.24958945252204 35.74958180378378 -193.251 118.22544724328186 118.83961069888187 35.24958945252204 35.74958180378378 -194.251 118.83961069888187 119.45377415448188 35.24958945252204 35.74958180378378 -195.251 119.45377415448188 120.06793761008188 35.24958945252204 35.74958180378378 -196.251 120.06793761008188 120.68210106568189 35.24958945252204 35.74958180378378 -197.251 120.68210106568189 121.29626452128187 35.24958945252204 35.74958180378378 -198.251 121.29626452128187 121.91042797683188 35.24958945252204 35.74958180378378 -199.251 121.91042797683188 122.5245914323819 35.24958945252204 35.74958180378378 -200.251 122.5245914323819 123.13875488798189 35.24958945252204 35.74958180378378 -201.251 123.13875488798189 123.75291834358188 35.24958945252204 35.74958180378378 -202.251 123.75291834358188 124.36708179918189 35.24958945252204 35.74958180378378 -203.251 124.36708179918189 124.98124525478187 35.24958945252204 35.74958180378378 -204.251 124.98124525478187 125.59540871038189 35.24958945252204 35.74958180378378 -205.251 125.59540871038189 126.20957216593189 35.24958945252204 35.74958180378378 -206.251 126.20957216593189 126.82373562148189 35.24958945252204 35.74958180378378 -207.251 126.82373562148189 127.43789907708188 35.24958945252204 35.74958180378378 -208.251 127.43789907708188 128.0520625326819 35.24958945252204 35.74958180378378 -209.251 128.0520625326819 128.6662259882819 35.24958945252204 35.74958180378378 -210.251 128.6662259882819 129.28038944388186 35.24958945252204 35.74958180378378 -211.251 129.28038944388186 129.89455289948188 35.24958945252204 35.74958180378378 -212.251 129.89455289948188 130.50871635503188 35.24958945252204 35.74958180378378 -213.251 130.50871635503188 131.12287981058188 35.24958945252204 35.74958180378378 -214.251 131.12287981058188 131.7370432661819 35.24958945252204 35.74958180378378 -215.251 131.7370432661819 132.35120672178186 35.24958945252204 35.74958180378378 -216.251 132.35120672178186 132.96537017738189 35.24958945252204 35.74958180378378 -217.251 132.96537017738189 133.57953363298188 35.24958945252204 35.74958180378378 -218.251 133.57953363298188 134.19369708858187 35.24958945252204 35.74958180378378 -219.251 134.19369708858187 134.80786054413187 35.24958945252204 35.74958180378378 -220.251 134.80786054413187 135.4220239996819 35.24958945252204 35.74958180378378 -221.251 135.4220239996819 136.0361874552819 35.24958945252204 35.74958180378378 -222.251 136.0361874552819 136.65035091088185 35.24958945252204 35.74958180378378 -223.251 136.65035091088185 137.26451436648188 35.24958945252204 35.74958180378378 -224.251 137.26451436648188 137.8786778220819 35.24958945252204 35.74958180378378 -225.251 137.8786778220819 138.49284127768186 35.24958945252204 35.74958180378378 -226.251 138.49284127768186 139.10700473323186 35.24958945252204 35.74958180378378 -227.251 139.10700473323186 139.7211681887819 35.24958945252204 35.74958180378378 -228.251 139.7211681887819 140.33533164438188 35.24958945252204 35.74958180378378 -229.251 140.33533164438188 140.9494950999819 35.24958945252204 35.74958180378378 -230.251 140.9494950999819 141.56365855558187 35.24958945252204 35.74958180378378 -231.251 141.56365855558187 142.1778220111819 35.24958945252204 35.74958180378378 -232.251 142.1778220111819 142.79198546678188 35.24958945252204 35.74958180378378 -233.251 142.79198546678188 143.40614892238187 35.24958945252204 35.74958180378378 -234.251 143.40614892238187 144.0203123779319 35.24958945252204 35.74958180378378 -235.251 144.0203123779319 144.63447583348187 35.24958945252204 35.74958180378378 -236.251 144.63447583348187 145.2486392890819 35.24958945252204 35.74958180378378 -237.251 145.2486392890819 145.8628027446819 35.24958945252204 35.74958180378378 -238.251 145.8628027446819 146.47696620028188 35.24958945252204 35.74958180378378 -239.251 146.47696620028188 147.0911296558819 35.24958945252204 35.74958180378378 -240.251 147.0911296558819 147.70529311148186 35.24958945252204 35.74958180378378 -241.251 147.70529311148186 148.31945656703186 35.24958945252204 35.74958180378378 -242.251 148.31945656703186 148.9336200225819 35.24958945252204 35.74958180378378 -243.251 148.9336200225819 149.54778347818188 35.24958945252204 35.74958180378378 -244.251 149.54778347818188 150.16194693378188 35.24958945252204 35.74958180378378 -245.251 150.16194693378188 150.77611038938187 35.24958945252204 35.74958180378378 -246.251 150.77611038938187 151.3902738449819 35.24958945252204 35.74958180378378 -247.251 151.3902738449819 152.00443730058186 35.24958945252204 35.74958180378378 -248.251 152.00443730058186 152.61860075613185 35.24958945252204 35.74958180378378 -249.251 152.61860075613185 153.2327642116819 35.24958945252204 35.74958180378378 -250.251 153.2327642116819 153.84692766728188 35.24958945252204 35.74958180378378 -251.251 153.84692766728188 154.4610911228819 35.24958945252204 35.74958180378378 -252.251 154.4610911228819 155.07525457848186 35.24958945252204 35.74958180378378 -253.251 155.07525457848186 155.68941803408188 35.24958945252204 35.74958180378378 -254.251 155.68941803408188 156.30358148968187 35.24958945252204 35.74958180378378 -255.251 156.30358148968187 156.9177449452319 35.24958945252204 35.74958180378378 -256.251 156.9177449452319 157.5319084007819 35.24958945252204 35.74958180378378 -257.251 157.5319084007819 158.15591292056556 35.24958945252204 35.74958180378378 -259.251 158.75039424779823 159.37439876758188 35.24958945252204 35.74958180378378 -260.251 159.37439876758188 159.98856222318187 35.24958945252204 35.74958180378378 -261.251 159.98856222318187 160.6027256787819 35.24958945252204 35.74958180378378 -262.251 160.6027256787819 161.21688913433186 35.24958945252204 35.74958180378378 -263.251 161.21688913433186 161.8310525898819 35.24958945252204 35.74958180378378 -264.251 161.8310525898819 162.44521604548189 35.24958945252204 35.74958180378378 -265.251 162.44521604548189 163.05937950108188 35.24958945252204 35.74958180378378 -266.251 163.05937950108188 163.6735429566819 35.24958945252204 35.74958180378378 -267.251 163.6735429566819 164.28770641228186 35.24958945252204 35.74958180378378 -268.251 164.28770641228186 164.90186986788189 35.24958945252204 35.74958180378378 -269.251 164.90186986788189 165.5160333234819 35.24958945252204 35.74958180378378 -270.251 165.5160333234819 166.1301967790319 35.24958945252204 35.74958180378378 -271.251 166.1301967790319 166.7443602345819 35.24958945252204 35.74958180378378 -272.251 166.7443602345819 167.3585236901819 35.24958945252204 35.74958180378378 -273.251 167.3585236901819 167.9726871457819 35.24958945252204 35.74958180378378 -274.251 167.9726871457819 168.58685060138185 35.24958945252204 35.74958180378378 -275.251 168.58685060138185 169.20101405698188 35.24958945252204 35.74958180378378 -276.251 169.20101405698188 169.8151775125819 35.24958945252204 35.74958180378378 -277.251 169.8151775125819 170.4293409681319 35.24958945252204 35.74958180378378 -278.251 170.4293409681319 171.0435044236819 35.24958945252204 35.74958180378378 -279.251 171.0435044236819 171.6576678792819 35.24958945252204 35.74958180378378 -280.251 171.6576678792819 172.27183133488188 35.24958945252204 35.74958180378378 -281.251 172.27183133488188 172.8859947904819 35.24958945252204 35.74958180378378 -282.251 172.8859947904819 173.50015824608187 35.24958945252204 35.74958180378378 -283.251 173.50015824608187 174.1143217016819 35.24958945252204 35.74958180378378 -284.251 174.1143217016819 174.7284851572319 35.24958945252204 35.74958180378378 -285.251 174.7284851572319 175.3426486127819 35.24958945252204 35.74958180378378 -286.251 175.3426486127819 175.9568120683819 35.24958945252204 35.74958180378378 -287.251 175.9568120683819 176.5709755239819 35.24958945252204 35.74958180378378 -288.251 176.5709755239819 177.1851389795819 35.24958945252204 35.74958180378378 -289.251 177.1851389795819 177.79930243518186 35.24958945252204 35.74958180378378 -290.251 177.79930243518186 178.41346589078188 35.24958945252204 35.74958180378378 -291.251 178.41346589078188 179.02762934633188 35.24958945252204 35.74958180378378 -292.251 179.02762934633188 179.64179280188188 35.24958945252204 35.74958180378378 -293.251 179.64179280188188 180.25595625748187 35.24958945252204 35.74958180378378 -294.251 180.25595625748187 180.87011971308186 35.24958945252204 35.74958180378378 -295.251 180.87011971308186 181.48428316868186 35.24958945252204 35.74958180378378 -296.251 181.48428316868186 182.09844662428185 35.24958945252204 35.74958180378378 -297.251 182.09844662428185 182.71261007988187 35.24958945252204 35.74958180378378 -298.251 182.71261007988187 183.32677353548186 35.24958945252204 35.74958180378378 -299.251 183.32677353548186 183.94093699103186 35.24958945252204 35.74958180378378 -300.251 183.94093699103186 184.55510044658186 35.24958945252204 35.74958180378378 -301.251 184.55510044658186 185.16926390218185 35.24958945252204 35.74958180378378 -302.251 185.16926390218185 185.78342735778187 35.24958945252204 35.74958180378378 -303.251 185.78342735778187 186.39759081338187 35.24958945252204 35.74958180378378 -304.251 186.39759081338187 187.01175426898186 35.24958945252204 35.74958180378378 -305.251 187.01175426898186 187.62591772458188 35.24958945252204 35.74958180378378 -306.251 187.62591772458188 188.24008118013188 35.24958945252204 35.74958180378378 -307.251 188.24008118013188 188.85424463568188 35.24958945252204 35.74958180378378 -308.251 188.85424463568188 189.46840809128187 35.24958945252204 35.74958180378378 -309.251 189.46840809128187 190.08257154688187 35.24958945252204 35.74958180378378 -310.251 190.08257154688187 190.69673500248186 35.24958945252204 35.74958180378378 -311.251 190.69673500248186 191.31089845808185 35.24958945252204 35.74958180378378 -312.251 191.31089845808185 191.92506191368187 35.24958945252204 35.74958180378378 -313.251 191.92506191368187 192.53922536923187 35.24958945252204 35.74958180378378 -314.251 192.53922536923187 193.15338882478187 35.24958945252204 35.74958180378378 -315.251 193.15338882478187 193.76755228038186 35.24958945252204 35.74958180378378 -316.251 193.76755228038186 194.39155680016555 35.24958945252204 35.74958180378378 -367.251 225.0800474510982 225.7040519708819 35.24958945252204 35.74958180378378 -368.251 225.7040519708819 226.31821542648186 35.24958945252204 35.74958180378378 -369.251 226.31821542648186 226.93237888208188 35.24958945252204 35.74958180378378 -370.251 226.93237888208188 227.5465423376819 35.24958945252204 35.74958180378378 -371.251 227.5465423376819 228.1607057932319 35.24958945252204 35.74958180378378 -372.251 228.1607057932319 228.77486924878187 35.24958945252204 35.74958180378378 -373.251 228.77486924878187 229.38903270438186 35.24958945252204 35.74958180378378 -374.251 229.38903270438186 230.00319615998188 35.24958945252204 35.74958180378378 -375.251 230.00319615998188 230.61735961558185 35.24958945252204 35.74958180378378 -376.251 230.61735961558185 231.23152307118187 35.24958945252204 35.74958180378378 -377.251 231.23152307118187 231.84568652678186 35.24958945252204 35.74958180378378 -378.251 231.84568652678186 232.45984998233186 35.24958945252204 35.74958180378378 -379.251 232.45984998233186 233.0740134378819 35.24958945252204 35.74958180378378 -380.251 233.0740134378819 233.6881768934819 35.24958945252204 35.74958180378378 -381.251 233.6881768934819 234.30234034908187 35.24958945252204 35.74958180378378 -382.251 234.30234034908187 234.9165038046819 35.24958945252204 35.74958180378378 -383.251 234.9165038046819 235.53066726028186 35.24958945252204 35.74958180378378 -384.251 235.53066726028186 236.14483071588185 35.24958945252204 35.74958180378378 -385.251 236.14483071588185 236.75899417143188 35.24958945252204 35.74958180378378 -386.251 236.75899417143188 237.37315762698185 35.24958945252204 35.74958180378378 -387.251 237.37315762698185 237.98732108258187 35.24958945252204 35.74958180378378 -388.251 237.98732108258187 238.60148453818186 35.24958945252204 35.74958180378378 -389.251 238.60148453818186 239.21564799378186 35.24958945252204 35.74958180378378 -390.251 239.21564799378186 239.82981144938185 35.24958945252204 35.74958180378378 -391.251 239.82981144938185 240.44397490498187 35.24958945252204 35.74958180378378 -392.251 240.44397490498187 241.05813836053187 35.24958945252204 35.74958180378378 -393.251 241.05813836053187 241.67230181608187 35.24958945252204 35.74958180378378 -394.251 241.67230181608187 242.2864652716819 35.24958945252204 35.74958180378378 -395.251 242.2864652716819 242.90062872728186 35.24958945252204 35.74958180378378 -396.251 242.90062872728186 243.51479218288188 35.24958945252204 35.74958180378378 -397.251 243.51479218288188 244.1289556384819 35.24958945252204 35.74958180378378 -398.251 244.1289556384819 244.7431190940819 35.24958945252204 35.74958180378378 -399.251 244.7431190940819 245.35728254963186 35.24958945252204 35.74958180378378 -400.251 245.35728254963186 245.97144600518186 35.24958945252204 35.74958180378378 -401.251 245.97144600518186 246.58560946078188 35.24958945252204 35.74958180378378 -402.251 246.58560946078188 247.19977291638187 35.24958945252204 35.74958180378378 -403.251 247.19977291638187 247.81393637198187 35.24958945252204 35.74958180378378 -404.251 247.81393637198187 248.42809982758186 35.24958945252204 35.74958180378378 -405.251 248.42809982758186 249.04226328318185 35.24958945252204 35.74958180378378 -406.251 249.04226328318185 249.65642673878187 35.24958945252204 35.74958180378378 -407.251 249.65642673878187 250.2705901943319 35.24958945252204 35.74958180378378 -408.251 250.2705901943319 250.8847536498819 35.24958945252204 35.74958180378378 -409.251 250.8847536498819 251.4989171054819 35.24958945252204 35.74958180378378 -410.251 251.4989171054819 252.11308056108186 35.24958945252204 35.74958180378378 -411.251 252.11308056108186 252.72724401668188 35.24958945252204 35.74958180378378 -412.251 252.72724401668188 253.3414074722819 35.24958945252204 35.74958180378378 -413.251 253.3414074722819 253.95557092788187 35.24958945252204 35.74958180378378 -414.251 253.95557092788187 254.56973438343186 35.24958945252204 35.74958180378378 -415.251 254.56973438343186 255.18389783898186 35.24958945252204 35.74958180378378 -416.251 255.18389783898186 255.79806129458188 35.24958945252204 35.74958180378378 -417.251 255.79806129458188 256.41222475018185 35.24958945252204 35.74958180378378 -418.251 256.41222475018185 257.0263882057818 35.24958945252204 35.74958180378378 -419.251 257.0263882057818 257.64055166138183 35.24958945252204 35.74958180378378 -420.251 257.64055166138183 258.25471511698186 35.24958945252204 35.74958180378378 -421.251 258.25471511698186 258.86887857253186 35.24958945252204 35.74958180378378 -422.251 258.86887857253186 259.48304202808185 35.24958945252204 35.74958180378378 -423.251 259.48304202808185 260.09720548368193 35.24958945252204 35.74958180378378 -424.251 260.09720548368193 260.7113689392819 35.24958945252204 35.74958180378378 -425.251 260.7113689392819 261.32553239488186 35.24958945252204 35.74958180378378 -426.251 261.32553239488186 261.93969585048194 35.24958945252204 35.74958180378378 -427.251 261.93969585048194 262.5538593060819 35.24958945252204 35.74958180378378 -428.251 262.5538593060819 263.16802276163185 35.24958945252204 35.74958180378378 -429.251 263.16802276163185 263.7821862171819 35.24958945252204 35.74958180378378 -430.251 263.7821862171819 264.39634967278187 35.24958945252204 35.74958180378378 -431.251 264.39634967278187 265.01051312838183 35.24958945252204 35.74958180378378 -432.251 265.01051312838183 265.62467658398185 35.24958945252204 35.74958180378378 -433.251 265.62467658398185 266.2388400395819 35.24958945252204 35.74958180378378 -434.251 266.2388400395819 266.85300349518184 35.24958945252204 35.74958180378378 -435.251 266.85300349518184 267.46716695073184 35.24958945252204 35.74958180378378 -436.251 267.46716695073184 268.08133040628184 35.24958945252204 35.74958180378378 -437.251 268.08133040628184 268.6954938618819 35.24958945252204 35.74958180378378 -438.251 268.6954938618819 269.3096573174819 35.24958945252204 35.74958180378378 -439.251 269.3096573174819 269.92382077308184 35.24958945252204 35.74958180378378 -440.251 269.92382077308184 270.5379842286819 35.24958945252204 35.74958180378378 -441.251 270.5379842286819 271.1521476842819 35.24958945252204 35.74958180378378 -442.251 271.1521476842819 271.76631113988185 35.24958945252204 35.74958180378378 -443.251 271.76631113988185 272.3903156596656 35.24958945252204 35.74958180378378 -570.251 349.7552289350982 350.37923345488184 35.24958945252204 35.74958180378378 -571.251 350.37923345488184 350.9933969104819 35.24958945252204 35.74958180378378 -572.251 350.9933969104819 351.60756036603186 35.24958945252204 35.74958180378378 -573.251 351.60756036603186 352.22172382158186 35.24958945252204 35.74958180378378 -574.251 352.22172382158186 352.8358872771819 35.24958945252204 35.74958180378378 -575.251 352.8358872771819 353.45005073278185 35.24958945252204 35.74958180378378 -576.251 353.45005073278185 354.06421418838187 35.24958945252204 35.74958180378378 -577.251 354.06421418838187 354.6783776439819 35.24958945252204 35.74958180378378 -578.251 354.6783776439819 355.29254109958185 35.24958945252204 35.74958180378378 -579.251 355.29254109958185 355.9067045551319 35.24958945252204 35.74958180378378 -580.251 355.9067045551319 356.5208680106819 35.24958945252204 35.74958180378378 -581.251 356.5208680106819 357.13503146628193 35.24958945252204 35.74958180378378 -582.251 357.13503146628193 357.7491949218819 35.24958945252204 35.74958180378378 -583.251 357.7491949218819 358.3633583774819 35.24958945252204 35.74958180378378 -584.251 358.3633583774819 358.9775218330819 35.24958945252204 35.74958180378378 -585.251 358.9775218330819 359.6015263528655 35.24958945252204 35.74958180378378 -000.251 359.68205925099824 0.30606377078187835 35.24958945252204 35.74958180378378 -001.252 0.3079735942673215 0.9260075830173214 35.74958180378378 36.24957405833459 -002.252 0.9260075830173214 1.5440415717673217 35.74958180378378 36.24957405833459 -003.252 1.5440415717673217 2.1620755605173216 35.74958180378378 36.24957405833459 -004.252 2.1620755605173216 2.7801095492673213 35.74958180378378 36.24957405833459 -005.252 2.7801095492673213 3.3981435380173206 35.74958180378378 36.24957405833459 -006.252 3.3981435380173206 4.016177526767321 35.74958180378378 36.24957405833459 -007.252 4.016177526767321 4.634211515517322 35.74958180378378 36.24957405833459 -008.252 4.634211515517322 5.2522455042673215 35.74958180378378 36.24957405833459 -009.252 5.2522455042673215 5.870279493017321 35.74958180378378 36.24957405833459 -010.252 5.870279493017321 6.488313481767321 35.74958180378378 36.24957405833459 -011.252 6.488313481767321 7.106347470517322 35.74958180378378 36.24957405833459 -012.252 7.106347470517322 7.724381459267322 35.74958180378378 36.24957405833459 -013.252 7.724381459267322 8.34241544801732 35.74958180378378 36.24957405833459 -014.252 8.34241544801732 8.96044943676732 35.74958180378378 36.24957405833459 -015.252 8.96044943676732 9.57848342551732 35.74958180378378 36.24957405833459 -016.252 9.57848342551732 10.196517414267321 35.74958180378378 36.24957405833459 -017.252 10.196517414267321 10.814551403017319 35.74958180378378 36.24957405833459 -018.252 10.814551403017319 11.43258539176732 35.74958180378378 36.24957405833459 -019.252 11.43258539176732 12.05061938051732 35.74958180378378 36.24957405833459 -020.252 12.05061938051732 12.668653369267322 35.74958180378378 36.24957405833459 -021.252 12.668653369267322 13.286687358017321 35.74958180378378 36.24957405833459 -022.252 13.286687358017321 13.904721346767323 35.74958180378378 36.24957405833459 -023.252 13.904721346767323 14.522755335517322 35.74958180378378 36.24957405833459 -024.252 14.522755335517322 15.14078932426732 35.74958180378378 36.24957405833459 -025.252 15.14078932426732 15.758823313017324 35.74958180378378 36.24957405833459 -026.252 15.758823313017324 16.37685730176732 35.74958180378378 36.24957405833459 -027.252 16.37685730176732 16.99489129051732 35.74958180378378 36.24957405833459 -028.252 16.99489129051732 17.612925279267323 35.74958180378378 36.24957405833459 -029.252 17.612925279267323 18.230959268017322 35.74958180378378 36.24957405833459 -030.252 18.230959268017322 18.848993256767322 35.74958180378378 36.24957405833459 -031.252 18.848993256767322 19.467027245517325 35.74958180378378 36.24957405833459 -032.252 19.467027245517325 20.08506123426732 35.74958180378378 36.24957405833459 -033.252 20.08506123426732 20.703095223017318 35.74958180378378 36.24957405833459 -034.252 20.703095223017318 21.32112921176732 35.74958180378378 36.24957405833459 -035.252 21.32112921176732 21.93916320051732 35.74958180378378 36.24957405833459 -036.252 21.93916320051732 22.55719718926732 35.74958180378378 36.24957405833459 -037.252 22.55719718926732 23.17523117801732 35.74958180378378 36.24957405833459 -038.252 23.17523117801732 23.79326516676732 35.74958180378378 36.24957405833459 -039.252 23.79326516676732 24.41129915551732 35.74958180378378 36.24957405833459 -040.252 24.41129915551732 25.029333144267323 35.74958180378378 36.24957405833459 -041.252 25.029333144267323 25.647367133017323 35.74958180378378 36.24957405833459 -042.252 25.647367133017323 26.265401121767326 35.74958180378378 36.24957405833459 -043.252 26.265401121767326 26.883435110517325 35.74958180378378 36.24957405833459 -044.252 26.883435110517325 27.501469099267325 35.74958180378378 36.24957405833459 -045.252 27.501469099267325 28.11950308801732 35.74958180378378 36.24957405833459 -046.252 28.11950308801732 28.737537076767318 35.74958180378378 36.24957405833459 -047.252 28.737537076767318 29.355571065517317 35.74958180378378 36.24957405833459 -048.252 29.355571065517317 29.973605054267317 35.74958180378378 36.24957405833459 -049.252 29.973605054267317 30.60154220901605 35.74958180378378 36.24957405833459 -183.252 112.78025638071861 113.40819353551731 35.74958180378378 36.24957405833459 -184.252 113.40819353551731 114.02622752426733 35.74958180378378 36.24957405833459 -185.252 114.02622752426733 114.64426151301731 35.74958180378378 36.24957405833459 -186.252 114.64426151301731 115.26229550176731 35.74958180378378 36.24957405833459 -187.252 115.26229550176731 115.88032949051733 35.74958180378378 36.24957405833459 -188.252 115.88032949051733 116.49836347926733 35.74958180378378 36.24957405833459 -189.252 116.49836347926733 117.11639746801731 35.74958180378378 36.24957405833459 -190.252 117.11639746801731 117.73443145676733 35.74958180378378 36.24957405833459 -191.252 117.73443145676733 118.35246544551731 35.74958180378378 36.24957405833459 -192.252 118.35246544551731 118.97049943426734 35.74958180378378 36.24957405833459 -193.252 118.97049943426734 119.58853342301732 35.74958180378378 36.24957405833459 -194.252 119.58853342301732 120.20656741176732 35.74958180378378 36.24957405833459 -195.252 120.20656741176732 120.82460140051731 35.74958180378378 36.24957405833459 -196.252 120.82460140051731 121.44263538926732 35.74958180378378 36.24957405833459 -197.252 121.44263538926732 122.06066937801731 35.74958180378378 36.24957405833459 -198.252 122.06066937801731 122.67870336676731 35.74958180378378 36.24957405833459 -199.252 122.67870336676731 123.29673735551734 35.74958180378378 36.24957405833459 -200.252 123.29673735551734 123.91477134426732 35.74958180378378 36.24957405833459 -201.252 123.91477134426732 124.53280533301734 35.74958180378378 36.24957405833459 -202.252 124.53280533301734 125.15083932176732 35.74958180378378 36.24957405833459 -203.252 125.15083932176732 125.76887331051731 35.74958180378378 36.24957405833459 -204.252 125.76887331051731 126.38690729926734 35.74958180378378 36.24957405833459 -205.252 126.38690729926734 127.00494128801733 35.74958180378378 36.24957405833459 -206.252 127.00494128801733 127.62297527676733 35.74958180378378 36.24957405833459 -207.252 127.62297527676733 128.24100926551733 35.74958180378378 36.24957405833459 -208.252 128.24100926551733 128.85904325426733 35.74958180378378 36.24957405833459 -209.252 128.85904325426733 129.47707724301733 35.74958180378378 36.24957405833459 -210.252 129.47707724301733 130.0951112317673 35.74958180378378 36.24957405833459 -211.252 130.0951112317673 130.7131452205173 35.74958180378378 36.24957405833459 -212.252 130.7131452205173 131.3311792092673 35.74958180378378 36.24957405833459 -213.252 131.3311792092673 131.94921319801733 35.74958180378378 36.24957405833459 -214.252 131.94921319801733 132.56724718676733 35.74958180378378 36.24957405833459 -215.252 132.56724718676733 133.18528117551733 35.74958180378378 36.24957405833459 -216.252 133.18528117551733 133.8033151642673 35.74958180378378 36.24957405833459 -217.252 133.8033151642673 134.42134915301733 35.74958180378378 36.24957405833459 -218.252 134.42134915301733 135.0393831417673 35.74958180378378 36.24957405833459 -219.252 135.0393831417673 135.65741713051733 35.74958180378378 36.24957405833459 -220.252 135.65741713051733 136.27545111926733 35.74958180378378 36.24957405833459 -221.252 136.27545111926733 136.89348510801733 35.74958180378378 36.24957405833459 -222.252 136.89348510801733 137.5115190967673 35.74958180378378 36.24957405833459 -223.252 137.5115190967673 138.1295530855173 35.74958180378378 36.24957405833459 -224.252 138.1295530855173 138.7475870742673 35.74958180378378 36.24957405833459 -225.252 138.7475870742673 139.36562106301733 35.74958180378378 36.24957405833459 -226.252 139.36562106301733 139.9836550517673 35.74958180378378 36.24957405833459 -227.252 139.9836550517673 140.60168904051733 35.74958180378378 36.24957405833459 -228.252 140.60168904051733 141.2197230292673 35.74958180378378 36.24957405833459 -229.252 141.2197230292673 141.83775701801733 35.74958180378378 36.24957405833459 -230.252 141.83775701801733 142.4557910067673 35.74958180378378 36.24957405833459 -231.252 142.4557910067673 143.07382499551733 35.74958180378378 36.24957405833459 -232.252 143.07382499551733 143.6918589842673 35.74958180378378 36.24957405833459 -233.252 143.6918589842673 144.30989297301733 35.74958180378378 36.24957405833459 -234.252 144.30989297301733 144.92792696176733 35.74958180378378 36.24957405833459 -235.252 144.92792696176733 145.54596095051733 35.74958180378378 36.24957405833459 -236.252 145.54596095051733 146.1639949392673 35.74958180378378 36.24957405833459 -237.252 146.1639949392673 146.78202892801733 35.74958180378378 36.24957405833459 -238.252 146.78202892801733 147.4000629167673 35.74958180378378 36.24957405833459 -239.252 147.4000629167673 148.01809690551733 35.74958180378378 36.24957405833459 -240.252 148.01809690551733 148.63613089426732 35.74958180378378 36.24957405833459 -241.252 148.63613089426732 149.25416488301732 35.74958180378378 36.24957405833459 -242.252 149.25416488301732 149.8721988717673 35.74958180378378 36.24957405833459 -243.252 149.8721988717673 150.49023286051732 35.74958180378378 36.24957405833459 -244.252 150.49023286051732 151.10826684926735 35.74958180378378 36.24957405833459 -245.252 151.10826684926735 151.72630083801732 35.74958180378378 36.24957405833459 -246.252 151.72630083801732 152.34433482676735 35.74958180378378 36.24957405833459 -247.252 152.34433482676735 152.96236881551732 35.74958180378378 36.24957405833459 -248.252 152.96236881551732 153.5804028042673 35.74958180378378 36.24957405833459 -249.252 153.5804028042673 154.19843679301732 35.74958180378378 36.24957405833459 -250.252 154.19843679301732 154.81647078176732 35.74958180378378 36.24957405833459 -251.252 154.81647078176732 155.43450477051732 35.74958180378378 36.24957405833459 -252.252 155.43450477051732 156.05253875926735 35.74958180378378 36.24957405833459 -253.252 156.05253875926735 156.67057274801732 35.74958180378378 36.24957405833459 -254.252 156.67057274801732 157.29850990281605 35.74958180378378 36.24957405833459 -257.252 158.5147715482186 159.14270870301732 35.74958180378378 36.24957405833459 -258.252 159.14270870301732 159.76074269176732 35.74958180378378 36.24957405833459 -259.252 159.76074269176732 160.37877668051732 35.74958180378378 36.24957405833459 -260.252 160.37877668051732 160.99681066926732 35.74958180378378 36.24957405833459 -261.252 160.99681066926732 161.61484465801732 35.74958180378378 36.24957405833459 -262.252 161.61484465801732 162.23287864676732 35.74958180378378 36.24957405833459 -263.252 162.23287864676732 162.85091263551732 35.74958180378378 36.24957405833459 -264.252 162.85091263551732 163.46894662426735 35.74958180378378 36.24957405833459 -265.252 163.46894662426735 164.08698061301735 35.74958180378378 36.24957405833459 -266.252 164.08698061301735 164.70501460176735 35.74958180378378 36.24957405833459 -267.252 164.70501460176735 165.32304859051732 35.74958180378378 36.24957405833459 -268.252 165.32304859051732 165.94108257926734 35.74958180378378 36.24957405833459 -269.252 165.94108257926734 166.55911656801734 35.74958180378378 36.24957405833459 -270.252 166.55911656801734 167.17715055676734 35.74958180378378 36.24957405833459 -271.252 167.17715055676734 167.79518454551734 35.74958180378378 36.24957405833459 -272.252 167.79518454551734 168.41321853426734 35.74958180378378 36.24957405833459 -273.252 168.41321853426734 169.03125252301732 35.74958180378378 36.24957405833459 -274.252 169.03125252301732 169.64928651176731 35.74958180378378 36.24957405833459 -275.252 169.64928651176731 170.26732050051734 35.74958180378378 36.24957405833459 -276.252 170.26732050051734 170.88535448926734 35.74958180378378 36.24957405833459 -277.252 170.88535448926734 171.50338847801734 35.74958180378378 36.24957405833459 -278.252 171.50338847801734 172.12142246676734 35.74958180378378 36.24957405833459 -279.252 172.12142246676734 172.7394564555173 35.74958180378378 36.24957405833459 -280.252 172.7394564555173 173.35749044426734 35.74958180378378 36.24957405833459 -281.252 173.35749044426734 173.97552443301734 35.74958180378378 36.24957405833459 -282.252 173.97552443301734 174.59355842176734 35.74958180378378 36.24957405833459 -283.252 174.59355842176734 175.21159241051734 35.74958180378378 36.24957405833459 -284.252 175.21159241051734 175.82962639926734 35.74958180378378 36.24957405833459 -285.252 175.82962639926734 176.4476603880173 35.74958180378378 36.24957405833459 -286.252 176.4476603880173 177.0656943767673 35.74958180378378 36.24957405833459 -287.252 177.0656943767673 177.6837283655173 35.74958180378378 36.24957405833459 -288.252 177.6837283655173 178.30176235426734 35.74958180378378 36.24957405833459 -289.252 178.30176235426734 178.91979634301734 35.74958180378378 36.24957405833459 -290.252 178.91979634301734 179.53783033176734 35.74958180378378 36.24957405833459 -291.252 179.53783033176734 180.1558643205173 35.74958180378378 36.24957405833459 -292.252 180.1558643205173 180.77389830926734 35.74958180378378 36.24957405833459 -293.252 180.77389830926734 181.3919322980173 35.74958180378378 36.24957405833459 -294.252 181.3919322980173 182.0099662867673 35.74958180378378 36.24957405833459 -295.252 182.0099662867673 182.6280002755173 35.74958180378378 36.24957405833459 -296.252 182.6280002755173 183.24603426426734 35.74958180378378 36.24957405833459 -297.252 183.24603426426734 183.8640682530173 35.74958180378378 36.24957405833459 -298.252 183.8640682530173 184.48210224176734 35.74958180378378 36.24957405833459 -299.252 184.48210224176734 185.1001362305173 35.74958180378378 36.24957405833459 -300.252 185.1001362305173 185.7181702192673 35.74958180378378 36.24957405833459 -301.252 185.7181702192673 186.3362042080173 35.74958180378378 36.24957405833459 -302.252 186.3362042080173 186.95423819676734 35.74958180378378 36.24957405833459 -303.252 186.95423819676734 187.5722721855173 35.74958180378378 36.24957405833459 -304.252 187.5722721855173 188.19030617426733 35.74958180378378 36.24957405833459 -305.252 188.19030617426733 188.8083401630173 35.74958180378378 36.24957405833459 -306.252 188.8083401630173 189.4263741517673 35.74958180378378 36.24957405833459 -307.252 189.4263741517673 190.0444081405173 35.74958180378378 36.24957405833459 -308.252 190.0444081405173 190.66244212926733 35.74958180378378 36.24957405833459 -309.252 190.66244212926733 191.2804761180173 35.74958180378378 36.24957405833459 -310.252 191.2804761180173 191.89851010676733 35.74958180378378 36.24957405833459 -311.252 191.89851010676733 192.5165440955173 35.74958180378378 36.24957405833459 -312.252 192.5165440955173 193.13457808426733 35.74958180378378 36.24957405833459 -313.252 193.13457808426733 193.7526120730173 35.74958180378378 36.24957405833459 -314.252 193.7526120730173 194.38054922781603 35.74958180378378 36.24957405833459 -365.252 225.26244233321862 225.89037948801735 35.74958180378378 36.24957405833459 -366.252 225.89037948801735 226.50841347676732 35.74958180378378 36.24957405833459 -367.252 226.50841347676732 227.12644746551732 35.74958180378378 36.24957405833459 -368.252 227.12644746551732 227.74448145426732 35.74958180378378 36.24957405833459 -369.252 227.74448145426732 228.36251544301732 35.74958180378378 36.24957405833459 -370.252 228.36251544301732 228.9805494317673 35.74958180378378 36.24957405833459 -371.252 228.9805494317673 229.5985834205173 35.74958180378378 36.24957405833459 -372.252 229.5985834205173 230.21661740926731 35.74958180378378 36.24957405833459 -373.252 230.21661740926731 230.83465139801734 35.74958180378378 36.24957405833459 -374.252 230.83465139801734 231.45268538676737 35.74958180378378 36.24957405833459 -375.252 231.45268538676737 232.07071937551734 35.74958180378378 36.24957405833459 -376.252 232.07071937551734 232.6887533642673 35.74958180378378 36.24957405833459 -377.252 232.6887533642673 233.3067873530173 35.74958180378378 36.24957405833459 -378.252 233.3067873530173 233.9248213417673 35.74958180378378 36.24957405833459 -379.252 233.9248213417673 234.54285533051734 35.74958180378378 36.24957405833459 -380.252 234.54285533051734 235.1608893192673 35.74958180378378 36.24957405833459 -381.252 235.1608893192673 235.7789233080173 35.74958180378378 36.24957405833459 -382.252 235.7789233080173 236.3969572967673 35.74958180378378 36.24957405833459 -383.252 236.3969572967673 237.01499128551728 35.74958180378378 36.24957405833459 -384.252 237.01499128551728 237.6330252742673 35.74958180378378 36.24957405833459 -385.252 237.6330252742673 238.25105926301728 35.74958180378378 36.24957405833459 -386.252 238.25105926301728 238.8690932517673 35.74958180378378 36.24957405833459 -387.252 238.8690932517673 239.48712724051734 35.74958180378378 36.24957405833459 -388.252 239.48712724051734 240.1051612292673 35.74958180378378 36.24957405833459 -389.252 240.1051612292673 240.72319521801734 35.74958180378378 36.24957405833459 -390.252 240.72319521801734 241.3412292067673 35.74958180378378 36.24957405833459 -391.252 241.3412292067673 241.95926319551734 35.74958180378378 36.24957405833459 -392.252 241.95926319551734 242.5772971842673 35.74958180378378 36.24957405833459 -393.252 242.5772971842673 243.19533117301734 35.74958180378378 36.24957405833459 -394.252 243.19533117301734 243.8133651617673 35.74958180378378 36.24957405833459 -395.252 243.8133651617673 244.4313991505173 35.74958180378378 36.24957405833459 -396.252 244.4313991505173 245.0494331392673 35.74958180378378 36.24957405833459 -397.252 245.0494331392673 245.66746712801728 35.74958180378378 36.24957405833459 -398.252 245.66746712801728 246.2855011167673 35.74958180378378 36.24957405833459 -399.252 246.2855011167673 246.90353510551734 35.74958180378378 36.24957405833459 -400.252 246.90353510551734 247.52156909426733 35.74958180378378 36.24957405833459 -401.252 247.52156909426733 248.13960308301733 35.74958180378378 36.24957405833459 -402.252 248.13960308301733 248.7576370717673 35.74958180378378 36.24957405833459 -403.252 248.7576370717673 249.37567106051733 35.74958180378378 36.24957405833459 -404.252 249.37567106051733 249.9937050492673 35.74958180378378 36.24957405833459 -405.252 249.9937050492673 250.6117390380173 35.74958180378378 36.24957405833459 -406.252 250.6117390380173 251.2297730267673 35.74958180378378 36.24957405833459 -407.252 251.2297730267673 251.8478070155173 35.74958180378378 36.24957405833459 -408.252 251.8478070155173 252.4658410042673 35.74958180378378 36.24957405833459 -409.252 252.4658410042673 253.08387499301728 35.74958180378378 36.24957405833459 -410.252 253.08387499301728 253.7019089817673 35.74958180378378 36.24957405833459 -411.252 253.7019089817673 254.31994297051733 35.74958180378378 36.24957405833459 -412.252 254.31994297051733 254.9379769592673 35.74958180378378 36.24957405833459 -413.252 254.9379769592673 255.55601094801733 35.74958180378378 36.24957405833459 -414.252 255.55601094801733 256.17404493676736 35.74958180378378 36.24957405833459 -415.252 256.17404493676736 256.79207892551733 35.74958180378378 36.24957405833459 -416.252 256.79207892551733 257.4101129142673 35.74958180378378 36.24957405833459 -417.252 257.4101129142673 258.0281469030173 35.74958180378378 36.24957405833459 -418.252 258.0281469030173 258.6461808917673 35.74958180378378 36.24957405833459 -419.252 258.6461808917673 259.26421488051733 35.74958180378378 36.24957405833459 -420.252 259.26421488051733 259.8822488692673 35.74958180378378 36.24957405833459 -421.252 259.8822488692673 260.5002828580173 35.74958180378378 36.24957405833459 -422.252 260.5002828580173 261.1183168467673 35.74958180378378 36.24957405833459 -423.252 261.1183168467673 261.7363508355173 35.74958180378378 36.24957405833459 -424.252 261.7363508355173 262.3543848242673 35.74958180378378 36.24957405833459 -425.252 262.3543848242673 262.9724188130173 35.74958180378378 36.24957405833459 -426.252 262.9724188130173 263.59045280176736 35.74958180378378 36.24957405833459 -427.252 263.59045280176736 264.2084867905173 35.74958180378378 36.24957405833459 -428.252 264.2084867905173 264.8265207792673 35.74958180378378 36.24957405833459 -429.252 264.8265207792673 265.44455476801727 35.74958180378378 36.24957405833459 -430.252 265.44455476801727 266.0625887567673 35.74958180378378 36.24957405833459 -431.252 266.0625887567673 266.6806227455173 35.74958180378378 36.24957405833459 -432.252 266.6806227455173 267.2986567342673 35.74958180378378 36.24957405833459 -433.252 267.2986567342673 267.91669072301727 35.74958180378378 36.24957405833459 -434.252 267.91669072301727 268.5347247117673 35.74958180378378 36.24957405833459 -435.252 268.5347247117673 269.1527587005173 35.74958180378378 36.24957405833459 -436.252 269.1527587005173 269.7707926892673 35.74958180378378 36.24957405833459 -437.252 269.7707926892673 270.3888266780173 35.74958180378378 36.24957405833459 -438.252 270.3888266780173 271.00686066676735 35.74958180378378 36.24957405833459 -439.252 271.00686066676735 271.6248946555173 35.74958180378378 36.24957405833459 -440.252 271.6248946555173 272.2429286442673 35.74958180378378 36.24957405833459 -441.252 272.2429286442673 272.87086579901603 35.74958180378378 36.24957405833459 -567.252 350.10530806071864 350.7332452154673 35.74958180378378 36.24957405833459 -568.252 350.7332452154673 351.35127920421735 35.74958180378378 36.24957405833459 -569.252 351.35127920421735 351.9693131929673 35.74958180378378 36.24957405833459 -570.252 351.9693131929673 352.5873471817173 35.74958180378378 36.24957405833459 -571.252 352.5873471817173 353.2053811704673 35.74958180378378 36.24957405833459 -572.252 353.2053811704673 353.82341515921735 35.74958180378378 36.24957405833459 -573.252 353.82341515921735 354.4414491479673 35.74958180378378 36.24957405833459 -574.252 354.4414491479673 355.0594831367173 35.74958180378378 36.24957405833459 -575.252 355.0594831367173 355.6775171254673 35.74958180378378 36.24957405833459 -576.252 355.6775171254673 356.29555111421735 35.74958180378378 36.24957405833459 -577.252 356.29555111421735 356.9135851029673 35.74958180378378 36.24957405833459 -578.252 356.9135851029673 357.53161909171735 35.74958180378378 36.24957405833459 -579.252 357.53161909171735 358.1496530804673 35.74958180378378 36.24957405833459 -580.252 358.1496530804673 358.76768706921735 35.74958180378378 36.24957405833459 -581.252 358.76768706921735 359.39562422401605 35.74958180378378 36.24957405833459 -000.252 359.6800364395186 0.3079735942673215 35.74958180378378 36.24957405833459 -001.253 0.3099311501471672 0.9319324348471674 36.24957405833459 36.74956621312616 -002.253 0.9319324348471674 1.5539337194971674 36.24957405833459 36.74956621312616 -003.253 1.5539337194971674 2.1759350041471675 36.24957405833459 36.74956621312616 -004.253 2.1759350041471675 2.7979362888471675 36.24957405833459 36.74956621312616 -005.253 2.7979362888471675 3.419937573547168 36.24957405833459 36.74956621312616 -006.253 3.419937573547168 4.041938858197167 36.24957405833459 36.74956621312616 -007.253 4.041938858197167 4.663940142847167 36.24957405833459 36.74956621312616 -008.253 4.663940142847167 5.285941427547169 36.24957405833459 36.74956621312616 -009.253 5.285941427547169 5.907942712247168 36.24957405833459 36.74956621312616 -010.253 5.907942712247168 6.529943996897167 36.24957405833459 36.74956621312616 -011.253 6.529943996897167 7.151945281547168 36.24957405833459 36.74956621312616 -012.253 7.151945281547168 7.773946566247167 36.24957405833459 36.74956621312616 -013.253 7.773946566247167 8.395947850947167 36.24957405833459 36.74956621312616 -014.253 8.395947850947167 9.017949135597167 36.24957405833459 36.74956621312616 -015.253 9.017949135597167 9.639950420247168 36.24957405833459 36.74956621312616 -016.253 9.639950420247168 10.261951704947169 36.24957405833459 36.74956621312616 -017.253 10.261951704947169 10.883952989647167 36.24957405833459 36.74956621312616 -018.253 10.883952989647167 11.505954274347168 36.24957405833459 36.74956621312616 -019.253 11.505954274347168 12.127955558997167 36.24957405833459 36.74956621312616 -020.253 12.127955558997167 12.749956843647167 36.24957405833459 36.74956621312616 -021.253 12.749956843647167 13.371958128347167 36.24957405833459 36.74956621312616 -022.253 13.371958128347167 13.993959413047167 36.24957405833459 36.74956621312616 -023.253 13.993959413047167 14.615960697697167 36.24957405833459 36.74956621312616 -024.253 14.615960697697167 15.23796198234717 36.24957405833459 36.74956621312616 -025.253 15.23796198234717 15.859963267047169 36.24957405833459 36.74956621312616 -026.253 15.859963267047169 16.48196455174717 36.24957405833459 36.74956621312616 -027.253 16.48196455174717 17.10396583639717 36.24957405833459 36.74956621312616 -028.253 17.10396583639717 17.72596712104717 36.24957405833459 36.74956621312616 -029.253 17.72596712104717 18.347968405747167 36.24957405833459 36.74956621312616 -030.253 18.347968405747167 18.969969690447165 36.24957405833459 36.74956621312616 -031.253 18.969969690447165 19.591970975147163 36.24957405833459 36.74956621312616 -032.253 19.591970975147163 20.213972259797167 36.24957405833459 36.74956621312616 -033.253 20.213972259797167 20.835973544447164 36.24957405833459 36.74956621312616 -034.253 20.835973544447164 21.457974829147165 36.24957405833459 36.74956621312616 -035.253 21.457974829147165 22.079976113847167 36.24957405833459 36.74956621312616 -036.253 22.079976113847167 22.701977398497164 36.24957405833459 36.74956621312616 -037.253 22.701977398497164 23.323978683147164 36.24957405833459 36.74956621312616 -038.253 23.323978683147164 23.945979967847165 36.24957405833459 36.74956621312616 -039.253 23.945979967847165 24.567981252547163 36.24957405833459 36.74956621312616 -040.253 24.567981252547163 25.19994935923781 36.24957405833459 36.74956621312616 -181.253 112.26019556995651 112.89216367659716 36.24957405833459 36.74956621312616 -182.253 112.89216367659716 113.51416496124716 36.24957405833459 36.74956621312616 -183.253 113.51416496124716 114.13616624594718 36.24957405833459 36.74956621312616 -184.253 114.13616624594718 114.75816753064717 36.24957405833459 36.74956621312616 -185.253 114.75816753064717 115.38016881529717 36.24957405833459 36.74956621312616 -186.253 115.38016881529717 116.00217009994718 36.24957405833459 36.74956621312616 -187.253 116.00217009994718 116.62417138464718 36.24957405833459 36.74956621312616 -188.253 116.62417138464718 117.24617266934717 36.24957405833459 36.74956621312616 -189.253 117.24617266934717 117.86817395404718 36.24957405833459 36.74956621312616 -190.253 117.86817395404718 118.49017523869716 36.24957405833459 36.74956621312616 -191.253 118.49017523869716 119.11217652334716 36.24957405833459 36.74956621312616 -192.253 119.11217652334716 119.73417780804718 36.24957405833459 36.74956621312616 -193.253 119.73417780804718 120.35617909274717 36.24957405833459 36.74956621312616 -194.253 120.35617909274717 120.97818037739717 36.24957405833459 36.74956621312616 -195.253 120.97818037739717 121.60018166204719 36.24957405833459 36.74956621312616 -196.253 121.60018166204719 122.22218294674718 36.24957405833459 36.74956621312616 -197.253 122.22218294674718 122.84418423144717 36.24957405833459 36.74956621312616 -198.253 122.84418423144717 123.46618551609717 36.24957405833459 36.74956621312616 -199.253 123.46618551609717 124.08818680074717 36.24957405833459 36.74956621312616 -200.253 124.08818680074717 124.71018808544716 36.24957405833459 36.74956621312616 -201.253 124.71018808544716 125.33218937014718 36.24957405833459 36.74956621312616 -202.253 125.33218937014718 125.95419065479717 36.24957405833459 36.74956621312616 -203.253 125.95419065479717 126.57619193944718 36.24957405833459 36.74956621312616 -204.253 126.57619193944718 127.19819322414719 36.24957405833459 36.74956621312616 -205.253 127.19819322414719 127.82019450884715 36.24957405833459 36.74956621312616 -206.253 127.82019450884715 128.44219579354717 36.24957405833459 36.74956621312616 -207.253 128.44219579354717 129.06419707819717 36.24957405833459 36.74956621312616 -208.253 129.06419707819717 129.68619836284716 36.24957405833459 36.74956621312616 -209.253 129.68619836284716 130.30819964754716 36.24957405833459 36.74956621312616 -210.253 130.30819964754716 130.93020093224715 36.24957405833459 36.74956621312616 -211.253 130.93020093224715 131.55220221689717 36.24957405833459 36.74956621312616 -212.253 131.55220221689717 132.17420350154717 36.24957405833459 36.74956621312616 -213.253 132.17420350154717 132.7962047862472 36.24957405833459 36.74956621312616 -214.253 132.7962047862472 133.41820607094718 36.24957405833459 36.74956621312616 -215.253 133.41820607094718 134.04020735559715 36.24957405833459 36.74956621312616 -216.253 134.04020735559715 134.66220864024717 36.24957405833459 36.74956621312616 -217.253 134.66220864024717 135.28420992494716 36.24957405833459 36.74956621312616 -218.253 135.28420992494716 135.90621120964715 36.24957405833459 36.74956621312616 -219.253 135.90621120964715 136.52821249429718 36.24957405833459 36.74956621312616 -220.253 136.52821249429718 137.15021377894715 36.24957405833459 36.74956621312616 -221.253 137.15021377894715 137.77221506364714 36.24957405833459 36.74956621312616 -222.253 137.77221506364714 138.3942163483472 36.24957405833459 36.74956621312616 -223.253 138.3942163483472 139.01621763304718 36.24957405833459 36.74956621312616 -224.253 139.01621763304718 139.63821891769717 36.24957405833459 36.74956621312616 -225.253 139.63821891769717 140.26022020234717 36.24957405833459 36.74956621312616 -226.253 140.26022020234717 140.8822214870472 36.24957405833459 36.74956621312616 -227.253 140.8822214870472 141.50422277174718 36.24957405833459 36.74956621312616 -228.253 141.50422277174718 142.12622405639715 36.24957405833459 36.74956621312616 -229.253 142.12622405639715 142.74822534104715 36.24957405833459 36.74956621312616 -230.253 142.74822534104715 143.3702266257472 36.24957405833459 36.74956621312616 -231.253 143.3702266257472 143.99222791044718 36.24957405833459 36.74956621312616 -232.253 143.99222791044718 144.61422919509718 36.24957405833459 36.74956621312616 -233.253 144.61422919509718 145.23623047974715 36.24957405833459 36.74956621312616 -234.253 145.23623047974715 145.85823176444717 36.24957405833459 36.74956621312616 -235.253 145.85823176444717 146.48023304914716 36.24957405833459 36.74956621312616 -236.253 146.48023304914716 147.10223433384715 36.24957405833459 36.74956621312616 -237.253 147.10223433384715 147.72423561849718 36.24957405833459 36.74956621312616 -238.253 147.72423561849718 148.3462369031472 36.24957405833459 36.74956621312616 -239.253 148.3462369031472 148.9682381878472 36.24957405833459 36.74956621312616 -240.253 148.9682381878472 149.59023947254718 36.24957405833459 36.74956621312616 -241.253 149.59023947254718 150.21224075719715 36.24957405833459 36.74956621312616 -242.253 150.21224075719715 150.83424204184718 36.24957405833459 36.74956621312616 -243.253 150.83424204184718 151.45624332654717 36.24957405833459 36.74956621312616 -244.253 151.45624332654717 152.0782446112472 36.24957405833459 36.74956621312616 -245.253 152.0782446112472 152.70024589589718 36.24957405833459 36.74956621312616 -246.253 152.70024589589718 153.32224718054715 36.24957405833459 36.74956621312616 -247.253 153.32224718054715 153.9442484652472 36.24957405833459 36.74956621312616 -248.253 153.9442484652472 154.5662497499472 36.24957405833459 36.74956621312616 -249.253 154.5662497499472 155.1882510345972 36.24957405833459 36.74956621312616 -250.253 155.1882510345972 155.81025231924718 36.24957405833459 36.74956621312616 -251.253 155.81025231924718 156.43225360394717 36.24957405833459 36.74956621312616 -252.253 156.43225360394717 157.06422171063778 36.24957405833459 36.74956621312616 -255.253 158.28829063595654 158.92025874264718 36.24957405833459 36.74956621312616 -256.253 158.92025874264718 159.5422600273472 36.24957405833459 36.74956621312616 -257.253 159.5422600273472 160.1642613120472 36.24957405833459 36.74956621312616 -258.253 160.1642613120472 160.78626259669716 36.24957405833459 36.74956621312616 -259.253 160.78626259669716 161.40826388134718 36.24957405833459 36.74956621312616 -260.253 161.40826388134718 162.03026516604717 36.24957405833459 36.74956621312616 -261.253 162.03026516604717 162.6522664507472 36.24957405833459 36.74956621312616 -262.253 162.6522664507472 163.2742677353972 36.24957405833459 36.74956621312616 -263.253 163.2742677353972 163.89626902004719 36.24957405833459 36.74956621312616 -264.253 163.89626902004719 164.51827030474718 36.24957405833459 36.74956621312616 -265.253 164.51827030474718 165.14027158944717 36.24957405833459 36.74956621312616 -266.253 165.14027158944717 165.7622728740972 36.24957405833459 36.74956621312616 -267.253 165.7622728740972 166.3842741587472 36.24957405833459 36.74956621312616 -268.253 166.3842741587472 167.00627544344718 36.24957405833459 36.74956621312616 -269.253 167.00627544344718 167.62827672814717 36.24957405833459 36.74956621312616 -270.253 167.62827672814717 168.2502780128472 36.24957405833459 36.74956621312616 -271.253 168.2502780128472 168.8722792974972 36.24957405833459 36.74956621312616 -272.253 168.8722792974972 169.49428058214718 36.24957405833459 36.74956621312616 -273.253 169.49428058214718 170.11628186684717 36.24957405833459 36.74956621312616 -274.253 170.11628186684717 170.7382831515472 36.24957405833459 36.74956621312616 -275.253 170.7382831515472 171.3602844361972 36.24957405833459 36.74956621312616 -276.253 171.3602844361972 171.9822857208472 36.24957405833459 36.74956621312616 -277.253 171.9822857208472 172.60428700554718 36.24957405833459 36.74956621312616 -278.253 172.60428700554718 173.22628829024717 36.24957405833459 36.74956621312616 -279.253 173.22628829024717 173.8482895748972 36.24957405833459 36.74956621312616 -280.253 173.8482895748972 174.4702908595472 36.24957405833459 36.74956621312616 -281.253 174.4702908595472 175.09229214424718 36.24957405833459 36.74956621312616 -282.253 175.09229214424718 175.71429342894717 36.24957405833459 36.74956621312616 -283.253 175.71429342894717 176.3362947136472 36.24957405833459 36.74956621312616 -284.253 176.3362947136472 176.9582959982972 36.24957405833459 36.74956621312616 -285.253 176.9582959982972 177.58029728294719 36.24957405833459 36.74956621312616 -286.253 177.58029728294719 178.20229856764718 36.24957405833459 36.74956621312616 -287.253 178.20229856764718 178.82429985234717 36.24957405833459 36.74956621312616 -288.253 178.82429985234717 179.4463011369972 36.24957405833459 36.74956621312616 -289.253 179.4463011369972 180.06830242164716 36.24957405833459 36.74956621312616 -290.253 180.06830242164716 180.69030370634715 36.24957405833459 36.74956621312616 -291.253 180.69030370634715 181.31230499104714 36.24957405833459 36.74956621312616 -292.253 181.31230499104714 181.93430627569717 36.24957405833459 36.74956621312616 -293.253 181.93430627569717 182.55630756034716 36.24957405833459 36.74956621312616 -294.253 182.55630756034716 183.17830884504716 36.24957405833459 36.74956621312616 -295.253 183.17830884504716 183.80031012974715 36.24957405833459 36.74956621312616 -296.253 183.80031012974715 184.42231141439714 36.24957405833459 36.74956621312616 -297.253 184.42231141439714 185.04431269904717 36.24957405833459 36.74956621312616 -298.253 185.04431269904717 185.66631398374716 36.24957405833459 36.74956621312616 -299.253 185.66631398374716 186.28831526844715 36.24957405833459 36.74956621312616 -300.253 186.28831526844715 186.91031655314714 36.24957405833459 36.74956621312616 -301.253 186.91031655314714 187.53231783779717 36.24957405833459 36.74956621312616 -302.253 187.53231783779717 188.15431912244716 36.24957405833459 36.74956621312616 -303.253 188.15431912244716 188.77632040714715 36.24957405833459 36.74956621312616 -304.253 188.77632040714715 189.39832169184717 36.24957405833459 36.74956621312616 -305.253 189.39832169184717 190.02032297649714 36.24957405833459 36.74956621312616 -306.253 190.02032297649714 190.64232426114717 36.24957405833459 36.74956621312616 -307.253 190.64232426114717 191.26432554584716 36.24957405833459 36.74956621312616 -308.253 191.26432554584716 191.88632683054715 36.24957405833459 36.74956621312616 -309.253 191.88632683054715 192.50832811519714 36.24957405833459 36.74956621312616 -310.253 192.50832811519714 193.13032939984714 36.24957405833459 36.74956621312616 -311.253 193.13032939984714 193.75233068454716 36.24957405833459 36.74956621312616 -312.253 193.75233068454716 194.3842987912378 36.24957405833459 36.74956621312616 -364.253 226.08643066575652 226.71839877244716 36.24957405833459 36.74956621312616 -365.253 226.71839877244716 227.34040005709716 36.24957405833459 36.74956621312616 -366.253 227.34040005709716 227.96240134174715 36.24957405833459 36.74956621312616 -367.253 227.96240134174715 228.58440262644717 36.24957405833459 36.74956621312616 -368.253 228.58440262644717 229.20640391114716 36.24957405833459 36.74956621312616 -369.253 229.20640391114716 229.82840519579713 36.24957405833459 36.74956621312616 -370.253 229.82840519579713 230.45040648044716 36.24957405833459 36.74956621312616 -371.253 230.45040648044716 231.07240776514715 36.24957405833459 36.74956621312616 -372.253 231.07240776514715 231.69440904984714 36.24957405833459 36.74956621312616 -373.253 231.69440904984714 232.31641033449716 36.24957405833459 36.74956621312616 -374.253 232.31641033449716 232.93841161914713 36.24957405833459 36.74956621312616 -375.253 232.93841161914713 233.56041290384718 36.24957405833459 36.74956621312616 -376.253 233.56041290384718 234.18241418854717 36.24957405833459 36.74956621312616 -377.253 234.18241418854717 234.80441547324716 36.24957405833459 36.74956621312616 -378.253 234.80441547324716 235.4264167578972 36.24957405833459 36.74956621312616 -379.253 235.4264167578972 236.04841804254715 36.24957405833459 36.74956621312616 -380.253 236.04841804254715 236.67041932724715 36.24957405833459 36.74956621312616 -381.253 236.67041932724715 237.2924206119472 36.24957405833459 36.74956621312616 -382.253 237.2924206119472 237.9144218965972 36.24957405833459 36.74956621312616 -383.253 237.9144218965972 238.53642318124716 36.24957405833459 36.74956621312616 -384.253 238.53642318124716 239.15842446594715 36.24957405833459 36.74956621312616 -385.253 239.15842446594715 239.78042575064717 36.24957405833459 36.74956621312616 -386.253 239.78042575064717 240.40242703529717 36.24957405833459 36.74956621312616 -387.253 240.40242703529717 241.02442831994716 36.24957405833459 36.74956621312616 -388.253 241.02442831994716 241.64642960464715 36.24957405833459 36.74956621312616 -389.253 241.64642960464715 242.26843088934714 36.24957405833459 36.74956621312616 -390.253 242.26843088934714 242.8904321739971 36.24957405833459 36.74956621312616 -391.253 242.8904321739971 243.51243345864717 36.24957405833459 36.74956621312616 -392.253 243.51243345864717 244.13443474334716 36.24957405833459 36.74956621312616 -393.253 244.13443474334716 244.75643602804715 36.24957405833459 36.74956621312616 -394.253 244.75643602804715 245.37843731274717 36.24957405833459 36.74956621312616 -395.253 245.37843731274717 246.00043859739716 36.24957405833459 36.74956621312616 -396.253 246.00043859739716 246.62243988204716 36.24957405833459 36.74956621312616 -397.253 246.62243988204716 247.24444116674715 36.24957405833459 36.74956621312616 -398.253 247.24444116674715 247.86644245144714 36.24957405833459 36.74956621312616 -399.253 247.86644245144714 248.48844373609717 36.24957405833459 36.74956621312616 -400.253 248.48844373609717 249.1104450207472 36.24957405833459 36.74956621312616 -401.253 249.1104450207472 249.73244630544716 36.24957405833459 36.74956621312616 -402.253 249.73244630544716 250.35444759014712 36.24957405833459 36.74956621312616 -403.253 250.35444759014712 250.97644887479714 36.24957405833459 36.74956621312616 -404.253 250.97644887479714 251.59845015944717 36.24957405833459 36.74956621312616 -405.253 251.59845015944717 252.22045144414716 36.24957405833459 36.74956621312616 -406.253 252.22045144414716 252.84245272884715 36.24957405833459 36.74956621312616 -407.253 252.84245272884715 253.46445401354714 36.24957405833459 36.74956621312616 -408.253 253.46445401354714 254.08645529819717 36.24957405833459 36.74956621312616 -409.253 254.08645529819717 254.7084565828472 36.24957405833459 36.74956621312616 -410.253 254.7084565828472 255.33045786754715 36.24957405833459 36.74956621312616 -411.253 255.33045786754715 255.95245915224712 36.24957405833459 36.74956621312616 -412.253 255.95245915224712 256.5744604368972 36.24957405833459 36.74956621312616 -413.253 256.5744604368972 257.19646172154717 36.24957405833459 36.74956621312616 -414.253 257.19646172154717 257.81846300624716 36.24957405833459 36.74956621312616 -415.253 257.81846300624716 258.44046429094715 36.24957405833459 36.74956621312616 -416.253 258.44046429094715 259.06246557559723 36.24957405833459 36.74956621312616 -417.253 259.06246557559723 259.6844668602472 36.24957405833459 36.74956621312616 -418.253 259.6844668602472 260.3064681449472 36.24957405833459 36.74956621312616 -419.253 260.3064681449472 260.9284694296472 36.24957405833459 36.74956621312616 -420.253 260.9284694296472 261.55047071429715 36.24957405833459 36.74956621312616 -421.253 261.55047071429715 262.1724719989471 36.24957405833459 36.74956621312616 -422.253 262.1724719989471 262.79447328364716 36.24957405833459 36.74956621312616 -423.253 262.79447328364716 263.41647456834716 36.24957405833459 36.74956621312616 -424.253 263.41647456834716 264.0384758530472 36.24957405833459 36.74956621312616 -425.253 264.0384758530472 264.66047713769717 36.24957405833459 36.74956621312616 -426.253 264.66047713769717 265.28247842234714 36.24957405833459 36.74956621312616 -427.253 265.28247842234714 265.90447970704713 36.24957405833459 36.74956621312616 -428.253 265.90447970704713 266.5264809917472 36.24957405833459 36.74956621312616 -429.253 266.5264809917472 267.14848227639715 36.24957405833459 36.74956621312616 -430.253 267.14848227639715 267.7704835610471 36.24957405833459 36.74956621312616 -431.253 267.7704835610471 268.39248484574716 36.24957405833459 36.74956621312616 -432.253 268.39248484574716 269.01448613044715 36.24957405833459 36.74956621312616 -433.253 269.01448613044715 269.6364874150971 36.24957405833459 36.74956621312616 -434.253 269.6364874150971 270.2584886997472 36.24957405833459 36.74956621312616 -435.253 270.2584886997472 270.8804899844472 36.24957405833459 36.74956621312616 -436.253 270.8804899844472 271.50249126914713 36.24957405833459 36.74956621312616 -437.253 271.50249126914713 272.12449255379715 36.24957405833459 36.74956621312616 -438.253 272.12449255379715 272.7564606604378 36.24957405833459 36.74956621312616 -568.253 352.97469273975656 353.6066608464472 36.24957405833459 36.74956621312616 -569.253 353.6066608464472 354.2286621311472 36.24957405833459 36.74956621312616 -570.253 354.2286621311472 354.85066341579716 36.24957405833459 36.74956621312616 -571.253 354.85066341579716 355.4726647004472 36.24957405833459 36.74956621312616 -572.253 355.4726647004472 356.0946659851471 36.24957405833459 36.74956621312616 -573.253 356.0946659851471 356.7166672698471 36.24957405833459 36.74956621312616 -574.253 356.7166672698471 357.3386685544972 36.24957405833459 36.74956621312616 -575.253 357.3386685544972 357.96066983914716 36.24957405833459 36.74956621312616 -576.253 357.96066983914716 358.58267112384715 36.24957405833459 36.74956621312616 -577.253 358.58267112384715 359.2046724085472 36.24957405833459 36.74956621312616 -578.253 359.2046724085472 359.7573017793472 36.24957405833459 36.74956621312616 -000.253 359.7573017793472 0.3099311501471672 36.24957405833459 36.74956621312616 -001.254 0.31193765532106 0.93800548442106 36.74956621312616 37.24955826500035 -002.254 0.93800548442106 1.5640733134710603 36.74956621312616 37.24955826500035 -003.254 1.5640733134710603 2.19014114252106 36.74956621312616 37.24955826500035 -004.254 2.19014114252106 2.8162089716210597 36.74956621312616 37.24955826500035 -005.254 2.8162089716210597 3.4422768007210593 36.74956621312616 37.24955826500035 -006.254 3.4422768007210593 4.068344629771061 36.74956621312616 37.24955826500035 -007.254 4.068344629771061 4.694412458821061 36.74956621312616 37.24955826500035 -008.254 4.694412458821061 5.320480287921059 36.74956621312616 37.24955826500035 -009.254 5.320480287921059 5.9465481170210595 36.74956621312616 37.24955826500035 -010.254 5.9465481170210595 6.572615946121058 36.74956621312616 37.24955826500035 -011.254 6.572615946121058 7.198683775171059 36.74956621312616 37.24955826500035 -012.254 7.198683775171059 7.824751604221059 36.74956621312616 37.24955826500035 -013.254 7.824751604221059 8.45081943332106 36.74956621312616 37.24955826500035 -014.254 8.45081943332106 9.07688726242106 36.74956621312616 37.24955826500035 -015.254 9.07688726242106 9.702955091471061 36.74956621312616 37.24955826500035 -016.254 9.702955091471061 10.329022920521062 36.74956621312616 37.24955826500035 -017.254 10.329022920521062 10.95509074962106 36.74956621312616 37.24955826500035 -018.254 10.95509074962106 11.581158578721059 36.74956621312616 37.24955826500035 -019.254 11.581158578721059 12.207226407821057 36.74956621312616 37.24955826500035 -020.254 12.207226407821057 12.833294236871058 36.74956621312616 37.24955826500035 -021.254 12.833294236871058 13.45936206592106 36.74956621312616 37.24955826500035 -022.254 13.45936206592106 14.085429895021061 36.74956621312616 37.24955826500035 -023.254 14.085429895021061 14.711497724121058 36.74956621312616 37.24955826500035 -024.254 14.711497724121058 15.337565553221058 36.74956621312616 37.24955826500035 -025.254 15.337565553221058 15.963633382271063 36.74956621312616 37.24955826500035 -026.254 15.963633382271063 16.58970121132106 36.74956621312616 37.24955826500035 -027.254 16.58970121132106 17.21576904042106 36.74956621312616 37.24955826500035 -028.254 17.21576904042106 17.84183686952106 36.74956621312616 37.24955826500035 -029.254 17.84183686952106 18.46790469857106 36.74956621312616 37.24955826500035 -030.254 18.46790469857106 19.093972527621062 36.74956621312616 37.24955826500035 -031.254 19.093972527621062 19.720040356721057 36.74956621312616 37.24955826500035 -032.254 19.720040356721057 20.346108185821063 36.74956621312616 37.24955826500035 -033.254 20.346108185821063 20.97217601492106 36.74956621312616 37.24955826500035 -034.254 20.97217601492106 21.598243843971062 36.74956621312616 37.24955826500035 -035.254 21.598243843971062 22.224311673021063 36.74956621312616 37.24955826500035 -036.254 22.224311673021063 22.850379502121058 36.74956621312616 37.24955826500035 -037.254 22.850379502121058 23.476447331221063 36.74956621312616 37.24955826500035 -038.254 23.476447331221063 24.10251516027106 36.74956621312616 37.24955826500035 -039.254 24.10251516027106 24.7386150614517 36.74956621312616 37.24955826500035 -180.254 112.36804698819041 113.00414688937106 36.74956621312616 37.24955826500035 -181.254 113.00414688937106 113.63021471842106 36.74956621312616 37.24955826500035 -182.254 113.63021471842106 114.25628254752107 36.74956621312616 37.24955826500035 -183.254 114.25628254752107 114.88235037662108 36.74956621312616 37.24955826500035 -184.254 114.88235037662108 115.50841820572107 36.74956621312616 37.24955826500035 -185.254 115.50841820572107 116.13448603477107 36.74956621312616 37.24955826500035 -186.254 116.13448603477107 116.76055386382107 36.74956621312616 37.24955826500035 -187.254 116.76055386382107 117.38662169292107 36.74956621312616 37.24955826500035 -188.254 117.38662169292107 118.01268952202106 36.74956621312616 37.24955826500035 -189.254 118.01268952202106 118.63875735107106 36.74956621312616 37.24955826500035 -190.254 118.63875735107106 119.26482518012108 36.74956621312616 37.24955826500035 -191.254 119.26482518012108 119.89089300922107 36.74956621312616 37.24955826500035 -192.254 119.89089300922107 120.51696083832105 36.74956621312616 37.24955826500035 -193.254 120.51696083832105 121.14302866742108 36.74956621312616 37.24955826500035 -194.254 121.14302866742108 121.7690964964711 36.74956621312616 37.24955826500035 -195.254 121.7690964964711 122.39516432552108 36.74956621312616 37.24955826500035 -196.254 122.39516432552108 123.02123215462106 36.74956621312616 37.24955826500035 -197.254 123.02123215462106 123.64729998372106 36.74956621312616 37.24955826500035 -198.254 123.64729998372106 124.27336781277106 36.74956621312616 37.24955826500035 -199.254 124.27336781277106 124.89943564182107 36.74956621312616 37.24955826500035 -200.254 124.89943564182107 125.52550347092108 36.74956621312616 37.24955826500035 -201.254 125.52550347092108 126.15157130002106 36.74956621312616 37.24955826500035 -202.254 126.15157130002106 126.77763912912107 36.74956621312616 37.24955826500035 -203.254 126.77763912912107 127.40370695817106 36.74956621312616 37.24955826500035 -204.254 127.40370695817106 128.02977478722107 36.74956621312616 37.24955826500035 -205.254 128.02977478722107 128.65584261632102 36.74956621312616 37.24955826500035 -206.254 128.65584261632102 129.2819104454211 36.74956621312616 37.24955826500035 -207.254 129.2819104454211 129.90797827447108 36.74956621312616 37.24955826500035 -208.254 129.90797827447108 130.53404610352106 36.74956621312616 37.24955826500035 -209.254 130.53404610352106 131.16011393262104 36.74956621312616 37.24955826500035 -210.254 131.16011393262104 131.78618176172105 36.74956621312616 37.24955826500035 -211.254 131.78618176172105 132.4122495908211 36.74956621312616 37.24955826500035 -212.254 132.4122495908211 133.03831741987108 36.74956621312616 37.24955826500035 -213.254 133.03831741987108 133.66438524892106 36.74956621312616 37.24955826500035 -214.254 133.66438524892106 134.29045307802107 36.74956621312616 37.24955826500035 -215.254 134.29045307802107 134.91652090712105 36.74956621312616 37.24955826500035 -216.254 134.91652090712105 135.5425887362211 36.74956621312616 37.24955826500035 -217.254 135.5425887362211 136.16865656527108 36.74956621312616 37.24955826500035 -218.254 136.16865656527108 136.79472439432107 36.74956621312616 37.24955826500035 -219.254 136.79472439432107 137.42079222342107 36.74956621312616 37.24955826500035 -220.254 137.42079222342107 138.04686005252108 36.74956621312616 37.24955826500035 -221.254 138.04686005252108 138.67292788157107 36.74956621312616 37.24955826500035 -222.254 138.67292788157107 139.29899571062106 36.74956621312616 37.24955826500035 -223.254 139.29899571062106 139.92506353972107 36.74956621312616 37.24955826500035 -224.254 139.92506353972107 140.55113136882107 36.74956621312616 37.24955826500035 -225.254 140.55113136882107 141.17719919792108 36.74956621312616 37.24955826500035 -226.254 141.17719919792108 141.80326702697107 36.74956621312616 37.24955826500035 -227.254 141.80326702697107 142.42933485602106 36.74956621312616 37.24955826500035 -228.254 142.42933485602106 143.05540268512107 36.74956621312616 37.24955826500035 -229.254 143.05540268512107 143.68147051422108 36.74956621312616 37.24955826500035 -230.254 143.68147051422108 144.30753834327106 36.74956621312616 37.24955826500035 -231.254 144.30753834327106 144.93360617232105 36.74956621312616 37.24955826500035 -232.254 144.93360617232105 145.55967400142106 36.74956621312616 37.24955826500035 -233.254 145.55967400142106 146.18574183052107 36.74956621312616 37.24955826500035 -234.254 146.18574183052107 146.81180965962108 36.74956621312616 37.24955826500035 -235.254 146.81180965962108 147.43787748867106 36.74956621312616 37.24955826500035 -236.254 147.43787748867106 148.06394531772105 36.74956621312616 37.24955826500035 -237.254 148.06394531772105 148.69001314682106 36.74956621312616 37.24955826500035 -238.254 148.69001314682106 149.31608097592107 36.74956621312616 37.24955826500035 -239.254 149.31608097592107 149.94214880497105 36.74956621312616 37.24955826500035 -240.254 149.94214880497105 150.56821663402104 36.74956621312616 37.24955826500035 -241.254 150.56821663402104 151.19428446312105 36.74956621312616 37.24955826500035 -242.254 151.19428446312105 151.82035229222106 36.74956621312616 37.24955826500035 -243.254 151.82035229222106 152.44642012132107 36.74956621312616 37.24955826500035 -244.254 152.44642012132107 153.07248795037106 36.74956621312616 37.24955826500035 -245.254 153.07248795037106 153.69855577942107 36.74956621312616 37.24955826500035 -246.254 153.69855577942107 154.32462360852105 36.74956621312616 37.24955826500035 -247.254 154.32462360852105 154.95069143762106 36.74956621312616 37.24955826500035 -248.254 154.95069143762106 155.57675926672104 36.74956621312616 37.24955826500035 -249.254 155.57675926672104 156.20282709577106 36.74956621312616 37.24955826500035 -250.254 156.20282709577106 156.82889492482104 36.74956621312616 37.24955826500035 -251.254 156.82889492482104 157.4649948260517 36.74956621312616 37.24955826500035 -254.254 158.69706633989043 159.3331662411211 36.74956621312616 37.24955826500035 -255.254 159.3331662411211 159.95923407022107 36.74956621312616 37.24955826500035 -256.254 159.95923407022107 160.58530189932105 36.74956621312616 37.24955826500035 -257.254 160.58530189932105 161.21136972842106 36.74956621312616 37.24955826500035 -258.254 161.21136972842106 161.83743755747108 36.74956621312616 37.24955826500035 -259.254 161.83743755747108 162.46350538652106 36.74956621312616 37.24955826500035 -260.254 162.46350538652106 163.08957321562104 36.74956621312616 37.24955826500035 -261.254 163.08957321562104 163.71564104472105 36.74956621312616 37.24955826500035 -262.254 163.71564104472105 164.34170887377104 36.74956621312616 37.24955826500035 -263.254 164.34170887377104 164.96777670282106 36.74956621312616 37.24955826500035 -264.254 164.96777670282106 165.59384453192106 36.74956621312616 37.24955826500035 -265.254 165.59384453192106 166.21991236102107 36.74956621312616 37.24955826500035 -266.254 166.21991236102107 166.84598019012105 36.74956621312616 37.24955826500035 -267.254 166.84598019012105 167.47204801917107 36.74956621312616 37.24955826500035 -268.254 167.47204801917107 168.09811584822108 36.74956621312616 37.24955826500035 -269.254 168.09811584822108 168.7241836773211 36.74956621312616 37.24955826500035 -270.254 168.7241836773211 169.35025150642107 36.74956621312616 37.24955826500035 -271.254 169.35025150642107 169.9763193354711 36.74956621312616 37.24955826500035 -272.254 169.9763193354711 170.60238716452105 36.74956621312616 37.24955826500035 -273.254 170.60238716452105 171.22845499362109 36.74956621312616 37.24955826500035 -274.254 171.22845499362109 171.85452282272104 36.74956621312616 37.24955826500035 -275.254 171.85452282272104 172.48059065182105 36.74956621312616 37.24955826500035 -276.254 172.48059065182105 173.10665848087103 36.74956621312616 37.24955826500035 -277.254 173.10665848087103 173.73272630992108 36.74956621312616 37.24955826500035 -278.254 173.73272630992108 174.35879413902106 36.74956621312616 37.24955826500035 -279.254 174.35879413902106 174.98486196812107 36.74956621312616 37.24955826500035 -280.254 174.98486196812107 175.61092979722105 36.74956621312616 37.24955826500035 -281.254 175.61092979722105 176.23699762627103 36.74956621312616 37.24955826500035 -282.254 176.23699762627103 176.86306545532105 36.74956621312616 37.24955826500035 -283.254 176.86306545532105 177.4891332844211 36.74956621312616 37.24955826500035 -284.254 177.4891332844211 178.11520111352104 36.74956621312616 37.24955826500035 -285.254 178.11520111352104 178.74126894257105 36.74956621312616 37.24955826500035 -286.254 178.74126894257105 179.36733677162107 36.74956621312616 37.24955826500035 -287.254 179.36733677162107 179.99340460072105 36.74956621312616 37.24955826500035 -288.254 179.99340460072105 180.61947242982103 36.74956621312616 37.24955826500035 -289.254 180.61947242982103 181.24554025892104 36.74956621312616 37.24955826500035 -290.254 181.24554025892104 181.87160808797105 36.74956621312616 37.24955826500035 -291.254 181.87160808797105 182.49767591702104 36.74956621312616 37.24955826500035 -292.254 182.49767591702104 183.12374374612102 36.74956621312616 37.24955826500035 -293.254 183.12374374612102 183.74981157522103 36.74956621312616 37.24955826500035 -294.254 183.74981157522103 184.37587940427107 36.74956621312616 37.24955826500035 -295.254 184.37587940427107 185.00194723332106 36.74956621312616 37.24955826500035 -296.254 185.00194723332106 185.62801506242104 36.74956621312616 37.24955826500035 -297.254 185.62801506242104 186.25408289152102 36.74956621312616 37.24955826500035 -298.254 186.25408289152102 186.88015072062103 36.74956621312616 37.24955826500035 -299.254 186.88015072062103 187.50621854967108 36.74956621312616 37.24955826500035 -300.254 187.50621854967108 188.13228637872106 36.74956621312616 37.24955826500035 -301.254 188.13228637872106 188.75835420782104 36.74956621312616 37.24955826500035 -302.254 188.75835420782104 189.38442203692102 36.74956621312616 37.24955826500035 -303.254 189.38442203692102 190.01048986597107 36.74956621312616 37.24955826500035 -304.254 190.01048986597107 190.63655769502105 36.74956621312616 37.24955826500035 -305.254 190.63655769502105 191.26262552412106 36.74956621312616 37.24955826500035 -306.254 191.26262552412106 191.88869335322104 36.74956621312616 37.24955826500035 -307.254 191.88869335322104 192.51476118232102 36.74956621312616 37.24955826500035 -308.254 192.51476118232102 193.14082901137107 36.74956621312616 37.24955826500035 -309.254 193.14082901137107 193.76689684042105 36.74956621312616 37.24955826500035 -310.254 193.76689684042105 194.39296466952106 36.74956621312616 37.24955826500035 -311.254 194.39296466952106 195.0290645707517 36.74956621312616 37.24955826500035 -362.254 226.3123918803904 226.94849178162104 36.74956621312616 37.24955826500035 -363.254 226.94849178162104 227.57455961067103 36.74956621312616 37.24955826500035 -364.254 227.57455961067103 228.20062743972107 36.74956621312616 37.24955826500035 -365.254 228.20062743972107 228.82669526882106 36.74956621312616 37.24955826500035 -366.254 228.82669526882106 229.45276309792106 36.74956621312616 37.24955826500035 -367.254 229.45276309792106 230.07883092697108 36.74956621312616 37.24955826500035 -368.254 230.07883092697108 230.70489875602107 36.74956621312616 37.24955826500035 -369.254 230.70489875602107 231.33096658512105 36.74956621312616 37.24955826500035 -370.254 231.33096658512105 231.95703441422106 36.74956621312616 37.24955826500035 -371.254 231.95703441422106 232.5831022433211 36.74956621312616 37.24955826500035 -372.254 232.5831022433211 233.20917007237108 36.74956621312616 37.24955826500035 -373.254 233.20917007237108 233.83523790142107 36.74956621312616 37.24955826500035 -374.254 233.83523790142107 234.46130573052105 36.74956621312616 37.24955826500035 -375.254 234.46130573052105 235.08737355962103 36.74956621312616 37.24955826500035 -376.254 235.08737355962103 235.71344138872104 36.74956621312616 37.24955826500035 -377.254 235.71344138872104 236.33950921777105 36.74956621312616 37.24955826500035 -378.254 236.33950921777105 236.96557704682107 36.74956621312616 37.24955826500035 -379.254 236.96557704682107 237.59164487592105 36.74956621312616 37.24955826500035 -380.254 237.59164487592105 238.21771270502103 36.74956621312616 37.24955826500035 -381.254 238.21771270502103 238.84378053407104 36.74956621312616 37.24955826500035 -382.254 238.84378053407104 239.46984836312106 36.74956621312616 37.24955826500035 -383.254 239.46984836312106 240.09591619222104 36.74956621312616 37.24955826500035 -384.254 240.09591619222104 240.72198402132105 36.74956621312616 37.24955826500035 -385.254 240.72198402132105 241.34805185042103 36.74956621312616 37.24955826500035 -386.254 241.34805185042103 241.97411967947104 36.74956621312616 37.24955826500035 -387.254 241.97411967947104 242.60018750852106 36.74956621312616 37.24955826500035 -388.254 242.60018750852106 243.22625533762104 36.74956621312616 37.24955826500035 -389.254 243.22625533762104 243.85232316672105 36.74956621312616 37.24955826500035 -390.254 243.85232316672105 244.47839099577104 36.74956621312616 37.24955826500035 -391.254 244.47839099577104 245.10445882482105 36.74956621312616 37.24955826500035 -392.254 245.10445882482105 245.73052665392106 36.74956621312616 37.24955826500035 -393.254 245.73052665392106 246.35659448302104 36.74956621312616 37.24955826500035 -394.254 246.35659448302104 246.98266231212108 36.74956621312616 37.24955826500035 -395.254 246.98266231212108 247.60873014117107 36.74956621312616 37.24955826500035 -396.254 247.60873014117107 248.23479797022105 36.74956621312616 37.24955826500035 -397.254 248.23479797022105 248.86086579932106 36.74956621312616 37.24955826500035 -398.254 248.86086579932106 249.48693362842104 36.74956621312616 37.24955826500035 -399.254 249.48693362842104 250.11300145747106 36.74956621312616 37.24955826500035 -400.254 250.11300145747106 250.73906928652107 36.74956621312616 37.24955826500035 -401.254 250.73906928652107 251.36513711562105 36.74956621312616 37.24955826500035 -402.254 251.36513711562105 251.99120494472106 36.74956621312616 37.24955826500035 -403.254 251.99120494472106 252.61727277382104 36.74956621312616 37.24955826500035 -404.254 252.61727277382104 253.24334060287106 36.74956621312616 37.24955826500035 -405.254 253.24334060287106 253.86940843192107 36.74956621312616 37.24955826500035 -406.254 253.86940843192107 254.49547626102105 36.74956621312616 37.24955826500035 -407.254 254.49547626102105 255.12154409012106 36.74956621312616 37.24955826500035 -408.254 255.12154409012106 255.74761191922107 36.74956621312616 37.24955826500035 -409.254 255.74761191922107 256.37367974827106 36.74956621312616 37.24955826500035 -410.254 256.37367974827106 256.99974757732105 36.74956621312616 37.24955826500035 -411.254 256.99974757732105 257.62581540642105 36.74956621312616 37.24955826500035 -412.254 257.62581540642105 258.25188323552106 36.74956621312616 37.24955826500035 -413.254 258.25188323552106 258.87795106457105 36.74956621312616 37.24955826500035 -414.254 258.87795106457105 259.50401889362104 36.74956621312616 37.24955826500035 -415.254 259.50401889362104 260.13008672272105 36.74956621312616 37.24955826500035 -416.254 260.13008672272105 260.75615455182106 36.74956621312616 37.24955826500035 -417.254 260.75615455182106 261.38222238092106 36.74956621312616 37.24955826500035 -418.254 261.38222238092106 262.00829020997105 36.74956621312616 37.24955826500035 -419.254 262.00829020997105 262.63435803902104 36.74956621312616 37.24955826500035 -420.254 262.63435803902104 263.26042586812105 36.74956621312616 37.24955826500035 -421.254 263.26042586812105 263.886493697221 36.74956621312616 37.24955826500035 -422.254 263.886493697221 264.51256152627104 36.74956621312616 37.24955826500035 -423.254 264.51256152627104 265.1386293553211 36.74956621312616 37.24955826500035 -424.254 265.1386293553211 265.76469718442104 36.74956621312616 37.24955826500035 -425.254 265.76469718442104 266.39076501352105 36.74956621312616 37.24955826500035 -426.254 266.39076501352105 267.01683284262106 36.74956621312616 37.24955826500035 -427.254 267.01683284262106 267.64290067167104 36.74956621312616 37.24955826500035 -428.254 267.64290067167104 268.26896850072103 36.74956621312616 37.24955826500035 -429.254 268.26896850072103 268.89503632982104 36.74956621312616 37.24955826500035 -430.254 268.89503632982104 269.52110415892105 36.74956621312616 37.24955826500035 -431.254 269.52110415892105 270.1471719879711 36.74956621312616 37.24955826500035 -432.254 270.1471719879711 270.7732398170211 36.74956621312616 37.24955826500035 -433.254 270.7732398170211 271.3993076461211 36.74956621312616 37.24955826500035 -434.254 271.3993076461211 272.02537547522104 36.74956621312616 37.24955826500035 -435.254 272.02537547522104 272.6614753764517 36.74956621312616 37.24955826500035 -565.254 353.40416118319035 354.04026108442105 36.74956621312616 37.24955826500035 -566.254 354.04026108442105 354.66632891352106 36.74956621312616 37.24955826500035 -567.254 354.66632891352106 355.29239674262107 36.74956621312616 37.24955826500035 -568.254 355.29239674262107 355.9184645717211 36.74956621312616 37.24955826500035 -569.254 355.9184645717211 356.544532400771 36.74956621312616 37.24955826500035 -570.254 356.544532400771 357.17060022982105 36.74956621312616 37.24955826500035 -571.254 357.17060022982105 357.79666805892106 36.74956621312616 37.24955826500035 -572.254 357.79666805892106 358.42273588802107 36.74956621312616 37.24955826500035 -573.254 358.42273588802107 359.04880371707105 36.74956621312616 37.24955826500035 -574.254 359.04880371707105 359.68037068617105 36.74956621312616 37.24955826500035 -000.254 359.68037068617105 0.31193765532106 36.74956621312616 37.24955826500035 -179.255 112.48594026411293 113.1262754291751 37.24955826500035 37.74955021068385 -180.255 113.1262754291751 113.7565116361751 37.24955826500035 37.74955021068385 -181.255 113.7565116361751 114.38674784317509 37.24955826500035 37.74955021068385 -182.255 114.38674784317509 115.0169840501751 37.24955826500035 37.74955021068385 -183.255 115.0169840501751 115.64722025717509 37.24955826500035 37.74955021068385 -184.255 115.64722025717509 116.27745646417509 37.24955826500035 37.74955021068385 -185.255 116.27745646417509 116.9076926712251 37.24955826500035 37.74955021068385 -186.255 116.9076926712251 117.5379288782751 37.24955826500035 37.74955021068385 -187.255 117.5379288782751 118.16816508527509 37.24955826500035 37.74955021068385 -188.255 118.16816508527509 118.79840129227509 37.24955826500035 37.74955021068385 -189.255 118.79840129227509 119.4286374992751 37.24955826500035 37.74955021068385 -190.255 119.4286374992751 120.05887370627511 37.24955826500035 37.74955021068385 -191.255 120.05887370627511 120.6891099132751 37.24955826500035 37.74955021068385 -192.255 120.6891099132751 121.31934612027509 37.24955826500035 37.74955021068385 -193.255 121.31934612027509 121.9495823272751 37.24955826500035 37.74955021068385 -194.255 121.9495823272751 122.57981853427509 37.24955826500035 37.74955021068385 -195.255 122.57981853427509 123.21005474127509 37.24955826500035 37.74955021068385 -196.255 123.21005474127509 123.8402909482751 37.24955826500035 37.74955021068385 -197.255 123.8402909482751 124.47052715527511 37.24955826500035 37.74955021068385 -198.255 124.47052715527511 125.1007633622751 37.24955826500035 37.74955021068385 -199.255 125.1007633622751 125.7309995692751 37.24955826500035 37.74955021068385 -200.255 125.7309995692751 126.3612357762751 37.24955826500035 37.74955021068385 -201.255 126.3612357762751 126.99147198327509 37.24955826500035 37.74955021068385 -202.255 126.99147198327509 127.62170819027509 37.24955826500035 37.74955021068385 -203.255 127.62170819027509 128.25194439727508 37.24955826500035 37.74955021068385 -204.255 128.25194439727508 128.88218060432507 37.24955826500035 37.74955021068385 -205.255 128.88218060432507 129.5124168113751 37.24955826500035 37.74955021068385 -206.255 129.5124168113751 130.14265301837509 37.24955826500035 37.74955021068385 -207.255 130.14265301837509 130.77288922537508 37.24955826500035 37.74955021068385 -208.255 130.77288922537508 131.40312543237508 37.24955826500035 37.74955021068385 -209.255 131.40312543237508 132.0333616393751 37.24955826500035 37.74955021068385 -210.255 132.0333616393751 132.66359784637513 37.24955826500035 37.74955021068385 -211.255 132.66359784637513 133.29383405337512 37.24955826500035 37.74955021068385 -212.255 133.29383405337512 133.9240702603751 37.24955826500035 37.74955021068385 -213.255 133.9240702603751 134.55430646737508 37.24955826500035 37.74955021068385 -214.255 134.55430646737508 135.1845426743751 37.24955826500035 37.74955021068385 -215.255 135.1845426743751 135.8147788813751 37.24955826500035 37.74955021068385 -216.255 135.8147788813751 136.4450150883751 37.24955826500035 37.74955021068385 -217.255 136.4450150883751 137.0752512953751 37.24955826500035 37.74955021068385 -218.255 137.0752512953751 137.7054875023751 37.24955826500035 37.74955021068385 -219.255 137.7054875023751 138.3357237093751 37.24955826500035 37.74955021068385 -220.255 138.3357237093751 138.96595991637508 37.24955826500035 37.74955021068385 -221.255 138.96595991637508 139.59619612337508 37.24955826500035 37.74955021068385 -222.255 139.59619612337508 140.2264323303751 37.24955826500035 37.74955021068385 -223.255 140.2264323303751 140.85666853737513 37.24955826500035 37.74955021068385 -224.255 140.85666853737513 141.4869047444251 37.24955826500035 37.74955021068385 -225.255 141.4869047444251 142.1171409514751 37.24955826500035 37.74955021068385 -226.255 142.1171409514751 142.7473771584751 37.24955826500035 37.74955021068385 -227.255 142.7473771584751 143.3776133654751 37.24955826500035 37.74955021068385 -228.255 143.3776133654751 144.0078495724751 37.24955826500035 37.74955021068385 -229.255 144.0078495724751 144.6380857794751 37.24955826500035 37.74955021068385 -230.255 144.6380857794751 145.2683219864751 37.24955826500035 37.74955021068385 -231.255 145.2683219864751 145.89855819347508 37.24955826500035 37.74955021068385 -232.255 145.89855819347508 146.52879440047508 37.24955826500035 37.74955021068385 -233.255 146.52879440047508 147.1590306074751 37.24955826500035 37.74955021068385 -234.255 147.1590306074751 147.78926681447513 37.24955826500035 37.74955021068385 -235.255 147.78926681447513 148.41950302147512 37.24955826500035 37.74955021068385 -236.255 148.41950302147512 149.04973922847512 37.24955826500035 37.74955021068385 -237.255 149.04973922847512 149.6799754354751 37.24955826500035 37.74955021068385 -238.255 149.6799754354751 150.3102116424751 37.24955826500035 37.74955021068385 -239.255 150.3102116424751 150.9404478494751 37.24955826500035 37.74955021068385 -240.255 150.9404478494751 151.5706840564751 37.24955826500035 37.74955021068385 -241.255 151.5706840564751 152.2009202634751 37.24955826500035 37.74955021068385 -242.255 152.2009202634751 152.8311564704751 37.24955826500035 37.74955021068385 -243.255 152.8311564704751 153.4613926775251 37.24955826500035 37.74955021068385 -244.255 153.4613926775251 154.0916288845751 37.24955826500035 37.74955021068385 -245.255 154.0916288845751 154.72186509157513 37.24955826500035 37.74955021068385 -246.255 154.72186509157513 155.3521012985751 37.24955826500035 37.74955021068385 -247.255 155.3521012985751 155.9823375055751 37.24955826500035 37.74955021068385 -248.255 155.9823375055751 156.6125737125751 37.24955826500035 37.74955021068385 -249.255 156.6125737125751 157.25290887763728 37.24955826500035 37.74955021068385 -253.255 159.12341958251292 159.7637547475751 37.24955826500035 37.74955021068385 -254.255 159.7637547475751 160.3939909545751 37.24955826500035 37.74955021068385 -255.255 160.3939909545751 161.02422716157508 37.24955826500035 37.74955021068385 -256.255 161.02422716157508 161.65446336857508 37.24955826500035 37.74955021068385 -257.255 161.65446336857508 162.2846995755751 37.24955826500035 37.74955021068385 -258.255 162.2846995755751 162.91493578257513 37.24955826500035 37.74955021068385 -259.255 162.91493578257513 163.54517198957512 37.24955826500035 37.74955021068385 -260.255 163.54517198957512 164.17540819657512 37.24955826500035 37.74955021068385 -261.255 164.17540819657512 164.80564440357512 37.24955826500035 37.74955021068385 -262.255 164.80564440357512 165.43588061057508 37.24955826500035 37.74955021068385 -263.255 165.43588061057508 166.06611681762507 37.24955826500035 37.74955021068385 -264.255 166.06611681762507 166.6963530246751 37.24955826500035 37.74955021068385 -265.255 166.6963530246751 167.3265892316751 37.24955826500035 37.74955021068385 -266.255 167.3265892316751 167.95682543867508 37.24955826500035 37.74955021068385 -267.255 167.95682543867508 168.58706164567508 37.24955826500035 37.74955021068385 -268.255 168.58706164567508 169.2172978526751 37.24955826500035 37.74955021068385 -269.255 169.2172978526751 169.84753405967513 37.24955826500035 37.74955021068385 -270.255 169.84753405967513 170.47777026667512 37.24955826500035 37.74955021068385 -271.255 170.47777026667512 171.1080064736751 37.24955826500035 37.74955021068385 -272.255 171.1080064736751 171.7382426806751 37.24955826500035 37.74955021068385 -273.255 171.7382426806751 172.3684788876751 37.24955826500035 37.74955021068385 -274.255 172.3684788876751 172.9987150946751 37.24955826500035 37.74955021068385 -275.255 172.9987150946751 173.6289513016751 37.24955826500035 37.74955021068385 -276.255 173.6289513016751 174.2591875086751 37.24955826500035 37.74955021068385 -277.255 174.2591875086751 174.8894237156751 37.24955826500035 37.74955021068385 -278.255 174.8894237156751 175.5196599226751 37.24955826500035 37.74955021068385 -279.255 175.5196599226751 176.14989612967508 37.24955826500035 37.74955021068385 -280.255 176.14989612967508 176.78013233667508 37.24955826500035 37.74955021068385 -281.255 176.78013233667508 177.4103685436751 37.24955826500035 37.74955021068385 -282.255 177.4103685436751 178.04060475072512 37.24955826500035 37.74955021068385 -283.255 178.04060475072512 178.6708409577751 37.24955826500035 37.74955021068385 -284.255 178.6708409577751 179.3010771647751 37.24955826500035 37.74955021068385 -285.255 179.3010771647751 179.9313133717751 37.24955826500035 37.74955021068385 -286.255 179.9313133717751 180.5615495787751 37.24955826500035 37.74955021068385 -287.255 180.5615495787751 181.1917857857751 37.24955826500035 37.74955021068385 -288.255 181.1917857857751 181.8220219927751 37.24955826500035 37.74955021068385 -289.255 181.8220219927751 182.4522581997751 37.24955826500035 37.74955021068385 -290.255 182.4522581997751 183.08249440677508 37.24955826500035 37.74955021068385 -291.255 183.08249440677508 183.71273061377508 37.24955826500035 37.74955021068385 -292.255 183.71273061377508 184.34296682077508 37.24955826500035 37.74955021068385 -293.255 184.34296682077508 184.9732030277751 37.24955826500035 37.74955021068385 -294.255 184.9732030277751 185.6034392347751 37.24955826500035 37.74955021068385 -295.255 185.6034392347751 186.2336754417751 37.24955826500035 37.74955021068385 -296.255 186.2336754417751 186.8639116487751 37.24955826500035 37.74955021068385 -297.255 186.8639116487751 187.49414785577508 37.24955826500035 37.74955021068385 -298.255 187.49414785577508 188.1243840627751 37.24955826500035 37.74955021068385 -299.255 188.1243840627751 188.7546202697751 37.24955826500035 37.74955021068385 -300.255 188.7546202697751 189.3848564767751 37.24955826500035 37.74955021068385 -301.255 189.3848564767751 190.0150926838251 37.24955826500035 37.74955021068385 -302.255 190.0150926838251 190.64532889087508 37.24955826500035 37.74955021068385 -303.255 190.64532889087508 191.27556509787507 37.24955826500035 37.74955021068385 -304.255 191.27556509787507 191.9058013048751 37.24955826500035 37.74955021068385 -305.255 191.9058013048751 192.5360375118751 37.24955826500035 37.74955021068385 -306.255 192.5360375118751 193.16627371887512 37.24955826500035 37.74955021068385 -307.255 193.16627371887512 193.7965099258751 37.24955826500035 37.74955021068385 -308.255 193.7965099258751 194.42674613287508 37.24955826500035 37.74955021068385 -309.255 194.42674613287508 195.06708129793725 37.24955826500035 37.74955021068385 -361.255 227.1889299391129 227.82926510417508 37.24955826500035 37.74955021068385 -362.255 227.82926510417508 228.45950131117507 37.24955826500035 37.74955021068385 -363.255 228.45950131117507 229.08973751817513 37.24955826500035 37.74955021068385 -364.255 229.08973751817513 229.71997372517512 37.24955826500035 37.74955021068385 -365.255 229.71997372517512 230.35020993217512 37.24955826500035 37.74955021068385 -366.255 230.35020993217512 230.98044613917511 37.24955826500035 37.74955021068385 -367.255 230.98044613917511 231.61068234617508 37.24955826500035 37.74955021068385 -368.255 231.61068234617508 232.24091855317508 37.24955826500035 37.74955021068385 -369.255 232.24091855317508 232.8711547601751 37.24955826500035 37.74955021068385 -370.255 232.8711547601751 233.50139096717513 37.24955826500035 37.74955021068385 -371.255 233.50139096717513 234.13162717417512 37.24955826500035 37.74955021068385 -372.255 234.13162717417512 234.76186338117512 37.24955826500035 37.74955021068385 -373.255 234.76186338117512 235.39209958817509 37.24955826500035 37.74955021068385 -374.255 235.39209958817509 236.0223357951751 37.24955826500035 37.74955021068385 -375.255 236.0223357951751 236.65257200217508 37.24955826500035 37.74955021068385 -376.255 236.65257200217508 237.2828082091751 37.24955826500035 37.74955021068385 -377.255 237.2828082091751 237.91304441617513 37.24955826500035 37.74955021068385 -378.255 237.91304441617513 238.54328062317512 37.24955826500035 37.74955021068385 -379.255 238.54328062317512 239.17351683022508 37.24955826500035 37.74955021068385 -380.255 239.17351683022508 239.8037530372751 37.24955826500035 37.74955021068385 -381.255 239.8037530372751 240.43398924427507 37.24955826500035 37.74955021068385 -382.255 240.43398924427507 241.06422545127506 37.24955826500035 37.74955021068385 -383.255 241.06422545127506 241.69446165827506 37.24955826500035 37.74955021068385 -384.255 241.69446165827506 242.32469786527506 37.24955826500035 37.74955021068385 -385.255 242.32469786527506 242.95493407227505 37.24955826500035 37.74955021068385 -386.255 242.95493407227505 243.58517027927508 37.24955826500035 37.74955021068385 -387.255 243.58517027927508 244.2154064862751 37.24955826500035 37.74955021068385 -388.255 244.2154064862751 244.84564269327507 37.24955826500035 37.74955021068385 -389.255 244.84564269327507 245.4758789002751 37.24955826500035 37.74955021068385 -390.255 245.4758789002751 246.1061151072751 37.24955826500035 37.74955021068385 -391.255 246.1061151072751 246.73635131427505 37.24955826500035 37.74955021068385 -392.255 246.73635131427505 247.36658752127505 37.24955826500035 37.74955021068385 -393.255 247.36658752127505 247.9968237282751 37.24955826500035 37.74955021068385 -394.255 247.9968237282751 248.6270599352751 37.24955826500035 37.74955021068385 -395.255 248.6270599352751 249.2572961422751 37.24955826500035 37.74955021068385 -396.255 249.2572961422751 249.88753234927506 37.24955826500035 37.74955021068385 -397.255 249.88753234927506 250.5177685562751 37.24955826500035 37.74955021068385 -398.255 250.5177685562751 251.14800476327508 37.24955826500035 37.74955021068385 -399.255 251.14800476327508 251.7782409703251 37.24955826500035 37.74955021068385 -400.255 251.7782409703251 252.40847717737512 37.24955826500035 37.74955021068385 -401.255 252.40847717737512 253.0387133843751 37.24955826500035 37.74955021068385 -402.255 253.0387133843751 253.66894959137508 37.24955826500035 37.74955021068385 -403.255 253.66894959137508 254.29918579837508 37.24955826500035 37.74955021068385 -404.255 254.29918579837508 254.9294220053751 37.24955826500035 37.74955021068385 -405.255 254.9294220053751 255.55965821237513 37.24955826500035 37.74955021068385 -406.255 255.55965821237513 256.1898944193751 37.24955826500035 37.74955021068385 -407.255 256.1898944193751 256.8201306263751 37.24955826500035 37.74955021068385 -408.255 256.8201306263751 257.4503668333751 37.24955826500035 37.74955021068385 -409.255 257.4503668333751 258.0806030403751 37.24955826500035 37.74955021068385 -410.255 258.0806030403751 258.71083924737513 37.24955826500035 37.74955021068385 -411.255 258.71083924737513 259.34107545437513 37.24955826500035 37.74955021068385 -412.255 259.34107545437513 259.9713116613751 37.24955826500035 37.74955021068385 -413.255 259.9713116613751 260.6015478683751 37.24955826500035 37.74955021068385 -414.255 260.6015478683751 261.2317840753751 37.24955826500035 37.74955021068385 -415.255 261.2317840753751 261.8620202823751 37.24955826500035 37.74955021068385 -416.255 261.8620202823751 262.4922564893751 37.24955826500035 37.74955021068385 -417.255 262.4922564893751 263.12249269637505 37.24955826500035 37.74955021068385 -418.255 263.12249269637505 263.7527289034251 37.24955826500035 37.74955021068385 -419.255 263.7527289034251 264.3829651104751 37.24955826500035 37.74955021068385 -420.255 264.3829651104751 265.01320131747514 37.24955826500035 37.74955021068385 -421.255 265.01320131747514 265.6434375244751 37.24955826500035 37.74955021068385 -422.255 265.6434375244751 266.2736737314751 37.24955826500035 37.74955021068385 -423.255 266.2736737314751 266.90390993847507 37.24955826500035 37.74955021068385 -424.255 266.90390993847507 267.5341461454751 37.24955826500035 37.74955021068385 -425.255 267.5341461454751 268.16438235247506 37.24955826500035 37.74955021068385 -426.255 268.16438235247506 268.79461855947505 37.24955826500035 37.74955021068385 -427.255 268.79461855947505 269.42485476647505 37.24955826500035 37.74955021068385 -428.255 269.42485476647505 270.0550909734751 37.24955826500035 37.74955021068385 -429.255 270.0550909734751 270.6853271804751 37.24955826500035 37.74955021068385 -430.255 270.6853271804751 271.3155633874751 37.24955826500035 37.74955021068385 -431.255 271.3155633874751 271.94579959447515 37.24955826500035 37.74955021068385 -432.255 271.94579959447515 272.5760358014751 37.24955826500035 37.74955021068385 -433.255 272.5760358014751 273.2163709665373 37.24955826500035 37.74955021068385 -178.256 112.61404713713947 113.25872376771093 37.74955021068385 38.24954204678249 -179.256 113.25872376771093 113.89323287521091 37.74955021068385 38.24954204678249 -180.256 113.89323287521091 114.52774198276092 37.74955021068385 38.24954204678249 -181.256 114.52774198276092 115.16225109031092 37.74955021068385 38.24954204678249 -182.256 115.16225109031092 115.79676019781093 37.74955021068385 38.24954204678249 -183.256 115.79676019781093 116.4312693053609 37.74955021068385 38.24954204678249 -184.256 116.4312693053609 117.06577841291093 37.74955021068385 38.24954204678249 -185.256 117.06577841291093 117.70028752041094 37.74955021068385 38.24954204678249 -186.256 117.70028752041094 118.33479662796093 37.74955021068385 38.24954204678249 -187.256 118.33479662796093 118.96930573551094 37.74955021068385 38.24954204678249 -188.256 118.96930573551094 119.60381484306092 37.74955021068385 38.24954204678249 -189.256 119.60381484306092 120.23832395061092 37.74955021068385 38.24954204678249 -190.256 120.23832395061092 120.87283305811093 37.74955021068385 38.24954204678249 -191.256 120.87283305811093 121.50734216566092 37.74955021068385 38.24954204678249 -192.256 121.50734216566092 122.14185127321093 37.74955021068385 38.24954204678249 -193.256 122.14185127321093 122.77636038071091 37.74955021068385 38.24954204678249 -194.256 122.77636038071091 123.41086948826091 37.74955021068385 38.24954204678249 -195.256 123.41086948826091 124.04537859581092 37.74955021068385 38.24954204678249 -196.256 124.04537859581092 124.67988770331092 37.74955021068385 38.24954204678249 -197.256 124.67988770331092 125.31439681086093 37.74955021068385 38.24954204678249 -198.256 125.31439681086093 125.94890591841093 37.74955021068385 38.24954204678249 -199.256 125.94890591841093 126.58341502596093 37.74955021068385 38.24954204678249 -200.256 126.58341502596093 127.2179241335109 37.74955021068385 38.24954204678249 -201.256 127.2179241335109 127.85243324101091 37.74955021068385 38.24954204678249 -202.256 127.85243324101091 128.48694234856092 37.74955021068385 38.24954204678249 -203.256 128.48694234856092 129.12145145611092 37.74955021068385 38.24954204678249 -204.256 129.12145145611092 129.75596056361093 37.74955021068385 38.24954204678249 -205.256 129.75596056361093 130.39046967116093 37.74955021068385 38.24954204678249 -206.256 130.39046967116093 131.0249787787109 37.74955021068385 38.24954204678249 -207.256 131.0249787787109 131.6594878862109 37.74955021068385 38.24954204678249 -208.256 131.6594878862109 132.2939969937609 37.74955021068385 38.24954204678249 -209.256 132.2939969937609 132.92850610131092 37.74955021068385 38.24954204678249 -210.256 132.92850610131092 133.56301520886092 37.74955021068385 38.24954204678249 -211.256 133.56301520886092 134.19752431641092 37.74955021068385 38.24954204678249 -212.256 134.19752431641092 134.8320334239109 37.74955021068385 38.24954204678249 -213.256 134.8320334239109 135.4665425314609 37.74955021068385 38.24954204678249 -214.256 135.4665425314609 136.1010516390109 37.74955021068385 38.24954204678249 -215.256 136.1010516390109 136.7355607465109 37.74955021068385 38.24954204678249 -216.256 136.7355607465109 137.37006985406092 37.74955021068385 38.24954204678249 -217.256 137.37006985406092 138.00457896161092 37.74955021068385 38.24954204678249 -218.256 138.00457896161092 138.63908806911093 37.74955021068385 38.24954204678249 -219.256 138.63908806911093 139.27359717666093 37.74955021068385 38.24954204678249 -220.256 139.27359717666093 139.9081062842109 37.74955021068385 38.24954204678249 -221.256 139.9081062842109 140.54261539176088 37.74955021068385 38.24954204678249 -222.256 140.54261539176088 141.17712449931093 37.74955021068385 38.24954204678249 -223.256 141.17712449931093 141.81163360681091 37.74955021068385 38.24954204678249 -224.256 141.81163360681091 142.44614271436092 37.74955021068385 38.24954204678249 -225.256 142.44614271436092 143.08065182191092 37.74955021068385 38.24954204678249 -226.256 143.08065182191092 143.7151609294109 37.74955021068385 38.24954204678249 -227.256 143.7151609294109 144.3496700369609 37.74955021068385 38.24954204678249 -228.256 144.3496700369609 144.98417914451093 37.74955021068385 38.24954204678249 -229.256 144.98417914451093 145.61868825201094 37.74955021068385 38.24954204678249 -230.256 145.61868825201094 146.25319735956094 37.74955021068385 38.24954204678249 -231.256 146.25319735956094 146.88770646711095 37.74955021068385 38.24954204678249 -232.256 146.88770646711095 147.52221557466095 37.74955021068385 38.24954204678249 -233.256 147.52221557466095 148.15672468221095 37.74955021068385 38.24954204678249 -234.256 148.15672468221095 148.79123378971093 37.74955021068385 38.24954204678249 -235.256 148.79123378971093 149.42574289726093 37.74955021068385 38.24954204678249 -236.256 149.42574289726093 150.06025200481093 37.74955021068385 38.24954204678249 -237.256 150.06025200481093 150.6947611123109 37.74955021068385 38.24954204678249 -238.256 150.6947611123109 151.32927021986092 37.74955021068385 38.24954204678249 -239.256 151.32927021986092 151.96377932741092 37.74955021068385 38.24954204678249 -240.256 151.96377932741092 152.5982884349109 37.74955021068385 38.24954204678249 -241.256 152.5982884349109 153.2327975424609 37.74955021068385 38.24954204678249 -242.256 153.2327975424609 153.8673066500109 37.74955021068385 38.24954204678249 -243.256 153.8673066500109 154.5018157575609 37.74955021068385 38.24954204678249 -244.256 154.5018157575609 155.1363248651109 37.74955021068385 38.24954204678249 -245.256 155.1363248651109 155.7708339726109 37.74955021068385 38.24954204678249 -246.256 155.7708339726109 156.4053430801609 37.74955021068385 38.24954204678249 -247.256 156.4053430801609 157.0398521877109 37.74955021068385 38.24954204678249 -248.256 157.0398521877109 157.6845288182824 37.74955021068385 38.24954204678249 -251.256 158.93321198723947 159.5778886178109 37.74955021068385 38.24954204678249 -252.256 159.5778886178109 160.21239772536092 37.74955021068385 38.24954204678249 -253.256 160.21239772536092 160.84690683291092 37.74955021068385 38.24954204678249 -254.256 160.84690683291092 161.48141594046092 37.74955021068385 38.24954204678249 -255.256 161.48141594046092 162.11592504801092 37.74955021068385 38.24954204678249 -256.256 162.11592504801092 162.7504341555109 37.74955021068385 38.24954204678249 -257.256 162.7504341555109 163.3849432630609 37.74955021068385 38.24954204678249 -258.256 163.3849432630609 164.0194523706109 37.74955021068385 38.24954204678249 -259.256 164.0194523706109 164.65396147811094 37.74955021068385 38.24954204678249 -260.256 164.65396147811094 165.28847058566095 37.74955021068385 38.24954204678249 -261.256 165.28847058566095 165.92297969321095 37.74955021068385 38.24954204678249 -262.256 165.92297969321095 166.55748880071093 37.74955021068385 38.24954204678249 -263.256 166.55748880071093 167.19199790826093 37.74955021068385 38.24954204678249 -264.256 167.19199790826093 167.82650701581093 37.74955021068385 38.24954204678249 -265.256 167.82650701581093 168.46101612336093 37.74955021068385 38.24954204678249 -266.256 168.46101612336093 169.0955252309109 37.74955021068385 38.24954204678249 -267.256 169.0955252309109 169.73003433841092 37.74955021068385 38.24954204678249 -268.256 169.73003433841092 170.36454344596092 37.74955021068385 38.24954204678249 -269.256 170.36454344596092 170.99905255351092 37.74955021068385 38.24954204678249 -270.256 170.99905255351092 171.63356166101093 37.74955021068385 38.24954204678249 -271.256 171.63356166101093 172.26807076856093 37.74955021068385 38.24954204678249 -272.256 172.26807076856093 172.90257987611093 37.74955021068385 38.24954204678249 -273.256 172.90257987611093 173.53708898361091 37.74955021068385 38.24954204678249 -274.256 173.53708898361091 174.17159809116094 37.74955021068385 38.24954204678249 -275.256 174.17159809116094 174.80610719871092 37.74955021068385 38.24954204678249 -276.256 174.80610719871092 175.44061630626092 37.74955021068385 38.24954204678249 -277.256 175.44061630626092 176.07512541381092 37.74955021068385 38.24954204678249 -278.256 176.07512541381092 176.70963452131093 37.74955021068385 38.24954204678249 -279.256 176.70963452131093 177.34414362886093 37.74955021068385 38.24954204678249 -280.256 177.34414362886093 177.9786527364109 37.74955021068385 38.24954204678249 -281.256 177.9786527364109 178.61316184391092 37.74955021068385 38.24954204678249 -282.256 178.61316184391092 179.24767095146092 37.74955021068385 38.24954204678249 -283.256 179.24767095146092 179.88218005901092 37.74955021068385 38.24954204678249 -284.256 179.88218005901092 180.5166891665109 37.74955021068385 38.24954204678249 -285.256 180.5166891665109 181.1511982740609 37.74955021068385 38.24954204678249 -286.256 181.1511982740609 181.7857073816109 37.74955021068385 38.24954204678249 -287.256 181.7857073816109 182.42021648916088 37.74955021068385 38.24954204678249 -288.256 182.42021648916088 183.0547255967109 37.74955021068385 38.24954204678249 -289.256 183.0547255967109 183.6892347042109 37.74955021068385 38.24954204678249 -290.256 183.6892347042109 184.3237438117609 37.74955021068385 38.24954204678249 -291.256 184.3237438117609 184.95825291931092 37.74955021068385 38.24954204678249 -292.256 184.95825291931092 185.5927620268109 37.74955021068385 38.24954204678249 -293.256 185.5927620268109 186.22727113436088 37.74955021068385 38.24954204678249 -294.256 186.22727113436088 186.86178024191088 37.74955021068385 38.24954204678249 -295.256 186.86178024191088 187.49628934941092 37.74955021068385 38.24954204678249 -296.256 187.49628934941092 188.13079845696092 37.74955021068385 38.24954204678249 -297.256 188.13079845696092 188.76530756451092 37.74955021068385 38.24954204678249 -298.256 188.76530756451092 189.39981667206092 37.74955021068385 38.24954204678249 -299.256 189.39981667206092 190.03432577961092 37.74955021068385 38.24954204678249 -300.256 190.03432577961092 190.6688348871109 37.74955021068385 38.24954204678249 -301.256 190.6688348871109 191.3033439946609 37.74955021068385 38.24954204678249 -302.256 191.3033439946609 191.9378531022109 37.74955021068385 38.24954204678249 -303.256 191.9378531022109 192.5723622097109 37.74955021068385 38.24954204678249 -304.256 192.5723622097109 193.2068713172609 37.74955021068385 38.24954204678249 -305.256 193.2068713172609 193.8413804248109 37.74955021068385 38.24954204678249 -306.256 193.8413804248109 194.4758895323109 37.74955021068385 38.24954204678249 -307.256 194.4758895323109 195.1103986398609 37.74955021068385 38.24954204678249 -308.256 195.1103986398609 195.75507527048237 37.74955021068385 38.24954204678249 -359.256 227.46019560113945 228.1048722317609 37.74955021068385 38.24954204678249 -360.256 228.1048722317609 228.7393813393109 37.74955021068385 38.24954204678249 -361.256 228.7393813393109 229.3738904468109 37.74955021068385 38.24954204678249 -362.256 229.3738904468109 230.0083995543609 37.74955021068385 38.24954204678249 -363.256 230.0083995543609 230.6429086619109 37.74955021068385 38.24954204678249 -364.256 230.6429086619109 231.27741776941087 37.74955021068385 38.24954204678249 -365.256 231.27741776941087 231.91192687696088 37.74955021068385 38.24954204678249 -366.256 231.91192687696088 232.54643598451088 37.74955021068385 38.24954204678249 -367.256 232.54643598451088 233.18094509206088 37.74955021068385 38.24954204678249 -368.256 233.18094509206088 233.81545419961088 37.74955021068385 38.24954204678249 -369.256 233.81545419961088 234.44996330711092 37.74955021068385 38.24954204678249 -370.256 234.44996330711092 235.08447241466092 37.74955021068385 38.24954204678249 -371.256 235.08447241466092 235.71898152221092 37.74955021068385 38.24954204678249 -372.256 235.71898152221092 236.3534906297109 37.74955021068385 38.24954204678249 -373.256 236.3534906297109 236.9879997372609 37.74955021068385 38.24954204678249 -374.256 236.9879997372609 237.6225088448109 37.74955021068385 38.24954204678249 -375.256 237.6225088448109 238.25701795231095 37.74955021068385 38.24954204678249 -376.256 238.25701795231095 238.89152705986092 37.74955021068385 38.24954204678249 -377.256 238.89152705986092 239.52603616741095 37.74955021068385 38.24954204678249 -378.256 239.52603616741095 240.16054527496092 37.74955021068385 38.24954204678249 -379.256 240.16054527496092 240.7950543825109 37.74955021068385 38.24954204678249 -380.256 240.7950543825109 241.42956349001088 37.74955021068385 38.24954204678249 -381.256 241.42956349001088 242.06407259756088 37.74955021068385 38.24954204678249 -382.256 242.06407259756088 242.69858170511088 37.74955021068385 38.24954204678249 -383.256 242.69858170511088 243.33309081261092 37.74955021068385 38.24954204678249 -384.256 243.33309081261092 243.9675999201609 37.74955021068385 38.24954204678249 -385.256 243.9675999201609 244.60210902771092 37.74955021068385 38.24954204678249 -386.256 244.60210902771092 245.2366181352109 37.74955021068385 38.24954204678249 -387.256 245.2366181352109 245.8711272427609 37.74955021068385 38.24954204678249 -388.256 245.8711272427609 246.5056363503109 37.74955021068385 38.24954204678249 -389.256 246.5056363503109 247.1401454578609 37.74955021068385 38.24954204678249 -390.256 247.1401454578609 247.7746545654109 37.74955021068385 38.24954204678249 -391.256 247.7746545654109 248.40916367291092 37.74955021068385 38.24954204678249 -392.256 248.40916367291092 249.04367278046092 37.74955021068385 38.24954204678249 -393.256 249.04367278046092 249.67818188801093 37.74955021068385 38.24954204678249 -394.256 249.67818188801093 250.3126909955109 37.74955021068385 38.24954204678249 -395.256 250.3126909955109 250.94720010306088 37.74955021068385 38.24954204678249 -396.256 250.94720010306088 251.58170921061088 37.74955021068385 38.24954204678249 -397.256 251.58170921061088 252.21621831811092 37.74955021068385 38.24954204678249 -398.256 252.21621831811092 252.85072742566092 37.74955021068385 38.24954204678249 -399.256 252.85072742566092 253.48523653321092 37.74955021068385 38.24954204678249 -400.256 253.48523653321092 254.11974564076093 37.74955021068385 38.24954204678249 -401.256 254.11974564076093 254.75425474831087 37.74955021068385 38.24954204678249 -402.256 254.75425474831087 255.3887638558109 37.74955021068385 38.24954204678249 -403.256 255.3887638558109 256.0232729633609 37.74955021068385 38.24954204678249 -404.256 256.0232729633609 256.6577820709109 37.74955021068385 38.24954204678249 -405.256 256.6577820709109 257.2922911784109 37.74955021068385 38.24954204678249 -406.256 257.2922911784109 257.9268002859609 37.74955021068385 38.24954204678249 -407.256 257.9268002859609 258.5613093935109 37.74955021068385 38.24954204678249 -408.256 258.5613093935109 259.1958185010109 37.74955021068385 38.24954204678249 -409.256 259.1958185010109 259.8303276085609 37.74955021068385 38.24954204678249 -410.256 259.8303276085609 260.4648367161109 37.74955021068385 38.24954204678249 -411.256 260.4648367161109 261.0993458236609 37.74955021068385 38.24954204678249 -412.256 261.0993458236609 261.7338549312109 37.74955021068385 38.24954204678249 -413.256 261.7338549312109 262.36836403871087 37.74955021068385 38.24954204678249 -414.256 262.36836403871087 263.00287314626087 37.74955021068385 38.24954204678249 -415.256 263.00287314626087 263.63738225381087 37.74955021068385 38.24954204678249 -416.256 263.63738225381087 264.2718913613109 37.74955021068385 38.24954204678249 -417.256 264.2718913613109 264.9064004688609 37.74955021068385 38.24954204678249 -418.256 264.9064004688609 265.5409095764109 37.74955021068385 38.24954204678249 -419.256 265.5409095764109 266.17541868391095 37.74955021068385 38.24954204678249 -420.256 266.17541868391095 266.8099277914609 37.74955021068385 38.24954204678249 -421.256 266.8099277914609 267.4444368990109 37.74955021068385 38.24954204678249 -422.256 267.4444368990109 268.0789460065609 37.74955021068385 38.24954204678249 -423.256 268.0789460065609 268.7134551141109 37.74955021068385 38.24954204678249 -424.256 268.7134551141109 269.34796422161094 37.74955021068385 38.24954204678249 -425.256 269.34796422161094 269.98247332916094 37.74955021068385 38.24954204678249 -426.256 269.98247332916094 270.61698243671094 37.74955021068385 38.24954204678249 -427.256 270.61698243671094 271.2514915442109 37.74955021068385 38.24954204678249 -428.256 271.2514915442109 271.8860006517609 37.74955021068385 38.24954204678249 -429.256 271.8860006517609 272.5205097593109 37.74955021068385 38.24954204678249 -430.256 272.5205097593109 273.1550188668109 37.74955021068385 38.24954204678249 -431.256 273.1550188668109 273.79969549738234 37.74955021068385 38.24954204678249 -177.257 112.7525478240699 113.40167496496994 38.24954204678249 38.74953376977524 -178.257 113.40167496496994 114.04056429366992 38.24954204678249 38.74953376977524 -179.257 114.04056429366992 114.67945362241993 38.24954204678249 38.74953376977524 -180.257 114.67945362241993 115.31834295116994 38.24954204678249 38.74953376977524 -181.257 115.31834295116994 115.95723227991994 38.24954204678249 38.74953376977524 -182.257 115.95723227991994 116.59612160866993 38.24954204678249 38.74953376977524 -183.257 116.59612160866993 117.23501093741994 38.24954204678249 38.74953376977524 -184.257 117.23501093741994 117.87390026616995 38.24954204678249 38.74953376977524 -185.257 117.87390026616995 118.51278959486996 38.24954204678249 38.74953376977524 -186.257 118.51278959486996 119.15167892361994 38.24954204678249 38.74953376977524 -187.257 119.15167892361994 119.79056825236995 38.24954204678249 38.74953376977524 -188.257 119.79056825236995 120.42945758111995 38.24954204678249 38.74953376977524 -189.257 120.42945758111995 121.06834690986993 38.24954204678249 38.74953376977524 -190.257 121.06834690986993 121.70723623861993 38.24954204678249 38.74953376977524 -191.257 121.70723623861993 122.34612556736994 38.24954204678249 38.74953376977524 -192.257 122.34612556736994 122.98501489606994 38.24954204678249 38.74953376977524 -193.257 122.98501489606994 123.62390422481994 38.24954204678249 38.74953376977524 -194.257 123.62390422481994 124.26279355356994 38.24954204678249 38.74953376977524 -195.257 124.26279355356994 124.90168288231993 38.24954204678249 38.74953376977524 -196.257 124.90168288231993 125.54057221106993 38.24954204678249 38.74953376977524 -197.257 125.54057221106993 126.17946153981993 38.24954204678249 38.74953376977524 -198.257 126.17946153981993 126.81835086856995 38.24954204678249 38.74953376977524 -199.257 126.81835086856995 127.45724019726995 38.24954204678249 38.74953376977524 -200.257 127.45724019726995 128.09612952601992 38.24954204678249 38.74953376977524 -201.257 128.09612952601992 128.73501885476992 38.24954204678249 38.74953376977524 -202.257 128.73501885476992 129.37390818351994 38.24954204678249 38.74953376977524 -203.257 129.37390818351994 130.0127975122699 38.24954204678249 38.74953376977524 -204.257 130.0127975122699 130.6516868410199 38.24954204678249 38.74953376977524 -205.257 130.6516868410199 131.29057616976996 38.24954204678249 38.74953376977524 -206.257 131.29057616976996 131.92946549846994 38.24954204678249 38.74953376977524 -207.257 131.92946549846994 132.56835482721993 38.24954204678249 38.74953376977524 -208.257 132.56835482721993 133.20724415596993 38.24954204678249 38.74953376977524 -209.257 133.20724415596993 133.84613348471993 38.24954204678249 38.74953376977524 -210.257 133.84613348471993 134.48502281346993 38.24954204678249 38.74953376977524 -211.257 134.48502281346993 135.12391214221992 38.24954204678249 38.74953376977524 -212.257 135.12391214221992 135.76280147096992 38.24954204678249 38.74953376977524 -213.257 135.76280147096992 136.40169079966995 38.24954204678249 38.74953376977524 -214.257 136.40169079966995 137.04058012841995 38.24954204678249 38.74953376977524 -215.257 137.04058012841995 137.67946945716994 38.24954204678249 38.74953376977524 -216.257 137.67946945716994 138.31835878591994 38.24954204678249 38.74953376977524 -217.257 138.31835878591994 138.95724811466994 38.24954204678249 38.74953376977524 -218.257 138.95724811466994 139.59613744341993 38.24954204678249 38.74953376977524 -219.257 139.59613744341993 140.23502677216993 38.24954204678249 38.74953376977524 -220.257 140.23502677216993 140.87391610086996 38.24954204678249 38.74953376977524 -221.257 140.87391610086996 141.51280542961993 38.24954204678249 38.74953376977524 -222.257 141.51280542961993 142.15169475836996 38.24954204678249 38.74953376977524 -223.257 142.15169475836996 142.79058408711992 38.24954204678249 38.74953376977524 -224.257 142.79058408711992 143.42947341586995 38.24954204678249 38.74953376977524 -225.257 143.42947341586995 144.06836274456995 38.24954204678249 38.74953376977524 -226.257 144.06836274456995 144.70725207331992 38.24954204678249 38.74953376977524 -227.257 144.70725207331992 145.34614140206992 38.24954204678249 38.74953376977524 -228.257 145.34614140206992 145.98503073081991 38.24954204678249 38.74953376977524 -229.257 145.98503073081991 146.6239200595699 38.24954204678249 38.74953376977524 -230.257 146.6239200595699 147.26280938831994 38.24954204678249 38.74953376977524 -231.257 147.26280938831994 147.90169871706996 38.24954204678249 38.74953376977524 -232.257 147.90169871706996 148.54058804576994 38.24954204678249 38.74953376977524 -233.257 148.54058804576994 149.17947737451993 38.24954204678249 38.74953376977524 -234.257 149.17947737451993 149.81836670326993 38.24954204678249 38.74953376977524 -235.257 149.81836670326993 150.45725603201993 38.24954204678249 38.74953376977524 -236.257 150.45725603201993 151.09614536076992 38.24954204678249 38.74953376977524 -237.257 151.09614536076992 151.73503468951995 38.24954204678249 38.74953376977524 -238.257 151.73503468951995 152.37392401826995 38.24954204678249 38.74953376977524 -239.257 152.37392401826995 153.01281334696995 38.24954204678249 38.74953376977524 -240.257 153.01281334696995 153.65170267571995 38.24954204678249 38.74953376977524 -241.257 153.65170267571995 154.29059200446994 38.24954204678249 38.74953376977524 -242.257 154.29059200446994 154.92948133321994 38.24954204678249 38.74953376977524 -243.257 154.92948133321994 155.56837066196994 38.24954204678249 38.74953376977524 -244.257 155.56837066196994 156.20725999071993 38.24954204678249 38.74953376977524 -245.257 156.20725999071993 156.84614931946996 38.24954204678249 38.74953376977524 -246.257 156.84614931946996 157.48503864816996 38.24954204678249 38.74953376977524 -247.257 157.48503864816996 158.13416578907 38.24954204678249 38.74953376977524 -249.257 158.7525794934699 159.40170663441992 38.24954204678249 38.74953376977524 -250.257 159.40170663441992 160.04059596316995 38.24954204678249 38.74953376977524 -251.257 160.04059596316995 160.67948529191995 38.24954204678249 38.74953376977524 -252.257 160.67948529191995 161.31837462066994 38.24954204678249 38.74953376977524 -253.257 161.31837462066994 161.95726394936992 38.24954204678249 38.74953376977524 -254.257 161.95726394936992 162.59615327811994 38.24954204678249 38.74953376977524 -255.257 162.59615327811994 163.23504260686994 38.24954204678249 38.74953376977524 -256.257 163.23504260686994 163.87393193561996 38.24954204678249 38.74953376977524 -257.257 163.87393193561996 164.51282126436996 38.24954204678249 38.74953376977524 -258.257 164.51282126436996 165.15171059311993 38.24954204678249 38.74953376977524 -259.257 165.15171059311993 165.79059992186995 38.24954204678249 38.74953376977524 -260.257 165.79059992186995 166.42948925056993 38.24954204678249 38.74953376977524 -261.257 166.42948925056993 167.06837857931993 38.24954204678249 38.74953376977524 -262.257 167.06837857931993 167.70726790806995 38.24954204678249 38.74953376977524 -263.257 167.70726790806995 168.34615723681995 38.24954204678249 38.74953376977524 -264.257 168.34615723681995 168.98504656556992 38.24954204678249 38.74953376977524 -265.257 168.98504656556992 169.62393589431994 38.24954204678249 38.74953376977524 -266.257 169.62393589431994 170.2628252230699 38.24954204678249 38.74953376977524 -267.257 170.2628252230699 170.90171455176994 38.24954204678249 38.74953376977524 -268.257 170.90171455176994 171.54060388051994 38.24954204678249 38.74953376977524 -269.257 171.54060388051994 172.17949320926994 38.24954204678249 38.74953376977524 -270.257 172.17949320926994 172.81838253801993 38.24954204678249 38.74953376977524 -271.257 172.81838253801993 173.45727186676996 38.24954204678249 38.74953376977524 -272.257 173.45727186676996 174.09616119551993 38.24954204678249 38.74953376977524 -273.257 174.09616119551993 174.73505052426992 38.24954204678249 38.74953376977524 -274.257 174.73505052426992 175.37393985296995 38.24954204678249 38.74953376977524 -275.257 175.37393985296995 176.01282918171992 38.24954204678249 38.74953376977524 -276.257 176.01282918171992 176.65171851046995 38.24954204678249 38.74953376977524 -277.257 176.65171851046995 177.29060783921994 38.24954204678249 38.74953376977524 -278.257 177.29060783921994 177.92949716796994 38.24954204678249 38.74953376977524 -279.257 177.92949716796994 178.56838649671994 38.24954204678249 38.74953376977524 -280.257 178.56838649671994 179.20727582546994 38.24954204678249 38.74953376977524 -281.257 179.20727582546994 179.8461651541699 38.24954204678249 38.74953376977524 -282.257 179.8461651541699 180.4850544829199 38.24954204678249 38.74953376977524 -283.257 180.4850544829199 181.1239438116699 38.24954204678249 38.74953376977524 -284.257 181.1239438116699 181.7628331404199 38.24954204678249 38.74953376977524 -285.257 181.7628331404199 182.40172246916993 38.24954204678249 38.74953376977524 -286.257 182.40172246916993 183.04061179791992 38.24954204678249 38.74953376977524 -287.257 183.04061179791992 183.67950112666992 38.24954204678249 38.74953376977524 -288.257 183.67950112666992 184.31839045536992 38.24954204678249 38.74953376977524 -289.257 184.31839045536992 184.95727978411992 38.24954204678249 38.74953376977524 -290.257 184.95727978411992 185.59616911286992 38.24954204678249 38.74953376977524 -291.257 185.59616911286992 186.2350584416199 38.24954204678249 38.74953376977524 -292.257 186.2350584416199 186.8739477703699 38.24954204678249 38.74953376977524 -293.257 186.8739477703699 187.5128370991199 38.24954204678249 38.74953376977524 -294.257 187.5128370991199 188.15172642786993 38.24954204678249 38.74953376977524 -295.257 188.15172642786993 188.79061575656993 38.24954204678249 38.74953376977524 -296.257 188.79061575656993 189.42950508531993 38.24954204678249 38.74953376977524 -297.257 189.42950508531993 190.06839441406993 38.24954204678249 38.74953376977524 -298.257 190.06839441406993 190.70728374281993 38.24954204678249 38.74953376977524 -299.257 190.70728374281993 191.34617307156992 38.24954204678249 38.74953376977524 -300.257 191.34617307156992 191.98506240031992 38.24954204678249 38.74953376977524 -301.257 191.98506240031992 192.62395172906992 38.24954204678249 38.74953376977524 -302.257 192.62395172906992 193.26284105776992 38.24954204678249 38.74953376977524 -303.257 193.26284105776992 193.90173038651992 38.24954204678249 38.74953376977524 -304.257 193.90173038651992 194.5406197152699 38.24954204678249 38.74953376977524 -305.257 194.5406197152699 195.17950904401994 38.24954204678249 38.74953376977524 -306.257 195.17950904401994 195.82863618496998 38.24954204678249 38.74953376977524 -357.257 227.75262699766986 228.40175413861994 38.24954204678249 38.74953376977524 -358.257 228.40175413861994 229.04064346736993 38.24954204678249 38.74953376977524 -359.257 229.04064346736993 229.67953279611993 38.24954204678249 38.74953376977524 -360.257 229.67953279611993 230.31842212486993 38.24954204678249 38.74953376977524 -361.257 230.31842212486993 230.95731145361992 38.24954204678249 38.74953376977524 -362.257 230.95731145361992 231.59620078236992 38.24954204678249 38.74953376977524 -363.257 231.59620078236992 232.2350901110699 38.24954204678249 38.74953376977524 -364.257 232.2350901110699 232.87397943981992 38.24954204678249 38.74953376977524 -365.257 232.87397943981992 233.51286876856994 38.24954204678249 38.74953376977524 -366.257 233.51286876856994 234.1517580973199 38.24954204678249 38.74953376977524 -367.257 234.1517580973199 234.79064742606988 38.24954204678249 38.74953376977524 -368.257 234.79064742606988 235.42953675481994 38.24954204678249 38.74953376977524 -369.257 235.42953675481994 236.06842608356993 38.24954204678249 38.74953376977524 -370.257 236.06842608356993 236.70731541226993 38.24954204678249 38.74953376977524 -371.257 236.70731541226993 237.3462047410199 38.24954204678249 38.74953376977524 -372.257 237.3462047410199 237.98509406976996 38.24954204678249 38.74953376977524 -373.257 237.98509406976996 238.62398339851993 38.24954204678249 38.74953376977524 -374.257 238.62398339851993 239.2628727272699 38.24954204678249 38.74953376977524 -375.257 239.2628727272699 239.90176205601992 38.24954204678249 38.74953376977524 -376.257 239.90176205601992 240.54065138476992 38.24954204678249 38.74953376977524 -377.257 240.54065138476992 241.17954071346992 38.24954204678249 38.74953376977524 -378.257 241.17954071346992 241.81843004221992 38.24954204678249 38.74953376977524 -379.257 241.81843004221992 242.4573193709699 38.24954204678249 38.74953376977524 -380.257 242.4573193709699 243.0962086997199 38.24954204678249 38.74953376977524 -381.257 243.0962086997199 243.73509802846993 38.24954204678249 38.74953376977524 -382.257 243.73509802846993 244.3739873572199 38.24954204678249 38.74953376977524 -383.257 244.3739873572199 245.01287668596996 38.24954204678249 38.74953376977524 -384.257 245.01287668596996 245.65176601466993 38.24954204678249 38.74953376977524 -385.257 245.65176601466993 246.29065534341993 38.24954204678249 38.74953376977524 -386.257 246.29065534341993 246.92954467216992 38.24954204678249 38.74953376977524 -387.257 246.92954467216992 247.56843400091992 38.24954204678249 38.74953376977524 -388.257 247.56843400091992 248.20732332966992 38.24954204678249 38.74953376977524 -389.257 248.20732332966992 248.84621265841992 38.24954204678249 38.74953376977524 -390.257 248.84621265841992 249.4851019871699 38.24954204678249 38.74953376977524 -391.257 249.4851019871699 250.1239913158699 38.24954204678249 38.74953376977524 -392.257 250.1239913158699 250.7628806446199 38.24954204678249 38.74953376977524 -393.257 250.7628806446199 251.4017699733699 38.24954204678249 38.74953376977524 -394.257 251.4017699733699 252.04065930211993 38.24954204678249 38.74953376977524 -395.257 252.04065930211993 252.67954863086993 38.24954204678249 38.74953376977524 -396.257 252.67954863086993 253.3184379595699 38.24954204678249 38.74953376977524 -397.257 253.3184379595699 253.95732728831993 38.24954204678249 38.74953376977524 -398.257 253.95732728831993 254.59621661706993 38.24954204678249 38.74953376977524 -399.257 254.59621661706993 255.2351059458199 38.24954204678249 38.74953376977524 -400.257 255.2351059458199 255.8739952745699 38.24954204678249 38.74953376977524 -401.257 255.8739952745699 256.5128846033199 38.24954204678249 38.74953376977524 -402.257 256.5128846033199 257.1517739320699 38.24954204678249 38.74953376977524 -403.257 257.1517739320699 257.79066326077 38.24954204678249 38.74953376977524 -404.257 257.79066326077 258.42955258952 38.24954204678249 38.74953376977524 -405.257 258.42955258952 259.0684419182699 38.24954204678249 38.74953376977524 -406.257 259.0684419182699 259.7073312470199 38.24954204678249 38.74953376977524 -407.257 259.7073312470199 260.3462205757699 38.24954204678249 38.74953376977524 -408.257 260.3462205757699 260.9851099045199 38.24954204678249 38.74953376977524 -409.257 260.9851099045199 261.6239992332699 38.24954204678249 38.74953376977524 -410.257 261.6239992332699 262.26288856196993 38.24954204678249 38.74953376977524 -411.257 262.26288856196993 262.9017778907199 38.24954204678249 38.74953376977524 -412.257 262.9017778907199 263.5406672194699 38.24954204678249 38.74953376977524 -413.257 263.5406672194699 264.1795565482199 38.24954204678249 38.74953376977524 -414.257 264.1795565482199 264.8184458769699 38.24954204678249 38.74953376977524 -415.257 264.8184458769699 265.4573352057199 38.24954204678249 38.74953376977524 -416.257 265.4573352057199 266.0962245344699 38.24954204678249 38.74953376977524 -417.257 266.0962245344699 266.73511386316994 38.24954204678249 38.74953376977524 -418.257 266.73511386316994 267.3740031919199 38.24954204678249 38.74953376977524 -419.257 267.3740031919199 268.0128925206699 38.24954204678249 38.74953376977524 -420.257 268.0128925206699 268.65178184941993 38.24954204678249 38.74953376977524 -421.257 268.65178184941993 269.29067117816993 38.24954204678249 38.74953376977524 -422.257 269.29067117816993 269.92956050691987 38.24954204678249 38.74953376977524 -423.257 269.92956050691987 270.5684498356699 38.24954204678249 38.74953376977524 -424.257 270.5684498356699 271.2073391643699 38.24954204678249 38.74953376977524 -425.257 271.2073391643699 271.8462284931199 38.24954204678249 38.74953376977524 -426.257 271.8462284931199 272.4851178218699 38.24954204678249 38.74953376977524 -427.257 272.4851178218699 273.13424496276997 38.24954204678249 38.74953376977524 -175.258 112.25825161449299 112.91194126975239 38.74953376977524 39.24952537600794 -176.258 112.91194126975239 113.55532105265239 38.74953376977524 39.24952537600794 -177.258 113.55532105265239 114.19870083560238 38.74953376977524 39.24952537600794 -178.258 114.19870083560238 114.84208061855239 38.74953376977524 39.24952537600794 -179.258 114.84208061855239 115.4854604015024 38.74953376977524 39.24952537600794 -180.258 115.4854604015024 116.1288401844524 38.74953376977524 39.24952537600794 -181.258 116.1288401844524 116.77221996740238 38.74953376977524 39.24952537600794 -182.258 116.77221996740238 117.41559975035238 38.74953376977524 39.24952537600794 -183.258 117.41559975035238 118.05897953330239 38.74953376977524 39.24952537600794 -184.258 118.05897953330239 118.7023593162524 38.74953376977524 39.24952537600794 -185.258 118.7023593162524 119.3457390992024 38.74953376977524 39.24952537600794 -186.258 119.3457390992024 119.98911888215238 38.74953376977524 39.24952537600794 -187.258 119.98911888215238 120.63249866510239 38.74953376977524 39.24952537600794 -188.258 120.63249866510239 121.27587844805238 38.74953376977524 39.24952537600794 -189.258 121.27587844805238 121.9192582310024 38.74953376977524 39.24952537600794 -190.258 121.9192582310024 122.56263801395238 38.74953376977524 39.24952537600794 -191.258 122.56263801395238 123.2060177968524 38.74953376977524 39.24952537600794 -192.258 123.2060177968524 123.8493975798024 38.74953376977524 39.24952537600794 -193.258 123.8493975798024 124.4927773627524 38.74953376977524 39.24952537600794 -194.258 124.4927773627524 125.13615714570241 38.74953376977524 39.24952537600794 -195.258 125.13615714570241 125.77953692865239 38.74953376977524 39.24952537600794 -196.258 125.77953692865239 126.4229167116024 38.74953376977524 39.24952537600794 -197.258 126.4229167116024 127.0662964945524 38.74953376977524 39.24952537600794 -198.258 127.0662964945524 127.70967627750238 38.74953376977524 39.24952537600794 -199.258 127.70967627750238 128.3530560604524 38.74953376977524 39.24952537600794 -200.258 128.3530560604524 128.99643584340237 38.74953376977524 39.24952537600794 -201.258 128.99643584340237 129.6398156263524 38.74953376977524 39.24952537600794 -202.258 129.6398156263524 130.2831954093024 38.74953376977524 39.24952537600794 -203.258 130.2831954093024 130.92657519225241 38.74953376977524 39.24952537600794 -204.258 130.92657519225241 131.56995497515243 38.74953376977524 39.24952537600794 -205.258 131.56995497515243 132.2133347581024 38.74953376977524 39.24952537600794 -206.258 132.2133347581024 132.8567145410524 38.74953376977524 39.24952537600794 -207.258 132.8567145410524 133.50009432400242 38.74953376977524 39.24952537600794 -208.258 133.50009432400242 134.1434741069524 38.74953376977524 39.24952537600794 -209.258 134.1434741069524 134.78685388990237 38.74953376977524 39.24952537600794 -210.258 134.78685388990237 135.4302336728524 38.74953376977524 39.24952537600794 -211.258 135.4302336728524 136.0736134558024 38.74953376977524 39.24952537600794 -212.258 136.0736134558024 136.71699323875242 38.74953376977524 39.24952537600794 -213.258 136.71699323875242 137.3603730217024 38.74953376977524 39.24952537600794 -214.258 137.3603730217024 138.0037528046524 38.74953376977524 39.24952537600794 -215.258 138.0037528046524 138.64713258760239 38.74953376977524 39.24952537600794 -216.258 138.64713258760239 139.2905123705524 38.74953376977524 39.24952537600794 -217.258 139.2905123705524 139.93389215350237 38.74953376977524 39.24952537600794 -218.258 139.93389215350237 140.5772719364524 38.74953376977524 39.24952537600794 -219.258 140.5772719364524 141.22065171935242 38.74953376977524 39.24952537600794 -220.258 141.22065171935242 141.8640315023024 38.74953376977524 39.24952537600794 -221.258 141.8640315023024 142.50741128525243 38.74953376977524 39.24952537600794 -222.258 142.50741128525243 143.1507910682024 38.74953376977524 39.24952537600794 -223.258 143.1507910682024 143.7941708511524 38.74953376977524 39.24952537600794 -224.258 143.7941708511524 144.4375506341024 38.74953376977524 39.24952537600794 -225.258 144.4375506341024 145.0809304170524 38.74953376977524 39.24952537600794 -226.258 145.0809304170524 145.7243102000024 38.74953376977524 39.24952537600794 -227.258 145.7243102000024 146.3676899829524 38.74953376977524 39.24952537600794 -228.258 146.3676899829524 147.0110697659024 38.74953376977524 39.24952537600794 -229.258 147.0110697659024 147.6544495488524 38.74953376977524 39.24952537600794 -230.258 147.6544495488524 148.2978293318024 38.74953376977524 39.24952537600794 -231.258 148.2978293318024 148.94120911475238 38.74953376977524 39.24952537600794 -232.258 148.94120911475238 149.58458889770236 38.74953376977524 39.24952537600794 -233.258 149.58458889770236 150.2279686806524 38.74953376977524 39.24952537600794 -234.258 150.2279686806524 150.8713484635524 38.74953376977524 39.24952537600794 -235.258 150.8713484635524 151.5147282465024 38.74953376977524 39.24952537600794 -236.258 151.5147282465024 152.15810802945236 38.74953376977524 39.24952537600794 -237.258 152.15810802945236 152.8014878124024 38.74953376977524 39.24952537600794 -238.258 152.8014878124024 153.44486759535238 38.74953376977524 39.24952537600794 -239.258 153.44486759535238 154.08824737830238 38.74953376977524 39.24952537600794 -240.258 154.08824737830238 154.7316271612524 38.74953376977524 39.24952537600794 -241.258 154.7316271612524 155.3750069442024 38.74953376977524 39.24952537600794 -242.258 155.3750069442024 156.0183867271524 38.74953376977524 39.24952537600794 -243.258 156.0183867271524 156.66176651010238 38.74953376977524 39.24952537600794 -244.258 156.66176651010238 157.3051462930524 38.74953376977524 39.24952537600794 -245.258 157.3051462930524 157.9485260760024 38.74953376977524 39.24952537600794 -246.258 157.9485260760024 158.5919058589524 38.74953376977524 39.24952537600794 -247.258 158.5919058589524 159.2352856419024 38.74953376977524 39.24952537600794 -248.258 159.2352856419024 159.8786654248524 38.74953376977524 39.24952537600794 -249.258 159.8786654248524 160.5220452077524 38.74953376977524 39.24952537600794 -250.258 160.5220452077524 161.1654249907024 38.74953376977524 39.24952537600794 -251.258 161.1654249907024 161.8088047736524 38.74953376977524 39.24952537600794 -252.258 161.8088047736524 162.4521845566024 38.74953376977524 39.24952537600794 -253.258 162.4521845566024 163.09556433955242 38.74953376977524 39.24952537600794 -254.258 163.09556433955242 163.7389441225024 38.74953376977524 39.24952537600794 -255.258 163.7389441225024 164.38232390545238 38.74953376977524 39.24952537600794 -256.258 164.38232390545238 165.02570368840236 38.74953376977524 39.24952537600794 -257.258 165.02570368840236 165.6690834713524 38.74953376977524 39.24952537600794 -258.258 165.6690834713524 166.3124632543024 38.74953376977524 39.24952537600794 -259.258 166.3124632543024 166.9558430372524 38.74953376977524 39.24952537600794 -260.258 166.9558430372524 167.59922282020239 38.74953376977524 39.24952537600794 -261.258 167.59922282020239 168.24260260315236 38.74953376977524 39.24952537600794 -262.258 168.24260260315236 168.8859823861024 38.74953376977524 39.24952537600794 -263.258 168.8859823861024 169.52936216905238 38.74953376977524 39.24952537600794 -264.258 169.52936216905238 170.1727419519524 38.74953376977524 39.24952537600794 -265.258 170.1727419519524 170.8161217349024 38.74953376977524 39.24952537600794 -266.258 170.8161217349024 171.4595015178524 38.74953376977524 39.24952537600794 -267.258 171.4595015178524 172.1028813008024 38.74953376977524 39.24952537600794 -268.258 172.1028813008024 172.74626108375242 38.74953376977524 39.24952537600794 -269.258 172.74626108375242 173.3896408667024 38.74953376977524 39.24952537600794 -270.258 173.3896408667024 174.03302064965237 38.74953376977524 39.24952537600794 -271.258 174.03302064965237 174.6764004326024 38.74953376977524 39.24952537600794 -272.258 174.6764004326024 175.31978021555238 38.74953376977524 39.24952537600794 -273.258 175.31978021555238 175.9631599985024 38.74953376977524 39.24952537600794 -274.258 175.9631599985024 176.6065397814524 38.74953376977524 39.24952537600794 -275.258 176.6065397814524 177.2499195644024 38.74953376977524 39.24952537600794 -276.258 177.2499195644024 177.8932993473524 38.74953376977524 39.24952537600794 -277.258 177.8932993473524 178.5366791303024 38.74953376977524 39.24952537600794 -278.258 178.5366791303024 179.1800589132524 38.74953376977524 39.24952537600794 -279.258 179.1800589132524 179.82343869615238 38.74953376977524 39.24952537600794 -280.258 179.82343869615238 180.46681847910236 38.74953376977524 39.24952537600794 -281.258 180.46681847910236 181.1101982620524 38.74953376977524 39.24952537600794 -282.258 181.1101982620524 181.75357804500237 38.74953376977524 39.24952537600794 -283.258 181.75357804500237 182.39695782795238 38.74953376977524 39.24952537600794 -284.258 182.39695782795238 183.04033761090238 38.74953376977524 39.24952537600794 -285.258 183.04033761090238 183.68371739385236 38.74953376977524 39.24952537600794 -286.258 183.68371739385236 184.32709717680237 38.74953376977524 39.24952537600794 -287.258 184.32709717680237 184.97047695975238 38.74953376977524 39.24952537600794 -288.258 184.97047695975238 185.61385674270235 38.74953376977524 39.24952537600794 -289.258 185.61385674270235 186.2572365256524 38.74953376977524 39.24952537600794 -290.258 186.2572365256524 186.9006163086024 38.74953376977524 39.24952537600794 -291.258 186.9006163086024 187.5439960915524 38.74953376977524 39.24952537600794 -292.258 187.5439960915524 188.1873758744524 38.74953376977524 39.24952537600794 -293.258 188.1873758744524 188.8307556574024 38.74953376977524 39.24952537600794 -294.258 188.8307556574024 189.47413544035237 38.74953376977524 39.24952537600794 -295.258 189.47413544035237 190.11751522330238 38.74953376977524 39.24952537600794 -296.258 190.11751522330238 190.76089500625238 38.74953376977524 39.24952537600794 -297.258 190.76089500625238 191.40427478920236 38.74953376977524 39.24952537600794 -298.258 191.40427478920236 192.0476545721524 38.74953376977524 39.24952537600794 -299.258 192.0476545721524 192.6910343551024 38.74953376977524 39.24952537600794 -300.258 192.6910343551024 193.3344141380524 38.74953376977524 39.24952537600794 -301.258 193.3344141380524 193.9777939210024 38.74953376977524 39.24952537600794 -302.258 193.9777939210024 194.62117370395237 38.74953376977524 39.24952537600794 -303.258 194.62117370395237 195.2645534869024 38.74953376977524 39.24952537600794 -304.258 195.2645534869024 195.9182431422118 38.74953376977524 39.24952537600794 -355.258 228.06661254479297 228.72030220010237 38.74953376977524 39.24952537600794 -356.258 228.72030220010237 229.3636819830524 38.74953376977524 39.24952537600794 -357.258 229.3636819830524 230.0070617660024 38.74953376977524 39.24952537600794 -358.258 230.0070617660024 230.65044154895241 38.74953376977524 39.24952537600794 -359.258 230.65044154895241 231.2938213319024 38.74953376977524 39.24952537600794 -360.258 231.2938213319024 231.93720111485237 38.74953376977524 39.24952537600794 -361.258 231.93720111485237 232.5805808978024 38.74953376977524 39.24952537600794 -362.258 232.5805808978024 233.22396068075238 38.74953376977524 39.24952537600794 -363.258 233.22396068075238 233.86734046370236 38.74953376977524 39.24952537600794 -364.258 233.86734046370236 234.51072024665237 38.74953376977524 39.24952537600794 -365.258 234.51072024665237 235.15410002960238 38.74953376977524 39.24952537600794 -366.258 235.15410002960238 235.7974798125524 38.74953376977524 39.24952537600794 -367.258 235.7974798125524 236.4408595954524 38.74953376977524 39.24952537600794 -368.258 236.4408595954524 237.08423937840237 38.74953376977524 39.24952537600794 -369.258 237.08423937840237 237.72761916135238 38.74953376977524 39.24952537600794 -370.258 237.72761916135238 238.37099894430236 38.74953376977524 39.24952537600794 -371.258 238.37099894430236 239.0143787272524 38.74953376977524 39.24952537600794 -372.258 239.0143787272524 239.65775851020243 38.74953376977524 39.24952537600794 -373.258 239.65775851020243 240.3011382931524 38.74953376977524 39.24952537600794 -374.258 240.3011382931524 240.94451807610238 38.74953376977524 39.24952537600794 -375.258 240.94451807610238 241.5878978590524 38.74953376977524 39.24952537600794 -376.258 241.5878978590524 242.2312776420024 38.74953376977524 39.24952537600794 -377.258 242.2312776420024 242.87465742495237 38.74953376977524 39.24952537600794 -378.258 242.87465742495237 243.51803720790235 38.74953376977524 39.24952537600794 -379.258 243.51803720790235 244.16141699085236 38.74953376977524 39.24952537600794 -380.258 244.16141699085236 244.80479677380237 38.74953376977524 39.24952537600794 -381.258 244.80479677380237 245.4481765567524 38.74953376977524 39.24952537600794 -382.258 245.4481765567524 246.09155633965239 38.74953376977524 39.24952537600794 -383.258 246.09155633965239 246.73493612260236 38.74953376977524 39.24952537600794 -384.258 246.73493612260236 247.37831590555237 38.74953376977524 39.24952537600794 -385.258 247.37831590555237 248.02169568850235 38.74953376977524 39.24952537600794 -386.258 248.02169568850235 248.66507547145238 38.74953376977524 39.24952537600794 -387.258 248.66507547145238 249.3084552544024 38.74953376977524 39.24952537600794 -388.258 249.3084552544024 249.9518350373524 38.74953376977524 39.24952537600794 -389.258 249.9518350373524 250.5952148203024 38.74953376977524 39.24952537600794 -390.258 250.5952148203024 251.2385946032524 38.74953376977524 39.24952537600794 -391.258 251.2385946032524 251.8819743862024 38.74953376977524 39.24952537600794 -392.258 251.8819743862024 252.5253541691524 38.74953376977524 39.24952537600794 -393.258 252.5253541691524 253.1687339521024 38.74953376977524 39.24952537600794 -394.258 253.1687339521024 253.81211373505238 38.74953376977524 39.24952537600794 -395.258 253.81211373505238 254.45549351795236 38.74953376977524 39.24952537600794 -396.258 254.45549351795236 255.09887330090237 38.74953376977524 39.24952537600794 -397.258 255.09887330090237 255.74225308385238 38.74953376977524 39.24952537600794 -398.258 255.74225308385238 256.3856328668023 38.74953376977524 39.24952537600794 -399.258 256.3856328668023 257.02901264975236 38.74953376977524 39.24952537600794 -400.258 257.02901264975236 257.67239243270234 38.74953376977524 39.24952537600794 -401.258 257.67239243270234 258.3157722156524 38.74953376977524 39.24952537600794 -402.258 258.3157722156524 258.9591519986024 38.74953376977524 39.24952537600794 -403.258 258.9591519986024 259.6025317815524 38.74953376977524 39.24952537600794 -404.258 259.6025317815524 260.2459115645024 38.74953376977524 39.24952537600794 -405.258 260.2459115645024 260.8892913474524 38.74953376977524 39.24952537600794 -406.258 260.8892913474524 261.5326711304024 38.74953376977524 39.24952537600794 -407.258 261.5326711304024 262.17605091335236 38.74953376977524 39.24952537600794 -408.258 262.17605091335236 262.8194306963024 38.74953376977524 39.24952537600794 -409.258 262.8194306963024 263.4628104792524 38.74953376977524 39.24952537600794 -410.258 263.4628104792524 264.1061902621524 38.74953376977524 39.24952537600794 -411.258 264.1061902621524 264.7495700451024 38.74953376977524 39.24952537600794 -412.258 264.7495700451024 265.3929498280524 38.74953376977524 39.24952537600794 -413.258 265.3929498280524 266.0363296110023 38.74953376977524 39.24952537600794 -414.258 266.0363296110023 266.67970939395235 38.74953376977524 39.24952537600794 -415.258 266.67970939395235 267.32308917690233 38.74953376977524 39.24952537600794 -416.258 267.32308917690233 267.96646895985236 38.74953376977524 39.24952537600794 -417.258 267.96646895985236 268.6098487428024 38.74953376977524 39.24952537600794 -418.258 268.6098487428024 269.2532285257524 38.74953376977524 39.24952537600794 -419.258 269.2532285257524 269.8966083087024 38.74953376977524 39.24952537600794 -420.258 269.8966083087024 270.5399880916524 38.74953376977524 39.24952537600794 -421.258 270.5399880916524 271.18336787460237 38.74953376977524 39.24952537600794 -422.258 271.18336787460237 271.82674765755235 38.74953376977524 39.24952537600794 -423.258 271.82674765755235 272.4701274405024 38.74953376977524 39.24952537600794 -424.258 272.4701274405024 273.1238170958118 38.74953376977524 39.24952537600794 -173.259 111.7655291816232 112.42389643628078 39.24952537600794 39.74951686168647 -174.259 112.42389643628078 113.07187993858079 39.24952537600794 39.74951686168647 -175.259 113.07187993858079 113.7198634408808 39.24952537600794 39.74951686168647 -176.259 113.7198634408808 114.36784694318081 39.24952537600794 39.74951686168647 -177.259 114.36784694318081 115.0158304454808 39.24952537600794 39.74951686168647 -178.259 115.0158304454808 115.6638139477808 39.24952537600794 39.74951686168647 -179.259 115.6638139477808 116.3117974500808 39.24952537600794 39.74951686168647 -180.259 116.3117974500808 116.95978095238081 39.24952537600794 39.74951686168647 -181.259 116.95978095238081 117.60776445468079 39.24952537600794 39.74951686168647 -182.259 117.60776445468079 118.2557479569808 39.24952537600794 39.74951686168647 -183.259 118.2557479569808 118.9037314592808 39.24952537600794 39.74951686168647 -184.259 118.9037314592808 119.55171496158081 39.24952537600794 39.74951686168647 -185.259 119.55171496158081 120.1996984638808 39.24952537600794 39.74951686168647 -186.259 120.1996984638808 120.8476819661308 39.24952537600794 39.74951686168647 -187.259 120.8476819661308 121.4956654683808 39.24952537600794 39.74951686168647 -188.259 121.4956654683808 122.1436489706808 39.24952537600794 39.74951686168647 -189.259 122.1436489706808 122.79163247298081 39.24952537600794 39.74951686168647 -190.259 122.79163247298081 123.43961597528082 39.24952537600794 39.74951686168647 -191.259 123.43961597528082 124.08759947758081 39.24952537600794 39.74951686168647 -192.259 124.08759947758081 124.7355829798808 39.24952537600794 39.74951686168647 -193.259 124.7355829798808 125.38356648218081 39.24952537600794 39.74951686168647 -194.259 125.38356648218081 126.03154998448082 39.24952537600794 39.74951686168647 -195.259 126.03154998448082 126.6795334867808 39.24952537600794 39.74951686168647 -196.259 126.6795334867808 127.3275169890808 39.24952537600794 39.74951686168647 -197.259 127.3275169890808 127.97550049138079 39.24952537600794 39.74951686168647 -198.259 127.97550049138079 128.6234839936808 39.24952537600794 39.74951686168647 -199.259 128.6234839936808 129.2714674959808 39.24952537600794 39.74951686168647 -200.259 129.2714674959808 129.91945099828078 39.24952537600794 39.74951686168647 -201.259 129.91945099828078 130.56743450058082 39.24952537600794 39.74951686168647 -202.259 130.56743450058082 131.21541800288082 39.24952537600794 39.74951686168647 -203.259 131.21541800288082 131.8634015051308 39.24952537600794 39.74951686168647 -204.259 131.8634015051308 132.5113850073808 39.24952537600794 39.74951686168647 -205.259 132.5113850073808 133.1593685096808 39.24952537600794 39.74951686168647 -206.259 133.1593685096808 133.8073520119808 39.24952537600794 39.74951686168647 -207.259 133.8073520119808 134.45533551428082 39.24952537600794 39.74951686168647 -208.259 134.45533551428082 135.10331901658083 39.24952537600794 39.74951686168647 -209.259 135.10331901658083 135.7513025188808 39.24952537600794 39.74951686168647 -210.259 135.7513025188808 136.39928602118079 39.24952537600794 39.74951686168647 -211.259 136.39928602118079 137.0472695234808 39.24952537600794 39.74951686168647 -212.259 137.0472695234808 137.6952530257808 39.24952537600794 39.74951686168647 -213.259 137.6952530257808 138.3432365280808 39.24952537600794 39.74951686168647 -214.259 138.3432365280808 138.9912200303808 39.24952537600794 39.74951686168647 -215.259 138.9912200303808 139.63920353268082 39.24952537600794 39.74951686168647 -216.259 139.63920353268082 140.2871870349808 39.24952537600794 39.74951686168647 -217.259 140.2871870349808 140.93517053728078 39.24952537600794 39.74951686168647 -218.259 140.93517053728078 141.5831540395808 39.24952537600794 39.74951686168647 -219.259 141.5831540395808 142.2311375418808 39.24952537600794 39.74951686168647 -220.259 142.2311375418808 142.8791210441808 39.24952537600794 39.74951686168647 -221.259 142.8791210441808 143.52710454643082 39.24952537600794 39.74951686168647 -222.259 143.52710454643082 144.1750880486808 39.24952537600794 39.74951686168647 -223.259 144.1750880486808 144.82307155098079 39.24952537600794 39.74951686168647 -224.259 144.82307155098079 145.4710550532808 39.24952537600794 39.74951686168647 -225.259 145.4710550532808 146.1190385555808 39.24952537600794 39.74951686168647 -226.259 146.1190385555808 146.7670220578808 39.24952537600794 39.74951686168647 -227.259 146.7670220578808 147.41500556018082 39.24952537600794 39.74951686168647 -228.259 147.41500556018082 148.06298906248082 39.24952537600794 39.74951686168647 -229.259 148.06298906248082 148.7109725647808 39.24952537600794 39.74951686168647 -230.259 148.7109725647808 149.35895606708078 39.24952537600794 39.74951686168647 -231.259 149.35895606708078 150.0069395693808 39.24952537600794 39.74951686168647 -232.259 150.0069395693808 150.6549230716808 39.24952537600794 39.74951686168647 -233.259 150.6549230716808 151.3029065739808 39.24952537600794 39.74951686168647 -234.259 151.3029065739808 151.9508900762808 39.24952537600794 39.74951686168647 -235.259 151.9508900762808 152.59887357858082 39.24952537600794 39.74951686168647 -236.259 152.59887357858082 153.2468570808808 39.24952537600794 39.74951686168647 -237.259 153.2468570808808 153.89484058318078 39.24952537600794 39.74951686168647 -238.259 153.89484058318078 154.5428240854808 39.24952537600794 39.74951686168647 -239.259 154.5428240854808 155.1908075877308 39.24952537600794 39.74951686168647 -240.259 155.1908075877308 155.83879108998082 39.24952537600794 39.74951686168647 -241.259 155.83879108998082 156.48677459228082 39.24952537600794 39.74951686168647 -242.259 156.48677459228082 157.1347580945808 39.24952537600794 39.74951686168647 -243.259 157.1347580945808 157.78274159688078 39.24952537600794 39.74951686168647 -244.259 157.78274159688078 158.4411088515384 39.24952537600794 39.74951686168647 -246.259 159.06832484912317 159.7266921037808 39.24952537600794 39.74951686168647 -247.259 159.7266921037808 160.3746756060808 39.24952537600794 39.74951686168647 -248.259 160.3746756060808 161.02265910838082 39.24952537600794 39.74951686168647 -249.259 161.02265910838082 161.6706426106808 39.24952537600794 39.74951686168647 -250.259 161.6706426106808 162.31862611298078 39.24952537600794 39.74951686168647 -251.259 162.31862611298078 162.9666096152808 39.24952537600794 39.74951686168647 -252.259 162.9666096152808 163.6145931175808 39.24952537600794 39.74951686168647 -253.259 163.6145931175808 164.2625766198808 39.24952537600794 39.74951686168647 -254.259 164.2625766198808 164.9105601221808 39.24952537600794 39.74951686168647 -255.259 164.9105601221808 165.55854362448082 39.24952537600794 39.74951686168647 -256.259 165.55854362448082 166.2065271267308 39.24952537600794 39.74951686168647 -257.259 166.2065271267308 166.8545106289808 39.24952537600794 39.74951686168647 -258.259 166.8545106289808 167.5024941312808 39.24952537600794 39.74951686168647 -259.259 167.5024941312808 168.15047763358078 39.24952537600794 39.74951686168647 -260.259 168.15047763358078 168.7984611358808 39.24952537600794 39.74951686168647 -261.259 168.7984611358808 169.44644463818082 39.24952537600794 39.74951686168647 -262.259 169.44644463818082 170.0944281404808 39.24952537600794 39.74951686168647 -263.259 170.0944281404808 170.74241164278078 39.24952537600794 39.74951686168647 -264.259 170.74241164278078 171.3903951450808 39.24952537600794 39.74951686168647 -265.259 171.3903951450808 172.0383786473808 39.24952537600794 39.74951686168647 -266.259 172.0383786473808 172.6863621496808 39.24952537600794 39.74951686168647 -267.259 172.6863621496808 173.3343456519808 39.24952537600794 39.74951686168647 -268.259 173.3343456519808 173.98232915428082 39.24952537600794 39.74951686168647 -269.259 173.98232915428082 174.6303126565808 39.24952537600794 39.74951686168647 -270.259 174.6303126565808 175.27829615888078 39.24952537600794 39.74951686168647 -271.259 175.27829615888078 175.92627966118079 39.24952537600794 39.74951686168647 -272.259 175.92627966118079 176.5742631634808 39.24952537600794 39.74951686168647 -273.259 176.5742631634808 177.2222466657808 39.24952537600794 39.74951686168647 -274.259 177.2222466657808 177.8702301680308 39.24952537600794 39.74951686168647 -275.259 177.8702301680308 178.5182136702808 39.24952537600794 39.74951686168647 -276.259 178.5182136702808 179.1661971725808 39.24952537600794 39.74951686168647 -277.259 179.1661971725808 179.8141806748808 39.24952537600794 39.74951686168647 -278.259 179.8141806748808 180.4621641771808 39.24952537600794 39.74951686168647 -279.259 180.4621641771808 181.11014767948078 39.24952537600794 39.74951686168647 -280.259 181.11014767948078 181.7581311817808 39.24952537600794 39.74951686168647 -281.259 181.7581311817808 182.40611468408082 39.24952537600794 39.74951686168647 -282.259 182.40611468408082 183.05409818638077 39.24952537600794 39.74951686168647 -283.259 183.05409818638077 183.70208168868078 39.24952537600794 39.74951686168647 -284.259 183.70208168868078 184.35006519098079 39.24952537600794 39.74951686168647 -285.259 184.35006519098079 184.9980486932808 39.24952537600794 39.74951686168647 -286.259 184.9980486932808 185.6460321955808 39.24952537600794 39.74951686168647 -287.259 185.6460321955808 186.29401569788075 39.24952537600794 39.74951686168647 -288.259 186.29401569788075 186.9419992001808 39.24952537600794 39.74951686168647 -289.259 186.9419992001808 187.58998270248077 39.24952537600794 39.74951686168647 -290.259 187.58998270248077 188.23796620478078 39.24952537600794 39.74951686168647 -291.259 188.23796620478078 188.88594970708078 39.24952537600794 39.74951686168647 -292.259 188.88594970708078 189.53393320933077 39.24952537600794 39.74951686168647 -293.259 189.53393320933077 190.18191671158075 39.24952537600794 39.74951686168647 -294.259 190.18191671158075 190.8299002138808 39.24952537600794 39.74951686168647 -295.259 190.8299002138808 191.4778837161808 39.24952537600794 39.74951686168647 -296.259 191.4778837161808 192.12586721848078 39.24952537600794 39.74951686168647 -297.259 192.12586721848078 192.77385072078079 39.24952537600794 39.74951686168647 -298.259 192.77385072078079 193.4218342230808 39.24952537600794 39.74951686168647 -299.259 193.4218342230808 194.0698177253808 39.24952537600794 39.74951686168647 -300.259 194.0698177253808 194.71780122768075 39.24952537600794 39.74951686168647 -301.259 194.71780122768075 195.36578472998076 39.24952537600794 39.74951686168647 -302.259 195.36578472998076 196.0241519846384 39.24952537600794 39.74951686168647 -354.259 229.0505430969232 229.7089103515808 39.24952537600794 39.74951686168647 -355.259 229.7089103515808 230.3568938538808 39.24952537600794 39.74951686168647 -356.259 230.3568938538808 231.00487735618077 39.24952537600794 39.74951686168647 -357.259 231.00487735618077 231.65286085848078 39.24952537600794 39.74951686168647 -358.259 231.65286085848078 232.3008443607808 39.24952537600794 39.74951686168647 -359.259 232.3008443607808 232.9488278630808 39.24952537600794 39.74951686168647 -360.259 232.9488278630808 233.59681136538074 39.24952537600794 39.74951686168647 -361.259 233.59681136538074 234.2447948676808 39.24952537600794 39.74951686168647 -362.259 234.2447948676808 234.89277836998082 39.24952537600794 39.74951686168647 -363.259 234.89277836998082 235.5407618722308 39.24952537600794 39.74951686168647 -364.259 235.5407618722308 236.1887453744808 39.24952537600794 39.74951686168647 -365.259 236.1887453744808 236.8367288767808 39.24952537600794 39.74951686168647 -366.259 236.8367288767808 237.48471237908078 39.24952537600794 39.74951686168647 -367.259 237.48471237908078 238.13269588138076 39.24952537600794 39.74951686168647 -368.259 238.13269588138076 238.78067938368076 39.24952537600794 39.74951686168647 -369.259 238.78067938368076 239.42866288598077 39.24952537600794 39.74951686168647 -370.259 239.42866288598077 240.07664638828078 39.24952537600794 39.74951686168647 -371.259 240.07664638828078 240.7246298905808 39.24952537600794 39.74951686168647 -372.259 240.7246298905808 241.3726133928808 39.24952537600794 39.74951686168647 -373.259 241.3726133928808 242.02059689518077 39.24952537600794 39.74951686168647 -374.259 242.02059689518077 242.66858039748075 39.24952537600794 39.74951686168647 -375.259 242.66858039748075 243.31656389978076 39.24952537600794 39.74951686168647 -376.259 243.31656389978076 243.96454740208077 39.24952537600794 39.74951686168647 -377.259 243.96454740208077 244.61253090438078 39.24952537600794 39.74951686168647 -378.259 244.61253090438078 245.26051440668078 39.24952537600794 39.74951686168647 -379.259 245.26051440668078 245.9084979089808 39.24952537600794 39.74951686168647 -380.259 245.9084979089808 246.5564814112308 39.24952537600794 39.74951686168647 -381.259 246.5564814112308 247.20446491348082 39.24952537600794 39.74951686168647 -382.259 247.20446491348082 247.8524484157808 39.24952537600794 39.74951686168647 -383.259 247.8524484157808 248.50043191808078 39.24952537600794 39.74951686168647 -384.259 248.50043191808078 249.1484154203808 39.24952537600794 39.74951686168647 -385.259 249.1484154203808 249.7963989226808 39.24952537600794 39.74951686168647 -386.259 249.7963989226808 250.4443824249808 39.24952537600794 39.74951686168647 -387.259 250.4443824249808 251.0923659272808 39.24952537600794 39.74951686168647 -388.259 251.0923659272808 251.74034942958082 39.24952537600794 39.74951686168647 -389.259 251.74034942958082 252.38833293188083 39.24952537600794 39.74951686168647 -390.259 252.38833293188083 253.0363164341808 39.24952537600794 39.74951686168647 -391.259 253.0363164341808 253.68429993648078 39.24952537600794 39.74951686168647 -392.259 253.68429993648078 254.3322834387808 39.24952537600794 39.74951686168647 -393.259 254.3322834387808 254.98026694108077 39.24952537600794 39.74951686168647 -394.259 254.98026694108077 255.62825044338078 39.24952537600794 39.74951686168647 -395.259 255.62825044338078 256.2762339456808 39.24952537600794 39.74951686168647 -396.259 256.2762339456808 256.9242174479808 39.24952537600794 39.74951686168647 -397.259 256.9242174479808 257.57220095028083 39.24952537600794 39.74951686168647 -398.259 257.57220095028083 258.2201844525308 39.24952537600794 39.74951686168647 -399.259 258.2201844525308 258.8681679547808 39.24952537600794 39.74951686168647 -400.259 258.8681679547808 259.5161514570808 39.24952537600794 39.74951686168647 -401.259 259.5161514570808 260.16413495938076 39.24952537600794 39.74951686168647 -402.259 260.16413495938076 260.8121184616808 39.24952537600794 39.74951686168647 -403.259 260.8121184616808 261.4601019639808 39.24952537600794 39.74951686168647 -404.259 261.4601019639808 262.10808546628084 39.24952537600794 39.74951686168647 -405.259 262.10808546628084 262.75606896858085 39.24952537600794 39.74951686168647 -406.259 262.75606896858085 263.40405247088074 39.24952537600794 39.74951686168647 -407.259 263.40405247088074 264.0520359731808 39.24952537600794 39.74951686168647 -408.259 264.0520359731808 264.7000194754808 39.24952537600794 39.74951686168647 -409.259 264.7000194754808 265.34800297778077 39.24952537600794 39.74951686168647 -410.259 265.34800297778077 265.9959864800808 39.24952537600794 39.74951686168647 -411.259 265.9959864800808 266.6439699823808 39.24952537600794 39.74951686168647 -412.259 266.6439699823808 267.2919534846808 39.24952537600794 39.74951686168647 -413.259 267.2919534846808 267.9399369869808 39.24952537600794 39.74951686168647 -414.259 267.9399369869808 268.5879204892808 39.24952537600794 39.74951686168647 -415.259 268.5879204892808 269.2359039915808 39.24952537600794 39.74951686168647 -416.259 269.2359039915808 269.8838874938308 39.24952537600794 39.74951686168647 -417.259 269.8838874938308 270.53187099608084 39.24952537600794 39.74951686168647 -418.259 270.53187099608084 271.1798544983808 39.24952537600794 39.74951686168647 -419.259 271.1798544983808 271.82783800068074 39.24952537600794 39.74951686168647 -420.259 271.82783800068074 272.48620525533835 39.24952537600794 39.74951686168647 -172.260 111.92694291285736 112.59010606060724 39.74951686168647 40.24950822286971 -173.260 112.59010606060724 113.24280970525726 39.74951686168647 40.24950822286971 -174.260 113.24280970525726 113.89551334995724 39.74951686168647 40.24950822286971 -175.260 113.89551334995724 114.54821699460723 39.74951686168647 40.24950822286971 -176.260 114.54821699460723 115.20092063925722 39.74951686168647 40.24950822286971 -177.260 115.20092063925722 115.85362428395725 39.74951686168647 40.24950822286971 -178.260 115.85362428395725 116.50632792860725 39.74951686168647 40.24950822286971 -179.260 116.50632792860725 117.15903157325727 39.74951686168647 40.24950822286971 -180.260 117.15903157325727 117.81173521795725 39.74951686168647 40.24950822286971 -181.260 117.81173521795725 118.46443886260724 39.74951686168647 40.24950822286971 -182.260 118.46443886260724 119.11714250725724 39.74951686168647 40.24950822286971 -183.260 119.11714250725724 119.76984615195725 39.74951686168647 40.24950822286971 -184.260 119.76984615195725 120.42254979660726 39.74951686168647 40.24950822286971 -185.260 120.42254979660726 121.07525344125725 39.74951686168647 40.24950822286971 -186.260 121.07525344125725 121.72795708595723 39.74951686168647 40.24950822286971 -187.260 121.72795708595723 122.38066073060725 39.74951686168647 40.24950822286971 -188.260 122.38066073060725 123.03336437525725 39.74951686168647 40.24950822286971 -189.260 123.03336437525725 123.68606801995725 39.74951686168647 40.24950822286971 -190.260 123.68606801995725 124.33877166460724 39.74951686168647 40.24950822286971 -191.260 124.33877166460724 124.99147530925723 39.74951686168647 40.24950822286971 -192.260 124.99147530925723 125.64417895395724 39.74951686168647 40.24950822286971 -193.260 125.64417895395724 126.29688259860724 39.74951686168647 40.24950822286971 -194.260 126.29688259860724 126.94958624325727 39.74951686168647 40.24950822286971 -195.260 126.94958624325727 127.60228988795726 39.74951686168647 40.24950822286971 -196.260 127.60228988795726 128.25499353260727 39.74951686168647 40.24950822286971 -197.260 128.25499353260727 128.90769717725723 39.74951686168647 40.24950822286971 -198.260 128.90769717725723 129.56040082195724 39.74951686168647 40.24950822286971 -199.260 129.56040082195724 130.21310446660723 39.74951686168647 40.24950822286971 -200.260 130.21310446660723 130.86580811125725 39.74951686168647 40.24950822286971 -201.260 130.86580811125725 131.51851175595726 39.74951686168647 40.24950822286971 -202.260 131.51851175595726 132.17121540060725 39.74951686168647 40.24950822286971 -203.260 132.17121540060725 132.82391904525724 39.74951686168647 40.24950822286971 -204.260 132.82391904525724 133.47662268995725 39.74951686168647 40.24950822286971 -205.260 133.47662268995725 134.12932633460724 39.74951686168647 40.24950822286971 -206.260 134.12932633460724 134.78202997925723 39.74951686168647 40.24950822286971 -207.260 134.78202997925723 135.43473362395724 39.74951686168647 40.24950822286971 -208.260 135.43473362395724 136.08743726860723 39.74951686168647 40.24950822286971 -209.260 136.08743726860723 136.74014091325725 39.74951686168647 40.24950822286971 -210.260 136.74014091325725 137.39284455795723 39.74951686168647 40.24950822286971 -211.260 137.39284455795723 138.04554820260722 39.74951686168647 40.24950822286971 -212.260 138.04554820260722 138.69825184725727 39.74951686168647 40.24950822286971 -213.260 138.69825184725727 139.35095549195725 39.74951686168647 40.24950822286971 -214.260 139.35095549195725 140.00365913660724 39.74951686168647 40.24950822286971 -215.260 140.00365913660724 140.65636278125726 39.74951686168647 40.24950822286971 -216.260 140.65636278125726 141.3090664259572 39.74951686168647 40.24950822286971 -217.260 141.3090664259572 141.96177007060726 39.74951686168647 40.24950822286971 -218.260 141.96177007060726 142.61447371525725 39.74951686168647 40.24950822286971 -219.260 142.61447371525725 143.26717735990724 39.74951686168647 40.24950822286971 -220.260 143.26717735990724 143.91988100455725 39.74951686168647 40.24950822286971 -221.260 143.91988100455725 144.57258464925724 39.74951686168647 40.24950822286971 -222.260 144.57258464925724 145.22528829390723 39.74951686168647 40.24950822286971 -223.260 145.22528829390723 145.87799193855724 39.74951686168647 40.24950822286971 -224.260 145.87799193855724 146.53069558325723 39.74951686168647 40.24950822286971 -225.260 146.53069558325723 147.18339922790724 39.74951686168647 40.24950822286971 -226.260 147.18339922790724 147.83610287255726 39.74951686168647 40.24950822286971 -227.260 147.83610287255726 148.48880651725722 39.74951686168647 40.24950822286971 -228.260 148.48880651725722 149.14151016190726 39.74951686168647 40.24950822286971 -229.260 149.14151016190726 149.79421380655725 39.74951686168647 40.24950822286971 -230.260 149.79421380655725 150.44691745125726 39.74951686168647 40.24950822286971 -231.260 150.44691745125726 151.09962109590725 39.74951686168647 40.24950822286971 -232.260 151.09962109590725 151.75232474055724 39.74951686168647 40.24950822286971 -233.260 151.75232474055724 152.40502838525725 39.74951686168647 40.24950822286971 -234.260 152.40502838525725 153.05773202990724 39.74951686168647 40.24950822286971 -235.260 153.05773202990724 153.71043567455723 39.74951686168647 40.24950822286971 -236.260 153.71043567455723 154.36313931925724 39.74951686168647 40.24950822286971 -237.260 154.36313931925724 155.01584296390723 39.74951686168647 40.24950822286971 -238.260 155.01584296390723 155.66854660855728 39.74951686168647 40.24950822286971 -239.260 155.66854660855728 156.32125025325723 39.74951686168647 40.24950822286971 -240.260 156.32125025325723 156.97395389790722 39.74951686168647 40.24950822286971 -241.260 156.97395389790722 157.6266575425572 39.74951686168647 40.24950822286971 -242.260 157.6266575425572 158.28982069035712 39.74951686168647 40.24950822286971 -244.260 158.92160532875735 159.58476847655723 39.74951686168647 40.24950822286971 -245.260 159.58476847655723 160.23747212125724 39.74951686168647 40.24950822286971 -246.260 160.23747212125724 160.89017576590723 39.74951686168647 40.24950822286971 -247.260 160.89017576590723 161.54287941055725 39.74951686168647 40.24950822286971 -248.260 161.54287941055725 162.19558305525726 39.74951686168647 40.24950822286971 -249.260 162.19558305525726 162.84828669990725 39.74951686168647 40.24950822286971 -250.260 162.84828669990725 163.50099034455724 39.74951686168647 40.24950822286971 -251.260 163.50099034455724 164.15369398925725 39.74951686168647 40.24950822286971 -252.260 164.15369398925725 164.80639763390724 39.74951686168647 40.24950822286971 -253.260 164.80639763390724 165.45910127855723 39.74951686168647 40.24950822286971 -254.260 165.45910127855723 166.11180492325724 39.74951686168647 40.24950822286971 -255.260 166.11180492325724 166.76450856790723 39.74951686168647 40.24950822286971 -256.260 166.76450856790723 167.41721221255722 39.74951686168647 40.24950822286971 -257.260 167.41721221255722 168.06991585725723 39.74951686168647 40.24950822286971 -258.260 168.06991585725723 168.72261950190725 39.74951686168647 40.24950822286971 -259.260 168.72261950190725 169.37532314655724 39.74951686168647 40.24950822286971 -260.260 169.37532314655724 170.02802679125728 39.74951686168647 40.24950822286971 -261.260 170.02802679125728 170.68073043590726 39.74951686168647 40.24950822286971 -262.260 170.68073043590726 171.33343408055725 39.74951686168647 40.24950822286971 -263.260 171.33343408055725 171.98613772525727 39.74951686168647 40.24950822286971 -264.260 171.98613772525727 172.63884136990723 39.74951686168647 40.24950822286971 -265.260 172.63884136990723 173.29154501455724 39.74951686168647 40.24950822286971 -266.260 173.29154501455724 173.94424865925725 39.74951686168647 40.24950822286971 -267.260 173.94424865925725 174.59695230390724 39.74951686168647 40.24950822286971 -268.260 174.59695230390724 175.24965594855726 39.74951686168647 40.24950822286971 -269.260 175.24965594855726 175.90235959325724 39.74951686168647 40.24950822286971 -270.260 175.90235959325724 176.55506323790726 39.74951686168647 40.24950822286971 -271.260 176.55506323790726 177.20776688255725 39.74951686168647 40.24950822286971 -272.260 177.20776688255725 177.86047052725723 39.74951686168647 40.24950822286971 -273.260 177.86047052725723 178.51317417190722 39.74951686168647 40.24950822286971 -274.260 178.51317417190722 179.1658778165572 39.74951686168647 40.24950822286971 -275.260 179.1658778165572 179.81858146125725 39.74951686168647 40.24950822286971 -276.260 179.81858146125725 180.4712851059072 39.74951686168647 40.24950822286971 -277.260 180.4712851059072 181.1239887505572 39.74951686168647 40.24950822286971 -278.260 181.1239887505572 181.77669239525721 39.74951686168647 40.24950822286971 -279.260 181.77669239525721 182.4293960399072 39.74951686168647 40.24950822286971 -280.260 182.4293960399072 183.08209968455725 39.74951686168647 40.24950822286971 -281.260 183.08209968455725 183.7348033292572 39.74951686168647 40.24950822286971 -282.260 183.7348033292572 184.38750697390722 39.74951686168647 40.24950822286971 -283.260 184.38750697390722 185.04021061855724 39.74951686168647 40.24950822286971 -284.260 185.04021061855724 185.69291426320723 39.74951686168647 40.24950822286971 -285.260 185.69291426320723 186.34561790785725 39.74951686168647 40.24950822286971 -286.260 186.34561790785725 186.99832155255723 39.74951686168647 40.24950822286971 -287.260 186.99832155255723 187.65102519720722 39.74951686168647 40.24950822286971 -288.260 187.65102519720722 188.30372884185724 39.74951686168647 40.24950822286971 -289.260 188.30372884185724 188.95643248655722 39.74951686168647 40.24950822286971 -290.260 188.95643248655722 189.60913613120724 39.74951686168647 40.24950822286971 -291.260 189.60913613120724 190.26183977585723 39.74951686168647 40.24950822286971 -292.260 190.26183977585723 190.9145434205572 39.74951686168647 40.24950822286971 -293.260 190.9145434205572 191.56724706520723 39.74951686168647 40.24950822286971 -294.260 191.56724706520723 192.21995070985722 39.74951686168647 40.24950822286971 -295.260 192.21995070985722 192.87265435455723 39.74951686168647 40.24950822286971 -296.260 192.87265435455723 193.52535799920722 39.74951686168647 40.24950822286971 -297.260 193.52535799920722 194.17806164385723 39.74951686168647 40.24950822286971 -298.260 194.17806164385723 194.83076528855725 39.74951686168647 40.24950822286971 -299.260 194.83076528855725 195.48346893320723 39.74951686168647 40.24950822286971 -300.260 195.48346893320723 196.13617257785722 39.74951686168647 40.24950822286971 -301.260 196.13617257785722 196.79933572565713 39.74951686168647 40.24950822286971 -352.260 229.41359895275738 230.07676210050727 39.74951686168647 40.24950822286971 -353.260 230.07676210050727 230.72946574515726 39.74951686168647 40.24950822286971 -354.260 230.72946574515726 231.3821693898572 39.74951686168647 40.24950822286971 -355.260 231.3821693898572 232.03487303450723 39.74951686168647 40.24950822286971 -356.260 232.03487303450723 232.68757667915725 39.74951686168647 40.24950822286971 -357.260 232.68757667915725 233.34028032385726 39.74951686168647 40.24950822286971 -358.260 233.34028032385726 233.99298396850722 39.74951686168647 40.24950822286971 -359.260 233.99298396850722 234.64568761315724 39.74951686168647 40.24950822286971 -360.260 234.64568761315724 235.29839125785725 39.74951686168647 40.24950822286971 -361.260 235.29839125785725 235.95109490250724 39.74951686168647 40.24950822286971 -362.260 235.95109490250724 236.60379854715723 39.74951686168647 40.24950822286971 -363.260 236.60379854715723 237.25650219185724 39.74951686168647 40.24950822286971 -364.260 237.25650219185724 237.90920583650723 39.74951686168647 40.24950822286971 -365.260 237.90920583650723 238.56190948115724 39.74951686168647 40.24950822286971 -366.260 238.56190948115724 239.21461312585723 39.74951686168647 40.24950822286971 -367.260 239.21461312585723 239.86731677050722 39.74951686168647 40.24950822286971 -368.260 239.86731677050722 240.52002041515723 39.74951686168647 40.24950822286971 -369.260 240.52002041515723 241.17272405985722 39.74951686168647 40.24950822286971 -370.260 241.17272405985722 241.82542770450723 39.74951686168647 40.24950822286971 -371.260 241.82542770450723 242.47813134915725 39.74951686168647 40.24950822286971 -372.260 242.47813134915725 243.1308349938572 39.74951686168647 40.24950822286971 -373.260 243.1308349938572 243.78353863850725 39.74951686168647 40.24950822286971 -374.260 243.78353863850725 244.43624228315724 39.74951686168647 40.24950822286971 -375.260 244.43624228315724 245.08894592785722 39.74951686168647 40.24950822286971 -376.260 245.08894592785722 245.74164957250724 39.74951686168647 40.24950822286971 -377.260 245.74164957250724 246.39435321715723 39.74951686168647 40.24950822286971 -378.260 246.39435321715723 247.04705686185721 39.74951686168647 40.24950822286971 -379.260 247.04705686185721 247.69976050650723 39.74951686168647 40.24950822286971 -380.260 247.69976050650723 248.35246415115722 39.74951686168647 40.24950822286971 -381.260 248.35246415115722 249.00516779585723 39.74951686168647 40.24950822286971 -382.260 249.00516779585723 249.65787144050722 39.74951686168647 40.24950822286971 -383.260 249.65787144050722 250.3105750851572 39.74951686168647 40.24950822286971 -384.260 250.3105750851572 250.96327872985722 39.74951686168647 40.24950822286971 -385.260 250.96327872985722 251.61598237450724 39.74951686168647 40.24950822286971 -386.260 251.61598237450724 252.2686860191572 39.74951686168647 40.24950822286971 -387.260 252.2686860191572 252.9213896638572 39.74951686168647 40.24950822286971 -388.260 252.9213896638572 253.5740933085072 39.74951686168647 40.24950822286971 -389.260 253.5740933085072 254.22679695315725 39.74951686168647 40.24950822286971 -390.260 254.22679695315725 254.87950059785726 39.74951686168647 40.24950822286971 -391.260 254.87950059785726 255.5322042425072 39.74951686168647 40.24950822286971 -392.260 255.5322042425072 256.18490788715724 39.74951686168647 40.24950822286971 -393.260 256.18490788715724 256.83761153185725 39.74951686168647 40.24950822286971 -394.260 256.83761153185725 257.49031517650724 39.74951686168647 40.24950822286971 -395.260 257.49031517650724 258.14301882115717 39.74951686168647 40.24950822286971 -396.260 258.14301882115717 258.79572246585724 39.74951686168647 40.24950822286971 -397.260 258.79572246585724 259.4484261105072 39.74951686168647 40.24950822286971 -398.260 259.4484261105072 260.1011297551572 39.74951686168647 40.24950822286971 -399.260 260.1011297551572 260.7538333998572 39.74951686168647 40.24950822286971 -400.260 260.7538333998572 261.4065370445073 39.74951686168647 40.24950822286971 -401.260 261.4065370445073 262.05924068915726 39.74951686168647 40.24950822286971 -402.260 262.05924068915726 262.7119443338572 39.74951686168647 40.24950822286971 -403.260 262.7119443338572 263.36464797850726 39.74951686168647 40.24950822286971 -404.260 263.36464797850726 264.01735162315725 39.74951686168647 40.24950822286971 -405.260 264.01735162315725 264.67005526785726 39.74951686168647 40.24950822286971 -406.260 264.67005526785726 265.32275891250725 39.74951686168647 40.24950822286971 -407.260 265.32275891250725 265.97546255715724 39.74951686168647 40.24950822286971 -408.260 265.97546255715724 266.62816620180723 39.74951686168647 40.24950822286971 -409.260 266.62816620180723 267.2808698464572 39.74951686168647 40.24950822286971 -410.260 267.2808698464572 267.93357349115723 39.74951686168647 40.24950822286971 -411.260 267.93357349115723 268.5862771358072 39.74951686168647 40.24950822286971 -412.260 268.5862771358072 269.23898078045727 39.74951686168647 40.24950822286971 -413.260 269.23898078045727 269.8916844251572 39.74951686168647 40.24950822286971 -414.260 269.8916844251572 270.5443880698072 39.74951686168647 40.24950822286971 -415.260 270.5443880698072 271.19709171445726 39.74951686168647 40.24950822286971 -416.260 271.19709171445726 271.84979535915727 39.74951686168647 40.24950822286971 -417.260 271.84979535915727 272.5024990038072 39.74951686168647 40.24950822286971 -418.260 272.5024990038072 273.15520264845725 39.74951686168647 40.24950822286971 -419.260 273.15520264845725 273.8183657962571 39.74951686168647 40.24950822286971 -171.261 112.09932459213913 112.76740526966418 40.24950822286971 40.7494994554619 -172.261 112.76740526966418 113.42494876961419 40.24950822286971 40.7494994554619 -173.261 113.42494876961419 114.08249226956418 40.24950822286971 40.7494994554619 -174.261 114.08249226956418 114.74003576946419 40.24950822286971 40.7494994554619 -175.261 114.74003576946419 115.39757926941418 40.24950822286971 40.7494994554619 -176.261 115.39757926941418 116.05512276936417 40.24950822286971 40.7494994554619 -177.261 116.05512276936417 116.71266626931418 40.24950822286971 40.7494994554619 -178.261 116.71266626931418 117.37020976926419 40.24950822286971 40.7494994554619 -179.261 117.37020976926419 118.02775326921419 40.24950822286971 40.7494994554619 -180.261 118.02775326921419 118.6852967691642 40.24950822286971 40.7494994554619 -181.261 118.6852967691642 119.3428402691142 40.24950822286971 40.7494994554619 -182.261 119.3428402691142 120.0003837690642 40.24950822286971 40.7494994554619 -183.261 120.0003837690642 120.65792726901418 40.24950822286971 40.7494994554619 -184.261 120.65792726901418 121.31547076896419 40.24950822286971 40.7494994554619 -185.261 121.31547076896419 121.97301426886418 40.24950822286971 40.7494994554619 -186.261 121.97301426886418 122.63055776881419 40.24950822286971 40.7494994554619 -187.261 122.63055776881419 123.2881012687642 40.24950822286971 40.7494994554619 -188.261 123.2881012687642 123.94564476871419 40.24950822286971 40.7494994554619 -189.261 123.94564476871419 124.6031882686642 40.24950822286971 40.7494994554619 -190.261 124.6031882686642 125.26073176861419 40.24950822286971 40.7494994554619 -191.261 125.26073176861419 125.91827526856417 40.24950822286971 40.7494994554619 -192.261 125.91827526856417 126.57581876851418 40.24950822286971 40.7494994554619 -193.261 126.57581876851418 127.23336226846419 40.24950822286971 40.7494994554619 -194.261 127.23336226846419 127.89090576841417 40.24950822286971 40.7494994554619 -195.261 127.89090576841417 128.54844926836418 40.24950822286971 40.7494994554619 -196.261 128.54844926836418 129.2059927682642 40.24950822286971 40.7494994554619 -197.261 129.2059927682642 129.8635362682142 40.24950822286971 40.7494994554619 -198.261 129.8635362682142 130.52107976816418 40.24950822286971 40.7494994554619 -199.261 130.52107976816418 131.17862326811417 40.24950822286971 40.7494994554619 -200.261 131.17862326811417 131.83616676806417 40.24950822286971 40.7494994554619 -201.261 131.83616676806417 132.49371026801418 40.24950822286971 40.7494994554619 -202.261 132.49371026801418 133.1512537679642 40.24950822286971 40.7494994554619 -203.261 133.1512537679642 133.80879726791417 40.24950822286971 40.7494994554619 -204.261 133.80879726791417 134.46634076786418 40.24950822286971 40.7494994554619 -205.261 134.46634076786418 135.1238842678142 40.24950822286971 40.7494994554619 -206.261 135.1238842678142 135.7814277677642 40.24950822286971 40.7494994554619 -207.261 135.7814277677642 136.4389712676642 40.24950822286971 40.7494994554619 -208.261 136.4389712676642 137.09651476761417 40.24950822286971 40.7494994554619 -209.261 137.09651476761417 137.75405826756418 40.24950822286971 40.7494994554619 -210.261 137.75405826756418 138.41160176751418 40.24950822286971 40.7494994554619 -211.261 138.41160176751418 139.0691452674642 40.24950822286971 40.7494994554619 -212.261 139.0691452674642 139.72668876741417 40.24950822286971 40.7494994554619 -213.261 139.72668876741417 140.38423226736418 40.24950822286971 40.7494994554619 -214.261 140.38423226736418 141.0417757673142 40.24950822286971 40.7494994554619 -215.261 141.0417757673142 141.6993192672642 40.24950822286971 40.7494994554619 -216.261 141.6993192672642 142.3568627672142 40.24950822286971 40.7494994554619 -217.261 142.3568627672142 143.0144062671642 40.24950822286971 40.7494994554619 -218.261 143.0144062671642 143.67194976706418 40.24950822286971 40.7494994554619 -219.261 143.67194976706418 144.3294932670142 40.24950822286971 40.7494994554619 -220.261 144.3294932670142 144.9870367669642 40.24950822286971 40.7494994554619 -221.261 144.9870367669642 145.6445802669142 40.24950822286971 40.7494994554619 -222.261 145.6445802669142 146.30212376686418 40.24950822286971 40.7494994554619 -223.261 146.30212376686418 146.9596672668142 40.24950822286971 40.7494994554619 -224.261 146.9596672668142 147.61721076676417 40.24950822286971 40.7494994554619 -225.261 147.61721076676417 148.2747542667142 40.24950822286971 40.7494994554619 -226.261 148.2747542667142 148.9322977666642 40.24950822286971 40.7494994554619 -227.261 148.9322977666642 149.58984126656418 40.24950822286971 40.7494994554619 -228.261 149.58984126656418 150.2473847665142 40.24950822286971 40.7494994554619 -229.261 150.2473847665142 150.9049282664642 40.24950822286971 40.7494994554619 -230.261 150.9049282664642 151.5624717664142 40.24950822286971 40.7494994554619 -231.261 151.5624717664142 152.2200152663642 40.24950822286971 40.7494994554619 -232.261 152.2200152663642 152.8775587663142 40.24950822286971 40.7494994554619 -233.261 152.8775587663142 153.53510226626418 40.24950822286971 40.7494994554619 -234.261 153.53510226626418 154.1926457662142 40.24950822286971 40.7494994554619 -235.261 154.1926457662142 154.8501892661642 40.24950822286971 40.7494994554619 -236.261 154.8501892661642 155.50773276611417 40.24950822286971 40.7494994554619 -237.261 155.50773276611417 156.16527626606415 40.24950822286971 40.7494994554619 -238.261 156.16527626606415 156.8228197659642 40.24950822286971 40.7494994554619 -239.261 156.8228197659642 157.4803632659142 40.24950822286971 40.7494994554619 -240.261 157.4803632659142 158.13790676586422 40.24950822286971 40.7494994554619 -241.261 158.13790676586422 158.7954502658142 40.24950822286971 40.7494994554619 -242.261 158.7954502658142 159.45299376576418 40.24950822286971 40.7494994554619 -243.261 159.45299376576418 160.11053726571419 40.24950822286971 40.7494994554619 -244.261 160.11053726571419 160.7680807656642 40.24950822286971 40.7494994554619 -245.261 160.7680807656642 161.42562426561418 40.24950822286971 40.7494994554619 -246.261 161.42562426561418 162.08316776556416 40.24950822286971 40.7494994554619 -247.261 162.08316776556416 162.74071126551416 40.24950822286971 40.7494994554619 -248.261 162.74071126551416 163.39825476546417 40.24950822286971 40.7494994554619 -249.261 163.39825476546417 164.05579826536422 40.24950822286971 40.7494994554619 -250.261 164.05579826536422 164.7133417653142 40.24950822286971 40.7494994554619 -251.261 164.7133417653142 165.37088526526418 40.24950822286971 40.7494994554619 -252.261 165.37088526526418 166.0284287652142 40.24950822286971 40.7494994554619 -253.261 166.0284287652142 166.6859722651642 40.24950822286971 40.7494994554619 -254.261 166.6859722651642 167.34351576511418 40.24950822286971 40.7494994554619 -255.261 167.34351576511418 168.00105926506416 40.24950822286971 40.7494994554619 -256.261 168.00105926506416 168.65860276501417 40.24950822286971 40.7494994554619 -257.261 168.65860276501417 169.31614626496417 40.24950822286971 40.7494994554619 -258.261 169.31614626496417 169.9736897649142 40.24950822286971 40.7494994554619 -259.261 169.9736897649142 170.6312332648642 40.24950822286971 40.7494994554619 -260.261 170.6312332648642 171.28877676476418 40.24950822286971 40.7494994554619 -261.261 171.28877676476418 171.9463202647142 40.24950822286971 40.7494994554619 -262.261 171.9463202647142 172.6038637646642 40.24950822286971 40.7494994554619 -263.261 172.6038637646642 173.26140726461418 40.24950822286971 40.7494994554619 -264.261 173.26140726461418 173.91895076456416 40.24950822286971 40.7494994554619 -265.261 173.91895076456416 174.57649426451417 40.24950822286971 40.7494994554619 -266.261 174.57649426451417 175.23403776446418 40.24950822286971 40.7494994554619 -267.261 175.23403776446418 175.89158126441419 40.24950822286971 40.7494994554619 -268.261 175.89158126441419 176.5491247643642 40.24950822286971 40.7494994554619 -269.261 176.5491247643642 177.2066682643142 40.24950822286971 40.7494994554619 -270.261 177.2066682643142 177.8642117642642 40.24950822286971 40.7494994554619 -271.261 177.8642117642642 178.5217552641642 40.24950822286971 40.7494994554619 -272.261 178.5217552641642 179.17929876411418 40.24950822286971 40.7494994554619 -273.261 179.17929876411418 179.83684226406416 40.24950822286971 40.7494994554619 -274.261 179.83684226406416 180.49438576401414 40.24950822286971 40.7494994554619 -275.261 180.49438576401414 181.15192926396418 40.24950822286971 40.7494994554619 -276.261 181.15192926396418 181.80947276391416 40.24950822286971 40.7494994554619 -277.261 181.80947276391416 182.46701626386414 40.24950822286971 40.7494994554619 -278.261 182.46701626386414 183.12455976381418 40.24950822286971 40.7494994554619 -279.261 183.12455976381418 183.78210326376416 40.24950822286971 40.7494994554619 -280.261 183.78210326376416 184.43964676371417 40.24950822286971 40.7494994554619 -281.261 184.43964676371417 185.09719026366417 40.24950822286971 40.7494994554619 -282.261 185.09719026366417 185.75473376356416 40.24950822286971 40.7494994554619 -283.261 185.75473376356416 186.41227726351414 40.24950822286971 40.7494994554619 -284.261 186.41227726351414 187.06982076346415 40.24950822286971 40.7494994554619 -285.261 187.06982076346415 187.72736426341413 40.24950822286971 40.7494994554619 -286.261 187.72736426341413 188.38490776336414 40.24950822286971 40.7494994554619 -287.261 188.38490776336414 189.04245126331418 40.24950822286971 40.7494994554619 -288.261 189.04245126331418 189.69999476326416 40.24950822286971 40.7494994554619 -289.261 189.69999476326416 190.35753826321417 40.24950822286971 40.7494994554619 -290.261 190.35753826321417 191.01508176316418 40.24950822286971 40.7494994554619 -291.261 191.01508176316418 191.67262526311418 40.24950822286971 40.7494994554619 -292.261 191.67262526311418 192.33016876306417 40.24950822286971 40.7494994554619 -293.261 192.33016876306417 192.98771226296415 40.24950822286971 40.7494994554619 -294.261 192.98771226296415 193.64525576291416 40.24950822286971 40.7494994554619 -295.261 193.64525576291416 194.30279926286417 40.24950822286971 40.7494994554619 -296.261 194.30279926286417 194.96034276281418 40.24950822286971 40.7494994554619 -297.261 194.96034276281418 195.61788626276416 40.24950822286971 40.7494994554619 -298.261 195.61788626276416 196.27542976271417 40.24950822286971 40.7494994554619 -299.261 196.27542976271417 196.93297326266418 40.24950822286971 40.7494994554619 -300.261 196.93297326266418 197.60105394018922 40.24950822286971 40.7494994554619 -377.261 247.5532855808391 248.22136625841418 40.24950822286971 40.7494994554619 -378.261 248.22136625841418 248.8789097583642 40.24950822286971 40.7494994554619 -379.261 248.8789097583642 249.53645325831417 40.24950822286971 40.7494994554619 -380.261 249.53645325831417 250.19399675826418 40.24950822286971 40.7494994554619 -381.261 250.19399675826418 250.85154025816416 40.24950822286971 40.7494994554619 -382.261 250.85154025816416 251.50908375811417 40.24950822286971 40.7494994554619 -383.261 251.50908375811417 252.16662725806418 40.24950822286971 40.7494994554619 -384.261 252.16662725806418 252.82417075801416 40.24950822286971 40.7494994554619 -385.261 252.82417075801416 253.4817142579642 40.24950822286971 40.7494994554619 -386.261 253.4817142579642 254.13925775791418 40.24950822286971 40.7494994554619 -387.261 254.13925775791418 254.79680125786416 40.24950822286971 40.7494994554619 -388.261 254.79680125786416 255.45434475781417 40.24950822286971 40.7494994554619 -389.261 255.45434475781417 256.1118882577642 40.24950822286971 40.7494994554619 -390.261 256.1118882577642 256.7694317577142 40.24950822286971 40.7494994554619 -391.261 256.7694317577142 257.42697525766414 40.24950822286971 40.7494994554619 -392.261 257.42697525766414 258.0845187575642 40.24950822286971 40.7494994554619 -393.261 258.0845187575642 258.7420622575142 40.24950822286971 40.7494994554619 -394.261 258.7420622575142 259.3996057574642 40.24950822286971 40.7494994554619 -395.261 259.3996057574642 260.05714925741415 40.24950822286971 40.7494994554619 -396.261 260.05714925741415 260.7146927573642 40.24950822286971 40.7494994554619 -397.261 260.7146927573642 261.37223625731417 40.24950822286971 40.7494994554619 -398.261 261.37223625731417 262.0297797572642 40.24950822286971 40.7494994554619 -399.261 262.0297797572642 262.6873232572142 40.24950822286971 40.7494994554619 -400.261 262.6873232572142 263.34486675716414 40.24950822286971 40.7494994554619 -401.261 263.34486675716414 264.0024102570642 40.24950822286971 40.7494994554619 -402.261 264.0024102570642 264.65995375701414 40.24950822286971 40.7494994554619 -403.261 264.65995375701414 265.31749725696415 40.24950822286971 40.7494994554619 -404.261 265.31749725696415 265.97504075691415 40.24950822286971 40.7494994554619 -405.261 265.97504075691415 266.63258425686416 40.24950822286971 40.7494994554619 -406.261 266.63258425686416 267.2901277568142 40.24950822286971 40.7494994554619 -407.261 267.2901277568142 267.9476712567641 40.24950822286971 40.7494994554619 -408.261 267.9476712567641 268.6052147567142 40.24950822286971 40.7494994554619 -409.261 268.6052147567142 269.2627582566642 40.24950822286971 40.7494994554619 -410.261 269.2627582566642 269.9203017566142 40.24950822286971 40.7494994554619 -411.261 269.9203017566142 270.57784525656416 40.24950822286971 40.7494994554619 -412.261 270.57784525656416 271.2353887564642 40.24950822286971 40.7494994554619 -413.261 271.2353887564642 271.89293225641416 40.24950822286971 40.7494994554619 -414.261 271.89293225641416 272.5504757563642 40.24950822286971 40.7494994554619 -415.261 272.5504757563642 273.2080192563142 40.24950822286971 40.7494994554619 -416.261 273.2080192563142 273.87609993388924 40.24950822286971 40.7494994554619 -169.262 111.62038962891701 112.29351295660811 40.7494994554619 41.249490555204694 -170.262 112.29351295660811 112.95601945325811 40.7494994554619 41.249490555204694 -171.262 112.95601945325811 113.61852594995811 40.7494994554619 41.249490555204694 -172.262 113.61852594995811 114.2810324466581 40.7494994554619 41.249490555204694 -173.262 114.2810324466581 114.94353894330811 40.7494994554619 41.249490555204694 -174.262 114.94353894330811 115.60604543995812 40.7494994554619 41.249490555204694 -175.262 115.60604543995812 116.2685519366581 40.7494994554619 41.249490555204694 -176.262 116.2685519366581 116.93105843335809 40.7494994554619 41.249490555204694 -177.262 116.93105843335809 117.59356493000811 40.7494994554619 41.249490555204694 -178.262 117.59356493000811 118.25607142665811 40.7494994554619 41.249490555204694 -179.262 118.25607142665811 118.9185779233581 40.7494994554619 41.249490555204694 -180.262 118.9185779233581 119.5810844200581 40.7494994554619 41.249490555204694 -181.262 119.5810844200581 120.24359091670811 40.7494994554619 41.249490555204694 -182.262 120.24359091670811 120.90609741335811 40.7494994554619 41.249490555204694 -183.262 120.90609741335811 121.56860391005813 40.7494994554619 41.249490555204694 -184.262 121.56860391005813 122.23111040675812 40.7494994554619 41.249490555204694 -185.262 122.23111040675812 122.89361690340809 40.7494994554619 41.249490555204694 -186.262 122.89361690340809 123.55612340005811 40.7494994554619 41.249490555204694 -187.262 123.55612340005811 124.21862989675813 40.7494994554619 41.249490555204694 -188.262 124.21862989675813 124.8811363934581 40.7494994554619 41.249490555204694 -189.262 124.8811363934581 125.54364289010809 40.7494994554619 41.249490555204694 -190.262 125.54364289010809 126.20614938675811 40.7494994554619 41.249490555204694 -191.262 126.20614938675811 126.86865588345812 40.7494994554619 41.249490555204694 -192.262 126.86865588345812 127.53116238015811 40.7494994554619 41.249490555204694 -193.262 127.53116238015811 128.19366887680812 40.7494994554619 41.249490555204694 -194.262 128.19366887680812 128.8561753734581 40.7494994554619 41.249490555204694 -195.262 128.8561753734581 129.5186818701581 40.7494994554619 41.249490555204694 -196.262 129.5186818701581 130.18118836685812 40.7494994554619 41.249490555204694 -197.262 130.18118836685812 130.84369486350812 40.7494994554619 41.249490555204694 -198.262 130.84369486350812 131.50620136015812 40.7494994554619 41.249490555204694 -199.262 131.50620136015812 132.16870785685813 40.7494994554619 41.249490555204694 -200.262 132.16870785685813 132.83121435355812 40.7494994554619 41.249490555204694 -201.262 132.83121435355812 133.49372085020812 40.7494994554619 41.249490555204694 -202.262 133.49372085020812 134.15622734685812 40.7494994554619 41.249490555204694 -203.262 134.15622734685812 134.8187338435581 40.7494994554619 41.249490555204694 -204.262 134.8187338435581 135.48124034025813 40.7494994554619 41.249490555204694 -205.262 135.48124034025813 136.14374683690812 40.7494994554619 41.249490555204694 -206.262 136.14374683690812 136.80625333355812 40.7494994554619 41.249490555204694 -207.262 136.80625333355812 137.46875983025814 40.7494994554619 41.249490555204694 -208.262 137.46875983025814 138.13126632695815 40.7494994554619 41.249490555204694 -209.262 138.13126632695815 138.79377282360812 40.7494994554619 41.249490555204694 -210.262 138.79377282360812 139.45627932025815 40.7494994554619 41.249490555204694 -211.262 139.45627932025815 140.1187858169581 40.7494994554619 41.249490555204694 -212.262 140.1187858169581 140.7812923136081 40.7494994554619 41.249490555204694 -213.262 140.7812923136081 141.44379881025813 40.7494994554619 41.249490555204694 -214.262 141.44379881025813 142.10630530695812 40.7494994554619 41.249490555204694 -215.262 142.10630530695812 142.76881180365808 40.7494994554619 41.249490555204694 -216.262 142.76881180365808 143.4313183003081 40.7494994554619 41.249490555204694 -217.262 143.4313183003081 144.09382479695813 40.7494994554619 41.249490555204694 -218.262 144.09382479695813 144.75633129365812 40.7494994554619 41.249490555204694 -219.262 144.75633129365812 145.4188377903581 40.7494994554619 41.249490555204694 -220.262 145.4188377903581 146.0813442870081 40.7494994554619 41.249490555204694 -221.262 146.0813442870081 146.7438507836581 40.7494994554619 41.249490555204694 -222.262 146.7438507836581 147.40635728035812 40.7494994554619 41.249490555204694 -223.262 147.40635728035812 148.06886377705808 40.7494994554619 41.249490555204694 -224.262 148.06886377705808 148.73137027370808 40.7494994554619 41.249490555204694 -225.262 148.73137027370808 149.39387677035813 40.7494994554619 41.249490555204694 -226.262 149.39387677035813 150.05638326705812 40.7494994554619 41.249490555204694 -227.262 150.05638326705812 150.71888976375809 40.7494994554619 41.249490555204694 -228.262 150.71888976375809 151.38139626040808 40.7494994554619 41.249490555204694 -229.262 151.38139626040808 152.0439027570581 40.7494994554619 41.249490555204694 -230.262 152.0439027570581 152.7064092537581 40.7494994554619 41.249490555204694 -231.262 152.7064092537581 153.3689157504581 40.7494994554619 41.249490555204694 -232.262 153.3689157504581 154.0314222471081 40.7494994554619 41.249490555204694 -233.262 154.0314222471081 154.69392874375808 40.7494994554619 41.249490555204694 -234.262 154.69392874375808 155.3564352404581 40.7494994554619 41.249490555204694 -235.262 155.3564352404581 156.01894173715812 40.7494994554619 41.249490555204694 -236.262 156.01894173715812 156.6814482338081 40.7494994554619 41.249490555204694 -237.262 156.6814482338081 157.3439547304581 40.7494994554619 41.249490555204694 -238.262 157.3439547304581 158.0064612271581 40.7494994554619 41.249490555204694 -239.262 158.0064612271581 158.66896772385812 40.7494994554619 41.249490555204694 -240.262 158.66896772385812 159.34209105159923 40.7494994554619 41.249490555204694 -242.262 159.98336388611696 160.6564872138581 40.7494994554619 41.249490555204694 -243.262 160.6564872138581 161.31899371055812 40.7494994554619 41.249490555204694 -244.262 161.31899371055812 161.98150020720811 40.7494994554619 41.249490555204694 -245.262 161.98150020720811 162.6440067038581 40.7494994554619 41.249490555204694 -246.262 162.6440067038581 163.30651320055813 40.7494994554619 41.249490555204694 -247.262 163.30651320055813 163.96901969725812 40.7494994554619 41.249490555204694 -248.262 163.96901969725812 164.6315261939081 40.7494994554619 41.249490555204694 -249.262 164.6315261939081 165.2940326905581 40.7494994554619 41.249490555204694 -250.262 165.2940326905581 165.9565391872581 40.7494994554619 41.249490555204694 -251.262 165.9565391872581 166.61904568395812 40.7494994554619 41.249490555204694 -252.262 166.61904568395812 167.28155218060812 40.7494994554619 41.249490555204694 -253.262 167.28155218060812 167.9440586772581 40.7494994554619 41.249490555204694 -254.262 167.9440586772581 168.60656517395813 40.7494994554619 41.249490555204694 -255.262 168.60656517395813 169.26907167060813 40.7494994554619 41.249490555204694 -256.262 169.26907167060813 169.93157816725812 40.7494994554619 41.249490555204694 -257.262 169.93157816725812 170.5940846639581 40.7494994554619 41.249490555204694 -258.262 170.5940846639581 171.2565911606581 40.7494994554619 41.249490555204694 -259.262 171.2565911606581 171.91909765730813 40.7494994554619 41.249490555204694 -260.262 171.91909765730813 172.58160415395812 40.7494994554619 41.249490555204694 -261.262 172.58160415395812 173.24411065065811 40.7494994554619 41.249490555204694 -262.262 173.24411065065811 173.90661714735813 40.7494994554619 41.249490555204694 -263.262 173.90661714735813 174.56912364400813 40.7494994554619 41.249490555204694 -264.262 174.56912364400813 175.23163014065813 40.7494994554619 41.249490555204694 -265.262 175.23163014065813 175.89413663735812 40.7494994554619 41.249490555204694 -266.262 175.89413663735812 176.5566431340581 40.7494994554619 41.249490555204694 -267.262 176.5566431340581 177.21914963070813 40.7494994554619 41.249490555204694 -268.262 177.21914963070813 177.88165612735813 40.7494994554619 41.249490555204694 -269.262 177.88165612735813 178.54416262405812 40.7494994554619 41.249490555204694 -270.262 178.54416262405812 179.20666912075808 40.7494994554619 41.249490555204694 -271.262 179.20666912075808 179.8691756174081 40.7494994554619 41.249490555204694 -272.262 179.8691756174081 180.5316821140581 40.7494994554619 41.249490555204694 -273.262 180.5316821140581 181.1941886107581 40.7494994554619 41.249490555204694 -274.262 181.1941886107581 181.8566951074581 40.7494994554619 41.249490555204694 -275.262 181.8566951074581 182.5192016041081 40.7494994554619 41.249490555204694 -276.262 182.5192016041081 183.18170810075807 40.7494994554619 41.249490555204694 -277.262 183.18170810075807 183.84421459745806 40.7494994554619 41.249490555204694 -278.262 183.84421459745806 184.50672109415808 40.7494994554619 41.249490555204694 -279.262 184.50672109415808 185.16922759080808 40.7494994554619 41.249490555204694 -280.262 185.16922759080808 185.83173408745807 40.7494994554619 41.249490555204694 -281.262 185.83173408745807 186.4942405841581 40.7494994554619 41.249490555204694 -282.262 186.4942405841581 187.15674708085808 40.7494994554619 41.249490555204694 -283.262 187.15674708085808 187.81925357750808 40.7494994554619 41.249490555204694 -284.262 187.81925357750808 188.4817600741581 40.7494994554619 41.249490555204694 -285.262 188.4817600741581 189.1442665708581 40.7494994554619 41.249490555204694 -286.262 189.1442665708581 189.80677306755808 40.7494994554619 41.249490555204694 -287.262 189.80677306755808 190.46927956420808 40.7494994554619 41.249490555204694 -288.262 190.46927956420808 191.13178606085808 40.7494994554619 41.249490555204694 -289.262 191.13178606085808 191.7942925575581 40.7494994554619 41.249490555204694 -290.262 191.7942925575581 192.4567990542581 40.7494994554619 41.249490555204694 -291.262 192.4567990542581 193.11930555090808 40.7494994554619 41.249490555204694 -292.262 193.11930555090808 193.7818120475581 40.7494994554619 41.249490555204694 -293.262 193.7818120475581 194.44431854425812 40.7494994554619 41.249490555204694 -294.262 194.44431854425812 195.10682504095809 40.7494994554619 41.249490555204694 -295.262 195.10682504095809 195.76933153760808 40.7494994554619 41.249490555204694 -296.262 195.76933153760808 196.4318380342581 40.7494994554619 41.249490555204694 -297.262 196.4318380342581 197.0943445309581 40.7494994554619 41.249490555204694 -298.262 197.0943445309581 197.7674678586992 40.7494994554619 41.249490555204694 -376.262 248.759234440517 249.4429745992992 40.7494994554619 41.249490555204694 -381.262 252.071766923817 252.7555070825992 40.7494994554619 41.249490555204694 -385.262 254.721792910517 255.40553306929922 40.7494994554619 41.249490555204694 -387.262 256.046805903917 256.7305460626992 40.7494994554619 41.249490555204694 -390.262 258.03432539391696 258.7074487216581 40.7494994554619 41.249490555204694 -391.262 258.7074487216581 259.3699552183581 40.7494994554619 41.249490555204694 -392.262 259.3699552183581 260.03246171500814 40.7494994554619 41.249490555204694 -393.262 260.03246171500814 260.6949682116581 40.7494994554619 41.249490555204694 -394.262 260.6949682116581 261.3574747083581 40.7494994554619 41.249490555204694 -395.262 261.3574747083581 262.01998120505806 40.7494994554619 41.249490555204694 -396.262 262.01998120505806 262.68248770170817 40.7494994554619 41.249490555204694 -397.262 262.68248770170817 263.3449941983581 40.7494994554619 41.249490555204694 -398.262 263.3449941983581 264.00750069505807 40.7494994554619 41.249490555204694 -399.262 264.00750069505807 264.6700071917581 40.7494994554619 41.249490555204694 -400.262 264.6700071917581 265.3325136884081 40.7494994554619 41.249490555204694 -401.262 265.3325136884081 265.9950201850581 40.7494994554619 41.249490555204694 -402.262 265.9950201850581 266.6575266817581 40.7494994554619 41.249490555204694 -403.262 266.6575266817581 267.32003317845806 40.7494994554619 41.249490555204694 -404.262 267.32003317845806 267.9825396751081 40.7494994554619 41.249490555204694 -405.262 267.9825396751081 268.64504617175817 40.7494994554619 41.249490555204694 -406.262 268.64504617175817 269.30755266845813 40.7494994554619 41.249490555204694 -407.262 269.30755266845813 269.9700591651581 40.7494994554619 41.249490555204694 -408.262 269.9700591651581 270.63256566180814 40.7494994554619 41.249490555204694 -409.262 270.63256566180814 271.2950721584581 40.7494994554619 41.249490555204694 -410.262 271.2950721584581 271.9575786551581 40.7494994554619 41.249490555204694 -411.262 271.9575786551581 272.62008515185806 40.7494994554619 41.249490555204694 -412.262 272.62008515185806 273.2825916485081 40.7494994554619 41.249490555204694 -413.262 273.2825916485081 273.9450981451581 40.7494994554619 41.249490555204694 -414.262 273.9450981451581 274.6182214728992 40.7494994554619 41.249490555204694 -167.263 111.1426978377812 111.82099256795551 41.249490555204694 41.74948151766863 -168.263 111.82099256795551 112.48858877710552 41.249490555204694 41.74948151766863 -169.263 112.48858877710552 113.15618498625551 41.249490555204694 41.74948151766863 -170.263 113.15618498625551 113.82378119535551 41.249490555204694 41.74948151766863 -171.263 113.82378119535551 114.49137740445552 41.249490555204694 41.74948151766863 -172.263 114.49137740445552 115.15897361355552 41.249490555204694 41.74948151766863 -173.263 115.15897361355552 115.82656982270552 41.249490555204694 41.74948151766863 -174.263 115.82656982270552 116.49416603185553 41.249490555204694 41.74948151766863 -175.263 116.49416603185553 117.16176224095551 41.249490555204694 41.74948151766863 -176.263 117.16176224095551 117.82935845005551 41.249490555204694 41.74948151766863 -177.263 117.82935845005551 118.49695465920551 41.249490555204694 41.74948151766863 -178.263 118.49695465920551 119.16455086835552 41.249490555204694 41.74948151766863 -179.263 119.16455086835552 119.83214707745552 41.249490555204694 41.74948151766863 -180.263 119.83214707745552 120.49974328655551 41.249490555204694 41.74948151766863 -181.263 120.49974328655551 121.1673394957055 41.249490555204694 41.74948151766863 -182.263 121.1673394957055 121.83493570485551 41.249490555204694 41.74948151766863 -183.263 121.83493570485551 122.50253191395551 41.249490555204694 41.74948151766863 -184.263 122.50253191395551 123.17012812305552 41.249490555204694 41.74948151766863 -185.263 123.17012812305552 123.83772433215552 41.249490555204694 41.74948151766863 -186.263 123.83772433215552 124.50532054130551 41.249490555204694 41.74948151766863 -187.263 124.50532054130551 125.17291675045553 41.249490555204694 41.74948151766863 -188.263 125.17291675045553 125.84051295955553 41.249490555204694 41.74948151766863 -189.263 125.84051295955553 126.50810916865551 41.249490555204694 41.74948151766863 -190.263 126.50810916865551 127.17570537780551 41.249490555204694 41.74948151766863 -191.263 127.17570537780551 127.84330158695552 41.249490555204694 41.74948151766863 -192.263 127.84330158695552 128.5108977960555 41.249490555204694 41.74948151766863 -193.263 128.5108977960555 129.17849400515553 41.249490555204694 41.74948151766863 -194.263 129.17849400515553 129.84609021430552 41.249490555204694 41.74948151766863 -195.263 129.84609021430552 130.5136864234555 41.249490555204694 41.74948151766863 -196.263 130.5136864234555 131.1812826325555 41.249490555204694 41.74948151766863 -197.263 131.1812826325555 131.8488788416555 41.249490555204694 41.74948151766863 -198.263 131.8488788416555 132.51647505080552 41.249490555204694 41.74948151766863 -199.263 132.51647505080552 133.1840712599555 41.249490555204694 41.74948151766863 -200.263 133.1840712599555 133.8516674690555 41.249490555204694 41.74948151766863 -201.263 133.8516674690555 134.5192636781555 41.249490555204694 41.74948151766863 -202.263 134.5192636781555 135.1868598872555 41.249490555204694 41.74948151766863 -203.263 135.1868598872555 135.8544560964055 41.249490555204694 41.74948151766863 -204.263 135.8544560964055 136.52205230555552 41.249490555204694 41.74948151766863 -205.263 136.52205230555552 137.18964851465552 41.249490555204694 41.74948151766863 -206.263 137.18964851465552 137.8572447237555 41.249490555204694 41.74948151766863 -207.263 137.8572447237555 138.52484093290553 41.249490555204694 41.74948151766863 -208.263 138.52484093290553 139.1924371420555 41.249490555204694 41.74948151766863 -209.263 139.1924371420555 139.86003335115552 41.249490555204694 41.74948151766863 -210.263 139.86003335115552 140.52762956025555 41.249490555204694 41.74948151766863 -211.263 140.52762956025555 141.1952257694055 41.249490555204694 41.74948151766863 -212.263 141.1952257694055 141.8628219785555 41.249490555204694 41.74948151766863 -213.263 141.8628219785555 142.5304181876555 41.249490555204694 41.74948151766863 -214.263 142.5304181876555 143.19801439675553 41.249490555204694 41.74948151766863 -215.263 143.19801439675553 143.86561060585552 41.249490555204694 41.74948151766863 -216.263 143.86561060585552 144.5332068150055 41.249490555204694 41.74948151766863 -217.263 144.5332068150055 145.2008030241555 41.249490555204694 41.74948151766863 -218.263 145.2008030241555 145.8683992332555 41.249490555204694 41.74948151766863 -219.263 145.8683992332555 146.5359954423555 41.249490555204694 41.74948151766863 -220.263 146.5359954423555 147.20359165150552 41.249490555204694 41.74948151766863 -221.263 147.20359165150552 147.8711878606555 41.249490555204694 41.74948151766863 -222.263 147.8711878606555 148.5387840697555 41.249490555204694 41.74948151766863 -223.263 148.5387840697555 149.2063802788555 41.249490555204694 41.74948151766863 -224.263 149.2063802788555 149.8739764880055 41.249490555204694 41.74948151766863 -225.263 149.8739764880055 150.54157269715552 41.249490555204694 41.74948151766863 -226.263 150.54157269715552 151.2091689062555 41.249490555204694 41.74948151766863 -227.263 151.2091689062555 151.8767651153555 41.249490555204694 41.74948151766863 -228.263 151.8767651153555 152.54436132450553 41.249490555204694 41.74948151766863 -229.263 152.54436132450553 153.21195753365552 41.249490555204694 41.74948151766863 -230.263 153.21195753365552 153.87955374275552 41.249490555204694 41.74948151766863 -231.263 153.87955374275552 154.54714995185554 41.249490555204694 41.74948151766863 -232.263 154.54714995185554 155.2147461609555 41.249490555204694 41.74948151766863 -233.263 155.2147461609555 155.8823423701055 41.249490555204694 41.74948151766863 -234.263 155.8823423701055 156.54993857925552 41.249490555204694 41.74948151766863 -235.263 156.54993857925552 157.21753478835552 41.249490555204694 41.74948151766863 -236.263 157.21753478835552 157.88513099745552 41.249490555204694 41.74948151766863 -237.263 157.88513099745552 158.5527272066055 41.249490555204694 41.74948151766863 -238.263 158.5527272066055 159.23102193682982 41.249490555204694 41.74948151766863 -240.263 159.8772211037812 160.5555158339555 41.249490555204694 41.74948151766863 -241.263 160.5555158339555 161.22311204310552 41.249490555204694 41.74948151766863 -242.263 161.22311204310552 161.8907082522555 41.249490555204694 41.74948151766863 -243.263 161.8907082522555 162.5583044613555 41.249490555204694 41.74948151766863 -244.263 162.5583044613555 163.2259006704555 41.249490555204694 41.74948151766863 -245.263 163.2259006704555 163.8934968795555 41.249490555204694 41.74948151766863 -246.263 163.8934968795555 164.5610930887055 41.249490555204694 41.74948151766863 -247.263 164.5610930887055 165.2286892978555 41.249490555204694 41.74948151766863 -248.263 165.2286892978555 165.8962855069555 41.249490555204694 41.74948151766863 -249.263 165.8962855069555 166.5638817160555 41.249490555204694 41.74948151766863 -250.263 166.5638817160555 167.23147792520552 41.249490555204694 41.74948151766863 -251.263 167.23147792520552 167.89907413435552 41.249490555204694 41.74948151766863 -252.263 167.89907413435552 168.56667034345554 41.249490555204694 41.74948151766863 -253.263 168.56667034345554 169.2342665525555 41.249490555204694 41.74948151766863 -254.263 169.2342665525555 169.9018627617055 41.249490555204694 41.74948151766863 -255.263 169.9018627617055 170.56945897085552 41.249490555204694 41.74948151766863 -256.263 170.56945897085552 171.23705517995552 41.249490555204694 41.74948151766863 -257.263 171.23705517995552 171.90465138905552 41.249490555204694 41.74948151766863 -258.263 171.90465138905552 172.5722475982055 41.249490555204694 41.74948151766863 -259.263 172.5722475982055 173.2398438073555 41.249490555204694 41.74948151766863 -260.263 173.2398438073555 173.90744001645552 41.249490555204694 41.74948151766863 -261.263 173.90744001645552 174.57503622555552 41.249490555204694 41.74948151766863 -262.263 174.57503622555552 175.24263243465552 41.249490555204694 41.74948151766863 -263.263 175.24263243465552 175.9102286438055 41.249490555204694 41.74948151766863 -264.263 175.9102286438055 176.5778248529555 41.249490555204694 41.74948151766863 -265.263 176.5778248529555 177.2454210620555 41.249490555204694 41.74948151766863 -266.263 177.2454210620555 177.91301727115552 41.249490555204694 41.74948151766863 -267.263 177.91301727115552 178.58061348030552 41.249490555204694 41.74948151766863 -268.263 178.58061348030552 179.2482096894555 41.249490555204694 41.74948151766863 -269.263 179.2482096894555 179.9158058985555 41.249490555204694 41.74948151766863 -270.263 179.9158058985555 180.58340210765547 41.249490555204694 41.74948151766863 -271.263 180.58340210765547 181.25099831680546 41.249490555204694 41.74948151766863 -272.263 181.25099831680546 181.91859452595548 41.249490555204694 41.74948151766863 -273.263 181.91859452595548 182.58619073505548 41.249490555204694 41.74948151766863 -274.263 182.58619073505548 183.25378694415548 41.249490555204694 41.74948151766863 -275.263 183.25378694415548 183.92138315325548 41.249490555204694 41.74948151766863 -276.263 183.92138315325548 184.5889793624055 41.249490555204694 41.74948151766863 -277.263 184.5889793624055 185.25657557155552 41.249490555204694 41.74948151766863 -278.263 185.25657557155552 185.92417178065548 41.249490555204694 41.74948151766863 -279.263 185.92417178065548 186.59176798975548 41.249490555204694 41.74948151766863 -280.263 186.59176798975548 187.25936419890547 41.249490555204694 41.74948151766863 -281.263 187.25936419890547 187.9269604080555 41.249490555204694 41.74948151766863 -282.263 187.9269604080555 188.59455661715552 41.249490555204694 41.74948151766863 -283.263 188.59455661715552 189.2621528262555 41.249490555204694 41.74948151766863 -284.263 189.2621528262555 189.92974903540548 41.249490555204694 41.74948151766863 -285.263 189.92974903540548 190.5973452445555 41.249490555204694 41.74948151766863 -286.263 190.5973452445555 191.26494145365552 41.249490555204694 41.74948151766863 -287.263 191.26494145365552 191.9325376627555 41.249490555204694 41.74948151766863 -288.263 191.9325376627555 192.60013387190548 41.249490555204694 41.74948151766863 -289.263 192.60013387190548 193.26773008105548 41.249490555204694 41.74948151766863 -290.263 193.26773008105548 193.9353262901555 41.249490555204694 41.74948151766863 -291.263 193.9353262901555 194.60292249925547 41.249490555204694 41.74948151766863 -292.263 194.60292249925547 195.2705187083555 41.249490555204694 41.74948151766863 -293.263 195.2705187083555 195.9381149175055 41.249490555204694 41.74948151766863 -294.263 195.9381149175055 196.60571112665548 41.249490555204694 41.74948151766863 -295.263 196.60571112665548 197.27330733575548 41.249490555204694 41.74948151766863 -296.263 197.27330733575548 197.9516020659298 41.249490555204694 41.74948151766863 -388.263 258.6814600540812 259.35975478425553 41.249490555204694 41.74948151766863 -389.263 259.35975478425553 260.0273509933555 41.249490555204694 41.74948151766863 -390.263 260.0273509933555 260.6949472024555 41.249490555204694 41.74948151766863 -391.263 260.6949472024555 261.36254341160554 41.249490555204694 41.74948151766863 -392.263 261.36254341160554 262.0301396207555 41.249490555204694 41.74948151766863 -393.263 262.0301396207555 262.6977358298555 41.249490555204694 41.74948151766863 -394.263 262.6977358298555 263.3653320389555 41.249490555204694 41.74948151766863 -395.263 263.3653320389555 264.03292824810546 41.249490555204694 41.74948151766863 -396.263 264.03292824810546 264.7005244572555 41.249490555204694 41.74948151766863 -397.263 264.7005244572555 265.36812066635554 41.249490555204694 41.74948151766863 -398.263 265.36812066635554 266.0357168754555 41.249490555204694 41.74948151766863 -399.263 266.0357168754555 266.70331308455553 41.249490555204694 41.74948151766863 -400.263 266.70331308455553 267.3709092937055 41.249490555204694 41.74948151766863 -401.263 267.3709092937055 268.0385055028555 41.249490555204694 41.74948151766863 -402.263 268.0385055028555 268.7061017119555 41.249490555204694 41.74948151766863 -403.263 268.7061017119555 269.3736979210555 41.249490555204694 41.74948151766863 -404.263 269.3736979210555 270.04129413020553 41.249490555204694 41.74948151766863 -405.263 270.04129413020553 270.7088903393555 41.249490555204694 41.74948151766863 -406.263 270.7088903393555 271.3764865484555 41.249490555204694 41.74948151766863 -407.263 271.3764865484555 272.0440827575555 41.249490555204694 41.74948151766863 -408.263 272.0440827575555 272.71167896670545 41.249490555204694 41.74948151766863 -409.263 272.71167896670545 273.37927517585547 41.249490555204694 41.74948151766863 -410.263 273.37927517585547 274.0468713849555 41.249490555204694 41.74948151766863 -411.263 274.0468713849555 274.7251661151298 41.249490555204694 41.74948151766863 -166.264 111.33891836286298 112.0225170353605 41.74948151766863 42.24947233824402 -167.264 112.0225170353605 112.6953334001605 41.74948151766863 42.24947233824402 -168.264 112.6953334001605 113.36814976496049 41.74948151766863 42.24947233824402 -169.264 113.36814976496049 114.04096612976049 41.74948151766863 42.24947233824402 -170.264 114.04096612976049 114.71378249456049 41.74948151766863 42.24947233824402 -171.264 114.71378249456049 115.38659885936048 41.74948151766863 42.24947233824402 -172.264 115.38659885936048 116.05941522421048 41.74948151766863 42.24947233824402 -173.264 116.05941522421048 116.73223158906048 41.74948151766863 42.24947233824402 -174.264 116.73223158906048 117.40504795386047 41.74948151766863 42.24947233824402 -175.264 117.40504795386047 118.07786431866049 41.74948151766863 42.24947233824402 -176.264 118.07786431866049 118.75068068346049 41.74948151766863 42.24947233824402 -177.264 118.75068068346049 119.42349704826049 41.74948151766863 42.24947233824402 -178.264 119.42349704826049 120.0963134130605 41.74948151766863 42.24947233824402 -179.264 120.0963134130605 120.7691297778605 41.74948151766863 42.24947233824402 -180.264 120.7691297778605 121.4419461426605 41.74948151766863 42.24947233824402 -181.264 121.4419461426605 122.1147625074605 41.74948151766863 42.24947233824402 -182.264 122.1147625074605 122.7875788722605 41.74948151766863 42.24947233824402 -183.264 122.7875788722605 123.46039523706048 41.74948151766863 42.24947233824402 -184.264 123.46039523706048 124.13321160186048 41.74948151766863 42.24947233824402 -185.264 124.13321160186048 124.8060279666605 41.74948151766863 42.24947233824402 -186.264 124.8060279666605 125.4788443314605 41.74948151766863 42.24947233824402 -187.264 125.4788443314605 126.15166069626049 41.74948151766863 42.24947233824402 -188.264 126.15166069626049 126.82447706106049 41.74948151766863 42.24947233824402 -189.264 126.82447706106049 127.49729342586049 41.74948151766863 42.24947233824402 -190.264 127.49729342586049 128.1701097906605 41.74948151766863 42.24947233824402 -191.264 128.1701097906605 128.84292615546048 41.74948151766863 42.24947233824402 -192.264 128.84292615546048 129.51574252026052 41.74948151766863 42.24947233824402 -193.264 129.51574252026052 130.1885588850605 41.74948151766863 42.24947233824402 -194.264 130.1885588850605 130.8613752498605 41.74948151766863 42.24947233824402 -195.264 130.8613752498605 131.53419161466053 41.74948151766863 42.24947233824402 -196.264 131.53419161466053 132.20700797946049 41.74948151766863 42.24947233824402 -197.264 132.20700797946049 132.8798243442605 41.74948151766863 42.24947233824402 -198.264 132.8798243442605 133.55264070906048 41.74948151766863 42.24947233824402 -199.264 133.55264070906048 134.22545707386047 41.74948151766863 42.24947233824402 -200.264 134.22545707386047 134.89827343866048 41.74948151766863 42.24947233824402 -201.264 134.89827343866048 135.5710898034605 41.74948151766863 42.24947233824402 -202.264 135.5710898034605 136.24390616826048 41.74948151766863 42.24947233824402 -203.264 136.24390616826048 136.9167225331105 41.74948151766863 42.24947233824402 -204.264 136.9167225331105 137.5895388979605 41.74948151766863 42.24947233824402 -205.264 137.5895388979605 138.26235526276048 41.74948151766863 42.24947233824402 -206.264 138.26235526276048 138.9351716275605 41.74948151766863 42.24947233824402 -207.264 138.9351716275605 139.6079879923605 41.74948151766863 42.24947233824402 -208.264 139.6079879923605 140.2808043571605 41.74948151766863 42.24947233824402 -209.264 140.2808043571605 140.95362072196048 41.74948151766863 42.24947233824402 -210.264 140.95362072196048 141.62643708676052 41.74948151766863 42.24947233824402 -211.264 141.62643708676052 142.2992534515605 41.74948151766863 42.24947233824402 -212.264 142.2992534515605 142.9720698163605 41.74948151766863 42.24947233824402 -213.264 142.9720698163605 143.6448861811605 41.74948151766863 42.24947233824402 -214.264 143.6448861811605 144.3177025459605 41.74948151766863 42.24947233824402 -215.264 144.3177025459605 144.9905189107605 41.74948151766863 42.24947233824402 -216.264 144.9905189107605 145.66333527556048 41.74948151766863 42.24947233824402 -217.264 145.66333527556048 146.33615164036047 41.74948151766863 42.24947233824402 -218.264 146.33615164036047 147.00896800516048 41.74948151766863 42.24947233824402 -219.264 147.00896800516048 147.6817843699605 41.74948151766863 42.24947233824402 -220.264 147.6817843699605 148.35460073476048 41.74948151766863 42.24947233824402 -221.264 148.35460073476048 149.02741709956047 41.74948151766863 42.24947233824402 -222.264 149.02741709956047 149.7002334643605 41.74948151766863 42.24947233824402 -223.264 149.7002334643605 150.3730498291605 41.74948151766863 42.24947233824402 -224.264 150.3730498291605 151.0458661939605 41.74948151766863 42.24947233824402 -225.264 151.0458661939605 151.7186825587605 41.74948151766863 42.24947233824402 -226.264 151.7186825587605 152.3914989235605 41.74948151766863 42.24947233824402 -227.264 152.3914989235605 153.0643152883605 41.74948151766863 42.24947233824402 -228.264 153.0643152883605 153.73713165316047 41.74948151766863 42.24947233824402 -229.264 153.73713165316047 154.4099480179605 41.74948151766863 42.24947233824402 -230.264 154.4099480179605 155.0827643827605 41.74948151766863 42.24947233824402 -231.264 155.0827643827605 155.7555807475605 41.74948151766863 42.24947233824402 -232.264 155.7555807475605 156.42839711236047 41.74948151766863 42.24947233824402 -233.264 156.42839711236047 157.1012134771605 41.74948151766863 42.24947233824402 -234.264 157.1012134771605 157.7740298419605 41.74948151766863 42.24947233824402 -235.264 157.7740298419605 158.44684620681048 41.74948151766863 42.24947233824402 -236.264 158.44684620681048 159.13044487935798 41.74948151766863 42.24947233824402 -238.264 159.781696628763 160.46529530126048 41.74948151766863 42.24947233824402 -239.264 160.46529530126048 161.13811166606047 41.74948151766863 42.24947233824402 -240.264 161.13811166606047 161.81092803086045 41.74948151766863 42.24947233824402 -241.264 161.81092803086045 162.4837443956605 41.74948151766863 42.24947233824402 -242.264 162.4837443956605 163.15656076046048 41.74948151766863 42.24947233824402 -243.264 163.15656076046048 163.8293771252605 41.74948151766863 42.24947233824402 -244.264 163.8293771252605 164.5021934900605 41.74948151766863 42.24947233824402 -245.264 164.5021934900605 165.1750098548605 41.74948151766863 42.24947233824402 -246.264 165.1750098548605 165.84782621966048 41.74948151766863 42.24947233824402 -247.264 165.84782621966048 166.5206425844605 41.74948151766863 42.24947233824402 -248.264 166.5206425844605 167.1934589492605 41.74948151766863 42.24947233824402 -249.264 167.1934589492605 167.8662753140605 41.74948151766863 42.24947233824402 -250.264 167.8662753140605 168.53909167886047 41.74948151766863 42.24947233824402 -251.264 168.53909167886047 169.21190804366051 41.74948151766863 42.24947233824402 -252.264 169.21190804366051 169.8847244084605 41.74948151766863 42.24947233824402 -253.264 169.8847244084605 170.55754077326048 41.74948151766863 42.24947233824402 -254.264 170.55754077326048 171.2303571380605 41.74948151766863 42.24947233824402 -255.264 171.2303571380605 171.90317350286048 41.74948151766863 42.24947233824402 -256.264 171.90317350286048 172.5759898676605 41.74948151766863 42.24947233824402 -257.264 172.5759898676605 173.24880623246048 41.74948151766863 42.24947233824402 -258.264 173.24880623246048 173.92162259726047 41.74948151766863 42.24947233824402 -259.264 173.92162259726047 174.5944389620605 41.74948151766863 42.24947233824402 -260.264 174.5944389620605 175.2672553268605 41.74948151766863 42.24947233824402 -261.264 175.2672553268605 175.94007169166048 41.74948151766863 42.24947233824402 -262.264 175.94007169166048 176.61288805646052 41.74948151766863 42.24947233824402 -263.264 176.61288805646052 177.2857044212605 41.74948151766863 42.24947233824402 -264.264 177.2857044212605 177.9585207860605 41.74948151766863 42.24947233824402 -265.264 177.9585207860605 178.6313371508605 41.74948151766863 42.24947233824402 -266.264 178.6313371508605 179.30415351571048 41.74948151766863 42.24947233824402 -267.264 179.30415351571048 179.9769698805605 41.74948151766863 42.24947233824402 -268.264 179.9769698805605 180.64978624536047 41.74948151766863 42.24947233824402 -269.264 180.64978624536047 181.3226026101605 41.74948151766863 42.24947233824402 -270.264 181.3226026101605 181.99541897496047 41.74948151766863 42.24947233824402 -271.264 181.99541897496047 182.66823533976049 41.74948151766863 42.24947233824402 -272.264 182.66823533976049 183.34105170456047 41.74948151766863 42.24947233824402 -273.264 183.34105170456047 184.01386806936046 41.74948151766863 42.24947233824402 -274.264 184.01386806936046 184.6866844341605 41.74948151766863 42.24947233824402 -275.264 184.6866844341605 185.35950079896048 41.74948151766863 42.24947233824402 -276.264 185.35950079896048 186.03231716376047 41.74948151766863 42.24947233824402 -277.264 186.03231716376047 186.7051335285605 41.74948151766863 42.24947233824402 -278.264 186.7051335285605 187.3779498933605 41.74948151766863 42.24947233824402 -279.264 187.3779498933605 188.05076625816048 41.74948151766863 42.24947233824402 -280.264 188.05076625816048 188.7235826229605 41.74948151766863 42.24947233824402 -281.264 188.7235826229605 189.39639898776048 41.74948151766863 42.24947233824402 -282.264 189.39639898776048 190.0692153525605 41.74948151766863 42.24947233824402 -283.264 190.0692153525605 190.74203171736048 41.74948151766863 42.24947233824402 -284.264 190.74203171736048 191.41484808216046 41.74948151766863 42.24947233824402 -285.264 191.41484808216046 192.08766444696047 41.74948151766863 42.24947233824402 -286.264 192.08766444696047 192.7604808117605 41.74948151766863 42.24947233824402 -287.264 192.7604808117605 193.43329717656047 41.74948151766863 42.24947233824402 -288.264 193.43329717656047 194.1061135413605 41.74948151766863 42.24947233824402 -289.264 194.1061135413605 194.7789299061605 41.74948151766863 42.24947233824402 -290.264 194.7789299061605 195.45174627096048 41.74948151766863 42.24947233824402 -291.264 195.45174627096048 196.1245626357605 41.74948151766863 42.24947233824402 -292.264 196.1245626357605 196.79737900056045 41.74948151766863 42.24947233824402 -293.264 196.79737900056045 197.48097767305796 41.74948151766863 42.24947233824402 -374.264 251.28472224196298 251.9683209144605 41.74948151766863 42.24947233824402 -375.264 251.9683209144605 252.6411372792605 41.74948151766863 42.24947233824402 -376.264 252.6411372792605 253.3139536440605 41.74948151766863 42.24947233824402 -377.264 253.3139536440605 253.9867700088605 41.74948151766863 42.24947233824402 -378.264 253.9867700088605 254.65958637366052 41.74948151766863 42.24947233824402 -379.264 254.65958637366052 255.33240273846047 41.74948151766863 42.24947233824402 -380.264 255.33240273846047 256.0052191032605 41.74948151766863 42.24947233824402 -381.264 256.0052191032605 256.6780354680605 41.74948151766863 42.24947233824402 -382.264 256.6780354680605 257.3508518328605 41.74948151766863 42.24947233824402 -383.264 257.3508518328605 258.0236681976604 41.74948151766863 42.24947233824402 -384.264 258.0236681976604 258.69648456246045 41.74948151766863 42.24947233824402 -385.264 258.69648456246045 259.3693009272605 41.74948151766863 42.24947233824402 -386.264 259.3693009272605 260.0421172920605 41.74948151766863 42.24947233824402 -387.264 260.0421172920605 260.725715964558 41.74948151766863 42.24947233824402 -394.264 264.741049538063 265.42464821056046 41.74948151766863 42.24947233824402 -395.264 265.42464821056046 266.0974645753605 41.74948151766863 42.24947233824402 -396.264 266.0974645753605 266.77028094016055 41.74948151766863 42.24947233824402 -397.264 266.77028094016055 267.453879612658 41.74948151766863 42.24947233824402 -400.264 268.77794772686303 269.4615463993605 41.74948151766863 42.24947233824402 -401.264 269.4615463993605 270.13436276416047 41.74948151766863 42.24947233824402 -402.264 270.13436276416047 270.80717912896046 41.74948151766863 42.24947233824402 -403.264 270.80717912896046 271.4799954937605 41.74948151766863 42.24947233824402 -404.264 271.4799954937605 272.1528118585605 41.74948151766863 42.24947233824402 -405.264 272.1528118585605 272.82562822336047 41.74948151766863 42.24947233824402 -406.264 272.82562822336047 273.4984445881605 41.74948151766863 42.24947233824402 -407.264 273.4984445881605 274.17126095296044 41.74948151766863 42.24947233824402 -408.264 274.17126095296044 274.85485962545795 41.74948151766863 42.24947233824402 -165.265 111.54679296897916 112.23583207508334 42.24947233824402 42.749463012131386 -166.265 112.23583207508334 112.91400292753335 42.24947233824402 42.749463012131386 -167.265 112.91400292753335 113.59217377998334 42.24947233824402 42.749463012131386 -168.265 113.59217377998334 114.27034463243334 42.24947233824402 42.749463012131386 -169.265 114.27034463243334 114.94851548488333 42.24947233824402 42.749463012131386 -170.265 114.94851548488333 115.62668633733334 42.24947233824402 42.749463012131386 -171.265 115.62668633733334 116.30485718978335 42.24947233824402 42.749463012131386 -172.265 116.30485718978335 116.98302804228334 42.24947233824402 42.749463012131386 -173.265 116.98302804228334 117.66119889473333 42.24947233824402 42.749463012131386 -174.265 117.66119889473333 118.33936974718334 42.24947233824402 42.749463012131386 -175.265 118.33936974718334 119.01754059963334 42.24947233824402 42.749463012131386 -176.265 119.01754059963334 119.69571145208334 42.24947233824402 42.749463012131386 -177.265 119.69571145208334 120.37388230453334 42.24947233824402 42.749463012131386 -178.265 120.37388230453334 121.05205315698333 42.24947233824402 42.749463012131386 -179.265 121.05205315698333 121.73022400943334 42.24947233824402 42.749463012131386 -180.265 121.73022400943334 122.40839486188334 42.24947233824402 42.749463012131386 -181.265 122.40839486188334 123.08656571433335 42.24947233824402 42.749463012131386 -182.265 123.08656571433335 123.76473656678334 42.24947233824402 42.749463012131386 -183.265 123.76473656678334 124.44290741928333 42.24947233824402 42.749463012131386 -184.265 124.44290741928333 125.12107827173334 42.24947233824402 42.749463012131386 -185.265 125.12107827173334 125.79924912418335 42.24947233824402 42.749463012131386 -186.265 125.79924912418335 126.47741997663334 42.24947233824402 42.749463012131386 -187.265 126.47741997663334 127.15559082908334 42.24947233824402 42.749463012131386 -188.265 127.15559082908334 127.83376168153335 42.24947233824402 42.749463012131386 -189.265 127.83376168153335 128.51193253398333 42.24947233824402 42.749463012131386 -190.265 128.51193253398333 129.19010338643335 42.24947233824402 42.749463012131386 -191.265 129.19010338643335 129.86827423888332 42.24947233824402 42.749463012131386 -192.265 129.86827423888332 130.54644509133334 42.24947233824402 42.749463012131386 -193.265 130.54644509133334 131.22461594378336 42.24947233824402 42.749463012131386 -194.265 131.22461594378336 131.90278679628335 42.24947233824402 42.749463012131386 -195.265 131.90278679628335 132.58095764873332 42.24947233824402 42.749463012131386 -196.265 132.58095764873332 133.25912850118334 42.24947233824402 42.749463012131386 -197.265 133.25912850118334 133.93729935363336 42.24947233824402 42.749463012131386 -198.265 133.93729935363336 134.61547020608333 42.24947233824402 42.749463012131386 -199.265 134.61547020608333 135.29364105853335 42.24947233824402 42.749463012131386 -200.265 135.29364105853335 135.97181191098332 42.24947233824402 42.749463012131386 -201.265 135.97181191098332 136.64998276343334 42.24947233824402 42.749463012131386 -202.265 136.64998276343334 137.32815361588337 42.24947233824402 42.749463012131386 -203.265 137.32815361588337 138.00632446833336 42.24947233824402 42.749463012131386 -204.265 138.00632446833336 138.68449532078336 42.24947233824402 42.749463012131386 -205.265 138.68449532078336 139.36266617328334 42.24947233824402 42.749463012131386 -206.265 139.36266617328334 140.04083702573334 42.24947233824402 42.749463012131386 -207.265 140.04083702573334 140.71900787818333 42.24947233824402 42.749463012131386 -208.265 140.71900787818333 141.39717873063336 42.24947233824402 42.749463012131386 -209.265 141.39717873063336 142.07534958308332 42.24947233824402 42.749463012131386 -210.265 142.07534958308332 142.75352043553335 42.24947233824402 42.749463012131386 -211.265 142.75352043553335 143.43169128798334 42.24947233824402 42.749463012131386 -212.265 143.43169128798334 144.10986214043334 42.24947233824402 42.749463012131386 -213.265 144.10986214043334 144.78803299288336 42.24947233824402 42.749463012131386 -214.265 144.78803299288336 145.46620384533333 42.24947233824402 42.749463012131386 -215.265 145.46620384533333 146.14437469778335 42.24947233824402 42.749463012131386 -216.265 146.14437469778335 146.82254555028334 42.24947233824402 42.749463012131386 -217.265 146.82254555028334 147.50071640273336 42.24947233824402 42.749463012131386 -218.265 147.50071640273336 148.17888725518335 42.24947233824402 42.749463012131386 -219.265 148.17888725518335 148.85705810763335 42.24947233824402 42.749463012131386 -220.265 148.85705810763335 149.53522896008332 42.24947233824402 42.749463012131386 -221.265 149.53522896008332 150.21339981253334 42.24947233824402 42.749463012131386 -222.265 150.21339981253334 150.89157066498336 42.24947233824402 42.749463012131386 -223.265 150.89157066498336 151.56974151743333 42.24947233824402 42.749463012131386 -224.265 151.56974151743333 152.24791236988335 42.24947233824402 42.749463012131386 -225.265 152.24791236988335 152.92608322233332 42.24947233824402 42.749463012131386 -226.265 152.92608322233332 153.60425407478334 42.24947233824402 42.749463012131386 -227.265 153.60425407478334 154.28242492728333 42.24947233824402 42.749463012131386 -228.265 154.28242492728333 154.96059577973335 42.24947233824402 42.749463012131386 -229.265 154.96059577973335 155.63876663218332 42.24947233824402 42.749463012131386 -230.265 155.63876663218332 156.31693748463334 42.24947233824402 42.749463012131386 -231.265 156.31693748463334 156.99510833708337 42.24947233824402 42.749463012131386 -232.265 156.99510833708337 157.6732791895334 42.24947233824402 42.749463012131386 -233.265 157.6732791895334 158.35145004198336 42.24947233824402 42.749463012131386 -234.265 158.35145004198336 159.02962089443332 42.24947233824402 42.749463012131386 -235.265 159.02962089443332 159.70779174688334 42.24947233824402 42.749463012131386 -236.265 159.70779174688334 160.38596259933337 42.24947233824402 42.749463012131386 -237.265 160.38596259933337 161.06413345178333 42.24947233824402 42.749463012131386 -238.265 161.06413345178333 161.74230430428332 42.24947233824402 42.749463012131386 -239.265 161.74230430428332 162.42047515673335 42.24947233824402 42.749463012131386 -240.265 162.42047515673335 163.09864600918334 42.24947233824402 42.749463012131386 -241.265 163.09864600918334 163.77681686163336 42.24947233824402 42.749463012131386 -242.265 163.77681686163336 164.45498771408336 42.24947233824402 42.749463012131386 -243.265 164.45498771408336 165.13315856653333 42.24947233824402 42.749463012131386 -244.265 165.13315856653333 165.81132941898335 42.24947233824402 42.749463012131386 -245.265 165.81132941898335 166.48950027143331 42.24947233824402 42.749463012131386 -246.265 166.48950027143331 167.16767112388334 42.24947233824402 42.749463012131386 -247.265 167.16767112388334 167.84584197633336 42.24947233824402 42.749463012131386 -248.265 167.84584197633336 168.52401282878336 42.24947233824402 42.749463012131386 -249.265 168.52401282878336 169.20218368128332 42.24947233824402 42.749463012131386 -250.265 169.20218368128332 169.88035453373334 42.24947233824402 42.749463012131386 -251.265 169.88035453373334 170.55852538618336 42.24947233824402 42.749463012131386 -252.265 170.55852538618336 171.23669623863333 42.24947233824402 42.749463012131386 -253.265 171.23669623863333 171.91486709108335 42.24947233824402 42.749463012131386 -254.265 171.91486709108335 172.59303794353332 42.24947233824402 42.749463012131386 -255.265 172.59303794353332 173.27120879598334 42.24947233824402 42.749463012131386 -256.265 173.27120879598334 173.94937964843336 42.24947233824402 42.749463012131386 -257.265 173.94937964843336 174.62755050088333 42.24947233824402 42.749463012131386 -258.265 174.62755050088333 175.30572135333335 42.24947233824402 42.749463012131386 -259.265 175.30572135333335 175.98389220578332 42.24947233824402 42.749463012131386 -260.265 175.98389220578332 176.66206305828337 42.24947233824402 42.749463012131386 -261.265 176.66206305828337 177.3402339107334 42.24947233824402 42.749463012131386 -262.265 177.3402339107334 178.01840476318336 42.24947233824402 42.749463012131386 -263.265 178.01840476318336 178.69657561563332 42.24947233824402 42.749463012131386 -264.265 178.69657561563332 179.37474646808334 42.24947233824402 42.749463012131386 -265.265 179.37474646808334 180.05291732053334 42.24947233824402 42.749463012131386 -266.265 180.05291732053334 180.73108817298333 42.24947233824402 42.749463012131386 -267.265 180.73108817298333 181.40925902543333 42.24947233824402 42.749463012131386 -268.265 181.40925902543333 182.08742987788332 42.24947233824402 42.749463012131386 -269.265 182.08742987788332 182.7656007303333 42.24947233824402 42.749463012131386 -270.265 182.7656007303333 183.4437715827833 42.24947233824402 42.749463012131386 -271.265 183.4437715827833 184.12194243528333 42.24947233824402 42.749463012131386 -272.265 184.12194243528333 184.80011328773332 42.24947233824402 42.749463012131386 -273.265 184.80011328773332 185.47828414018332 42.24947233824402 42.749463012131386 -274.265 185.47828414018332 186.15645499263331 42.24947233824402 42.749463012131386 -275.265 186.15645499263331 186.83462584508334 42.24947233824402 42.749463012131386 -276.265 186.83462584508334 187.51279669753336 42.24947233824402 42.749463012131386 -277.265 187.51279669753336 188.19096754998333 42.24947233824402 42.749463012131386 -278.265 188.19096754998333 188.8691384024333 42.24947233824402 42.749463012131386 -279.265 188.8691384024333 189.54730925488332 42.24947233824402 42.749463012131386 -280.265 189.54730925488332 190.2254801073833 42.24947233824402 42.749463012131386 -281.265 190.2254801073833 190.90365095983333 42.24947233824402 42.749463012131386 -282.265 190.90365095983333 191.58182181228332 42.24947233824402 42.749463012131386 -283.265 191.58182181228332 192.25999266473332 42.24947233824402 42.749463012131386 -284.265 192.25999266473332 192.93816351718334 42.24947233824402 42.749463012131386 -285.265 192.93816351718334 193.61633436963334 42.24947233824402 42.749463012131386 -286.265 193.61633436963334 194.29450522208333 42.24947233824402 42.749463012131386 -287.265 194.29450522208333 194.97267607453333 42.24947233824402 42.749463012131386 -288.265 194.97267607453333 195.65084692698332 42.24947233824402 42.749463012131386 -289.265 195.65084692698332 196.32901777943334 42.24947233824402 42.749463012131386 -290.265 196.32901777943334 197.00718863188334 42.24947233824402 42.749463012131386 -291.265 197.00718863188334 197.69622773798753 42.24947233824402 42.749463012131386 -371.265 251.24998857467915 251.93902768073332 42.24947233824402 42.749463012131386 -372.265 251.93902768073332 252.6171985331833 42.24947233824402 42.749463012131386 -373.265 252.6171985331833 253.2953693856333 42.24947233824402 42.749463012131386 -374.265 253.2953693856333 253.97354023808333 42.24947233824402 42.749463012131386 -375.265 253.97354023808333 254.65171109053333 42.24947233824402 42.749463012131386 -376.265 254.65171109053333 255.32988194298332 42.24947233824402 42.749463012131386 -377.265 255.32988194298332 256.00805279543334 42.24947233824402 42.749463012131386 -378.265 256.00805279543334 256.68622364788337 42.24947233824402 42.749463012131386 -379.265 256.68622364788337 257.36439450038336 42.24947233824402 42.749463012131386 -380.265 257.36439450038336 258.0425653528333 42.24947233824402 42.749463012131386 -381.265 258.0425653528333 258.7207362052833 42.24947233824402 42.749463012131386 -382.265 258.7207362052833 259.3989070577333 42.24947233824402 42.749463012131386 -383.265 259.3989070577333 260.07707791018333 42.24947233824402 42.749463012131386 -384.265 260.07707791018333 260.7552487626333 42.24947233824402 42.749463012131386 -385.265 260.7552487626333 261.4442878686875 42.24947233824402 42.749463012131386 -392.265 265.49157647617915 266.1806155822833 42.24947233824402 42.749463012131386 -393.265 266.1806155822833 266.85878643473336 42.24947233824402 42.749463012131386 -394.265 266.85878643473336 267.54782554078747 42.24947233824402 42.749463012131386 -397.265 268.8824307384791 269.57146984453334 42.24947233824402 42.749463012131386 -398.265 269.57146984453334 270.2496406969833 42.24947233824402 42.749463012131386 -399.265 270.2496406969833 270.9278115494833 42.24947233824402 42.749463012131386 -400.265 270.9278115494833 271.6059824019333 42.24947233824402 42.749463012131386 -401.265 271.6059824019333 272.28415325438334 42.24947233824402 42.749463012131386 -402.265 272.28415325438334 272.9623241068333 42.24947233824402 42.749463012131386 -403.265 272.9623241068333 273.64049495928333 42.24947233824402 42.749463012131386 -404.265 273.64049495928333 274.3295340653875 42.24947233824402 42.749463012131386 -162.266 110.39925464740229 111.09387480219928 42.749463012131386 43.249453534331224 -163.266 111.09387480219928 111.77753853274928 42.749463012131386 43.249453534331224 -164.266 111.77753853274928 112.46120226329927 42.749463012131386 43.249453534331224 -165.266 112.46120226329927 113.14486599384927 42.749463012131386 43.249453534331224 -166.266 113.14486599384927 113.82852972439926 42.749463012131386 43.249453534331224 -167.266 113.82852972439926 114.51219345494927 42.749463012131386 43.249453534331224 -168.266 114.51219345494927 115.19585718549926 42.749463012131386 43.249453534331224 -169.266 115.19585718549926 115.87952091604927 42.749463012131386 43.249453534331224 -170.266 115.87952091604927 116.56318464659927 42.749463012131386 43.249453534331224 -171.266 116.56318464659927 117.24684837714926 42.749463012131386 43.249453534331224 -172.266 117.24684837714926 117.93051210769929 42.749463012131386 43.249453534331224 -173.266 117.93051210769929 118.61417583824928 42.749463012131386 43.249453534331224 -174.266 118.61417583824928 119.29783956879928 42.749463012131386 43.249453534331224 -175.266 119.29783956879928 119.98150329934927 42.749463012131386 43.249453534331224 -176.266 119.98150329934927 120.6651670298993 42.749463012131386 43.249453534331224 -177.266 120.6651670298993 121.34883076044929 42.749463012131386 43.249453534331224 -178.266 121.34883076044929 122.03249449099928 42.749463012131386 43.249453534331224 -179.266 122.03249449099928 122.71615822154928 42.749463012131386 43.249453534331224 -180.266 122.71615822154928 123.39982195209927 42.749463012131386 43.249453534331224 -181.266 123.39982195209927 124.08348568264927 42.749463012131386 43.249453534331224 -182.266 124.08348568264927 124.76714941319928 42.749463012131386 43.249453534331224 -183.266 124.76714941319928 125.45081314374929 42.749463012131386 43.249453534331224 -184.266 125.45081314374929 126.13447687429928 42.749463012131386 43.249453534331224 -185.266 126.13447687429928 126.81814060484926 42.749463012131386 43.249453534331224 -186.266 126.81814060484926 127.50180433539927 42.749463012131386 43.249453534331224 -187.266 127.50180433539927 128.18546806594924 42.749463012131386 43.249453534331224 -188.266 128.18546806594924 128.8691317964993 42.749463012131386 43.249453534331224 -189.266 128.8691317964993 129.55279552704928 42.749463012131386 43.249453534331224 -190.266 129.55279552704928 130.23645925759928 42.749463012131386 43.249453534331224 -191.266 130.23645925759928 130.92012298814927 42.749463012131386 43.249453534331224 -192.266 130.92012298814927 131.60378671869927 42.749463012131386 43.249453534331224 -193.266 131.60378671869927 132.28745044924926 42.749463012131386 43.249453534331224 -194.266 132.28745044924926 132.9711141797993 42.749463012131386 43.249453534331224 -195.266 132.9711141797993 133.65477791034925 42.749463012131386 43.249453534331224 -196.266 133.65477791034925 134.33844164089925 42.749463012131386 43.249453534331224 -197.266 134.33844164089925 135.02210537144927 42.749463012131386 43.249453534331224 -198.266 135.02210537144927 135.70576910199927 42.749463012131386 43.249453534331224 -199.266 135.70576910199927 136.38943283254926 42.749463012131386 43.249453534331224 -200.266 136.38943283254926 137.07309656309928 42.749463012131386 43.249453534331224 -201.266 137.07309656309928 137.75676029364928 42.749463012131386 43.249453534331224 -202.266 137.75676029364928 138.44042402419927 42.749463012131386 43.249453534331224 -203.266 138.44042402419927 139.12408775474927 42.749463012131386 43.249453534331224 -204.266 139.12408775474927 139.80775148529926 42.749463012131386 43.249453534331224 -205.266 139.80775148529926 140.49141521584926 42.749463012131386 43.249453534331224 -206.266 140.49141521584926 141.17507894639925 42.749463012131386 43.249453534331224 -207.266 141.17507894639925 141.8587426769493 42.749463012131386 43.249453534331224 -208.266 141.8587426769493 142.5424064074993 42.749463012131386 43.249453534331224 -209.266 142.5424064074993 143.22607013804927 42.749463012131386 43.249453534331224 -210.266 143.22607013804927 143.9097338685993 42.749463012131386 43.249453534331224 -211.266 143.9097338685993 144.59339759914926 42.749463012131386 43.249453534331224 -212.266 144.59339759914926 145.27706132969928 42.749463012131386 43.249453534331224 -213.266 145.27706132969928 145.96072506019928 42.749463012131386 43.249453534331224 -214.266 145.96072506019928 146.64438879074928 42.749463012131386 43.249453534331224 -215.266 146.64438879074928 147.32805252129927 42.749463012131386 43.249453534331224 -216.266 147.32805252129927 148.0117162518493 42.749463012131386 43.249453534331224 -217.266 148.0117162518493 148.6953799823993 42.749463012131386 43.249453534331224 -218.266 148.6953799823993 149.37904371294928 42.749463012131386 43.249453534331224 -219.266 149.37904371294928 150.06270744349928 42.749463012131386 43.249453534331224 -220.266 150.06270744349928 150.74637117404927 42.749463012131386 43.249453534331224 -221.266 150.74637117404927 151.43003490459924 42.749463012131386 43.249453534331224 -222.266 151.43003490459924 152.11369863514926 42.749463012131386 43.249453534331224 -223.266 152.11369863514926 152.79736236569929 42.749463012131386 43.249453534331224 -224.266 152.79736236569929 153.48102609624925 42.749463012131386 43.249453534331224 -225.266 153.48102609624925 154.16468982679928 42.749463012131386 43.249453534331224 -226.266 154.16468982679928 154.84835355734927 42.749463012131386 43.249453534331224 -227.266 154.84835355734927 155.53201728789927 42.749463012131386 43.249453534331224 -228.266 155.53201728789927 156.2156810184493 42.749463012131386 43.249453534331224 -229.266 156.2156810184493 156.89934474899928 42.749463012131386 43.249453534331224 -230.266 156.89934474899928 157.58300847954928 42.749463012131386 43.249453534331224 -231.266 157.58300847954928 158.26667221009927 42.749463012131386 43.249453534331224 -232.266 158.26667221009927 158.95033594064927 42.749463012131386 43.249453534331224 -233.266 158.95033594064927 159.63399967119926 42.749463012131386 43.249453534331224 -234.266 159.63399967119926 160.32861982599624 42.749463012131386 43.249453534331224 -247.266 168.5106717441023 169.2052918988993 42.749463012131386 43.249453534331224 -248.266 169.2052918988993 169.88895562944927 42.749463012131386 43.249453534331224 -249.266 169.88895562944927 170.57261935999924 42.749463012131386 43.249453534331224 -250.266 170.57261935999924 171.25628309054926 42.749463012131386 43.249453534331224 -251.266 171.25628309054926 171.93994682109928 42.749463012131386 43.249453534331224 -252.266 171.93994682109928 172.62361055164928 42.749463012131386 43.249453534331224 -253.266 172.62361055164928 173.30727428219927 42.749463012131386 43.249453534331224 -254.266 173.30727428219927 173.99093801274927 42.749463012131386 43.249453534331224 -255.266 173.99093801274927 174.67460174329926 42.749463012131386 43.249453534331224 -256.266 174.67460174329926 175.35826547384926 42.749463012131386 43.249453534331224 -257.266 175.35826547384926 176.04192920439928 42.749463012131386 43.249453534331224 -258.266 176.04192920439928 176.72559293494928 42.749463012131386 43.249453534331224 -259.266 176.72559293494928 177.40925666549927 42.749463012131386 43.249453534331224 -260.266 177.40925666549927 178.0929203960493 42.749463012131386 43.249453534331224 -261.266 178.0929203960493 178.7765841265993 42.749463012131386 43.249453534331224 -262.266 178.7765841265993 179.46024785714928 42.749463012131386 43.249453534331224 -263.266 179.46024785714928 180.14391158769925 42.749463012131386 43.249453534331224 -264.266 180.14391158769925 180.82757531824925 42.749463012131386 43.249453534331224 -265.266 180.82757531824925 181.51123904879924 42.749463012131386 43.249453534331224 -266.266 181.51123904879924 182.19490277934926 42.749463012131386 43.249453534331224 -267.266 182.19490277934926 182.87856650989926 42.749463012131386 43.249453534331224 -268.266 182.87856650989926 183.56223024044925 42.749463012131386 43.249453534331224 -269.266 183.56223024044925 184.24589397099925 42.749463012131386 43.249453534331224 -270.266 184.24589397099925 184.92955770154927 42.749463012131386 43.249453534331224 -271.266 184.92955770154927 185.61322143209924 42.749463012131386 43.249453534331224 -272.266 185.61322143209924 186.29688516264926 42.749463012131386 43.249453534331224 -273.266 186.29688516264926 186.98054889319926 42.749463012131386 43.249453534331224 -274.266 186.98054889319926 187.66421262374925 42.749463012131386 43.249453534331224 -275.266 187.66421262374925 188.34787635429925 42.749463012131386 43.249453534331224 -276.266 188.34787635429925 189.03154008484927 42.749463012131386 43.249453534331224 -277.266 189.03154008484927 189.71520381539926 42.749463012131386 43.249453534331224 -278.266 189.71520381539926 190.39886754594926 42.749463012131386 43.249453534331224 -279.266 190.39886754594926 191.08253127649925 42.749463012131386 43.249453534331224 -280.266 191.08253127649925 191.76619500704925 42.749463012131386 43.249453534331224 -281.266 191.76619500704925 192.44985873759924 42.749463012131386 43.249453534331224 -282.266 192.44985873759924 193.13352246814924 42.749463012131386 43.249453534331224 -283.266 193.13352246814924 193.81718619869926 42.749463012131386 43.249453534331224 -284.266 193.81718619869926 194.50084992919926 42.749463012131386 43.249453534331224 -285.266 194.50084992919926 195.18451365974926 42.749463012131386 43.249453534331224 -286.266 195.18451365974926 195.86817739029925 42.749463012131386 43.249453534331224 -287.266 195.86817739029925 196.55184112084925 42.749463012131386 43.249453534331224 -288.266 196.55184112084925 197.23550485139924 42.749463012131386 43.249453534331224 -289.266 197.23550485139924 197.93012500619625 42.749463012131386 43.249453534331224 -368.266 251.23398314050223 251.92860329534926 42.749463012131386 43.249453534331224 -369.266 251.92860329534926 252.61226702589926 42.749463012131386 43.249453534331224 -370.266 252.61226702589926 253.29593075644925 42.749463012131386 43.249453534331224 -371.266 253.29593075644925 253.97959448699925 42.749463012131386 43.249453534331224 -372.266 253.97959448699925 254.66325821754924 42.749463012131386 43.249453534331224 -373.266 254.66325821754924 255.34692194809924 42.749463012131386 43.249453534331224 -374.266 255.34692194809924 256.03058567864923 42.749463012131386 43.249453534331224 -375.266 256.03058567864923 256.7142494091993 42.749463012131386 43.249453534331224 -376.266 256.7142494091993 257.3979131397492 42.749463012131386 43.249453534331224 -377.266 257.3979131397492 258.0815768702993 42.749463012131386 43.249453534331224 -378.266 258.0815768702993 258.76524060084927 42.749463012131386 43.249453534331224 -379.266 258.76524060084927 259.44890433139926 42.749463012131386 43.249453534331224 -380.266 259.44890433139926 260.13256806194926 42.749463012131386 43.249453534331224 -381.266 260.13256806194926 260.81623179249925 42.749463012131386 43.249453534331224 -382.266 260.81623179249925 261.51085194729626 42.749463012131386 43.249453534331224 -394.266 269.0092401348023 269.70386028964924 42.749463012131386 43.249453534331224 -395.266 269.70386028964924 270.3875240201993 42.749463012131386 43.249453534331224 -396.266 270.3875240201993 271.07118775074923 42.749463012131386 43.249453534331224 -397.266 271.07118775074923 271.7548514812993 42.749463012131386 43.249453534331224 -398.266 271.7548514812993 272.4385152118492 42.749463012131386 43.249453534331224 -399.266 272.4385152118492 273.1221789423993 42.749463012131386 43.249453534331224 -400.266 273.1221789423993 273.80584267294927 42.749463012131386 43.249453534331224 -401.266 273.80584267294927 274.48950640349926 42.749463012131386 43.249453534331224 -402.266 274.48950640349926 275.18412655829627 42.749463012131386 43.249453534331224 -160.267 109.93066133753636 110.63100746184648 43.249453534331224 43.74944389963306 -161.267 110.63100746184648 111.32030669819648 43.249453534331224 43.74944389963306 -162.267 111.32030669819648 112.00960593454649 43.249453534331224 43.74944389963306 -163.267 112.00960593454649 112.6989051708965 43.249453534331224 43.74944389963306 -164.267 112.6989051708965 113.3882044071965 43.249453534331224 43.74944389963306 -165.267 113.3882044071965 114.07750364354649 43.249453534331224 43.74944389963306 -166.267 114.07750364354649 114.76680287989649 43.249453534331224 43.74944389963306 -167.267 114.76680287989649 115.45610211624648 43.249453534331224 43.74944389963306 -168.267 115.45610211624648 116.1454013525965 43.249453534331224 43.74944389963306 -169.267 116.1454013525965 116.8347005888965 43.249453534331224 43.74944389963306 -170.267 116.8347005888965 117.52399982524649 43.249453534331224 43.74944389963306 -171.267 117.52399982524649 118.21329906159649 43.249453534331224 43.74944389963306 -172.267 118.21329906159649 118.9025982979465 43.249453534331224 43.74944389963306 -173.267 118.9025982979465 119.59189753429649 43.249453534331224 43.74944389963306 -174.267 119.59189753429649 120.28119677064649 43.249453534331224 43.74944389963306 -175.267 120.28119677064649 120.97049600699648 43.249453534331224 43.74944389963306 -176.267 120.97049600699648 121.65979524329649 43.249453534331224 43.74944389963306 -177.267 121.65979524329649 122.34909447964648 43.249453534331224 43.74944389963306 -178.267 122.34909447964648 123.03839371599648 43.249453534331224 43.74944389963306 -179.267 123.03839371599648 123.72769295234649 43.249453534331224 43.74944389963306 -180.267 123.72769295234649 124.4169921886965 43.249453534331224 43.74944389963306 -181.267 124.4169921886965 125.10629142499648 43.249453534331224 43.74944389963306 -182.267 125.10629142499648 125.7955906613465 43.249453534331224 43.74944389963306 -183.267 125.7955906613465 126.48488989769649 43.249453534331224 43.74944389963306 -184.267 126.48488989769649 127.17418913404649 43.249453534331224 43.74944389963306 -185.267 127.17418913404649 127.86348837039648 43.249453534331224 43.74944389963306 -186.267 127.86348837039648 128.55278760669648 43.249453534331224 43.74944389963306 -187.267 128.55278760669648 129.24208684304648 43.249453534331224 43.74944389963306 -188.267 129.24208684304648 129.93138607939647 43.249453534331224 43.74944389963306 -189.267 129.93138607939647 130.62068531574647 43.249453534331224 43.74944389963306 -190.267 130.62068531574647 131.3099845520965 43.249453534331224 43.74944389963306 -191.267 131.3099845520965 131.9992837883965 43.249453534331224 43.74944389963306 -192.267 131.9992837883965 132.6885830247465 43.249453534331224 43.74944389963306 -193.267 132.6885830247465 133.3778822610965 43.249453534331224 43.74944389963306 -194.267 133.3778822610965 134.06718149744648 43.249453534331224 43.74944389963306 -195.267 134.06718149744648 134.75648073379648 43.249453534331224 43.74944389963306 -196.267 134.75648073379648 135.44577997009648 43.249453534331224 43.74944389963306 -197.267 135.44577997009648 136.1350792064465 43.249453534331224 43.74944389963306 -198.267 136.1350792064465 136.82437844279647 43.249453534331224 43.74944389963306 -199.267 136.82437844279647 137.5136776791465 43.249453534331224 43.74944389963306 -200.267 137.5136776791465 138.2029769154965 43.249453534331224 43.74944389963306 -201.267 138.2029769154965 138.8922761518465 43.249453534331224 43.74944389963306 -202.267 138.8922761518465 139.58157538819648 43.249453534331224 43.74944389963306 -203.267 139.58157538819648 140.2708746244965 43.249453534331224 43.74944389963306 -204.267 140.2708746244965 140.9601738608465 43.249453534331224 43.74944389963306 -205.267 140.9601738608465 141.64947309719648 43.249453534331224 43.74944389963306 -206.267 141.64947309719648 142.3387723335465 43.249453534331224 43.74944389963306 -207.267 142.3387723335465 143.02807156989647 43.249453534331224 43.74944389963306 -208.267 143.02807156989647 143.71737080619647 43.249453534331224 43.74944389963306 -209.267 143.71737080619647 144.40667004254647 43.249453534331224 43.74944389963306 -210.267 144.40667004254647 145.0959692788965 43.249453534331224 43.74944389963306 -211.267 145.0959692788965 145.78526851524649 43.249453534331224 43.74944389963306 -212.267 145.78526851524649 146.4745677515965 43.249453534331224 43.74944389963306 -213.267 146.4745677515965 147.16386698789648 43.249453534331224 43.74944389963306 -214.267 147.16386698789648 147.85316622424648 43.249453534331224 43.74944389963306 -215.267 147.85316622424648 148.5424654605965 43.249453534331224 43.74944389963306 -216.267 148.5424654605965 149.23176469694647 43.249453534331224 43.74944389963306 -217.267 149.23176469694647 149.92106393329647 43.249453534331224 43.74944389963306 -218.267 149.92106393329647 150.61036316959647 43.249453534331224 43.74944389963306 -219.267 150.61036316959647 151.2996624059465 43.249453534331224 43.74944389963306 -220.267 151.2996624059465 151.9889616422965 43.249453534331224 43.74944389963306 -221.267 151.9889616422965 152.67826087864648 43.249453534331224 43.74944389963306 -222.267 152.67826087864648 153.36756011499648 43.249453534331224 43.74944389963306 -223.267 153.36756011499648 154.05685935134647 43.249453534331224 43.74944389963306 -224.267 154.05685935134647 154.7461585876965 43.249453534331224 43.74944389963306 -225.267 154.7461585876965 155.4354578239965 43.249453534331224 43.74944389963306 -226.267 155.4354578239965 156.1247570603465 43.249453534331224 43.74944389963306 -227.267 156.1247570603465 156.8140562966965 43.249453534331224 43.74944389963306 -228.267 156.8140562966965 157.5033555330465 43.249453534331224 43.74944389963306 -229.267 157.5033555330465 158.19265476939648 43.249453534331224 43.74944389963306 -230.267 158.19265476939648 158.88195400569649 43.249453534331224 43.74944389963306 -231.267 158.88195400569649 159.57125324204648 43.249453534331224 43.74944389963306 -232.267 159.57125324204648 160.26055247839648 43.249453534331224 43.74944389963306 -233.267 160.26055247839648 160.96089860265658 43.249453534331224 43.74944389963306 -245.267 168.52109642653636 169.22144255084646 43.249453534331224 43.74944389963306 -246.267 169.22144255084646 169.9107417871965 43.249453534331224 43.74944389963306 -247.267 169.9107417871965 170.6000410234965 43.249453534331224 43.74944389963306 -248.267 170.6000410234965 171.28934025984648 43.249453534331224 43.74944389963306 -249.267 171.28934025984648 171.97863949619648 43.249453534331224 43.74944389963306 -250.267 171.97863949619648 172.66793873254647 43.249453534331224 43.74944389963306 -251.267 172.66793873254647 173.35723796889647 43.249453534331224 43.74944389963306 -252.267 173.35723796889647 174.04653720519647 43.249453534331224 43.74944389963306 -253.267 174.04653720519647 174.7358364415465 43.249453534331224 43.74944389963306 -254.267 174.7358364415465 175.4251356778965 43.249453534331224 43.74944389963306 -255.267 175.4251356778965 176.1144349142465 43.249453534331224 43.74944389963306 -256.267 176.1144349142465 176.80373415059648 43.249453534331224 43.74944389963306 -257.267 176.80373415059648 177.49303338689649 43.249453534331224 43.74944389963306 -258.267 177.49303338689649 178.1823326232465 43.249453534331224 43.74944389963306 -259.267 178.1823326232465 178.8716318595965 43.249453534331224 43.74944389963306 -260.267 178.8716318595965 179.56093109594647 43.249453534331224 43.74944389963306 -261.267 179.56093109594647 180.25023033229647 43.249453534331224 43.74944389963306 -262.267 180.25023033229647 180.93952956859647 43.249453534331224 43.74944389963306 -263.267 180.93952956859647 181.62882880494647 43.249453534331224 43.74944389963306 -264.267 181.62882880494647 182.31812804129646 43.249453534331224 43.74944389963306 -265.267 182.31812804129646 183.00742727764649 43.249453534331224 43.74944389963306 -266.267 183.00742727764649 183.69672651399645 43.249453534331224 43.74944389963306 -267.267 183.69672651399645 184.38602575029648 43.249453534331224 43.74944389963306 -268.267 184.38602575029648 185.07532498664648 43.249453534331224 43.74944389963306 -269.267 185.07532498664648 185.76462422299647 43.249453534331224 43.74944389963306 -270.267 185.76462422299647 186.45392345934647 43.249453534331224 43.74944389963306 -271.267 186.45392345934647 187.14322269569647 43.249453534331224 43.74944389963306 -272.267 187.14322269569647 187.83252193204646 43.249453534331224 43.74944389963306 -273.267 187.83252193204646 188.52182116839646 43.249453534331224 43.74944389963306 -274.267 188.52182116839646 189.2111204046965 43.249453534331224 43.74944389963306 -275.267 189.2111204046965 189.90041964104648 43.249453534331224 43.74944389963306 -276.267 189.90041964104648 190.58971887739645 43.249453534331224 43.74944389963306 -277.267 190.58971887739645 191.27901811374647 43.249453534331224 43.74944389963306 -278.267 191.27901811374647 191.96831735009644 43.249453534331224 43.74944389963306 -279.267 191.96831735009644 192.65761658639644 43.249453534331224 43.74944389963306 -280.267 192.65761658639644 193.3469158227465 43.249453534331224 43.74944389963306 -281.267 193.3469158227465 194.0362150590965 43.249453534331224 43.74944389963306 -282.267 194.0362150590965 194.72551429544646 43.249453534331224 43.74944389963306 -283.267 194.72551429544646 195.41481353179648 43.249453534331224 43.74944389963306 -284.267 195.41481353179648 196.1041127680965 43.249453534331224 43.74944389963306 -285.267 196.1041127680965 196.7934120044465 43.249453534331224 43.74944389963306 -286.267 196.7934120044465 197.48271124079648 43.249453534331224 43.74944389963306 -287.267 197.48271124079648 198.1830573650566 43.249453534331224 43.74944389963306 -366.267 251.9263040238364 252.62665014809647 43.249453534331224 43.74944389963306 -367.267 252.62665014809647 253.31594938439645 43.249453534331224 43.74944389963306 -368.267 253.31594938439645 254.00524862074647 43.249453534331224 43.74944389963306 -369.267 254.00524862074647 254.69454785709647 43.249453534331224 43.74944389963306 -370.267 254.69454785709647 255.38384709344646 43.249453534331224 43.74944389963306 -371.267 255.38384709344646 256.0731463297965 43.249453534331224 43.74944389963306 -372.267 256.0731463297965 256.76244556609646 43.249453534331224 43.74944389963306 -373.267 256.76244556609646 257.45174480244646 43.249453534331224 43.74944389963306 -374.267 257.45174480244646 258.1410440387965 43.249453534331224 43.74944389963306 -375.267 258.1410440387965 258.83034327514645 43.249453534331224 43.74944389963306 -376.267 258.83034327514645 259.5196425114965 43.249453534331224 43.74944389963306 -377.267 259.5196425114965 260.20894174779653 43.249453534331224 43.74944389963306 -378.267 260.20894174779653 260.89824098414647 43.249453534331224 43.74944389963306 -379.267 260.89824098414647 261.5985871084566 43.249453534331224 43.74944389963306 -391.267 269.15878493233635 269.8591310565965 43.249453534331224 43.74944389963306 -392.267 269.8591310565965 270.5484302929465 43.249453534331224 43.74944389963306 -393.267 270.5484302929465 271.2377295292965 43.249453534331224 43.74944389963306 -394.267 271.2377295292965 271.9270287655965 43.249453534331224 43.74944389963306 -395.267 271.9270287655965 272.6163280019465 43.249453534331224 43.74944389963306 -396.267 272.6163280019465 273.30562723829644 43.249453534331224 43.74944389963306 -397.267 273.30562723829644 273.9949264746465 43.249453534331224 43.74944389963306 -398.267 273.9949264746465 274.69527259895654 43.249453534331224 43.74944389963306 -159.268 110.1577651379751 110.86398664946265 43.74944389963306 44.24943410260388 -160.268 110.86398664946265 111.55906844496263 43.74944389963306 44.24943410260388 -161.268 111.55906844496263 112.25415024051264 43.74944389963306 44.24943410260388 -162.268 112.25415024051264 112.94923203606265 43.74944389963306 44.24943410260388 -163.268 112.94923203606265 113.64431383156264 43.74944389963306 44.24943410260388 -164.268 113.64431383156264 114.33939562706266 43.74944389963306 44.24943410260388 -165.268 114.33939562706266 115.03447742256265 43.74944389963306 44.24943410260388 -166.268 115.03447742256265 115.72955921806266 43.74944389963306 44.24943410260388 -167.268 115.72955921806266 116.42464101356265 43.74944389963306 44.24943410260388 -168.268 116.42464101356265 117.11972280906264 43.74944389963306 44.24943410260388 -169.268 117.11972280906264 117.81480460456262 43.74944389963306 44.24943410260388 -170.268 117.81480460456262 118.50988640006265 43.74944389963306 44.24943410260388 -171.268 118.50988640006265 119.20496819556266 43.74944389963306 44.24943410260388 -172.268 119.20496819556266 119.90004999106266 43.74944389963306 44.24943410260388 -173.268 119.90004999106266 120.59513178661265 43.74944389963306 44.24943410260388 -174.268 120.59513178661265 121.29021358216265 43.74944389963306 44.24943410260388 -175.268 121.29021358216265 121.98529537766265 43.74944389963306 44.24943410260388 -176.268 121.98529537766265 122.68037717316264 43.74944389963306 44.24943410260388 -177.268 122.68037717316264 123.37545896866263 43.74944389963306 44.24943410260388 -178.268 123.37545896866263 124.07054076416266 43.74944389963306 44.24943410260388 -179.268 124.07054076416266 124.76562255966266 43.74944389963306 44.24943410260388 -180.268 124.76562255966266 125.46070435516265 43.74944389963306 44.24943410260388 -181.268 125.46070435516265 126.15578615066264 43.74944389963306 44.24943410260388 -182.268 126.15578615066264 126.85086794616262 43.74944389963306 44.24943410260388 -183.268 126.85086794616262 127.54594974166264 43.74944389963306 44.24943410260388 -184.268 127.54594974166264 128.24103153716266 43.74944389963306 44.24943410260388 -185.268 128.24103153716266 128.93611333271264 43.74944389963306 44.24943410260388 -186.268 128.93611333271264 129.63119512826265 43.74944389963306 44.24943410260388 -187.268 129.63119512826265 130.32627692376263 43.74944389963306 44.24943410260388 -188.268 130.32627692376263 131.02135871926265 43.74944389963306 44.24943410260388 -189.268 131.02135871926265 131.71644051476267 43.74944389963306 44.24943410260388 -190.268 131.71644051476267 132.41152231026263 43.74944389963306 44.24943410260388 -191.268 132.41152231026263 133.10660410576264 43.74944389963306 44.24943410260388 -192.268 133.10660410576264 133.80168590126266 43.74944389963306 44.24943410260388 -193.268 133.80168590126266 134.49676769676267 43.74944389963306 44.24943410260388 -194.268 134.49676769676267 135.19184949226263 43.74944389963306 44.24943410260388 -195.268 135.19184949226263 135.88693128776265 43.74944389963306 44.24943410260388 -196.268 135.88693128776265 136.58201308326267 43.74944389963306 44.24943410260388 -197.268 136.58201308326267 137.27709487881265 43.74944389963306 44.24943410260388 -198.268 137.27709487881265 137.97217667436263 43.74944389963306 44.24943410260388 -199.268 137.97217667436263 138.66725846986265 43.74944389963306 44.24943410260388 -200.268 138.66725846986265 139.36234026536266 43.74944389963306 44.24943410260388 -201.268 139.36234026536266 140.05742206086265 43.74944389963306 44.24943410260388 -202.268 140.05742206086265 140.75250385636264 43.74944389963306 44.24943410260388 -203.268 140.75250385636264 141.44758565186265 43.74944389963306 44.24943410260388 -204.268 141.44758565186265 142.14266744736267 43.74944389963306 44.24943410260388 -205.268 142.14266744736267 142.83774924286263 43.74944389963306 44.24943410260388 -206.268 142.83774924286263 143.53283103836264 43.74944389963306 44.24943410260388 -207.268 143.53283103836264 144.22791283386266 43.74944389963306 44.24943410260388 -208.268 144.22791283386266 144.92299462936262 43.74944389963306 44.24943410260388 -209.268 144.92299462936262 145.61807642491266 43.74944389963306 44.24943410260388 -210.268 145.61807642491266 146.31315822046264 43.74944389963306 44.24943410260388 -211.268 146.31315822046264 147.00824001596263 43.74944389963306 44.24943410260388 -212.268 147.00824001596263 147.70332181146264 43.74944389963306 44.24943410260388 -213.268 147.70332181146264 148.39840360696263 43.74944389963306 44.24943410260388 -214.268 148.39840360696263 149.09348540246265 43.74944389963306 44.24943410260388 -215.268 149.09348540246265 149.78856719796266 43.74944389963306 44.24943410260388 -216.268 149.78856719796266 150.48364899346265 43.74944389963306 44.24943410260388 -217.268 150.48364899346265 151.17873078896267 43.74944389963306 44.24943410260388 -218.268 151.17873078896267 151.87381258446266 43.74944389963306 44.24943410260388 -219.268 151.87381258446266 152.56889437996267 43.74944389963306 44.24943410260388 -220.268 152.56889437996267 153.26397617546263 43.74944389963306 44.24943410260388 -221.268 153.26397617546263 153.95905797101264 43.74944389963306 44.24943410260388 -222.268 153.95905797101264 154.65413976656265 43.74944389963306 44.24943410260388 -223.268 154.65413976656265 155.34922156206267 43.74944389963306 44.24943410260388 -224.268 155.34922156206267 156.04430335756265 43.74944389963306 44.24943410260388 -225.268 156.04430335756265 156.73938515306267 43.74944389963306 44.24943410260388 -226.268 156.73938515306267 157.43446694856263 43.74944389963306 44.24943410260388 -227.268 157.43446694856263 158.12954874406265 43.74944389963306 44.24943410260388 -228.268 158.12954874406265 158.82463053956263 43.74944389963306 44.24943410260388 -229.268 158.82463053956263 159.51971233506265 43.74944389963306 44.24943410260388 -230.268 159.51971233506265 160.21479413056267 43.74944389963306 44.24943410260388 -231.268 160.21479413056267 160.90987592606263 43.74944389963306 44.24943410260388 -232.268 160.90987592606263 161.60495772156264 43.74944389963306 44.24943410260388 -233.268 161.60495772156264 162.30003951711262 43.74944389963306 44.24943410260388 -234.268 162.30003951711262 162.99512131266263 43.74944389963306 44.24943410260388 -235.268 162.99512131266263 163.69020310816268 43.74944389963306 44.24943410260388 -236.268 163.69020310816268 164.38528490366264 43.74944389963306 44.24943410260388 -237.268 164.38528490366264 165.08036669916265 43.74944389963306 44.24943410260388 -238.268 165.08036669916265 165.77544849466267 43.74944389963306 44.24943410260388 -239.268 165.77544849466267 166.47053029016263 43.74944389963306 44.24943410260388 -240.268 166.47053029016263 167.16561208566264 43.74944389963306 44.24943410260388 -241.268 167.16561208566264 167.86069388116266 43.74944389963306 44.24943410260388 -242.268 167.86069388116266 168.55577567666265 43.74944389963306 44.24943410260388 -243.268 168.55577567666265 169.25085747216264 43.74944389963306 44.24943410260388 -244.268 169.25085747216264 169.94593926766265 43.74944389963306 44.24943410260388 -245.268 169.94593926766265 170.64102106321263 43.74944389963306 44.24943410260388 -246.268 170.64102106321263 171.33610285876264 43.74944389963306 44.24943410260388 -247.268 171.33610285876264 172.03118465426263 43.74944389963306 44.24943410260388 -248.268 172.03118465426263 172.72626644976265 43.74944389963306 44.24943410260388 -249.268 172.72626644976265 173.42134824526266 43.74944389963306 44.24943410260388 -250.268 173.42134824526266 174.11643004076265 43.74944389963306 44.24943410260388 -251.268 174.11643004076265 174.81151183626264 43.74944389963306 44.24943410260388 -252.268 174.81151183626264 175.50659363176263 43.74944389963306 44.24943410260388 -253.268 175.50659363176263 176.20167542726264 43.74944389963306 44.24943410260388 -254.268 176.20167542726264 176.89675722276263 43.74944389963306 44.24943410260388 -255.268 176.89675722276263 177.59183901826265 43.74944389963306 44.24943410260388 -256.268 177.59183901826265 178.28692081376263 43.74944389963306 44.24943410260388 -257.268 178.28692081376263 178.98200260931264 43.74944389963306 44.24943410260388 -258.268 178.98200260931264 179.67708440486265 43.74944389963306 44.24943410260388 -259.268 179.67708440486265 180.37216620036264 43.74944389963306 44.24943410260388 -260.268 180.37216620036264 181.0672479958626 43.74944389963306 44.24943410260388 -261.268 181.0672479958626 181.76232979136262 43.74944389963306 44.24943410260388 -262.268 181.76232979136262 182.45741158686263 43.74944389963306 44.24943410260388 -263.268 182.45741158686263 183.15249338236265 43.74944389963306 44.24943410260388 -264.268 183.15249338236265 183.84757517786264 43.74944389963306 44.24943410260388 -265.268 183.84757517786264 184.54265697336263 43.74944389963306 44.24943410260388 -266.268 184.54265697336263 185.23773876886264 43.74944389963306 44.24943410260388 -267.268 185.23773876886264 185.93282056436263 43.74944389963306 44.24943410260388 -268.268 185.93282056436263 186.62790235986262 43.74944389963306 44.24943410260388 -269.268 186.62790235986262 187.32298415541266 43.74944389963306 44.24943410260388 -270.268 187.32298415541266 188.01806595096264 43.74944389963306 44.24943410260388 -271.268 188.01806595096264 188.71314774646265 43.74944389963306 44.24943410260388 -272.268 188.71314774646265 189.40822954196264 43.74944389963306 44.24943410260388 -273.268 189.40822954196264 190.10331133746263 43.74944389963306 44.24943410260388 -274.268 190.10331133746263 190.79839313296264 43.74944389963306 44.24943410260388 -275.268 190.79839313296264 191.49347492846263 43.74944389963306 44.24943410260388 -276.268 191.49347492846263 192.18855672396262 43.74944389963306 44.24943410260388 -277.268 192.18855672396262 192.88363851946264 43.74944389963306 44.24943410260388 -278.268 192.88363851946264 193.57872031496265 43.74944389963306 44.24943410260388 -279.268 193.57872031496265 194.27380211046264 43.74944389963306 44.24943410260388 -280.268 194.27380211046264 194.96888390596263 43.74944389963306 44.24943410260388 -281.268 194.96888390596263 195.6639657015126 43.74944389963306 44.24943410260388 -282.268 195.6639657015126 196.35904749706265 43.74944389963306 44.24943410260388 -283.268 196.35904749706265 197.05412929256264 43.74944389963306 44.24943410260388 -284.268 197.05412929256264 197.74921108806262 43.74944389963306 44.24943410260388 -285.268 197.74921108806262 198.4554325995502 43.74944389963306 44.24943410260388 -374.268 259.6003511722751 260.3065726837626 43.74944389963306 44.24943410260388 -375.268 260.3065726837626 261.00165447926264 43.74944389963306 44.24943410260388 -376.268 261.00165447926264 261.69673627476266 43.74944389963306 44.24943410260388 -377.268 261.69673627476266 262.39181807031264 43.74944389963306 44.24943410260388 -378.268 262.39181807031264 263.0868998658626 43.74944389963306 44.24943410260388 -379.268 263.0868998658626 263.78198166136264 43.74944389963306 44.24943410260388 -380.268 263.78198166136264 264.47706345686265 43.74944389963306 44.24943410260388 -381.268 264.47706345686265 265.17214525236267 43.74944389963306 44.24943410260388 -382.268 265.17214525236267 265.8672270478627 43.74944389963306 44.24943410260388 -383.268 265.8672270478627 266.56230884336264 43.74944389963306 44.24943410260388 -384.268 266.56230884336264 267.25739063886266 43.74944389963306 44.24943410260388 -385.268 267.25739063886266 267.9524724343626 43.74944389963306 44.24943410260388 -386.268 267.9524724343626 268.64755422986264 43.74944389963306 44.24943410260388 -387.268 268.64755422986264 269.34263602536265 43.74944389963306 44.24943410260388 -388.268 269.34263602536265 270.03771782086267 43.74944389963306 44.24943410260388 -389.268 270.03771782086267 270.73279961641265 43.74944389963306 44.24943410260388 -390.268 270.73279961641265 271.42788141196263 43.74944389963306 44.24943410260388 -391.268 271.42788141196263 272.12296320746265 43.74944389963306 44.24943410260388 -392.268 272.12296320746265 272.81804500296266 43.74944389963306 44.24943410260388 -393.268 272.81804500296266 273.5131267984626 43.74944389963306 44.24943410260388 -394.268 273.5131267984626 274.20820859396264 43.74944389963306 44.24943410260388 -395.268 274.20820859396264 274.91443010545015 43.74944389963306 44.24943410260388 -158.269 110.39718936981822 111.10944038520867 44.24943410260388 44.74942413757573 -159.269 111.10944038520867 111.81045641760868 44.24943410260388 44.74942413757573 -160.269 111.81045641760868 112.51147245005868 44.24943410260388 44.74942413757573 -161.269 112.51147245005868 113.21248848250868 44.24943410260388 44.74942413757573 -162.269 113.21248848250868 113.91350451490868 44.24943410260388 44.74942413757573 -163.269 113.91350451490868 114.6145205473587 44.24943410260388 44.74942413757573 -164.269 114.6145205473587 115.31553657980868 44.24943410260388 44.74942413757573 -165.269 115.31553657980868 116.01655261220868 44.24943410260388 44.74942413757573 -166.269 116.01655261220868 116.71756864465868 44.24943410260388 44.74942413757573 -167.269 116.71756864465868 117.41858467710868 44.24943410260388 44.74942413757573 -168.269 117.41858467710868 118.11960070955868 44.24943410260388 44.74942413757573 -169.269 118.11960070955868 118.82061674200868 44.24943410260388 44.74942413757573 -170.269 118.82061674200868 119.52163277440867 44.24943410260388 44.74942413757573 -171.269 119.52163277440867 120.22264880685867 44.24943410260388 44.74942413757573 -172.269 120.22264880685867 120.92366483930867 44.24943410260388 44.74942413757573 -173.269 120.92366483930867 121.62468087170868 44.24943410260388 44.74942413757573 -174.269 121.62468087170868 122.32569690415869 44.24943410260388 44.74942413757573 -175.269 122.32569690415869 123.02671293660867 44.24943410260388 44.74942413757573 -176.269 123.02671293660867 123.72772896905869 44.24943410260388 44.74942413757573 -177.269 123.72772896905869 124.42874500150869 44.24943410260388 44.74942413757573 -178.269 124.42874500150869 125.12976103390868 44.24943410260388 44.74942413757573 -179.269 125.12976103390868 125.83077706635868 44.24943410260388 44.74942413757573 -180.269 125.83077706635868 126.53179309880866 44.24943410260388 44.74942413757573 -181.269 126.53179309880866 127.23280913120867 44.24943410260388 44.74942413757573 -182.269 127.23280913120867 127.93382516365867 44.24943410260388 44.74942413757573 -183.269 127.93382516365867 128.63484119610868 44.24943410260388 44.74942413757573 -184.269 128.63484119610868 129.33585722855867 44.24943410260388 44.74942413757573 -185.269 129.33585722855867 130.03687326100868 44.24943410260388 44.74942413757573 -186.269 130.03687326100868 130.73788929340867 44.24943410260388 44.74942413757573 -187.269 130.73788929340867 131.43890532585868 44.24943410260388 44.74942413757573 -188.269 131.43890532585868 132.1399213583087 44.24943410260388 44.74942413757573 -189.269 132.1399213583087 132.8409373907087 44.24943410260388 44.74942413757573 -190.269 132.8409373907087 133.54195342315867 44.24943410260388 44.74942413757573 -191.269 133.54195342315867 134.2429694556087 44.24943410260388 44.74942413757573 -192.269 134.2429694556087 134.94398548800868 44.24943410260388 44.74942413757573 -193.269 134.94398548800868 135.64500152045866 44.24943410260388 44.74942413757573 -194.269 135.64500152045866 136.34601755290868 44.24943410260388 44.74942413757573 -195.269 136.34601755290868 137.0470335853587 44.24943410260388 44.74942413757573 -196.269 137.0470335853587 137.7480496178087 44.24943410260388 44.74942413757573 -197.269 137.7480496178087 138.4490656502087 44.24943410260388 44.74942413757573 -198.269 138.4490656502087 139.15008168265868 44.24943410260388 44.74942413757573 -199.269 139.15008168265868 139.85109771510866 44.24943410260388 44.74942413757573 -200.269 139.85109771510866 140.55211374750868 44.24943410260388 44.74942413757573 -201.269 140.55211374750868 141.25312977995867 44.24943410260388 44.74942413757573 -202.269 141.25312977995867 141.95414581240868 44.24943410260388 44.74942413757573 -203.269 141.95414581240868 142.6551618448587 44.24943410260388 44.74942413757573 -204.269 142.6551618448587 143.35617787730868 44.24943410260388 44.74942413757573 -205.269 143.35617787730868 144.0571939097087 44.24943410260388 44.74942413757573 -206.269 144.0571939097087 144.75820994215871 44.24943410260388 44.74942413757573 -207.269 144.75820994215871 145.45922597460867 44.24943410260388 44.74942413757573 -208.269 145.45922597460867 146.16024200700866 44.24943410260388 44.74942413757573 -209.269 146.16024200700866 146.86125803945868 44.24943410260388 44.74942413757573 -210.269 146.86125803945868 147.5622740719087 44.24943410260388 44.74942413757573 -211.269 147.5622740719087 148.26329010435865 44.24943410260388 44.74942413757573 -212.269 148.26329010435865 148.96430613680866 44.24943410260388 44.74942413757573 -213.269 148.96430613680866 149.66532216920868 44.24943410260388 44.74942413757573 -214.269 149.66532216920868 150.36633820165866 44.24943410260388 44.74942413757573 -215.269 150.36633820165866 151.06735423410868 44.24943410260388 44.74942413757573 -216.269 151.06735423410868 151.76837026650867 44.24943410260388 44.74942413757573 -217.269 151.76837026650867 152.46938629895868 44.24943410260388 44.74942413757573 -218.269 152.46938629895868 153.1704023314087 44.24943410260388 44.74942413757573 -219.269 153.1704023314087 153.8714183638087 44.24943410260388 44.74942413757573 -220.269 153.8714183638087 154.57243439625867 44.24943410260388 44.74942413757573 -221.269 154.57243439625867 155.27345042870866 44.24943410260388 44.74942413757573 -222.269 155.27345042870866 155.97446646115867 44.24943410260388 44.74942413757573 -223.269 155.97446646115867 156.67548249360868 44.24943410260388 44.74942413757573 -224.269 156.67548249360868 157.37649852600867 44.24943410260388 44.74942413757573 -225.269 157.37649852600867 158.0775145584587 44.24943410260388 44.74942413757573 -226.269 158.0775145584587 158.7785305909087 44.24943410260388 44.74942413757573 -227.269 158.7785305909087 159.4795466233087 44.24943410260388 44.74942413757573 -228.269 159.4795466233087 160.18056265575868 44.24943410260388 44.74942413757573 -229.269 160.18056265575868 160.88157868820866 44.24943410260388 44.74942413757573 -230.269 160.88157868820866 161.58259472065868 44.24943410260388 44.74942413757573 -231.269 161.58259472065868 162.2836107531087 44.24943410260388 44.74942413757573 -232.269 162.2836107531087 162.98462678550868 44.24943410260388 44.74942413757573 -233.269 162.98462678550868 163.6856428179587 44.24943410260388 44.74942413757573 -234.269 163.6856428179587 164.38665885040868 44.24943410260388 44.74942413757573 -235.269 164.38665885040868 165.0876748828087 44.24943410260388 44.74942413757573 -236.269 165.0876748828087 165.7886909152587 44.24943410260388 44.74942413757573 -237.269 165.7886909152587 166.48970694770867 44.24943410260388 44.74942413757573 -238.269 166.48970694770867 167.19072298015868 44.24943410260388 44.74942413757573 -239.269 167.19072298015868 167.8917390126087 44.24943410260388 44.74942413757573 -240.269 167.8917390126087 168.5927550450087 44.24943410260388 44.74942413757573 -241.269 168.5927550450087 169.2937710774587 44.24943410260388 44.74942413757573 -242.269 169.2937710774587 169.99478710990866 44.24943410260388 44.74942413757573 -243.269 169.99478710990866 170.69580314230868 44.24943410260388 44.74942413757573 -244.269 170.69580314230868 171.39681917475866 44.24943410260388 44.74942413757573 -245.269 171.39681917475866 172.09783520720868 44.24943410260388 44.74942413757573 -246.269 172.09783520720868 172.79885123960867 44.24943410260388 44.74942413757573 -247.269 172.79885123960867 173.49986727205868 44.24943410260388 44.74942413757573 -248.269 173.49986727205868 174.2008833045087 44.24943410260388 44.74942413757573 -249.269 174.2008833045087 174.90189933695868 44.24943410260388 44.74942413757573 -250.269 174.90189933695868 175.60291536940866 44.24943410260388 44.74942413757573 -251.269 175.60291536940866 176.30393140180865 44.24943410260388 44.74942413757573 -252.269 176.30393140180865 177.00494743425867 44.24943410260388 44.74942413757573 -253.269 177.00494743425867 177.70596346670868 44.24943410260388 44.74942413757573 -254.269 177.70596346670868 178.40697949910867 44.24943410260388 44.74942413757573 -255.269 178.40697949910867 179.1079955315587 44.24943410260388 44.74942413757573 -256.269 179.1079955315587 179.8090115640087 44.24943410260388 44.74942413757573 -257.269 179.8090115640087 180.51002759645866 44.24943410260388 44.74942413757573 -258.269 180.51002759645866 181.21104362890867 44.24943410260388 44.74942413757573 -259.269 181.21104362890867 181.91205966130866 44.24943410260388 44.74942413757573 -260.269 181.91205966130866 182.61307569375865 44.24943410260388 44.74942413757573 -261.269 182.61307569375865 183.31409172620866 44.24943410260388 44.74942413757573 -262.269 183.31409172620866 184.01510775860865 44.24943410260388 44.74942413757573 -263.269 184.01510775860865 184.71612379105864 44.24943410260388 44.74942413757573 -264.269 184.71612379105864 185.41713982350865 44.24943410260388 44.74942413757573 -265.269 185.41713982350865 186.11815585595866 44.24943410260388 44.74942413757573 -266.269 186.11815585595866 186.81917188840868 44.24943410260388 44.74942413757573 -267.269 186.81917188840868 187.52018792080867 44.24943410260388 44.74942413757573 -268.269 187.52018792080867 188.22120395325865 44.24943410260388 44.74942413757573 -269.269 188.22120395325865 188.92221998570864 44.24943410260388 44.74942413757573 -270.269 188.92221998570864 189.62323601810866 44.24943410260388 44.74942413757573 -271.269 189.62323601810866 190.32425205055864 44.24943410260388 44.74942413757573 -272.269 190.32425205055864 191.02526808300865 44.24943410260388 44.74942413757573 -273.269 191.02526808300865 191.72628411540865 44.24943410260388 44.74942413757573 -274.269 191.72628411540865 192.42730014785866 44.24943410260388 44.74942413757573 -275.269 192.42730014785866 193.12831618030867 44.24943410260388 44.74942413757573 -276.269 193.12831618030867 193.8293322127587 44.24943410260388 44.74942413757573 -277.269 193.8293322127587 194.53034824520867 44.24943410260388 44.74942413757573 -278.269 194.53034824520867 195.23136427760863 44.24943410260388 44.74942413757573 -279.269 195.23136427760863 195.93238031005865 44.24943410260388 44.74942413757573 -280.269 195.93238031005865 196.63339634250866 44.24943410260388 44.74942413757573 -281.269 196.63339634250866 197.33441237490865 44.24943410260388 44.74942413757573 -282.269 197.33441237490865 198.03542840735867 44.24943410260388 44.74942413757573 -283.269 198.03542840735867 198.7476794227991 44.24943410260388 44.74942413757573 -365.269 255.50750808421827 256.2197590996587 44.24943410260388 44.74942413757573 -366.269 256.2197590996587 256.9207751321087 44.24943410260388 44.74942413757573 -367.269 256.9207751321087 257.6217911645087 44.24943410260388 44.74942413757573 -368.269 257.6217911645087 258.3228071969587 44.24943410260388 44.74942413757573 -369.269 258.3228071969587 259.02382322940866 44.24943410260388 44.74942413757573 -370.269 259.02382322940866 259.7248392618086 44.24943410260388 44.74942413757573 -371.269 259.7248392618086 260.42585529425867 44.24943410260388 44.74942413757573 -372.269 260.42585529425867 261.1268713267087 44.24943410260388 44.74942413757573 -373.269 261.1268713267087 261.8278873591587 44.24943410260388 44.74942413757573 -374.269 261.8278873591587 262.52890339160865 44.24943410260388 44.74942413757573 -375.269 262.52890339160865 263.2299194240087 44.24943410260388 44.74942413757573 -376.269 263.2299194240087 263.93093545645866 44.24943410260388 44.74942413757573 -377.269 263.93093545645866 264.6319514889087 44.24943410260388 44.74942413757573 -378.269 264.6319514889087 265.33296752130866 44.24943410260388 44.74942413757573 -379.269 265.33296752130866 266.0339835537586 44.24943410260388 44.74942413757573 -380.269 266.0339835537586 266.7349995862087 44.24943410260388 44.74942413757573 -381.269 266.7349995862087 267.4360156186087 44.24943410260388 44.74942413757573 -382.269 267.4360156186087 268.1370316510587 44.24943410260388 44.74942413757573 -383.269 268.1370316510587 268.83804768350865 44.24943410260388 44.74942413757573 -384.269 268.83804768350865 269.5390637159587 44.24943410260388 44.74942413757573 -385.269 269.5390637159587 270.2400797484087 44.24943410260388 44.74942413757573 -386.269 270.2400797484087 270.9410957808087 44.24943410260388 44.74942413757573 -387.269 270.9410957808087 271.6421118132587 44.24943410260388 44.74942413757573 -388.269 271.6421118132587 272.34312784570864 44.24943410260388 44.74942413757573 -389.269 272.34312784570864 273.0441438781087 44.24943410260388 44.74942413757573 -390.269 273.0441438781087 273.74515991055864 44.24943410260388 44.74942413757573 -391.269 273.74515991055864 274.4461759430086 44.24943410260388 44.74942413757573 -392.269 274.4461759430086 275.15842695839905 44.24943410260388 44.74942413757573 -156.270 109.94212861341957 110.6605681614788 44.74942413757573 45.249413998632505 -157.270 110.6605681614788 111.3676749426788 44.74942413757573 45.249413998632505 -158.270 111.3676749426788 112.07478172387883 44.74942413757573 45.249413998632505 -159.270 112.07478172387883 112.7818885050288 44.74942413757573 45.249413998632505 -160.270 112.7818885050288 113.4889952861788 44.74942413757573 45.249413998632505 -161.270 113.4889952861788 114.1961020673788 44.74942413757573 45.249413998632505 -162.270 114.1961020673788 114.90320884857881 44.74942413757573 45.249413998632505 -163.270 114.90320884857881 115.6103156297788 44.74942413757573 45.249413998632505 -164.270 115.6103156297788 116.31742241097882 44.74942413757573 45.249413998632505 -165.270 116.31742241097882 117.02452919217882 44.74942413757573 45.249413998632505 -166.270 117.02452919217882 117.73163597337883 44.74942413757573 45.249413998632505 -167.270 117.73163597337883 118.43874275452882 44.74942413757573 45.249413998632505 -168.270 118.43874275452882 119.14584953567883 44.74942413757573 45.249413998632505 -169.270 119.14584953567883 119.85295631687882 44.74942413757573 45.249413998632505 -170.270 119.85295631687882 120.56006309807883 44.74942413757573 45.249413998632505 -171.270 120.56006309807883 121.26716987927884 44.74942413757573 45.249413998632505 -172.270 121.26716987927884 121.97427666047884 44.74942413757573 45.249413998632505 -173.270 121.97427666047884 122.6813834416788 44.74942413757573 45.249413998632505 -174.270 122.6813834416788 123.38849022282884 44.74942413757573 45.249413998632505 -175.270 123.38849022282884 124.09559700397884 44.74942413757573 45.249413998632505 -176.270 124.09559700397884 124.80270378517884 44.74942413757573 45.249413998632505 -177.270 124.80270378517884 125.50981056637882 44.74942413757573 45.249413998632505 -178.270 125.50981056637882 126.21691734757883 44.74942413757573 45.249413998632505 -179.270 126.21691734757883 126.92402412877883 44.74942413757573 45.249413998632505 -180.270 126.92402412877883 127.63113090997882 44.74942413757573 45.249413998632505 -181.270 127.63113090997882 128.33823769117882 44.74942413757573 45.249413998632505 -182.270 128.33823769117882 129.04534447232882 44.74942413757573 45.249413998632505 -183.270 129.04534447232882 129.7524512534788 44.74942413757573 45.249413998632505 -184.270 129.7524512534788 130.45955803467882 44.74942413757573 45.249413998632505 -185.270 130.45955803467882 131.16666481587885 44.74942413757573 45.249413998632505 -186.270 131.16666481587885 131.87377159707881 44.74942413757573 45.249413998632505 -187.270 131.87377159707881 132.58087837827884 44.74942413757573 45.249413998632505 -188.270 132.58087837827884 133.28798515947884 44.74942413757573 45.249413998632505 -189.270 133.28798515947884 133.9950919406288 44.74942413757573 45.249413998632505 -190.270 133.9950919406288 134.7021987217788 44.74942413757573 45.249413998632505 -191.270 134.7021987217788 135.4093055029788 44.74942413757573 45.249413998632505 -192.270 135.4093055029788 136.1164122841788 44.74942413757573 45.249413998632505 -193.270 136.1164122841788 136.82351906537883 44.74942413757573 45.249413998632505 -194.270 136.82351906537883 137.5306258465788 44.74942413757573 45.249413998632505 -195.270 137.5306258465788 138.23773262777883 44.74942413757573 45.249413998632505 -196.270 138.23773262777883 138.9448394089788 44.74942413757573 45.249413998632505 -197.270 138.9448394089788 139.6519461901288 44.74942413757573 45.249413998632505 -198.270 139.6519461901288 140.3590529712788 44.74942413757573 45.249413998632505 -199.270 140.3590529712788 141.06615975247882 44.74942413757573 45.249413998632505 -200.270 141.06615975247882 141.7732665336788 44.74942413757573 45.249413998632505 -201.270 141.7732665336788 142.48037331487882 44.74942413757573 45.249413998632505 -202.270 142.48037331487882 143.18748009607884 44.74942413757573 45.249413998632505 -203.270 143.18748009607884 143.8945868772788 44.74942413757573 45.249413998632505 -204.270 143.8945868772788 144.60169365842881 44.74942413757573 45.249413998632505 -205.270 144.60169365842881 145.30880043957885 44.74942413757573 45.249413998632505 -206.270 145.30880043957885 146.01590722077884 44.74942413757573 45.249413998632505 -207.270 146.01590722077884 146.7230140019788 44.74942413757573 45.249413998632505 -208.270 146.7230140019788 147.43012078317884 44.74942413757573 45.249413998632505 -209.270 147.43012078317884 148.1372275643788 44.74942413757573 45.249413998632505 -210.270 148.1372275643788 148.84433434557883 44.74942413757573 45.249413998632505 -211.270 148.84433434557883 149.5514411267288 44.74942413757573 45.249413998632505 -212.270 149.5514411267288 150.25854790787884 44.74942413757573 45.249413998632505 -213.270 150.25854790787884 150.9656546890788 44.74942413757573 45.249413998632505 -214.270 150.9656546890788 151.6727614702788 44.74942413757573 45.249413998632505 -215.270 151.6727614702788 152.37986825147883 44.74942413757573 45.249413998632505 -216.270 152.37986825147883 153.08697503267882 44.74942413757573 45.249413998632505 -217.270 153.08697503267882 153.79408181387882 44.74942413757573 45.249413998632505 -218.270 153.79408181387882 154.50118859507882 44.74942413757573 45.249413998632505 -219.270 154.50118859507882 155.20829537622882 44.74942413757573 45.249413998632505 -220.270 155.20829537622882 155.91540215737882 44.74942413757573 45.249413998632505 -221.270 155.91540215737882 156.62250893857882 44.74942413757573 45.249413998632505 -222.270 156.62250893857882 157.32961571977881 44.74942413757573 45.249413998632505 -223.270 157.32961571977881 158.03672250097884 44.74942413757573 45.249413998632505 -224.270 158.03672250097884 158.74382928217884 44.74942413757573 45.249413998632505 -225.270 158.74382928217884 159.45093606337883 44.74942413757573 45.249413998632505 -226.270 159.45093606337883 160.15804284452884 44.74942413757573 45.249413998632505 -227.270 160.15804284452884 160.86514962567884 44.74942413757573 45.249413998632505 -228.270 160.86514962567884 161.57225640687884 44.74942413757573 45.249413998632505 -229.270 161.57225640687884 162.2793631880788 44.74942413757573 45.249413998632505 -230.270 162.2793631880788 162.9864699692788 44.74942413757573 45.249413998632505 -231.270 162.9864699692788 163.69357675047883 44.74942413757573 45.249413998632505 -232.270 163.69357675047883 164.4006835316788 44.74942413757573 45.249413998632505 -233.270 164.4006835316788 165.10779031287882 44.74942413757573 45.249413998632505 -234.270 165.10779031287882 165.81489709402882 44.74942413757573 45.249413998632505 -235.270 165.81489709402882 166.52200387517883 44.74942413757573 45.249413998632505 -236.270 166.52200387517883 167.2291106563788 44.74942413757573 45.249413998632505 -237.270 167.2291106563788 167.93621743757882 44.74942413757573 45.249413998632505 -238.270 167.93621743757882 168.64332421877884 44.74942413757573 45.249413998632505 -239.270 168.64332421877884 169.3504309999788 44.74942413757573 45.249413998632505 -240.270 169.3504309999788 170.05753778117884 44.74942413757573 45.249413998632505 -241.270 170.05753778117884 170.77597732923806 44.74942413757573 45.249413998632505 -266.270 187.72387454391955 188.4423140919788 44.74942413757573 45.249413998632505 -267.270 188.4423140919788 189.14942087317877 44.74942413757573 45.249413998632505 -268.270 189.14942087317877 189.8565276543788 44.74942413757573 45.249413998632505 -269.270 189.8565276543788 190.56363443557882 44.74942413757573 45.249413998632505 -270.270 190.56363443557882 191.2707412167788 44.74942413757573 45.249413998632505 -271.270 191.2707412167788 191.9778479979288 44.74942413757573 45.249413998632505 -272.270 191.9778479979288 192.6849547790788 44.74942413757573 45.249413998632505 -273.270 192.6849547790788 193.39206156027882 44.74942413757573 45.249413998632505 -274.270 193.39206156027882 194.0991683414788 44.74942413757573 45.249413998632505 -275.270 194.0991683414788 194.8062751226788 44.74942413757573 45.249413998632505 -276.270 194.8062751226788 195.51338190387878 44.74942413757573 45.249413998632505 -277.270 195.51338190387878 196.2204886850788 44.74942413757573 45.249413998632505 -278.270 196.2204886850788 196.9275954662288 44.74942413757573 45.249413998632505 -279.270 196.9275954662288 197.6347022473788 44.74942413757573 45.249413998632505 -280.270 197.6347022473788 198.35314179543803 44.74942413757573 45.249413998632505 -361.270 254.89901875661954 255.6174583046788 44.74942413757573 45.249413998632505 -362.270 255.6174583046788 256.3245650858788 44.74942413757573 45.249413998632505 -363.270 256.3245650858788 257.0316718670788 44.74942413757573 45.249413998632505 -364.270 257.0316718670788 257.73877864827875 44.74942413757573 45.249413998632505 -365.270 257.73877864827875 258.44588542947884 44.74942413757573 45.249413998632505 -366.270 258.44588542947884 259.1529922106788 44.74942413757573 45.249413998632505 -367.270 259.1529922106788 259.8600989918788 44.74942413757573 45.249413998632505 -368.270 259.8600989918788 260.56720577302883 44.74942413757573 45.249413998632505 -369.270 260.56720577302883 261.27431255417883 44.74942413757573 45.249413998632505 -370.270 261.27431255417883 261.98141933537886 44.74942413757573 45.249413998632505 -371.270 261.98141933537886 262.6885261165788 44.74942413757573 45.249413998632505 -372.270 262.6885261165788 263.3956328977788 44.74942413757573 45.249413998632505 -373.270 263.3956328977788 264.10273967897876 44.74942413757573 45.249413998632505 -374.270 264.10273967897876 264.8098464601788 44.74942413757573 45.249413998632505 -375.270 264.8098464601788 265.5169532413288 44.74942413757573 45.249413998632505 -376.270 265.5169532413288 266.22406002247885 44.74942413757573 45.249413998632505 -377.270 266.22406002247885 266.9311668036788 44.74942413757573 45.249413998632505 -378.270 266.9311668036788 267.6382735848788 44.74942413757573 45.249413998632505 -379.270 267.6382735848788 268.34538036607876 44.74942413757573 45.249413998632505 -380.270 268.34538036607876 269.0524871472788 44.74942413757573 45.249413998632505 -381.270 269.0524871472788 269.7595939284788 44.74942413757573 45.249413998632505 -382.270 269.7595939284788 270.46670070962875 44.74942413757573 45.249413998632505 -383.270 270.46670070962875 271.1738074907788 44.74942413757573 45.249413998632505 -384.270 271.1738074907788 271.8809142719788 44.74942413757573 45.249413998632505 -385.270 271.8809142719788 272.5880210531788 44.74942413757573 45.249413998632505 -386.270 272.5880210531788 273.29512783437883 44.74942413757573 45.249413998632505 -387.270 273.29512783437883 274.0022346155788 44.74942413757573 45.249413998632505 -388.270 274.0022346155788 274.70934139677877 44.74942413757573 45.249413998632505 -389.270 274.70934139677877 275.4164481779788 44.74942413757573 45.249413998632505 -390.270 275.4164481779788 276.134887726038 44.74942413757573 45.249413998632505 -154.271 109.48750146193713 110.21229370834565 45.249413998632505 45.74940367959586 -155.271 110.21229370834565 110.92565280554567 45.249413998632505 45.74940367959586 -156.271 110.92565280554567 111.63901190274566 45.249413998632505 45.74940367959586 -157.271 111.63901190274566 112.35237099994566 45.249413998632505 45.74940367959586 -158.271 112.35237099994566 113.06573009714566 45.249413998632505 45.74940367959586 -159.271 113.06573009714566 113.77908919434566 45.249413998632505 45.74940367959586 -160.271 113.77908919434566 114.49244829154567 45.249413998632505 45.74940367959586 -161.271 114.49244829154567 115.20580738874565 45.249413998632505 45.74940367959586 -162.271 115.20580738874565 115.91916648594565 45.249413998632505 45.74940367959586 -163.271 115.91916648594565 116.63252558314565 45.249413998632505 45.74940367959586 -164.271 116.63252558314565 117.34588468034565 45.249413998632505 45.74940367959586 -165.271 117.34588468034565 118.05924377754565 45.249413998632505 45.74940367959586 -166.271 118.05924377754565 118.77260287474564 45.249413998632505 45.74940367959586 -167.271 118.77260287474564 119.48596197194567 45.249413998632505 45.74940367959586 -168.271 119.48596197194567 120.19932106914565 45.249413998632505 45.74940367959586 -169.271 120.19932106914565 120.91268016634565 45.249413998632505 45.74940367959586 -170.271 120.91268016634565 121.62603926354565 45.249413998632505 45.74940367959586 -171.271 121.62603926354565 122.33939836074565 45.249413998632505 45.74940367959586 -172.271 122.33939836074565 123.05275745794566 45.249413998632505 45.74940367959586 -173.271 123.05275745794566 123.76611655514566 45.249413998632505 45.74940367959586 -174.271 123.76611655514566 124.47947565234566 45.249413998632505 45.74940367959586 -175.271 124.47947565234566 125.19283474954565 45.249413998632505 45.74940367959586 -176.271 125.19283474954565 125.90619384674565 45.249413998632505 45.74940367959586 -177.271 125.90619384674565 126.61955294394565 45.249413998632505 45.74940367959586 -178.271 126.61955294394565 127.33291204114565 45.249413998632505 45.74940367959586 -179.271 127.33291204114565 128.04627113834565 45.249413998632505 45.74940367959586 -180.271 128.04627113834565 128.75963023554561 45.249413998632505 45.74940367959586 -181.271 128.75963023554561 129.4729893327456 45.249413998632505 45.74940367959586 -182.271 129.4729893327456 130.1863484299456 45.249413998632505 45.74940367959586 -183.271 130.1863484299456 130.89970752714567 45.249413998632505 45.74940367959586 -184.271 130.89970752714567 131.61306662434566 45.249413998632505 45.74940367959586 -185.271 131.61306662434566 132.32642572154566 45.249413998632505 45.74940367959586 -186.271 132.32642572154566 133.03978481874566 45.249413998632505 45.74940367959586 -187.271 133.03978481874566 133.75314391594566 45.249413998632505 45.74940367959586 -188.271 133.75314391594566 134.46650301314565 45.249413998632505 45.74940367959586 -189.271 134.46650301314565 135.17986211034565 45.249413998632505 45.74940367959586 -190.271 135.17986211034565 135.89322120754565 45.249413998632505 45.74940367959586 -191.271 135.89322120754565 136.60658030474565 45.249413998632505 45.74940367959586 -192.271 136.60658030474565 137.31993940194565 45.249413998632505 45.74940367959586 -193.271 137.31993940194565 138.03329849914564 45.249413998632505 45.74940367959586 -194.271 138.03329849914564 138.74665759634564 45.249413998632505 45.74940367959586 -195.271 138.74665759634564 139.46001669354564 45.249413998632505 45.74940367959586 -196.271 139.46001669354564 140.17337579074564 45.249413998632505 45.74940367959586 -197.271 140.17337579074564 140.88673488794566 45.249413998632505 45.74940367959586 -198.271 140.88673488794566 141.6000939851457 45.249413998632505 45.74940367959586 -199.271 141.6000939851457 142.3134530823457 45.249413998632505 45.74940367959586 -200.271 142.3134530823457 143.0268121795457 45.249413998632505 45.74940367959586 -201.271 143.0268121795457 143.74017127674568 45.249413998632505 45.74940367959586 -202.271 143.74017127674568 144.45353037394568 45.249413998632505 45.74940367959586 -203.271 144.45353037394568 145.16688947114568 45.249413998632505 45.74940367959586 -204.271 145.16688947114568 145.88024856834568 45.249413998632505 45.74940367959586 -205.271 145.88024856834568 146.59360766554565 45.249413998632505 45.74940367959586 -206.271 146.59360766554565 147.30696676274565 45.249413998632505 45.74940367959586 -207.271 147.30696676274565 148.02032585994564 45.249413998632505 45.74940367959586 -208.271 148.02032585994564 148.73368495714564 45.249413998632505 45.74940367959586 -209.271 148.73368495714564 149.44704405434564 45.249413998632505 45.74940367959586 -210.271 149.44704405434564 150.16040315154564 45.249413998632505 45.74940367959586 -211.271 150.16040315154564 150.87376224874566 45.249413998632505 45.74940367959586 -212.271 150.87376224874566 151.58712134594566 45.249413998632505 45.74940367959586 -213.271 151.58712134594566 152.30048044314566 45.249413998632505 45.74940367959586 -214.271 152.30048044314566 153.01383954034566 45.249413998632505 45.74940367959586 -215.271 153.01383954034566 153.72719863754565 45.249413998632505 45.74940367959586 -216.271 153.72719863754565 154.44055773474565 45.249413998632505 45.74940367959586 -217.271 154.44055773474565 155.15391683194565 45.249413998632505 45.74940367959586 -218.271 155.15391683194565 155.86727592914565 45.249413998632505 45.74940367959586 -219.271 155.86727592914565 156.58063502634565 45.249413998632505 45.74940367959586 -220.271 156.58063502634565 157.29399412354564 45.249413998632505 45.74940367959586 -221.271 157.29399412354564 158.00735322074564 45.249413998632505 45.74940367959586 -222.271 158.00735322074564 158.72071231794564 45.249413998632505 45.74940367959586 -223.271 158.72071231794564 159.43407141514564 45.249413998632505 45.74940367959586 -224.271 159.43407141514564 160.14743051234564 45.249413998632505 45.74940367959586 -225.271 160.14743051234564 160.86078960954563 45.249413998632505 45.74940367959586 -226.271 160.86078960954563 161.57414870674566 45.249413998632505 45.74940367959586 -227.271 161.57414870674566 162.2875078039457 45.249413998632505 45.74940367959586 -228.271 162.2875078039457 163.00086690114568 45.249413998632505 45.74940367959586 -229.271 163.00086690114568 163.71422599834568 45.249413998632505 45.74940367959586 -230.271 163.71422599834568 164.42758509554568 45.249413998632505 45.74940367959586 -231.271 164.42758509554568 165.14094419274568 45.249413998632505 45.74940367959586 -232.271 165.14094419274568 165.85430328994568 45.249413998632505 45.74940367959586 -233.271 165.85430328994568 166.56766238714567 45.249413998632505 45.74940367959586 -234.271 166.56766238714567 167.28102148434567 45.249413998632505 45.74940367959586 -235.271 167.28102148434567 167.99438058154564 45.249413998632505 45.74940367959586 -236.271 167.99438058154564 168.70773967874564 45.249413998632505 45.74940367959586 -237.271 168.70773967874564 169.42109877594567 45.249413998632505 45.74940367959586 -238.271 169.42109877594567 170.1458910223542 45.249413998632505 45.74940367959586 -264.271 187.9570021539371 188.68179440034567 45.249413998632505 45.74940367959586 -265.271 188.68179440034567 189.39515349754566 45.249413998632505 45.74940367959586 -266.271 189.39515349754566 190.10851259474566 45.249413998632505 45.74940367959586 -267.271 190.10851259474566 190.82187169194566 45.249413998632505 45.74940367959586 -268.271 190.82187169194566 191.53523078914566 45.249413998632505 45.74940367959586 -269.271 191.53523078914566 192.24858988634566 45.249413998632505 45.74940367959586 -270.271 192.24858988634566 192.96194898354565 45.249413998632505 45.74940367959586 -271.271 192.96194898354565 193.67530808074565 45.249413998632505 45.74940367959586 -272.271 193.67530808074565 194.38866717794565 45.249413998632505 45.74940367959586 -273.271 194.38866717794565 195.10202627514565 45.249413998632505 45.74940367959586 -274.271 195.10202627514565 195.81538537234565 45.249413998632505 45.74940367959586 -275.271 195.81538537234565 196.52874446954564 45.249413998632505 45.74940367959586 -276.271 196.52874446954564 197.24210356674564 45.249413998632505 45.74940367959586 -277.271 197.24210356674564 197.95546266394564 45.249413998632505 45.74940367959586 -278.271 197.95546266394564 198.6802549103542 45.249413998632505 45.74940367959586 -357.271 254.29939819353712 255.02419043994564 45.249413998632505 45.74940367959586 -358.271 255.02419043994564 255.73754953714564 45.249413998632505 45.74940367959586 -359.271 255.73754953714564 256.45090863434564 45.249413998632505 45.74940367959586 -360.271 256.45090863434564 257.16426773154564 45.249413998632505 45.74940367959586 -361.271 257.16426773154564 257.87762682874563 45.249413998632505 45.74940367959586 -362.271 257.87762682874563 258.59098592594563 45.249413998632505 45.74940367959586 -363.271 258.59098592594563 259.30434502314563 45.249413998632505 45.74940367959586 -364.271 259.30434502314563 260.0177041203456 45.249413998632505 45.74940367959586 -365.271 260.0177041203456 260.7310632175456 45.249413998632505 45.74940367959586 -366.271 260.7310632175456 261.4444223147457 45.249413998632505 45.74940367959586 -367.271 261.4444223147457 262.1577814119457 45.249413998632505 45.74940367959586 -368.271 262.1577814119457 262.8711405091457 45.249413998632505 45.74940367959586 -369.271 262.8711405091457 263.5844996063457 45.249413998632505 45.74940367959586 -370.271 263.5844996063457 264.29785870354567 45.249413998632505 45.74940367959586 -371.271 264.29785870354567 265.01121780074567 45.249413998632505 45.74940367959586 -372.271 265.01121780074567 265.72457689794567 45.249413998632505 45.74940367959586 -373.271 265.72457689794567 266.43793599514566 45.249413998632505 45.74940367959586 -374.271 266.43793599514566 267.15129509234566 45.249413998632505 45.74940367959586 -375.271 267.15129509234566 267.86465418954566 45.249413998632505 45.74940367959586 -376.271 267.86465418954566 268.57801328674566 45.249413998632505 45.74940367959586 -377.271 268.57801328674566 269.29137238394566 45.249413998632505 45.74940367959586 -378.271 269.29137238394566 270.00473148114565 45.249413998632505 45.74940367959586 -379.271 270.00473148114565 270.71809057834565 45.249413998632505 45.74940367959586 -380.271 270.71809057834565 271.43144967554565 45.249413998632505 45.74940367959586 -381.271 271.43144967554565 272.14480877274565 45.249413998632505 45.74940367959586 -382.271 272.14480877274565 272.85816786994565 45.249413998632505 45.74940367959586 -383.271 272.85816786994565 273.5715269671457 45.249413998632505 45.74940367959586 -384.271 273.5715269671457 274.28488606434564 45.249413998632505 45.74940367959586 -385.271 274.28488606434564 274.99824516154564 45.249413998632505 45.74940367959586 -386.271 274.99824516154564 275.71160425874564 45.249413998632505 45.74940367959586 -387.271 275.71160425874564 276.4363965051542 45.249413998632505 45.74940367959586 -153.272 109.75291796655388 110.48423245168883 45.74940367959586 46.24939317401014 -154.272 110.48423245168883 111.20401072148883 45.74940367959586 46.24939317401014 -155.272 111.20401072148883 111.92378899128883 45.74940367959586 46.24939317401014 -156.272 111.92378899128883 112.64356726108883 45.74940367959586 46.24939317401014 -157.272 112.64356726108883 113.36334553088882 45.74940367959586 46.24939317401014 -158.272 113.36334553088882 114.08312380068882 45.74940367959586 46.24939317401014 -159.272 114.08312380068882 114.80290207053883 45.74940367959586 46.24939317401014 -160.272 114.80290207053883 115.52268034038883 45.74940367959586 46.24939317401014 -161.272 115.52268034038883 116.24245861018882 45.74940367959586 46.24939317401014 -162.272 116.24245861018882 116.96223687998884 45.74940367959586 46.24939317401014 -163.272 116.96223687998884 117.68201514978884 45.74940367959586 46.24939317401014 -164.272 117.68201514978884 118.40179341958883 45.74940367959586 46.24939317401014 -165.272 118.40179341958883 119.12157168938883 45.74940367959586 46.24939317401014 -166.272 119.12157168938883 119.84134995918882 45.74940367959586 46.24939317401014 -167.272 119.84134995918882 120.56112822903883 45.74940367959586 46.24939317401014 -168.272 120.56112822903883 121.28090649888883 45.74940367959586 46.24939317401014 -169.272 121.28090649888883 122.00068476868884 45.74940367959586 46.24939317401014 -170.272 122.00068476868884 122.72046303848883 45.74940367959586 46.24939317401014 -171.272 122.72046303848883 123.44024130828883 45.74940367959586 46.24939317401014 -172.272 123.44024130828883 124.16001957808882 45.74940367959586 46.24939317401014 -173.272 124.16001957808882 124.87979784788884 45.74940367959586 46.24939317401014 -174.272 124.87979784788884 125.59957611773882 45.74940367959586 46.24939317401014 -175.272 125.59957611773882 126.31935438758883 45.74940367959586 46.24939317401014 -176.272 126.31935438758883 127.03913265738883 45.74940367959586 46.24939317401014 -177.272 127.03913265738883 127.75891092718884 45.74940367959586 46.24939317401014 -178.272 127.75891092718884 128.47868919698885 45.74940367959586 46.24939317401014 -179.272 128.47868919698885 129.19846746678886 45.74940367959586 46.24939317401014 -180.272 129.19846746678886 129.91824573658883 45.74940367959586 46.24939317401014 -181.272 129.91824573658883 130.63802400638883 45.74940367959586 46.24939317401014 -182.272 130.63802400638883 131.35780227623883 45.74940367959586 46.24939317401014 -183.272 131.35780227623883 132.07758054608883 45.74940367959586 46.24939317401014 -184.272 132.07758054608883 132.79735881588886 45.74940367959586 46.24939317401014 -185.272 132.79735881588886 133.51713708568886 45.74940367959586 46.24939317401014 -186.272 133.51713708568886 134.2369153554888 45.74940367959586 46.24939317401014 -187.272 134.2369153554888 134.95669362528884 45.74940367959586 46.24939317401014 -188.272 134.95669362528884 135.67647189508884 45.74940367959586 46.24939317401014 -189.272 135.67647189508884 136.3962501648888 45.74940367959586 46.24939317401014 -190.272 136.3962501648888 137.11602843473884 45.74940367959586 46.24939317401014 -191.272 137.11602843473884 137.83580670458883 45.74940367959586 46.24939317401014 -192.272 137.83580670458883 138.5555849743888 45.74940367959586 46.24939317401014 -193.272 138.5555849743888 139.27536324418884 45.74940367959586 46.24939317401014 -194.272 139.27536324418884 139.99514151398884 45.74940367959586 46.24939317401014 -195.272 139.99514151398884 140.71491978378884 45.74940367959586 46.24939317401014 -196.272 140.71491978378884 141.43469805358882 45.74940367959586 46.24939317401014 -197.272 141.43469805358882 142.15447632338885 45.74940367959586 46.24939317401014 -198.272 142.15447632338885 142.87425459323885 45.74940367959586 46.24939317401014 -199.272 142.87425459323885 143.59403286308884 45.74940367959586 46.24939317401014 -200.272 143.59403286308884 144.31381113288884 45.74940367959586 46.24939317401014 -201.272 144.31381113288884 145.03358940268882 45.74940367959586 46.24939317401014 -202.272 145.03358940268882 145.75336767248882 45.74940367959586 46.24939317401014 -203.272 145.75336767248882 146.47314594228885 45.74940367959586 46.24939317401014 -204.272 146.47314594228885 147.19292421208883 45.74940367959586 46.24939317401014 -205.272 147.19292421208883 147.91270248188883 45.74940367959586 46.24939317401014 -206.272 147.91270248188883 148.63248075173885 45.74940367959586 46.24939317401014 -207.272 148.63248075173885 149.35225902158885 45.74940367959586 46.24939317401014 -208.272 149.35225902158885 150.07203729138882 45.74940367959586 46.24939317401014 -209.272 150.07203729138882 150.79181556118886 45.74940367959586 46.24939317401014 -210.272 150.79181556118886 151.51159383098883 45.74940367959586 46.24939317401014 -211.272 151.51159383098883 152.2313721007888 45.74940367959586 46.24939317401014 -212.272 152.2313721007888 152.95115037058883 45.74940367959586 46.24939317401014 -213.272 152.95115037058883 153.67092864043883 45.74940367959586 46.24939317401014 -214.272 153.67092864043883 154.39070691028883 45.74940367959586 46.24939317401014 -215.272 154.39070691028883 155.11048518008886 45.74940367959586 46.24939317401014 -216.272 155.11048518008886 155.83026344988883 45.74940367959586 46.24939317401014 -217.272 155.83026344988883 156.5500417196888 45.74940367959586 46.24939317401014 -218.272 156.5500417196888 157.26981998948884 45.74940367959586 46.24939317401014 -219.272 157.26981998948884 157.9895982592888 45.74940367959586 46.24939317401014 -220.272 157.9895982592888 158.70937652908881 45.74940367959586 46.24939317401014 -221.272 158.70937652908881 159.42915479893884 45.74940367959586 46.24939317401014 -222.272 159.42915479893884 160.14893306878884 45.74940367959586 46.24939317401014 -223.272 160.14893306878884 160.8687113385888 45.74940367959586 46.24939317401014 -224.272 160.8687113385888 161.58848960838884 45.74940367959586 46.24939317401014 -225.272 161.58848960838884 162.30826787818881 45.74940367959586 46.24939317401014 -226.272 162.30826787818881 163.0280461479888 45.74940367959586 46.24939317401014 -227.272 163.0280461479888 163.74782441778882 45.74940367959586 46.24939317401014 -228.272 163.74782441778882 164.46760268758885 45.74940367959586 46.24939317401014 -229.272 164.46760268758885 165.18738095743882 45.74940367959586 46.24939317401014 -230.272 165.18738095743882 165.90715922728884 45.74940367959586 46.24939317401014 -231.272 165.90715922728884 166.62693749708882 45.74940367959586 46.24939317401014 -232.272 166.62693749708882 167.3467157668888 45.74940367959586 46.24939317401014 -233.272 167.3467157668888 168.06649403668882 45.74940367959586 46.24939317401014 -234.272 168.06649403668882 168.78627230648885 45.74940367959586 46.24939317401014 -235.272 168.78627230648885 169.50605057628883 45.74940367959586 46.24939317401014 -236.272 169.50605057628883 170.23736506142376 45.74940367959586 46.24939317401014 -261.272 187.48897110635386 188.22028559148882 45.74940367959586 46.24939317401014 -262.272 188.22028559148882 188.94006386128882 45.74940367959586 46.24939317401014 -263.272 188.94006386128882 189.6598421310888 45.74940367959586 46.24939317401014 -264.272 189.6598421310888 190.37962040088883 45.74940367959586 46.24939317401014 -265.272 190.37962040088883 191.09939867068883 45.74940367959586 46.24939317401014 -266.272 191.09939867068883 191.81917694048883 45.74940367959586 46.24939317401014 -267.272 191.81917694048883 192.5389552102888 45.74940367959586 46.24939317401014 -268.272 192.5389552102888 193.2587334801388 45.74940367959586 46.24939317401014 -269.272 193.2587334801388 193.97851174998883 45.74940367959586 46.24939317401014 -270.272 193.97851174998883 194.69829001978883 45.74940367959586 46.24939317401014 -271.272 194.69829001978883 195.41806828958883 45.74940367959586 46.24939317401014 -272.272 195.41806828958883 196.13784655938883 45.74940367959586 46.24939317401014 -273.272 196.13784655938883 196.8576248291888 45.74940367959586 46.24939317401014 -274.272 196.8576248291888 197.5774030989888 45.74940367959586 46.24939317401014 -275.272 197.5774030989888 198.2971813687888 45.74940367959586 46.24939317401014 -276.272 198.2971813687888 199.0169596386388 45.74940367959586 46.24939317401014 -277.272 199.0169596386388 199.74827412382376 45.74940367959586 46.24939317401014 -355.272 255.14812846875387 255.87944295388883 45.74940367959586 46.24939317401014 -356.272 255.87944295388883 256.5992212236888 45.74940367959586 46.24939317401014 -357.272 256.5992212236888 257.31899949348883 45.74940367959586 46.24939317401014 -358.272 257.31899949348883 258.0387777632888 45.74940367959586 46.24939317401014 -359.272 258.0387777632888 258.75855603308884 45.74940367959586 46.24939317401014 -360.272 258.75855603308884 259.4783343028888 45.74940367959586 46.24939317401014 -361.272 259.4783343028888 260.1981125727388 45.74940367959586 46.24939317401014 -362.272 260.1981125727388 260.9178908425888 45.74940367959586 46.24939317401014 -363.272 260.9178908425888 261.63766911238883 45.74940367959586 46.24939317401014 -364.272 261.63766911238883 262.35744738218887 45.74940367959586 46.24939317401014 -365.272 262.35744738218887 263.07722565198884 45.74940367959586 46.24939317401014 -366.272 263.07722565198884 263.7970039217888 45.74940367959586 46.24939317401014 -367.272 263.7970039217888 264.51678219158885 45.74940367959586 46.24939317401014 -368.272 264.51678219158885 265.2365604613888 45.74940367959586 46.24939317401014 -369.272 265.2365604613888 265.9563387312388 45.74940367959586 46.24939317401014 -370.272 265.9563387312388 266.67611700108887 45.74940367959586 46.24939317401014 -371.272 266.67611700108887 267.39589527088884 45.74940367959586 46.24939317401014 -372.272 267.39589527088884 268.1156735406888 45.74940367959586 46.24939317401014 -373.272 268.1156735406888 268.8354518104888 45.74940367959586 46.24939317401014 -374.272 268.8354518104888 269.55523008028877 45.74940367959586 46.24939317401014 -375.272 269.55523008028877 270.2750083500888 45.74940367959586 46.24939317401014 -376.272 270.2750083500888 270.9947866198888 45.74940367959586 46.24939317401014 -377.272 270.9947866198888 271.7145648897388 45.74940367959586 46.24939317401014 -378.272 271.7145648897388 272.4343431595888 45.74940367959586 46.24939317401014 -379.272 272.4343431595888 273.1541214293888 45.74940367959586 46.24939317401014 -380.272 273.1541214293888 273.87389969918877 45.74940367959586 46.24939317401014 -381.272 273.87389969918877 274.5936779689888 45.74940367959586 46.24939317401014 -382.272 274.5936779689888 275.31345623878883 45.74940367959586 46.24939317401014 -383.272 275.31345623878883 276.03323450858886 45.74940367959586 46.24939317401014 -384.272 276.03323450858886 276.7645489937238 45.74940367959586 46.24939317401014 -152.273 110.03160941443437 110.76962130460572 46.24939317401014 46.74938247512624 -153.273 110.76962130460572 111.4959911402057 46.24939317401014 46.74938247512624 -154.273 111.4959911402057 112.22236097580571 46.24939317401014 46.74938247512624 -155.273 112.22236097580571 112.94873081145572 46.24939317401014 46.74938247512624 -156.273 112.94873081145572 113.67510064710571 46.24939317401014 46.74938247512624 -157.273 113.67510064710571 114.4014704827057 46.24939317401014 46.74938247512624 -158.273 114.4014704827057 115.12784031830572 46.24939317401014 46.74938247512624 -159.273 115.12784031830572 115.8542101539557 46.24939317401014 46.74938247512624 -160.273 115.8542101539557 116.58057998960572 46.24939317401014 46.74938247512624 -161.273 116.58057998960572 117.30694982520572 46.24939317401014 46.74938247512624 -162.273 117.30694982520572 118.03331966085568 46.24939317401014 46.74938247512624 -163.273 118.03331966085568 118.7596894965057 46.24939317401014 46.74938247512624 -164.273 118.7596894965057 119.48605933210573 46.24939317401014 46.74938247512624 -165.273 119.48605933210573 120.2124291677057 46.24939317401014 46.74938247512624 -166.273 120.2124291677057 120.93879900335571 46.24939317401014 46.74938247512624 -167.273 120.93879900335571 121.6651688390057 46.24939317401014 46.74938247512624 -168.273 121.6651688390057 122.39153867460573 46.24939317401014 46.74938247512624 -169.273 122.39153867460573 123.11790851020572 46.24939317401014 46.74938247512624 -170.273 123.11790851020572 123.84427834585571 46.24939317401014 46.74938247512624 -171.273 123.84427834585571 124.5706481815057 46.24939317401014 46.74938247512624 -172.273 124.5706481815057 125.29701801710573 46.24939317401014 46.74938247512624 -173.273 125.29701801710573 126.02338785275572 46.24939317401014 46.74938247512624 -174.273 126.02338785275572 126.74975768840571 46.24939317401014 46.74938247512624 -175.273 126.74975768840571 127.4761275240057 46.24939317401014 46.74938247512624 -176.273 127.4761275240057 128.20249735960573 46.24939317401014 46.74938247512624 -177.273 128.20249735960573 128.9288671952557 46.24939317401014 46.74938247512624 -178.273 128.9288671952557 129.6552370309057 46.24939317401014 46.74938247512624 -179.273 129.6552370309057 130.3816068665057 46.24939317401014 46.74938247512624 -180.273 130.3816068665057 131.10797670210573 46.24939317401014 46.74938247512624 -181.273 131.10797670210573 131.83434653775572 46.24939317401014 46.74938247512624 -182.273 131.83434653775572 132.56071637340568 46.24939317401014 46.74938247512624 -183.273 132.56071637340568 133.28708620900568 46.24939317401014 46.74938247512624 -184.273 133.28708620900568 134.0134560446557 46.24939317401014 46.74938247512624 -185.273 134.0134560446557 134.73982588030572 46.24939317401014 46.74938247512624 -186.273 134.73982588030572 135.4661957159057 46.24939317401014 46.74938247512624 -187.273 135.4661957159057 136.1925655515057 46.24939317401014 46.74938247512624 -188.273 136.1925655515057 136.91893538715573 46.24939317401014 46.74938247512624 -189.273 136.91893538715573 137.64530522280572 46.24939317401014 46.74938247512624 -190.273 137.64530522280572 138.37167505840569 46.24939317401014 46.74938247512624 -191.273 138.37167505840569 139.09804489400568 46.24939317401014 46.74938247512624 -192.273 139.09804489400568 139.8244147296557 46.24939317401014 46.74938247512624 -193.273 139.8244147296557 140.55078456530572 46.24939317401014 46.74938247512624 -194.273 140.55078456530572 141.27715440090572 46.24939317401014 46.74938247512624 -195.273 141.27715440090572 142.0035242365557 46.24939317401014 46.74938247512624 -196.273 142.0035242365557 142.7298940722057 46.24939317401014 46.74938247512624 -197.273 142.7298940722057 143.4562639078057 46.24939317401014 46.74938247512624 -198.273 143.4562639078057 144.1826337434057 46.24939317401014 46.74938247512624 -199.273 144.1826337434057 144.9090035790557 46.24939317401014 46.74938247512624 -200.273 144.9090035790557 145.63537341470573 46.24939317401014 46.74938247512624 -201.273 145.63537341470573 146.36174325030572 46.24939317401014 46.74938247512624 -202.273 146.36174325030572 147.08811308590572 46.24939317401014 46.74938247512624 -203.273 147.08811308590572 147.8144829215557 46.24939317401014 46.74938247512624 -204.273 147.8144829215557 148.54085275720573 46.24939317401014 46.74938247512624 -205.273 148.54085275720573 149.26722259280572 46.24939317401014 46.74938247512624 -206.273 149.26722259280572 149.9935924284557 46.24939317401014 46.74938247512624 -207.273 149.9935924284557 150.71996226410573 46.24939317401014 46.74938247512624 -208.273 150.71996226410573 151.44633209970573 46.24939317401014 46.74938247512624 -209.273 151.44633209970573 152.17270193530572 46.24939317401014 46.74938247512624 -210.273 152.17270193530572 152.8990717709557 46.24939317401014 46.74938247512624 -211.273 152.8990717709557 153.6254416066057 46.24939317401014 46.74938247512624 -212.273 153.6254416066057 154.3518114422057 46.24939317401014 46.74938247512624 -213.273 154.3518114422057 155.07818127785572 46.24939317401014 46.74938247512624 -214.273 155.07818127785572 155.8045511135057 46.24939317401014 46.74938247512624 -215.273 155.8045511135057 156.53092094910573 46.24939317401014 46.74938247512624 -216.273 156.53092094910573 157.25729078470573 46.24939317401014 46.74938247512624 -217.273 157.25729078470573 157.98366062035572 46.24939317401014 46.74938247512624 -218.273 157.98366062035572 158.7100304560057 46.24939317401014 46.74938247512624 -219.273 158.7100304560057 159.4364002916057 46.24939317401014 46.74938247512624 -220.273 159.4364002916057 160.1627701272057 46.24939317401014 46.74938247512624 -221.273 160.1627701272057 160.88913996285572 46.24939317401014 46.74938247512624 -222.273 160.88913996285572 161.6155097985057 46.24939317401014 46.74938247512624 -223.273 161.6155097985057 162.34187963410568 46.24939317401014 46.74938247512624 -224.273 162.34187963410568 163.0682494697557 46.24939317401014 46.74938247512624 -225.273 163.0682494697557 163.79461930540572 46.24939317401014 46.74938247512624 -226.273 163.79461930540572 164.5209891410057 46.24939317401014 46.74938247512624 -227.273 164.5209891410057 165.2473589766057 46.24939317401014 46.74938247512624 -228.273 165.2473589766057 165.97372881225573 46.24939317401014 46.74938247512624 -229.273 165.97372881225573 166.7000986479057 46.24939317401014 46.74938247512624 -230.273 166.7000986479057 167.4264684835057 46.24939317401014 46.74938247512624 -231.273 167.4264684835057 168.1528383191057 46.24939317401014 46.74938247512624 -232.273 168.1528383191057 168.8792081547557 46.24939317401014 46.74938247512624 -233.273 168.8792081547557 169.60557799040572 46.24939317401014 46.74938247512624 -234.273 169.60557799040572 170.34358988057707 46.24939317401014 46.74938247512624 -259.273 187.75318182653433 188.49119371670568 46.24939317401014 46.74938247512624 -260.273 188.49119371670568 189.2175635523057 46.24939317401014 46.74938247512624 -261.273 189.2175635523057 189.9439333879557 46.24939317401014 46.74938247512624 -262.273 189.9439333879557 190.67030322360569 46.24939317401014 46.74938247512624 -263.273 190.67030322360569 191.39667305920568 46.24939317401014 46.74938247512624 -264.273 191.39667305920568 192.12304289480568 46.24939317401014 46.74938247512624 -265.273 192.12304289480568 192.8494127304557 46.24939317401014 46.74938247512624 -266.273 192.8494127304557 193.5757825661057 46.24939317401014 46.74938247512624 -267.273 193.5757825661057 194.30215240170568 46.24939317401014 46.74938247512624 -268.273 194.30215240170568 195.02852223735567 46.24939317401014 46.74938247512624 -269.273 195.02852223735567 195.7548920730057 46.24939317401014 46.74938247512624 -270.273 195.7548920730057 196.4812619086057 46.24939317401014 46.74938247512624 -271.273 196.4812619086057 197.20763174420568 46.24939317401014 46.74938247512624 -272.273 197.20763174420568 197.9340015798557 46.24939317401014 46.74938247512624 -273.273 197.9340015798557 198.6603714155057 46.24939317401014 46.74938247512624 -274.273 198.6603714155057 199.39838330567704 46.24939317401014 46.74938247512624 -344.273 249.49461785483436 250.23262974500568 46.24939317401014 46.74938247512624 -345.273 250.23262974500568 250.9589995806557 46.24939317401014 46.74938247512624 -346.273 250.9589995806557 251.6853694163057 46.24939317401014 46.74938247512624 -347.273 251.6853694163057 252.4117392519057 46.24939317401014 46.74938247512624 -348.273 252.4117392519057 253.1381090875057 46.24939317401014 46.74938247512624 -349.273 253.1381090875057 253.86447892315567 46.24939317401014 46.74938247512624 -350.273 253.86447892315567 254.5908487588057 46.24939317401014 46.74938247512624 -351.273 254.5908487588057 255.31721859440572 46.24939317401014 46.74938247512624 -352.273 255.31721859440572 256.0435884300557 46.24939317401014 46.74938247512624 -353.273 256.0435884300557 256.7699582657057 46.24939317401014 46.74938247512624 -354.273 256.7699582657057 257.4963281013057 46.24939317401014 46.74938247512624 -355.273 257.4963281013057 258.2226979369057 46.24939317401014 46.74938247512624 -356.273 258.2226979369057 258.9490677725557 46.24939317401014 46.74938247512624 -357.273 258.9490677725557 259.6754376082057 46.24939317401014 46.74938247512624 -358.273 259.6754376082057 260.40180744380564 46.24939317401014 46.74938247512624 -359.273 260.40180744380564 261.1281772794057 46.24939317401014 46.74938247512624 -360.273 261.1281772794057 261.8545471150557 46.24939317401014 46.74938247512624 -361.273 261.8545471150557 262.5809169507057 46.24939317401014 46.74938247512624 -362.273 262.5809169507057 263.30728678630567 46.24939317401014 46.74938247512624 -363.273 263.30728678630567 264.0336566219557 46.24939317401014 46.74938247512624 -364.273 264.0336566219557 264.7600264576057 46.24939317401014 46.74938247512624 -365.273 264.7600264576057 265.48639629320564 46.24939317401014 46.74938247512624 -366.273 265.48639629320564 266.2127661288057 46.24939317401014 46.74938247512624 -367.273 266.2127661288057 266.93913596445566 46.24939317401014 46.74938247512624 -368.273 266.93913596445566 267.66550580010573 46.24939317401014 46.74938247512624 -369.273 267.66550580010573 268.3918756357057 46.24939317401014 46.74938247512624 -370.273 268.3918756357057 269.1182454713057 46.24939317401014 46.74938247512624 -371.273 269.1182454713057 269.8446153069557 46.24939317401014 46.74938247512624 -372.273 269.8446153069557 270.5709851426057 46.24939317401014 46.74938247512624 -373.273 270.5709851426057 271.2973549782057 46.24939317401014 46.74938247512624 -374.273 271.2973549782057 272.02372481385567 46.24939317401014 46.74938247512624 -375.273 272.02372481385567 272.75009464950574 46.24939317401014 46.74938247512624 -376.273 272.75009464950574 273.4764644851057 46.24939317401014 46.74938247512624 -377.273 273.4764644851057 274.20283432070573 46.24939317401014 46.74938247512624 -378.273 274.20283432070573 274.9292041563557 46.24939317401014 46.74938247512624 -379.273 274.9292041563557 275.65557399200566 46.24939317401014 46.74938247512624 -380.273 275.65557399200566 276.39358588217704 46.24939317401014 46.74938247512624 -151.274 110.32393108627903 111.06882143955266 46.74938247512624 47.24937157588444 -152.274 111.06882143955266 111.80196103235265 46.74938247512624 47.24937157588444 -153.274 111.80196103235265 112.53510062520263 46.74938247512624 47.24937157588444 -154.274 112.53510062520263 113.26824021805263 46.74938247512624 47.24937157588444 -155.274 113.26824021805263 114.00137981085264 46.74938247512624 47.24937157588444 -156.274 114.00137981085264 114.73451940365263 46.74938247512624 47.24937157588444 -157.274 114.73451940365263 115.46765899645263 46.74938247512624 47.24937157588444 -158.274 115.46765899645263 116.20079858930264 46.74938247512624 47.24937157588444 -159.274 116.20079858930264 116.93393818215264 46.74938247512624 47.24937157588444 -160.274 116.93393818215264 117.66707777495265 46.74938247512624 47.24937157588444 -161.274 117.66707777495265 118.40021736775266 46.74938247512624 47.24937157588444 -162.274 118.40021736775266 119.13335696055265 46.74938247512624 47.24937157588444 -163.274 119.13335696055265 119.86649655335265 46.74938247512624 47.24937157588444 -164.274 119.86649655335265 120.59963614620266 46.74938247512624 47.24937157588444 -165.274 120.59963614620266 121.33277573905266 46.74938247512624 47.24937157588444 -166.274 121.33277573905266 122.06591533185264 46.74938247512624 47.24937157588444 -167.274 122.06591533185264 122.79905492465264 46.74938247512624 47.24937157588444 -168.274 122.79905492465264 123.53219451745264 46.74938247512624 47.24937157588444 -169.274 123.53219451745264 124.26533411030263 46.74938247512624 47.24937157588444 -170.274 124.26533411030263 124.99847370315263 46.74938247512624 47.24937157588444 -171.274 124.99847370315263 125.73161329595263 46.74938247512624 47.24937157588444 -172.274 125.73161329595263 126.46475288875266 46.74938247512624 47.24937157588444 -173.274 126.46475288875266 127.19789248155266 46.74938247512624 47.24937157588444 -174.274 127.19789248155266 127.93103207440264 46.74938247512624 47.24937157588444 -175.274 127.93103207440264 128.66417166725262 46.74938247512624 47.24937157588444 -176.274 128.66417166725262 129.39731126005262 46.74938247512624 47.24937157588444 -177.274 129.39731126005262 130.13045085285262 46.74938247512624 47.24937157588444 -178.274 130.13045085285262 130.86359044565262 46.74938247512624 47.24937157588444 -179.274 130.86359044565262 131.59673003850264 46.74938247512624 47.24937157588444 -180.274 131.59673003850264 132.32986963135266 46.74938247512624 47.24937157588444 -181.274 132.32986963135266 133.06300922415267 46.74938247512624 47.24937157588444 -182.274 133.06300922415267 133.79614881695267 46.74938247512624 47.24937157588444 -183.274 133.79614881695267 134.52928840975267 46.74938247512624 47.24937157588444 -184.274 134.52928840975267 135.26242800260263 46.74938247512624 47.24937157588444 -185.274 135.26242800260263 135.99556759545266 46.74938247512624 47.24937157588444 -186.274 135.99556759545266 136.72870718825266 46.74938247512624 47.24937157588444 -187.274 136.72870718825266 137.46184678105266 46.74938247512624 47.24937157588444 -188.274 137.46184678105266 138.19498637385266 46.74938247512624 47.24937157588444 -189.274 138.19498637385266 138.92812596670262 46.74938247512624 47.24937157588444 -190.274 138.92812596670262 139.66126555955262 46.74938247512624 47.24937157588444 -191.274 139.66126555955262 140.39440515235262 46.74938247512624 47.24937157588444 -192.274 140.39440515235262 141.12754474515262 46.74938247512624 47.24937157588444 -193.274 141.12754474515262 141.86068433795262 46.74938247512624 47.24937157588444 -194.274 141.86068433795262 142.59382393080264 46.74938247512624 47.24937157588444 -195.274 142.59382393080264 143.32696352365264 46.74938247512624 47.24937157588444 -196.274 143.32696352365264 144.06010311645264 46.74938247512624 47.24937157588444 -197.274 144.06010311645264 144.79324270925264 46.74938247512624 47.24937157588444 -198.274 144.79324270925264 145.52638230205264 46.74938247512624 47.24937157588444 -199.274 145.52638230205264 146.25952189490266 46.74938247512624 47.24937157588444 -200.274 146.25952189490266 146.99266148775263 46.74938247512624 47.24937157588444 -201.274 146.99266148775263 147.72580108055263 46.74938247512624 47.24937157588444 -202.274 147.72580108055263 148.45894067335263 46.74938247512624 47.24937157588444 -203.274 148.45894067335263 149.19208026615263 46.74938247512624 47.24937157588444 -204.274 149.19208026615263 149.92521985900265 46.74938247512624 47.24937157588444 -205.274 149.92521985900265 150.65835945185265 46.74938247512624 47.24937157588444 -206.274 150.65835945185265 151.39149904465265 46.74938247512624 47.24937157588444 -207.274 151.39149904465265 152.12463863745265 46.74938247512624 47.24937157588444 -208.274 152.12463863745265 152.85777823025265 46.74938247512624 47.24937157588444 -209.274 152.85777823025265 153.59091782310264 46.74938247512624 47.24937157588444 -210.274 153.59091782310264 154.32405741595267 46.74938247512624 47.24937157588444 -211.274 154.32405741595267 155.05719700875267 46.74938247512624 47.24937157588444 -212.274 155.05719700875267 155.79033660155267 46.74938247512624 47.24937157588444 -213.274 155.79033660155267 156.52347619435267 46.74938247512624 47.24937157588444 -214.274 156.52347619435267 157.25661578720266 46.74938247512624 47.24937157588444 -215.274 157.25661578720266 157.98975538005266 46.74938247512624 47.24937157588444 -216.274 157.98975538005266 158.72289497285266 46.74938247512624 47.24937157588444 -217.274 158.72289497285266 159.45603456565266 46.74938247512624 47.24937157588444 -218.274 159.45603456565266 160.18917415845266 46.74938247512624 47.24937157588444 -219.274 160.18917415845266 160.92231375130262 46.74938247512624 47.24937157588444 -220.274 160.92231375130262 161.65545334415265 46.74938247512624 47.24937157588444 -221.274 161.65545334415265 162.38859293695265 46.74938247512624 47.24937157588444 -222.274 162.38859293695265 163.12173252975265 46.74938247512624 47.24937157588444 -223.274 163.12173252975265 163.85487212255265 46.74938247512624 47.24937157588444 -224.274 163.85487212255265 164.58801171540264 46.74938247512624 47.24937157588444 -225.274 164.58801171540264 165.32115130825267 46.74938247512624 47.24937157588444 -226.274 165.32115130825267 166.05429090105267 46.74938247512624 47.24937157588444 -227.274 166.05429090105267 166.78743049385267 46.74938247512624 47.24937157588444 -228.274 166.78743049385267 167.52057008665267 46.74938247512624 47.24937157588444 -229.274 167.52057008665267 168.25370967950266 46.74938247512624 47.24937157588444 -230.274 168.25370967950266 168.98684927235263 46.74938247512624 47.24937157588444 -231.274 168.98684927235263 169.71998886515263 46.74938247512624 47.24937157588444 -232.274 169.71998886515263 170.4648792184263 46.74938247512624 47.24937157588444 -257.274 188.03672792517904 188.78161827845264 46.74938247512624 47.24937157588444 -258.274 188.78161827845264 189.51475787125264 46.74938247512624 47.24937157588444 -259.274 189.51475787125264 190.2478974641026 46.74938247512624 47.24937157588444 -260.274 190.2478974641026 190.98103705695263 46.74938247512624 47.24937157588444 -261.274 190.98103705695263 191.71417664975263 46.74938247512624 47.24937157588444 -262.274 191.71417664975263 192.44731624255263 46.74938247512624 47.24937157588444 -263.274 192.44731624255263 193.18045583535263 46.74938247512624 47.24937157588444 -264.274 193.18045583535263 193.91359542815263 46.74938247512624 47.24937157588444 -265.274 193.91359542815263 194.6467350210026 46.74938247512624 47.24937157588444 -266.274 194.6467350210026 195.37987461385262 46.74938247512624 47.24937157588444 -267.274 195.37987461385262 196.11301420665262 46.74938247512624 47.24937157588444 -268.274 196.11301420665262 196.84615379945262 46.74938247512624 47.24937157588444 -269.274 196.84615379945262 197.57929339225262 46.74938247512624 47.24937157588444 -270.274 197.57929339225262 198.31243298510265 46.74938247512624 47.24937157588444 -271.274 198.31243298510265 199.04557257795267 46.74938247512624 47.24937157588444 -272.274 199.04557257795267 199.77871217075267 46.74938247512624 47.24937157588444 -273.274 199.77871217075267 200.52360252402627 46.74938247512624 47.24937157588444 -340.274 248.88731412917903 249.63220448250263 46.74938247512624 47.24937157588444 -341.274 249.63220448250263 250.3653440753526 46.74938247512624 47.24937157588444 -342.274 250.3653440753526 251.0984836681526 46.74938247512624 47.24937157588444 -343.274 251.0984836681526 251.8316232609526 46.74938247512624 47.24937157588444 -344.274 251.8316232609526 252.56476285375265 46.74938247512624 47.24937157588444 -345.274 252.56476285375265 253.29790244660268 46.74938247512624 47.24937157588444 -346.274 253.29790244660268 254.03104203945264 46.74938247512624 47.24937157588444 -347.274 254.03104203945264 254.76418163225264 46.74938247512624 47.24937157588444 -348.274 254.76418163225264 255.49732122505262 46.74938247512624 47.24937157588444 -349.274 255.49732122505262 256.23046081785265 46.74938247512624 47.24937157588444 -350.274 256.23046081785265 256.9636004107026 46.74938247512624 47.24937157588444 -351.274 256.9636004107026 257.6967400035526 46.74938247512624 47.24937157588444 -352.274 257.6967400035526 258.42987959635263 46.74938247512624 47.24937157588444 -353.274 258.42987959635263 259.1630191891526 46.74938247512624 47.24937157588444 -354.274 259.1630191891526 259.89615878195264 46.74938247512624 47.24937157588444 -355.274 259.89615878195264 260.6292983748026 46.74938247512624 47.24937157588444 -356.274 260.6292983748026 261.3624379676527 46.74938247512624 47.24937157588444 -357.274 261.3624379676527 262.0955775604526 46.74938247512624 47.24937157588444 -358.274 262.0955775604526 262.8287171532527 46.74938247512624 47.24937157588444 -359.274 262.8287171532527 263.5618567460526 46.74938247512624 47.24937157588444 -360.274 263.5618567460526 264.29499633890265 46.74938247512624 47.24937157588444 -361.274 264.29499633890265 265.0281359317527 46.74938247512624 47.24937157588444 -362.274 265.0281359317527 265.7612755245526 46.74938247512624 47.24937157588444 -363.274 265.7612755245526 266.4944151173527 46.74938247512624 47.24937157588444 -364.274 266.4944151173527 267.2275547101526 46.74938247512624 47.24937157588444 -365.274 267.2275547101526 267.96069430300264 46.74938247512624 47.24937157588444 -366.274 267.96069430300264 268.69383389585266 46.74938247512624 47.24937157588444 -367.274 268.69383389585266 269.4269734886526 46.74938247512624 47.24937157588444 -368.274 269.4269734886526 270.16011308145266 46.74938247512624 47.24937157588444 -369.274 270.16011308145266 270.8932526742526 46.74938247512624 47.24937157588444 -370.274 270.8932526742526 271.6263922671027 46.74938247512624 47.24937157588444 -371.274 271.6263922671027 272.35953185995265 46.74938247512624 47.24937157588444 -372.274 272.35953185995265 273.09267145275265 46.74938247512624 47.24937157588444 -373.274 273.09267145275265 273.82581104555265 46.74938247512624 47.24937157588444 -374.274 273.82581104555265 274.55895063835266 46.74938247512624 47.24937157588444 -375.274 274.55895063835266 275.29209023115266 46.74938247512624 47.24937157588444 -376.274 275.29209023115266 276.03698058442626 46.74938247512624 47.24937157588444 -149.275 109.89016284073479 110.64211888831471 47.24937157588444 47.74936046889584 -150.275 110.64211888831471 111.38221250476471 47.24937157588444 47.74936046889584 -151.275 111.38221250476471 112.12230612121469 47.24937157588444 47.74936046889584 -152.275 112.12230612121469 112.8623997377147 47.24937157588444 47.74936046889584 -153.275 112.8623997377147 113.6024933541647 47.24937157588444 47.74936046889584 -154.275 113.6024933541647 114.34258697061469 47.24937157588444 47.74936046889584 -155.275 114.34258697061469 115.08268058706469 47.24937157588444 47.74936046889584 -156.275 115.08268058706469 115.8227742035147 47.24937157588444 47.74936046889584 -157.275 115.8227742035147 116.5628678200147 47.24937157588444 47.74936046889584 -158.275 116.5628678200147 117.3029614364647 47.24937157588444 47.74936046889584 -159.275 117.3029614364647 118.0430550529147 47.24937157588444 47.74936046889584 -160.275 118.0430550529147 118.78314866936469 47.24937157588444 47.74936046889584 -161.275 118.78314866936469 119.52324228581469 47.24937157588444 47.74936046889584 -162.275 119.52324228581469 120.2633359023147 47.24937157588444 47.74936046889584 -163.275 120.2633359023147 121.00342951876469 47.24937157588444 47.74936046889584 -164.275 121.00342951876469 121.7435231352147 47.24937157588444 47.74936046889584 -165.275 121.7435231352147 122.4836167516647 47.24937157588444 47.74936046889584 -166.275 122.4836167516647 123.2237103681147 47.24937157588444 47.74936046889584 -167.275 123.2237103681147 123.96380398461469 47.24937157588444 47.74936046889584 -168.275 123.96380398461469 124.70389760106468 47.24937157588444 47.74936046889584 -169.275 124.70389760106468 125.44399121751468 47.24937157588444 47.74936046889584 -170.275 125.44399121751468 126.1840848340147 47.24937157588444 47.74936046889584 -171.275 126.1840848340147 126.9241784504647 47.24937157588444 47.74936046889584 -172.275 126.9241784504647 127.66427206691469 47.24937157588444 47.74936046889584 -173.275 127.66427206691469 128.4043656833647 47.24937157588444 47.74936046889584 -174.275 128.4043656833647 129.14445929981468 47.24937157588444 47.74936046889584 -175.275 129.14445929981468 129.8845529163147 47.24937157588444 47.74936046889584 -176.275 129.8845529163147 130.6246465327647 47.24937157588444 47.74936046889584 -177.275 130.6246465327647 131.3647401492147 47.24937157588444 47.74936046889584 -178.275 131.3647401492147 132.1048337656647 47.24937157588444 47.74936046889584 -179.275 132.1048337656647 132.8449273821147 47.24937157588444 47.74936046889584 -180.275 132.8449273821147 133.5850209986147 47.24937157588444 47.74936046889584 -181.275 133.5850209986147 134.3251146150647 47.24937157588444 47.74936046889584 -182.275 134.3251146150647 135.0652082315147 47.24937157588444 47.74936046889584 -183.275 135.0652082315147 135.8053018479647 47.24937157588444 47.74936046889584 -184.275 135.8053018479647 136.5453954644147 47.24937157588444 47.74936046889584 -185.275 136.5453954644147 137.2854890809147 47.24937157588444 47.74936046889584 -186.275 137.2854890809147 138.0255826973647 47.24937157588444 47.74936046889584 -187.275 138.0255826973647 138.76567631381468 47.24937157588444 47.74936046889584 -188.275 138.76567631381468 139.50576993031467 47.24937157588444 47.74936046889584 -189.275 139.50576993031467 140.2458635467647 47.24937157588444 47.74936046889584 -190.275 140.2458635467647 140.98595716321466 47.24937157588444 47.74936046889584 -191.275 140.98595716321466 141.7260507796647 47.24937157588444 47.74936046889584 -192.275 141.7260507796647 142.46614439611466 47.24937157588444 47.74936046889584 -193.275 142.46614439611466 143.2062380126147 47.24937157588444 47.74936046889584 -194.275 143.2062380126147 143.94633162906467 47.24937157588444 47.74936046889584 -195.275 143.94633162906467 144.68642524551467 47.24937157588444 47.74936046889584 -196.275 144.68642524551467 145.42651886196467 47.24937157588444 47.74936046889584 -197.275 145.42651886196467 146.16661247841466 47.24937157588444 47.74936046889584 -198.275 146.16661247841466 146.90670609491468 47.24937157588444 47.74936046889584 -199.275 146.90670609491468 147.64679971136474 47.24937157588444 47.74936046889584 -200.275 147.64679971136474 148.38689332781473 47.24937157588444 47.74936046889584 -201.275 148.38689332781473 149.12698694426467 47.24937157588444 47.74936046889584 -202.275 149.12698694426467 149.8670805607147 47.24937157588444 47.74936046889584 -203.275 149.8670805607147 150.6071741772147 47.24937157588444 47.74936046889584 -204.275 150.6071741772147 151.34726779366468 47.24937157588444 47.74936046889584 -205.275 151.34726779366468 152.08736141011468 47.24937157588444 47.74936046889584 -206.275 152.08736141011468 152.82745502661467 47.24937157588444 47.74936046889584 -207.275 152.82745502661467 153.56754864306467 47.24937157588444 47.74936046889584 -208.275 153.56754864306467 154.3076422595147 47.24937157588444 47.74936046889584 -209.275 154.3076422595147 155.0477358759647 47.24937157588444 47.74936046889584 -210.275 155.0477358759647 155.7878294924147 47.24937157588444 47.74936046889584 -211.275 155.7878294924147 156.5279231089147 47.24937157588444 47.74936046889584 -212.275 156.5279231089147 157.2680167253647 47.24937157588444 47.74936046889584 -213.275 157.2680167253647 158.0081103418147 47.24937157588444 47.74936046889584 -214.275 158.0081103418147 158.7482039582647 47.24937157588444 47.74936046889584 -215.275 158.7482039582647 159.4882975747147 47.24937157588444 47.74936046889584 -216.275 159.4882975747147 160.22839119121468 47.24937157588444 47.74936046889584 -217.275 160.22839119121468 160.9684848076647 47.24937157588444 47.74936046889584 -218.275 160.9684848076647 161.7085784241147 47.24937157588444 47.74936046889584 -219.275 161.7085784241147 162.4486720405647 47.24937157588444 47.74936046889584 -220.275 162.4486720405647 163.1887656570147 47.24937157588444 47.74936046889584 -221.275 163.1887656570147 163.92885927351472 47.24937157588444 47.74936046889584 -222.275 163.92885927351472 164.6689528899647 47.24937157588444 47.74936046889584 -223.275 164.6689528899647 165.40904650641468 47.24937157588444 47.74936046889584 -224.275 165.40904650641468 166.14914012291467 47.24937157588444 47.74936046889584 -225.275 166.14914012291467 166.88923373936467 47.24937157588444 47.74936046889584 -226.275 166.88923373936467 167.62932735581467 47.24937157588444 47.74936046889584 -227.275 167.62932735581467 168.36942097226466 47.24937157588444 47.74936046889584 -228.275 168.36942097226466 169.1095145887147 47.24937157588444 47.74936046889584 -229.275 169.1095145887147 169.84960820521468 47.24937157588444 47.74936046889584 -230.275 169.84960820521468 170.5897018216647 47.24937157588444 47.74936046889584 -231.275 170.5897018216647 171.3416578691946 47.24937157588444 47.74936046889584 -256.275 189.0801798020348 189.8321358496147 47.24937157588444 47.74936046889584 -257.275 189.8321358496147 190.57222946611466 47.24937157588444 47.74936046889584 -258.275 190.57222946611466 191.31232308256466 47.24937157588444 47.74936046889584 -259.275 191.31232308256466 192.05241669901469 47.24937157588444 47.74936046889584 -260.275 192.05241669901469 192.79251031551468 47.24937157588444 47.74936046889584 -261.275 192.79251031551468 193.53260393196467 47.24937157588444 47.74936046889584 -262.275 193.53260393196467 194.27269754841467 47.24937157588444 47.74936046889584 -263.275 194.27269754841467 195.01279116486467 47.24937157588444 47.74936046889584 -264.275 195.01279116486467 195.7528847813147 47.24937157588444 47.74936046889584 -265.275 195.7528847813147 196.49297839781468 47.24937157588444 47.74936046889584 -266.275 196.49297839781468 197.23307201426468 47.24937157588444 47.74936046889584 -267.275 197.23307201426468 197.97316563071467 47.24937157588444 47.74936046889584 -268.275 197.97316563071467 198.71325924716467 47.24937157588444 47.74936046889584 -269.275 198.71325924716467 199.45335286361467 47.24937157588444 47.74936046889584 -270.275 199.45335286361467 200.1934464801147 47.24937157588444 47.74936046889584 -271.275 200.1934464801147 200.9335400965647 47.24937157588444 47.74936046889584 -272.275 200.9335400965647 201.6736337130147 47.24937157588444 47.74936046889584 -273.275 201.6736337130147 202.41372732946468 47.24937157588444 47.74936046889584 -274.275 202.41372732946468 203.15382094591467 47.24937157588444 47.74936046889584 -275.275 203.15382094591467 203.8939145624147 47.24937157588444 47.74936046889584 -276.275 203.8939145624147 204.6340081788647 47.24937157588444 47.74936046889584 -277.275 204.6340081788647 205.3741017953147 47.24937157588444 47.74936046889584 -278.275 205.3741017953147 206.11419541181468 47.24937157588444 47.74936046889584 -279.275 206.11419541181468 206.8542890282647 47.24937157588444 47.74936046889584 -280.275 206.8542890282647 207.59438264471467 47.24937157588444 47.74936046889584 -281.275 207.59438264471467 208.3344762611647 47.24937157588444 47.74936046889584 -282.275 208.3344762611647 209.0745698776147 47.24937157588444 47.74936046889584 -283.275 209.0745698776147 209.81466349411468 47.24937157588444 47.74936046889584 -284.275 209.81466349411468 210.5547571105647 47.24937157588444 47.74936046889584 -285.275 210.5547571105647 211.3067131580946 47.24937157588444 47.74936046889584 -337.275 249.02776273543475 249.7797187830147 47.24937157588444 47.74936046889584 -338.275 249.7797187830147 250.5198123994647 47.24937157588444 47.74936046889584 -339.275 250.5198123994647 251.25990601591468 47.24937157588444 47.74936046889584 -340.275 251.25990601591468 251.99999963236468 47.24937157588444 47.74936046889584 -341.275 251.99999963236468 252.74009324881473 47.24937157588444 47.74936046889584 -342.275 252.74009324881473 253.4801868653147 47.24937157588444 47.74936046889584 -343.275 253.4801868653147 254.2202804817647 47.24937157588444 47.74936046889584 -344.275 254.2202804817647 254.9603740982147 47.24937157588444 47.74936046889584 -345.275 254.9603740982147 255.70046771471473 47.24937157588444 47.74936046889584 -346.275 255.70046771471473 256.4405613311647 47.24937157588444 47.74936046889584 -347.275 256.4405613311647 257.1806549476147 47.24937157588444 47.74936046889584 -348.275 257.1806549476147 257.9207485640647 47.24937157588444 47.74936046889584 -349.275 257.9207485640647 258.6608421805147 47.24937157588444 47.74936046889584 -350.275 258.6608421805147 259.40093579701465 47.24937157588444 47.74936046889584 -351.275 259.40093579701465 260.1410294134647 47.24937157588444 47.74936046889584 -352.275 260.1410294134647 260.8811230299147 47.24937157588444 47.74936046889584 -353.275 260.8811230299147 261.6212166463647 47.24937157588444 47.74936046889584 -354.275 261.6212166463647 262.36131026281464 47.24937157588444 47.74936046889584 -355.275 262.36131026281464 263.1014038793147 47.24937157588444 47.74936046889584 -356.275 263.1014038793147 263.8414974957647 47.24937157588444 47.74936046889584 -357.275 263.8414974957647 264.5815911122147 47.24937157588444 47.74936046889584 -358.275 264.5815911122147 265.32168472866465 47.24937157588444 47.74936046889584 -359.275 265.32168472866465 266.0617783451147 47.24937157588444 47.74936046889584 -360.275 266.0617783451147 266.80187196161467 47.24937157588444 47.74936046889584 -361.275 266.80187196161467 267.5419655780647 47.24937157588444 47.74936046889584 -362.275 267.5419655780647 268.2820591945147 47.24937157588444 47.74936046889584 -363.275 268.2820591945147 269.02215281101473 47.24937157588444 47.74936046889584 -364.275 269.02215281101473 269.7622464274647 47.24937157588444 47.74936046889584 -365.275 269.7622464274647 270.50234004391467 47.24937157588444 47.74936046889584 -366.275 270.50234004391467 271.24243366036467 47.24937157588444 47.74936046889584 -367.275 271.24243366036467 271.9825272768147 47.24937157588444 47.74936046889584 -368.275 271.9825272768147 272.7226208933147 47.24937157588444 47.74936046889584 -369.275 272.7226208933147 273.4627145097647 47.24937157588444 47.74936046889584 -370.275 273.4627145097647 274.2028081262147 47.24937157588444 47.74936046889584 -371.275 274.2028081262147 274.9429017426647 47.24937157588444 47.74936046889584 -372.275 274.9429017426647 275.69485779019453 47.24937157588444 47.74936046889584 -147.276 109.45650169931629 110.2157171435519 47.74936046889584 48.249349146422695 -148.276 110.2157171435519 110.9629554185019 47.74936046889584 48.249349146422695 -149.276 110.9629554185019 111.71019369340189 47.74936046889584 48.249349146422695 -150.276 111.71019369340189 112.4574319683519 47.74936046889584 48.249349146422695 -151.276 112.4574319683519 113.2046702433019 47.74936046889584 48.249349146422695 -152.276 113.2046702433019 113.95190851820189 47.74936046889584 48.249349146422695 -153.276 113.95190851820189 114.6991467931519 47.74936046889584 48.249349146422695 -154.276 114.6991467931519 115.4463850681019 47.74936046889584 48.249349146422695 -155.276 115.4463850681019 116.1936233430019 47.74936046889584 48.249349146422695 -156.276 116.1936233430019 116.9408616179519 47.74936046889584 48.249349146422695 -157.276 116.9408616179519 117.68809989290189 47.74936046889584 48.249349146422695 -158.276 117.68809989290189 118.43533816780187 47.74936046889584 48.249349146422695 -159.276 118.43533816780187 119.1825764427519 47.74936046889584 48.249349146422695 -160.276 119.1825764427519 119.92981471770189 47.74936046889584 48.249349146422695 -161.276 119.92981471770189 120.6770529926019 47.74936046889584 48.249349146422695 -162.276 120.6770529926019 121.4242912675519 47.74936046889584 48.249349146422695 -163.276 121.4242912675519 122.17152954250189 47.74936046889584 48.249349146422695 -164.276 122.17152954250189 122.91876781740189 47.74936046889584 48.249349146422695 -165.276 122.91876781740189 123.66600609235189 47.74936046889584 48.249349146422695 -166.276 123.66600609235189 124.41324436730189 47.74936046889584 48.249349146422695 -167.276 124.41324436730189 125.16048264220188 47.74936046889584 48.249349146422695 -168.276 125.16048264220188 125.90772091715189 47.74936046889584 48.249349146422695 -169.276 125.90772091715189 126.65495919210187 47.74936046889584 48.249349146422695 -170.276 126.65495919210187 127.40219746700187 47.74936046889584 48.249349146422695 -171.276 127.40219746700187 128.1494357419519 47.74936046889584 48.249349146422695 -172.276 128.1494357419519 128.8966740169019 47.74936046889584 48.249349146422695 -173.276 128.8966740169019 129.64391229180188 47.74936046889584 48.249349146422695 -174.276 129.64391229180188 130.3911505667519 47.74936046889584 48.249349146422695 -175.276 130.3911505667519 131.1383888417019 47.74936046889584 48.249349146422695 -176.276 131.1383888417019 131.88562711660188 47.74936046889584 48.249349146422695 -177.276 131.88562711660188 132.63286539150187 47.74936046889584 48.249349146422695 -178.276 132.63286539150187 133.3801036664519 47.74936046889584 48.249349146422695 -179.276 133.3801036664519 134.12734194140188 47.74936046889584 48.249349146422695 -180.276 134.12734194140188 134.8745802163019 47.74936046889584 48.249349146422695 -181.276 134.8745802163019 135.62181849125193 47.74936046889584 48.249349146422695 -182.276 135.62181849125193 136.36905676620188 47.74936046889584 48.249349146422695 -183.276 136.36905676620188 137.11629504110186 47.74936046889584 48.249349146422695 -184.276 137.11629504110186 137.86353331605187 47.74936046889584 48.249349146422695 -185.276 137.86353331605187 138.61077159100188 47.74936046889584 48.249349146422695 -186.276 138.61077159100188 139.3580098659019 47.74936046889584 48.249349146422695 -187.276 139.3580098659019 140.10524814085193 47.74936046889584 48.249349146422695 -188.276 140.10524814085193 140.85248641580188 47.74936046889584 48.249349146422695 -189.276 140.85248641580188 141.59972469070186 47.74936046889584 48.249349146422695 -190.276 141.59972469070186 142.34696296565187 47.74936046889584 48.249349146422695 -191.276 142.34696296565187 143.09420124060188 47.74936046889584 48.249349146422695 -192.276 143.09420124060188 143.84143951550192 47.74936046889584 48.249349146422695 -193.276 143.84143951550192 144.5886777904519 47.74936046889584 48.249349146422695 -194.276 144.5886777904519 145.3359160654019 47.74936046889584 48.249349146422695 -195.276 145.3359160654019 146.0831543403019 47.74936046889584 48.249349146422695 -196.276 146.0831543403019 146.83039261525187 47.74936046889584 48.249349146422695 -197.276 146.83039261525187 147.57763089020187 47.74936046889584 48.249349146422695 -198.276 147.57763089020187 148.32486916510192 47.74936046889584 48.249349146422695 -199.276 148.32486916510192 149.07210744005187 47.74936046889584 48.249349146422695 -200.276 149.07210744005187 149.81934571500193 47.74936046889584 48.249349146422695 -201.276 149.81934571500193 150.5665839899019 47.74936046889584 48.249349146422695 -202.276 150.5665839899019 151.3138222648519 47.74936046889584 48.249349146422695 -203.276 151.3138222648519 152.06106053980187 47.74936046889584 48.249349146422695 -204.276 152.06106053980187 152.8082988147019 47.74936046889584 48.249349146422695 -205.276 152.8082988147019 153.5555370896519 47.74936046889584 48.249349146422695 -206.276 153.5555370896519 154.3027753646019 47.74936046889584 48.249349146422695 -207.276 154.3027753646019 155.05001363950188 47.74936046889584 48.249349146422695 -208.276 155.05001363950188 155.7972519144519 47.74936046889584 48.249349146422695 -209.276 155.7972519144519 156.54449018940187 47.74936046889584 48.249349146422695 -210.276 156.54449018940187 157.2917284643019 47.74936046889584 48.249349146422695 -211.276 157.2917284643019 158.0389667392019 47.74936046889584 48.249349146422695 -212.276 158.0389667392019 158.7862050141519 47.74936046889584 48.249349146422695 -213.276 158.7862050141519 159.53344328910188 47.74936046889584 48.249349146422695 -214.276 159.53344328910188 160.2806815640019 47.74936046889584 48.249349146422695 -215.276 160.2806815640019 161.0279198389519 47.74936046889584 48.249349146422695 -216.276 161.0279198389519 161.7751581139019 47.74936046889584 48.249349146422695 -217.276 161.7751581139019 162.5223963888019 47.74936046889584 48.249349146422695 -218.276 162.5223963888019 163.2696346637519 47.74936046889584 48.249349146422695 -219.276 163.2696346637519 164.01687293870188 47.74936046889584 48.249349146422695 -220.276 164.01687293870188 164.7641112136019 47.74936046889584 48.249349146422695 -221.276 164.7641112136019 165.5113494885519 47.74936046889584 48.249349146422695 -222.276 165.5113494885519 166.2585877635019 47.74936046889584 48.249349146422695 -223.276 166.2585877635019 167.0058260384019 47.74936046889584 48.249349146422695 -224.276 167.0058260384019 167.7530643133519 47.74936046889584 48.249349146422695 -225.276 167.7530643133519 168.50030258830188 47.74936046889584 48.249349146422695 -226.276 168.50030258830188 169.2475408632019 47.74936046889584 48.249349146422695 -227.276 169.2475408632019 169.9947791381519 47.74936046889584 48.249349146422695 -228.276 169.9947791381519 170.7420174131019 47.74936046889584 48.249349146422695 -229.276 170.7420174131019 171.50123285728748 47.74936046889584 48.249349146422695 -254.276 189.4109971171163 190.17021256130187 47.74936046889584 48.249349146422695 -255.276 190.17021256130187 190.9174508362519 47.74936046889584 48.249349146422695 -256.276 190.9174508362519 191.66468911120188 47.74936046889584 48.249349146422695 -257.276 191.66468911120188 192.4119273861019 47.74936046889584 48.249349146422695 -258.276 192.4119273861019 193.15916566105187 47.74936046889584 48.249349146422695 -259.276 193.15916566105187 193.90640393600188 47.74936046889584 48.249349146422695 -260.276 193.90640393600188 194.65364221090186 47.74936046889584 48.249349146422695 -261.276 194.65364221090186 195.4008804858519 47.74936046889584 48.249349146422695 -262.276 195.4008804858519 196.14811876080188 47.74936046889584 48.249349146422695 -263.276 196.14811876080188 196.89535703570186 47.74936046889584 48.249349146422695 -264.276 196.89535703570186 197.64259531065187 47.74936046889584 48.249349146422695 -265.276 197.64259531065187 198.38983358560188 47.74936046889584 48.249349146422695 -266.276 198.38983358560188 199.13707186050186 47.74936046889584 48.249349146422695 -267.276 199.13707186050186 199.8843101354519 47.74936046889584 48.249349146422695 -268.276 199.8843101354519 200.63154841040188 47.74936046889584 48.249349146422695 -269.276 200.63154841040188 201.37878668530186 47.74936046889584 48.249349146422695 -270.276 201.37878668530186 202.12602496025187 47.74936046889584 48.249349146422695 -271.276 202.12602496025187 202.8732632352019 47.74936046889584 48.249349146422695 -272.276 202.8732632352019 203.6205015101019 47.74936046889584 48.249349146422695 -273.276 203.6205015101019 204.3677397850519 47.74936046889584 48.249349146422695 -274.276 204.3677397850519 205.11497806000187 47.74936046889584 48.249349146422695 -275.276 205.11497806000187 205.8622163349019 47.74936046889584 48.249349146422695 -276.276 205.8622163349019 206.6094546098019 47.74936046889584 48.249349146422695 -277.276 206.6094546098019 207.3566928847519 47.74936046889584 48.249349146422695 -278.276 207.3566928847519 208.1039311597019 47.74936046889584 48.249349146422695 -279.276 208.1039311597019 208.8511694346019 47.74936046889584 48.249349146422695 -280.276 208.8511694346019 209.59840770955188 47.74936046889584 48.249349146422695 -281.276 209.59840770955188 210.3456459845019 47.74936046889584 48.249349146422695 -282.276 210.3456459845019 211.0928842594019 47.74936046889584 48.249349146422695 -283.276 211.0928842594019 211.8520997035875 47.74936046889584 48.249349146422695 -334.276 249.19005911171627 249.94927455590187 47.74936046889584 48.249349146422695 -335.276 249.94927455590187 250.69651283085187 47.74936046889584 48.249349146422695 -336.276 250.69651283085187 251.44375110580188 47.74936046889584 48.249349146422695 -337.276 251.44375110580188 252.19098938070186 47.74936046889584 48.249349146422695 -338.276 252.19098938070186 252.93822765565187 47.74936046889584 48.249349146422695 -339.276 252.93822765565187 253.68546593060188 47.74936046889584 48.249349146422695 -340.276 253.68546593060188 254.4327042055019 47.74936046889584 48.249349146422695 -341.276 254.4327042055019 255.17994248040188 47.74936046889584 48.249349146422695 -342.276 255.17994248040188 255.92718075535186 47.74936046889584 48.249349146422695 -343.276 255.92718075535186 256.6744190303019 47.74936046889584 48.249349146422695 -344.276 256.6744190303019 257.42165730520185 47.74936046889584 48.249349146422695 -345.276 257.42165730520185 258.1688955801519 47.74936046889584 48.249349146422695 -346.276 258.1688955801519 258.91613385510186 47.74936046889584 48.249349146422695 -347.276 258.91613385510186 259.6633721300019 47.74936046889584 48.249349146422695 -348.276 259.6633721300019 260.4106104049519 47.74936046889584 48.249349146422695 -349.276 260.4106104049519 261.1578486799019 47.74936046889584 48.249349146422695 -350.276 261.1578486799019 261.90508695480185 47.74936046889584 48.249349146422695 -351.276 261.90508695480185 262.6523252297519 47.74936046889584 48.249349146422695 -352.276 262.6523252297519 263.3995635047019 47.74936046889584 48.249349146422695 -353.276 263.3995635047019 264.1468017796019 47.74936046889584 48.249349146422695 -354.276 264.1468017796019 264.89404005455185 47.74936046889584 48.249349146422695 -355.276 264.89404005455185 265.6412783295019 47.74936046889584 48.249349146422695 -356.276 265.6412783295019 266.3885166044019 47.74936046889584 48.249349146422695 -357.276 266.3885166044019 267.1357548793519 47.74936046889584 48.249349146422695 -358.276 267.1357548793519 267.88299315430186 47.74936046889584 48.249349146422695 -359.276 267.88299315430186 268.6302314292019 47.74936046889584 48.249349146422695 -360.276 268.6302314292019 269.37746970415185 47.74936046889584 48.249349146422695 -361.276 269.37746970415185 270.1247079791019 47.74936046889584 48.249349146422695 -362.276 270.1247079791019 270.87194625400184 47.74936046889584 48.249349146422695 -363.276 270.87194625400184 271.6191845289519 47.74936046889584 48.249349146422695 -364.276 271.6191845289519 272.3664228039019 47.74936046889584 48.249349146422695 -365.276 272.3664228039019 273.1136610788019 47.74936046889584 48.249349146422695 -366.276 273.1136610788019 273.86089935375185 47.74936046889584 48.249349146422695 -367.276 273.86089935375185 274.6081376287019 47.74936046889584 48.249349146422695 -368.276 274.6081376287019 275.35537590360184 47.74936046889584 48.249349146422695 -369.276 275.35537590360184 276.1145913477875 47.74936046889584 48.249349146422695 -145.277 109.02276881818783 109.78944414856977 48.249349146422695 48.749337600357094 -146.277 109.78944414856977 110.5440243961198 48.249349146422695 48.749337600357094 -147.277 110.5440243961198 111.29860464361978 48.249349146422695 48.749337600357094 -148.277 111.29860464361978 112.05318489116976 48.249349146422695 48.749337600357094 -149.277 112.05318489116976 112.80776513871976 48.249349146422695 48.749337600357094 -150.277 112.80776513871976 113.56234538621977 48.249349146422695 48.749337600357094 -151.277 113.56234538621977 114.31692563371979 48.249349146422695 48.749337600357094 -152.277 114.31692563371979 115.07150588126977 48.249349146422695 48.749337600357094 -153.277 115.07150588126977 115.82608612881977 48.249349146422695 48.749337600357094 -154.277 115.82608612881977 116.58066637631977 48.249349146422695 48.749337600357094 -155.277 116.58066637631977 117.33524662386976 48.249349146422695 48.749337600357094 -156.277 117.33524662386976 118.08982687141976 48.249349146422695 48.749337600357094 -157.277 118.08982687141976 118.84440711891976 48.249349146422695 48.749337600357094 -158.277 118.84440711891976 119.59898736641976 48.249349146422695 48.749337600357094 -159.277 119.59898736641976 120.35356761396977 48.249349146422695 48.749337600357094 -160.277 120.35356761396977 121.10814786151978 48.249349146422695 48.749337600357094 -161.277 121.10814786151978 121.86272810901978 48.249349146422695 48.749337600357094 -162.277 121.86272810901978 122.61730835656978 48.249349146422695 48.749337600357094 -163.277 122.61730835656978 123.37188860411977 48.249349146422695 48.749337600357094 -164.277 123.37188860411977 124.12646885161978 48.249349146422695 48.749337600357094 -165.277 124.12646885161978 124.88104909911978 48.249349146422695 48.749337600357094 -166.277 124.88104909911978 125.63562934666977 48.249349146422695 48.749337600357094 -167.277 125.63562934666977 126.39020959421978 48.249349146422695 48.749337600357094 -168.277 126.39020959421978 127.14478984171977 48.249349146422695 48.749337600357094 -169.277 127.14478984171977 127.89937008926978 48.249349146422695 48.749337600357094 -170.277 127.89937008926978 128.65395033681978 48.249349146422695 48.749337600357094 -171.277 128.65395033681978 129.4085305843198 48.249349146422695 48.749337600357094 -172.277 129.4085305843198 130.16311083181978 48.249349146422695 48.749337600357094 -173.277 130.16311083181978 130.91769107936977 48.249349146422695 48.749337600357094 -174.277 130.91769107936977 131.67227132691977 48.249349146422695 48.749337600357094 -175.277 131.67227132691977 132.4268515744198 48.249349146422695 48.749337600357094 -176.277 132.4268515744198 133.1814318219698 48.249349146422695 48.749337600357094 -177.277 133.1814318219698 133.9360120695198 48.249349146422695 48.749337600357094 -178.277 133.9360120695198 134.69059231701976 48.249349146422695 48.749337600357094 -179.277 134.69059231701976 135.4451725645198 48.249349146422695 48.749337600357094 -180.277 135.4451725645198 136.1997528120698 48.249349146422695 48.749337600357094 -181.277 136.1997528120698 136.95433305961978 48.249349146422695 48.749337600357094 -182.277 136.95433305961978 137.70891330711976 48.249349146422695 48.749337600357094 -183.277 137.70891330711976 138.46349355466978 48.249349146422695 48.749337600357094 -184.277 138.46349355466978 139.2180738022198 48.249349146422695 48.749337600357094 -185.277 139.2180738022198 139.97265404971978 48.249349146422695 48.749337600357094 -186.277 139.97265404971978 140.72723429721975 48.249349146422695 48.749337600357094 -187.277 140.72723429721975 141.48181454476978 48.249349146422695 48.749337600357094 -188.277 141.48181454476978 142.2363947923198 48.249349146422695 48.749337600357094 -189.277 142.2363947923198 142.99097503981977 48.249349146422695 48.749337600357094 -190.277 142.99097503981977 143.74555528736977 48.249349146422695 48.749337600357094 -191.277 143.74555528736977 144.50013553491976 48.249349146422695 48.749337600357094 -192.277 144.50013553491976 145.2547157824198 48.249349146422695 48.749337600357094 -193.277 145.2547157824198 146.00929602991977 48.249349146422695 48.749337600357094 -194.277 146.00929602991977 146.76387627746976 48.249349146422695 48.749337600357094 -195.277 146.76387627746976 147.51845652501976 48.249349146422695 48.749337600357094 -196.277 147.51845652501976 148.2730367725198 48.249349146422695 48.749337600357094 -197.277 148.2730367725198 149.02761702006978 48.249349146422695 48.749337600357094 -198.277 149.02761702006978 149.78219726761978 48.249349146422695 48.749337600357094 -199.277 149.78219726761978 150.53677751511975 48.249349146422695 48.749337600357094 -200.277 150.53677751511975 151.29135776261975 48.249349146422695 48.749337600357094 -201.277 151.29135776261975 152.04593801016978 48.249349146422695 48.749337600357094 -202.277 152.04593801016978 152.80051825771977 48.249349146422695 48.749337600357094 -203.277 152.80051825771977 153.5550985052198 48.249349146422695 48.749337600357094 -204.277 153.5550985052198 154.30967875271978 48.249349146422695 48.749337600357094 -205.277 154.30967875271978 155.06425900026977 48.249349146422695 48.749337600357094 -206.277 155.06425900026977 155.81883924781977 48.249349146422695 48.749337600357094 -207.277 155.81883924781977 156.5734194953198 48.249349146422695 48.749337600357094 -208.277 156.5734194953198 157.3279997428698 48.249349146422695 48.749337600357094 -209.277 157.3279997428698 158.0825799904198 48.249349146422695 48.749337600357094 -210.277 158.0825799904198 158.83716023791976 48.249349146422695 48.749337600357094 -211.277 158.83716023791976 159.59174048541976 48.249349146422695 48.749337600357094 -212.277 159.59174048541976 160.3463207329698 48.249349146422695 48.749337600357094 -213.277 160.3463207329698 161.10090098051978 48.249349146422695 48.749337600357094 -214.277 161.10090098051978 161.85548122801976 48.249349146422695 48.749337600357094 -215.277 161.85548122801976 162.61006147556975 48.249349146422695 48.749337600357094 -216.277 162.61006147556975 163.3646417231198 48.249349146422695 48.749337600357094 -217.277 163.3646417231198 164.11922197061978 48.249349146422695 48.749337600357094 -218.277 164.11922197061978 164.8738022181198 48.249349146422695 48.749337600357094 -219.277 164.8738022181198 165.6283824656698 48.249349146422695 48.749337600357094 -220.277 165.6283824656698 166.3829627132198 48.249349146422695 48.749337600357094 -221.277 166.3829627132198 167.13754296071977 48.249349146422695 48.749337600357094 -222.277 167.13754296071977 167.89212320826977 48.249349146422695 48.749337600357094 -223.277 167.89212320826977 168.64670345581976 48.249349146422695 48.749337600357094 -224.277 168.64670345581976 169.4012837033198 48.249349146422695 48.749337600357094 -225.277 169.4012837033198 170.15586395081976 48.249349146422695 48.749337600357094 -226.277 170.15586395081976 170.91044419836976 48.249349146422695 48.749337600357094 -227.277 170.91044419836976 171.67711952875172 48.249349146422695 48.749337600357094 -252.277 189.76285530378783 190.5295306341198 48.249349146422695 48.749337600357094 -253.277 190.5295306341198 191.28411088161977 48.249349146422695 48.749337600357094 -254.277 191.28411088161977 192.03869112916976 48.249349146422695 48.749337600357094 -255.277 192.03869112916976 192.79327137671976 48.249349146422695 48.749337600357094 -256.277 192.79327137671976 193.5478516242198 48.249349146422695 48.749337600357094 -257.277 193.5478516242198 194.30243187176978 48.249349146422695 48.749337600357094 -258.277 194.30243187176978 195.05701211931978 48.249349146422695 48.749337600357094 -259.277 195.05701211931978 195.81159236681975 48.249349146422695 48.749337600357094 -260.277 195.81159236681975 196.56617261431978 48.249349146422695 48.749337600357094 -261.277 196.56617261431978 197.32075286186978 48.249349146422695 48.749337600357094 -262.277 197.32075286186978 198.07533310941977 48.249349146422695 48.749337600357094 -263.277 198.07533310941977 198.8299133569198 48.249349146422695 48.749337600357094 -264.277 198.8299133569198 199.5844936044698 48.249349146422695 48.749337600357094 -265.277 199.5844936044698 200.3390738520198 48.249349146422695 48.749337600357094 -266.277 200.3390738520198 201.09365409951977 48.249349146422695 48.749337600357094 -267.277 201.09365409951977 201.84823434701977 48.249349146422695 48.749337600357094 -268.277 201.84823434701977 202.6028145945698 48.249349146422695 48.749337600357094 -269.277 202.6028145945698 203.35739484211976 48.249349146422695 48.749337600357094 -270.277 203.35739484211976 204.11197508961976 48.249349146422695 48.749337600357094 -271.277 204.11197508961976 204.86655533716976 48.249349146422695 48.749337600357094 -272.277 204.86655533716976 205.62113558471975 48.249349146422695 48.749337600357094 -273.277 205.62113558471975 206.37571583221978 48.249349146422695 48.749337600357094 -274.277 206.37571583221978 207.13029607971976 48.249349146422695 48.749337600357094 -275.277 207.13029607971976 207.88487632726978 48.249349146422695 48.749337600357094 -276.277 207.88487632726978 208.63945657481977 48.249349146422695 48.749337600357094 -277.277 208.63945657481977 209.39403682231978 48.249349146422695 48.749337600357094 -278.277 209.39403682231978 210.14861706986977 48.249349146422695 48.749337600357094 -279.277 210.14861706986977 210.90319731741977 48.249349146422695 48.749337600357094 -280.277 210.90319731741977 211.6577775649198 48.249349146422695 48.749337600357094 -281.277 211.6577775649198 212.41235781241977 48.249349146422695 48.749337600357094 -282.277 212.41235781241977 213.16693805996977 48.249349146422695 48.749337600357094 -283.277 213.16693805996977 213.92151830751976 48.249349146422695 48.749337600357094 -284.277 213.92151830751976 214.67609855501976 48.249349146422695 48.749337600357094 -285.277 214.67609855501976 215.43067880256976 48.249349146422695 48.749337600357094 -286.277 215.43067880256976 216.18525905011973 48.249349146422695 48.749337600357094 -287.277 216.18525905011973 216.93983929761976 48.249349146422695 48.749337600357094 -288.277 216.93983929761976 217.69441954511976 48.249349146422695 48.749337600357094 -289.277 217.69441954511976 218.44899979266978 48.249349146422695 48.749337600357094 -290.277 218.44899979266978 219.20358004021978 48.249349146422695 48.749337600357094 -291.277 219.20358004021978 219.95816028771978 48.249349146422695 48.749337600357094 -292.277 219.95816028771978 220.71274053526977 48.249349146422695 48.749337600357094 -293.277 220.71274053526977 221.4673207828198 48.249349146422695 48.749337600357094 -294.277 221.4673207828198 222.22190103031977 48.249349146422695 48.749337600357094 -295.277 222.22190103031977 222.97648127781974 48.249349146422695 48.749337600357094 -296.277 222.97648127781974 223.7310615253698 48.249349146422695 48.749337600357094 -297.277 223.7310615253698 224.48564177291976 48.249349146422695 48.749337600357094 -298.277 224.48564177291976 225.24022202041976 48.249349146422695 48.749337600357094 -299.277 225.24022202041976 225.99480226796976 48.249349146422695 48.749337600357094 -300.277 225.99480226796976 226.74938251551976 48.249349146422695 48.749337600357094 -301.277 226.74938251551976 227.50396276301976 48.249349146422695 48.749337600357094 -302.277 227.50396276301976 228.25854301051976 48.249349146422695 48.749337600357094 -303.277 228.25854301051976 229.01312325806975 48.249349146422695 48.749337600357094 -304.277 229.01312325806975 229.76770350561975 48.249349146422695 48.749337600357094 -305.277 229.76770350561975 230.52228375311978 48.249349146422695 48.749337600357094 -306.277 230.52228375311978 231.27686400066978 48.249349146422695 48.749337600357094 -307.277 231.27686400066978 232.03144424821977 48.249349146422695 48.749337600357094 -308.277 232.03144424821977 232.78602449571974 48.249349146422695 48.749337600357094 -309.277 232.78602449571974 233.5526998260517 48.249349146422695 48.749337600357094 -332.277 250.12927510608785 250.89595043641975 48.249349146422695 48.749337600357094 -333.277 250.89595043641975 251.65053068391975 48.249349146422695 48.749337600357094 -334.277 251.65053068391975 252.40511093146978 48.249349146422695 48.749337600357094 -335.277 252.40511093146978 253.15969117901977 48.249349146422695 48.749337600357094 -336.277 253.15969117901977 253.91427142651978 48.249349146422695 48.749337600357094 -337.277 253.91427142651978 254.66885167401978 48.249349146422695 48.749337600357094 -338.277 254.66885167401978 255.42343192156977 48.249349146422695 48.749337600357094 -339.277 255.42343192156977 256.17801216911977 48.249349146422695 48.749337600357094 -340.277 256.17801216911977 256.93259241661974 48.249349146422695 48.749337600357094 -341.277 256.93259241661974 257.6871726641698 48.249349146422695 48.749337600357094 -342.277 257.6871726641698 258.4417529117198 48.249349146422695 48.749337600357094 -343.277 258.4417529117198 259.19633315921976 48.249349146422695 48.749337600357094 -344.277 259.19633315921976 259.9509134067198 48.249349146422695 48.749337600357094 -345.277 259.9509134067198 260.7054936542698 48.249349146422695 48.749337600357094 -346.277 260.7054936542698 261.4600739018198 48.249349146422695 48.749337600357094 -347.277 261.4600739018198 262.2146541493198 48.249349146422695 48.749337600357094 -348.277 262.2146541493198 262.9692343968698 48.249349146422695 48.749337600357094 -349.277 262.9692343968698 263.7238146444198 48.249349146422695 48.749337600357094 -350.277 263.7238146444198 264.4783948919198 48.249349146422695 48.749337600357094 -351.277 264.4783948919198 265.23297513941975 48.249349146422695 48.749337600357094 -352.277 265.23297513941975 265.9875553869698 48.249349146422695 48.749337600357094 -353.277 265.9875553869698 266.74213563451974 48.249349146422695 48.749337600357094 -354.277 266.74213563451974 267.49671588201977 48.249349146422695 48.749337600357094 -355.277 267.49671588201977 268.25129612956977 48.249349146422695 48.749337600357094 -356.277 268.25129612956977 269.00587637711976 48.249349146422695 48.749337600357094 -357.277 269.00587637711976 269.7604566246198 48.249349146422695 48.749337600357094 -358.277 269.7604566246198 270.51503687211977 48.249349146422695 48.749337600357094 -359.277 270.51503687211977 271.26961711966976 48.249349146422695 48.749337600357094 -360.277 271.26961711966976 272.0241973672198 48.249349146422695 48.749337600357094 -361.277 272.0241973672198 272.7787776147198 48.249349146422695 48.749337600357094 -362.277 272.7787776147198 273.5333578622698 48.249349146422695 48.749337600357094 -363.277 273.5333578622698 274.28793810981983 48.249349146422695 48.749337600357094 -364.277 274.28793810981983 275.04251835731975 48.249349146422695 48.749337600357094 -365.277 275.04251835731975 275.7970986048198 48.249349146422695 48.749337600357094 -366.277 275.7970986048198 276.56377393515174 48.249349146422695 48.749337600357094 -143.278 108.58877890615099 109.3631217344116 48.749337600357094 49.249325822198244 -144.278 109.3631217344116 110.12524827776161 48.749337600357094 49.249325822198244 -145.278 110.12524827776161 110.88737482111162 48.749337600357094 49.249325822198244 -146.278 110.88737482111162 111.64950136446163 48.749337600357094 49.249325822198244 -147.278 111.64950136446163 112.4116279078116 48.749337600357094 49.249325822198244 -148.278 112.4116279078116 113.17375445116163 48.749337600357094 49.249325822198244 -149.278 113.17375445116163 113.93588099451162 48.749337600357094 49.249325822198244 -150.278 113.93588099451162 114.69800753786161 48.749337600357094 49.249325822198244 -151.278 114.69800753786161 115.46013408121163 48.749337600357094 49.249325822198244 -152.278 115.46013408121163 116.22226062456163 48.749337600357094 49.249325822198244 -153.278 116.22226062456163 116.98438716791162 48.749337600357094 49.249325822198244 -154.278 116.98438716791162 117.74651371126163 48.749337600357094 49.249325822198244 -155.278 117.74651371126163 118.50864025466161 48.749337600357094 49.249325822198244 -156.278 118.50864025466161 119.2707667980116 48.749337600357094 49.249325822198244 -157.278 119.2707667980116 120.03289334136161 48.749337600357094 49.249325822198244 -158.278 120.03289334136161 120.79501988471162 48.749337600357094 49.249325822198244 -159.278 120.79501988471162 121.55714642806163 48.749337600357094 49.249325822198244 -160.278 121.55714642806163 122.31927297141162 48.749337600357094 49.249325822198244 -161.278 122.31927297141162 123.08139951476161 48.749337600357094 49.249325822198244 -162.278 123.08139951476161 123.84352605811162 48.749337600357094 49.249325822198244 -163.278 123.84352605811162 124.60565260146163 48.749337600357094 49.249325822198244 -164.278 124.60565260146163 125.36777914481164 48.749337600357094 49.249325822198244 -165.278 125.36777914481164 126.12990568816163 48.749337600357094 49.249325822198244 -166.278 126.12990568816163 126.89203223151162 48.749337600357094 49.249325822198244 -167.278 126.89203223151162 127.65415877486161 48.749337600357094 49.249325822198244 -168.278 127.65415877486161 128.4162853182116 48.749337600357094 49.249325822198244 -169.278 128.4162853182116 129.17841186156164 48.749337600357094 49.249325822198244 -170.278 129.17841186156164 129.94053840491162 48.749337600357094 49.249325822198244 -171.278 129.94053840491162 130.7026649482616 48.749337600357094 49.249325822198244 -172.278 130.7026649482616 131.46479149166163 48.749337600357094 49.249325822198244 -173.278 131.46479149166163 132.22691803501164 48.749337600357094 49.249325822198244 -174.278 132.22691803501164 132.98904457836164 48.749337600357094 49.249325822198244 -175.278 132.98904457836164 133.75117112171162 48.749337600357094 49.249325822198244 -176.278 133.75117112171162 134.5132976650616 48.749337600357094 49.249325822198244 -177.278 134.5132976650616 135.2754242084116 48.749337600357094 49.249325822198244 -178.278 135.2754242084116 136.03755075176161 48.749337600357094 49.249325822198244 -179.278 136.03755075176161 136.79967729511162 48.749337600357094 49.249325822198244 -180.278 136.79967729511162 137.56180383846163 48.749337600357094 49.249325822198244 -181.278 137.56180383846163 138.32393038181164 48.749337600357094 49.249325822198244 -182.278 138.32393038181164 139.08605692516164 48.749337600357094 49.249325822198244 -183.278 139.08605692516164 139.8481834685116 48.749337600357094 49.249325822198244 -184.278 139.8481834685116 140.6103100118616 48.749337600357094 49.249325822198244 -185.278 140.6103100118616 141.3724365552116 48.749337600357094 49.249325822198244 -186.278 141.3724365552116 142.1345630985616 48.749337600357094 49.249325822198244 -187.278 142.1345630985616 142.89668964191162 48.749337600357094 49.249325822198244 -188.278 142.89668964191162 143.6588161852616 48.749337600357094 49.249325822198244 -189.278 143.6588161852616 144.4209427286616 48.749337600357094 49.249325822198244 -190.278 144.4209427286616 145.1830692720116 48.749337600357094 49.249325822198244 -191.278 145.1830692720116 145.94519581536161 48.749337600357094 49.249325822198244 -192.278 145.94519581536161 146.70732235871162 48.749337600357094 49.249325822198244 -193.278 146.70732235871162 147.4694489020616 48.749337600357094 49.249325822198244 -194.278 147.4694489020616 148.23157544541164 48.749337600357094 49.249325822198244 -195.278 148.23157544541164 148.99370198876161 48.749337600357094 49.249325822198244 -196.278 148.99370198876161 149.75582853211162 48.749337600357094 49.249325822198244 -197.278 149.75582853211162 150.51795507546163 48.749337600357094 49.249325822198244 -198.278 150.51795507546163 151.2800816188116 48.749337600357094 49.249325822198244 -199.278 151.2800816188116 152.04220816216161 48.749337600357094 49.249325822198244 -200.278 152.04220816216161 152.80433470551162 48.749337600357094 49.249325822198244 -201.278 152.80433470551162 153.56646124886163 48.749337600357094 49.249325822198244 -202.278 153.56646124886163 154.32858779221164 48.749337600357094 49.249325822198244 -203.278 154.32858779221164 155.09071433556161 48.749337600357094 49.249325822198244 -204.278 155.09071433556161 155.85284087891162 48.749337600357094 49.249325822198244 -205.278 155.85284087891162 156.6149674222616 48.749337600357094 49.249325822198244 -206.278 156.6149674222616 157.3770939656616 48.749337600357094 49.249325822198244 -207.278 157.3770939656616 158.1392205090116 48.749337600357094 49.249325822198244 -208.278 158.1392205090116 158.90134705236161 48.749337600357094 49.249325822198244 -209.278 158.90134705236161 159.66347359571162 48.749337600357094 49.249325822198244 -210.278 159.66347359571162 160.4256001390616 48.749337600357094 49.249325822198244 -211.278 160.4256001390616 161.1877266824116 48.749337600357094 49.249325822198244 -212.278 161.1877266824116 161.94985322576164 48.749337600357094 49.249325822198244 -213.278 161.94985322576164 162.71197976911162 48.749337600357094 49.249325822198244 -214.278 162.71197976911162 163.47410631246163 48.749337600357094 49.249325822198244 -215.278 163.47410631246163 164.23623285581164 48.749337600357094 49.249325822198244 -216.278 164.23623285581164 164.99835939916164 48.749337600357094 49.249325822198244 -217.278 164.99835939916164 165.76048594251162 48.749337600357094 49.249325822198244 -218.278 165.76048594251162 166.5226124858616 48.749337600357094 49.249325822198244 -219.278 166.5226124858616 167.2847390292116 48.749337600357094 49.249325822198244 -220.278 167.2847390292116 168.04686557256161 48.749337600357094 49.249325822198244 -221.278 168.04686557256161 168.80899211591162 48.749337600357094 49.249325822198244 -222.278 168.80899211591162 169.5711186592616 48.749337600357094 49.249325822198244 -223.278 169.5711186592616 170.3332452026616 48.749337600357094 49.249325822198244 -224.278 170.3332452026616 171.0953717460116 48.749337600357094 49.249325822198244 -225.278 171.0953717460116 171.86971457427225 48.749337600357094 49.249325822198244 -250.278 190.13631904485098 190.9106618731616 48.749337600357094 49.249325822198244 -251.278 190.9106618731616 191.6727884165116 48.749337600357094 49.249325822198244 -252.278 191.6727884165116 192.4349149598616 48.749337600357094 49.249325822198244 -253.278 192.4349149598616 193.1970415032116 48.749337600357094 49.249325822198244 -254.278 193.1970415032116 193.95916804656162 48.749337600357094 49.249325822198244 -255.278 193.95916804656162 194.7212945899116 48.749337600357094 49.249325822198244 -256.278 194.7212945899116 195.4834211332616 48.749337600357094 49.249325822198244 -257.278 195.4834211332616 196.24554767661158 48.749337600357094 49.249325822198244 -258.278 196.24554767661158 197.0076742199616 48.749337600357094 49.249325822198244 -259.278 197.0076742199616 197.76980076336162 48.749337600357094 49.249325822198244 -260.278 197.76980076336162 198.5319273067116 48.749337600357094 49.249325822198244 -261.278 198.5319273067116 199.29405385006157 48.749337600357094 49.249325822198244 -262.278 199.29405385006157 200.05618039341158 48.749337600357094 49.249325822198244 -263.278 200.05618039341158 200.8183069367616 48.749337600357094 49.249325822198244 -264.278 200.8183069367616 201.5804334801116 48.749337600357094 49.249325822198244 -265.278 201.5804334801116 202.3425600234616 48.749337600357094 49.249325822198244 -266.278 202.3425600234616 203.1046865668116 48.749337600357094 49.249325822198244 -267.278 203.1046865668116 203.86681311016162 48.749337600357094 49.249325822198244 -268.278 203.86681311016162 204.6289396535116 48.749337600357094 49.249325822198244 -269.278 204.6289396535116 205.3910661968616 48.749337600357094 49.249325822198244 -270.278 205.3910661968616 206.15319274021158 48.749337600357094 49.249325822198244 -271.278 206.15319274021158 206.91531928356162 48.749337600357094 49.249325822198244 -272.278 206.91531928356162 207.6774458269116 48.749337600357094 49.249325822198244 -273.278 207.6774458269116 208.4395723702616 48.749337600357094 49.249325822198244 -274.278 208.4395723702616 209.2016989136116 48.749337600357094 49.249325822198244 -275.278 209.2016989136116 209.96382545696162 48.749337600357094 49.249325822198244 -276.278 209.96382545696162 210.72595200036162 48.749337600357094 49.249325822198244 -277.278 210.72595200036162 211.4880785437116 48.749337600357094 49.249325822198244 -278.278 211.4880785437116 212.2502050870616 48.749337600357094 49.249325822198244 -279.278 212.2502050870616 213.0123316304116 48.749337600357094 49.249325822198244 -280.278 213.0123316304116 213.7744581737616 48.749337600357094 49.249325822198244 -281.278 213.7744581737616 214.5365847171116 48.749337600357094 49.249325822198244 -282.278 214.5365847171116 215.29871126046157 48.749337600357094 49.249325822198244 -283.278 215.29871126046157 216.06083780381164 48.749337600357094 49.249325822198244 -284.278 216.06083780381164 216.82296434716162 48.749337600357094 49.249325822198244 -285.278 216.82296434716162 217.5850908905116 48.749337600357094 49.249325822198244 -286.278 217.5850908905116 218.3472174338616 48.749337600357094 49.249325822198244 -287.278 218.3472174338616 219.1093439772116 48.749337600357094 49.249325822198244 -288.278 219.1093439772116 219.87147052056162 48.749337600357094 49.249325822198244 -289.278 219.87147052056162 220.6335970639116 48.749337600357094 49.249325822198244 -290.278 220.6335970639116 221.39572360726157 48.749337600357094 49.249325822198244 -291.278 221.39572360726157 222.1578501506116 48.749337600357094 49.249325822198244 -292.278 222.1578501506116 222.9199766939616 48.749337600357094 49.249325822198244 -293.278 222.9199766939616 223.68210323736162 48.749337600357094 49.249325822198244 -294.278 223.68210323736162 224.44422978071162 48.749337600357094 49.249325822198244 -295.278 224.44422978071162 225.20635632406157 48.749337600357094 49.249325822198244 -296.278 225.20635632406157 225.96848286741158 48.749337600357094 49.249325822198244 -297.278 225.96848286741158 226.7306094107616 48.749337600357094 49.249325822198244 -298.278 226.7306094107616 227.4927359541116 48.749337600357094 49.249325822198244 -299.278 227.4927359541116 228.2548624974616 48.749337600357094 49.249325822198244 -300.278 228.2548624974616 229.0169890408116 48.749337600357094 49.249325822198244 -301.278 229.0169890408116 229.77911558416162 48.749337600357094 49.249325822198244 -302.278 229.77911558416162 230.5412421275116 48.749337600357094 49.249325822198244 -303.278 230.5412421275116 231.30336867086157 48.749337600357094 49.249325822198244 -304.278 231.30336867086157 232.06549521421158 48.749337600357094 49.249325822198244 -305.278 232.06549521421158 232.8276217575616 48.749337600357094 49.249325822198244 -306.278 232.8276217575616 233.5897483009116 48.749337600357094 49.249325822198244 -307.278 233.5897483009116 234.3640911291722 48.749337600357094 49.249325822198244 -320.278 243.48517707955097 244.2595199078616 48.749337600357094 49.249325822198244 -321.278 244.2595199078616 245.0216464512116 48.749337600357094 49.249325822198244 -322.278 245.0216464512116 245.78377299456162 48.749337600357094 49.249325822198244 -323.278 245.78377299456162 246.54589953791162 48.749337600357094 49.249325822198244 -324.278 246.54589953791162 247.30802608126163 48.749337600357094 49.249325822198244 -325.278 247.30802608126163 248.0701526246116 48.749337600357094 49.249325822198244 -326.278 248.0701526246116 248.8322791679616 48.749337600357094 49.249325822198244 -327.278 248.8322791679616 249.59440571136162 48.749337600357094 49.249325822198244 -328.278 249.59440571136162 250.35653225471162 48.749337600357094 49.249325822198244 -329.278 250.35653225471162 251.11865879806163 48.749337600357094 49.249325822198244 -330.278 251.11865879806163 251.8807853414116 48.749337600357094 49.249325822198244 -331.278 251.8807853414116 252.6429118847616 48.749337600357094 49.249325822198244 -332.278 252.6429118847616 253.4050384281116 48.749337600357094 49.249325822198244 -333.278 253.4050384281116 254.1671649714616 48.749337600357094 49.249325822198244 -334.278 254.1671649714616 254.9292915148116 48.749337600357094 49.249325822198244 -335.278 254.9292915148116 255.69141805816162 48.749337600357094 49.249325822198244 -336.278 255.69141805816162 256.4535446015116 48.749337600357094 49.249325822198244 -337.278 256.4535446015116 257.21567114486163 48.749337600357094 49.249325822198244 -338.278 257.21567114486163 257.9777976882116 48.749337600357094 49.249325822198244 -339.278 257.9777976882116 258.7399242315616 48.749337600357094 49.249325822198244 -340.278 258.7399242315616 259.5020507749116 48.749337600357094 49.249325822198244 -341.278 259.5020507749116 260.2641773182616 48.749337600357094 49.249325822198244 -342.278 260.2641773182616 261.0263038616116 48.749337600357094 49.249325822198244 -343.278 261.0263038616116 261.78843040496156 48.749337600357094 49.249325822198244 -344.278 261.78843040496156 262.5505569483616 48.749337600357094 49.249325822198244 -345.278 262.5505569483616 263.3126834917116 48.749337600357094 49.249325822198244 -346.278 263.3126834917116 264.0748100350616 48.749337600357094 49.249325822198244 -347.278 264.0748100350616 264.8369365784116 48.749337600357094 49.249325822198244 -348.278 264.8369365784116 265.59906312176156 48.749337600357094 49.249325822198244 -349.278 265.59906312176156 266.3611896651116 48.749337600357094 49.249325822198244 -350.278 266.3611896651116 267.1233162084616 48.749337600357094 49.249325822198244 -351.278 267.1233162084616 267.8854427518116 48.749337600357094 49.249325822198244 -352.278 267.8854427518116 268.6475692951616 48.749337600357094 49.249325822198244 -353.278 268.6475692951616 269.4096958385116 48.749337600357094 49.249325822198244 -354.278 269.4096958385116 270.1718223818616 48.749337600357094 49.249325822198244 -355.278 270.1718223818616 270.9339489252116 48.749337600357094 49.249325822198244 -356.278 270.9339489252116 271.6960754685616 48.749337600357094 49.249325822198244 -357.278 271.6960754685616 272.45820201191157 48.749337600357094 49.249325822198244 -358.278 272.45820201191157 273.22032855526163 48.749337600357094 49.249325822198244 -359.278 273.22032855526163 273.9824550986116 48.749337600357094 49.249325822198244 -360.278 273.9824550986116 274.7445816419616 48.749337600357094 49.249325822198244 -361.278 274.7445816419616 275.5067081853616 48.749337600357094 49.249325822198244 -362.278 275.5067081853616 276.2688347287116 48.749337600357094 49.249325822198244 -363.278 276.2688347287116 277.04317755697224 48.749337600357094 49.249325822198244 -141.279 108.15433977717773 108.93656519326953 49.249325822198244 49.74931380302792 -142.279 108.93656519326953 109.70644971486954 49.249325822198244 49.74931380302792 -143.279 109.70644971486954 110.47633423646954 49.249325822198244 49.74931380302792 -144.279 110.47633423646954 111.24621875806953 49.249325822198244 49.74931380302792 -145.279 111.24621875806953 112.01610327966954 49.249325822198244 49.74931380302792 -146.279 112.01610327966954 112.78598780126953 49.249325822198244 49.74931380302792 -147.279 112.78598780126953 113.55587232291953 49.249325822198244 49.74931380302792 -148.279 113.55587232291953 114.32575684456953 49.249325822198244 49.74931380302792 -149.279 114.32575684456953 115.09564136616953 49.249325822198244 49.74931380302792 -150.279 115.09564136616953 115.86552588776954 49.249325822198244 49.74931380302792 -151.279 115.86552588776954 116.63541040936954 49.249325822198244 49.74931380302792 -152.279 116.63541040936954 117.40529493096953 49.249325822198244 49.74931380302792 -153.279 117.40529493096953 118.17517945256954 49.249325822198244 49.74931380302792 -154.279 118.17517945256954 118.94506397416953 49.249325822198244 49.74931380302792 -155.279 118.94506397416953 119.71494849576953 49.249325822198244 49.74931380302792 -156.279 119.71494849576953 120.48483301741953 49.249325822198244 49.74931380302792 -157.279 120.48483301741953 121.25471753906955 49.249325822198244 49.74931380302792 -158.279 121.25471753906955 122.02460206066955 49.249325822198244 49.74931380302792 -159.279 122.02460206066955 122.79448658226954 49.249325822198244 49.74931380302792 -160.279 122.79448658226954 123.56437110386955 49.249325822198244 49.74931380302792 -161.279 123.56437110386955 124.33425562546952 49.249325822198244 49.74931380302792 -162.279 124.33425562546952 125.10414014706953 49.249325822198244 49.74931380302792 -163.279 125.10414014706953 125.87402466866953 49.249325822198244 49.74931380302792 -164.279 125.87402466866953 126.64390919026954 49.249325822198244 49.74931380302792 -165.279 126.64390919026954 127.41379371191954 49.249325822198244 49.74931380302792 -166.279 127.41379371191954 128.18367823356954 49.249325822198244 49.74931380302792 -167.279 128.18367823356954 128.95356275516957 49.249325822198244 49.74931380302792 -168.279 128.95356275516957 129.72344727676955 49.249325822198244 49.74931380302792 -169.279 129.72344727676955 130.49333179836952 49.249325822198244 49.74931380302792 -170.279 130.49333179836952 131.26321631996956 49.249325822198244 49.74931380302792 -171.279 131.26321631996956 132.03310084156954 49.249325822198244 49.74931380302792 -172.279 132.03310084156954 132.80298536316954 49.249325822198244 49.74931380302792 -173.279 132.80298536316954 133.57286988476955 49.249325822198244 49.74931380302792 -174.279 133.57286988476955 134.34275440641954 49.249325822198244 49.74931380302792 -175.279 134.34275440641954 135.11263892806954 49.249325822198244 49.74931380302792 -176.279 135.11263892806954 135.88252344966955 49.249325822198244 49.74931380302792 -177.279 135.88252344966955 136.65240797126955 49.249325822198244 49.74931380302792 -178.279 136.65240797126955 137.42229249286953 49.249325822198244 49.74931380302792 -179.279 137.42229249286953 138.19217701446954 49.249325822198244 49.74931380302792 -180.279 138.19217701446954 138.96206153606954 49.249325822198244 49.74931380302792 -181.279 138.96206153606954 139.73194605766952 49.249325822198244 49.74931380302792 -182.279 139.73194605766952 140.50183057926952 49.249325822198244 49.74931380302792 -183.279 140.50183057926952 141.27171510091955 49.249325822198244 49.74931380302792 -184.279 141.27171510091955 142.04159962256955 49.249325822198244 49.74931380302792 -185.279 142.04159962256955 142.81148414416953 49.249325822198244 49.74931380302792 -186.279 142.81148414416953 143.58136866576956 49.249325822198244 49.74931380302792 -187.279 143.58136866576956 144.35125318736954 49.249325822198244 49.74931380302792 -188.279 144.35125318736954 145.12113770896954 49.249325822198244 49.74931380302792 -189.279 145.12113770896954 145.89102223056955 49.249325822198244 49.74931380302792 -190.279 145.89102223056955 146.66090675216952 49.249325822198244 49.74931380302792 -191.279 146.66090675216952 147.43079127376953 49.249325822198244 49.74931380302792 -192.279 147.43079127376953 148.20067579541956 49.249325822198244 49.74931380302792 -193.279 148.20067579541956 148.97056031706956 49.249325822198244 49.74931380302792 -194.279 148.97056031706956 149.74044483866953 49.249325822198244 49.74931380302792 -195.279 149.74044483866953 150.51032936026954 49.249325822198244 49.74931380302792 -196.279 150.51032936026954 151.28021388186954 49.249325822198244 49.74931380302792 -197.279 151.28021388186954 152.05009840346952 49.249325822198244 49.74931380302792 -198.279 152.05009840346952 152.81998292506952 49.249325822198244 49.74931380302792 -199.279 152.81998292506952 153.58986744666953 49.249325822198244 49.74931380302792 -200.279 153.58986744666953 154.3597519682695 49.249325822198244 49.74931380302792 -201.279 154.3597519682695 155.12963648991953 49.249325822198244 49.74931380302792 -202.279 155.12963648991953 155.89952101156953 49.249325822198244 49.74931380302792 -203.279 155.89952101156953 156.66940553316954 49.249325822198244 49.74931380302792 -204.279 156.66940553316954 157.43929005476954 49.249325822198244 49.74931380302792 -205.279 157.43929005476954 158.20917457636955 49.249325822198244 49.74931380302792 -206.279 158.20917457636955 158.97905909796953 49.249325822198244 49.74931380302792 -207.279 158.97905909796953 159.7489436195695 49.249325822198244 49.74931380302792 -208.279 159.7489436195695 160.51882814116954 49.249325822198244 49.74931380302792 -209.279 160.51882814116954 161.2887126627695 49.249325822198244 49.74931380302792 -210.279 161.2887126627695 162.05859718441954 49.249325822198244 49.74931380302792 -211.279 162.05859718441954 162.82848170606954 49.249325822198244 49.74931380302792 -212.279 162.82848170606954 163.59836622766954 49.249325822198244 49.74931380302792 -213.279 163.59836622766954 164.36825074926952 49.249325822198244 49.74931380302792 -214.279 164.36825074926952 165.1381352708695 49.249325822198244 49.74931380302792 -215.279 165.1381352708695 165.90801979246953 49.249325822198244 49.74931380302792 -216.279 165.90801979246953 166.6779043140695 49.249325822198244 49.74931380302792 -217.279 166.6779043140695 167.44778883566954 49.249325822198244 49.74931380302792 -218.279 167.44778883566954 168.21767335726952 49.249325822198244 49.74931380302792 -219.279 168.21767335726952 168.98755787891952 49.249325822198244 49.74931380302792 -220.279 168.98755787891952 169.75744240056952 49.249325822198244 49.74931380302792 -221.279 169.75744240056952 170.5273269221695 49.249325822198244 49.74931380302792 -222.279 170.5273269221695 171.3095523382613 49.249325822198244 49.74931380302792 -248.279 190.53198358957772 191.31420900566957 49.249325822198244 49.74931380302792 -249.279 191.31420900566957 192.08409352726954 49.249325822198244 49.74931380302792 -250.279 192.08409352726954 192.85397804886952 49.249325822198244 49.74931380302792 -251.279 192.85397804886952 193.62386257046956 49.249325822198244 49.74931380302792 -252.279 193.62386257046956 194.39374709206953 49.249325822198244 49.74931380302792 -253.279 194.39374709206953 195.16363161366954 49.249325822198244 49.74931380302792 -254.279 195.16363161366954 195.93351613531954 49.249325822198244 49.74931380302792 -255.279 195.93351613531954 196.70340065696954 49.249325822198244 49.74931380302792 -256.279 196.70340065696954 197.47328517856954 49.249325822198244 49.74931380302792 -257.279 197.47328517856954 198.24316970016955 49.249325822198244 49.74931380302792 -258.279 198.24316970016955 199.01305422176952 49.249325822198244 49.74931380302792 -259.279 199.01305422176952 199.78293874336953 49.249325822198244 49.74931380302792 -260.279 199.78293874336953 200.55282326496953 49.249325822198244 49.74931380302792 -261.279 200.55282326496953 201.32270778656954 49.249325822198244 49.74931380302792 -262.279 201.32270778656954 202.09259230816957 49.249325822198244 49.74931380302792 -263.279 202.09259230816957 202.86247682981954 49.249325822198244 49.74931380302792 -264.279 202.86247682981954 203.63236135146954 49.249325822198244 49.74931380302792 -265.279 203.63236135146954 204.40224587306955 49.249325822198244 49.74931380302792 -266.279 204.40224587306955 205.17213039466952 49.249325822198244 49.74931380302792 -267.279 205.17213039466952 205.94201491626956 49.249325822198244 49.74931380302792 -268.279 205.94201491626956 206.71189943786953 49.249325822198244 49.74931380302792 -269.279 206.71189943786953 207.48178395946957 49.249325822198244 49.74931380302792 -270.279 207.48178395946957 208.25166848106954 49.249325822198244 49.74931380302792 -271.279 208.25166848106954 209.02155300266952 49.249325822198244 49.74931380302792 -272.279 209.02155300266952 209.79143752431952 49.249325822198244 49.74931380302792 -273.279 209.79143752431952 210.56132204596955 49.249325822198244 49.74931380302792 -274.279 210.56132204596955 211.33120656756955 49.249325822198244 49.74931380302792 -275.279 211.33120656756955 212.10109108916953 49.249325822198244 49.74931380302792 -276.279 212.10109108916953 212.87097561076956 49.249325822198244 49.74931380302792 -277.279 212.87097561076956 213.64086013236954 49.249325822198244 49.74931380302792 -278.279 213.64086013236954 214.41074465396954 49.249325822198244 49.74931380302792 -279.279 214.41074465396954 215.18062917556952 49.249325822198244 49.74931380302792 -280.279 215.18062917556952 215.95051369716953 49.249325822198244 49.74931380302792 -281.279 215.95051369716953 216.72039821881953 49.249325822198244 49.74931380302792 -282.279 216.72039821881953 217.49028274046952 49.249325822198244 49.74931380302792 -283.279 217.49028274046952 218.26016726206953 49.249325822198244 49.74931380302792 -284.279 218.26016726206953 219.03005178366953 49.249325822198244 49.74931380302792 -285.279 219.03005178366953 219.79993630526957 49.249325822198244 49.74931380302792 -286.279 219.79993630526957 220.56982082686952 49.249325822198244 49.74931380302792 -287.279 220.56982082686952 221.33970534846952 49.249325822198244 49.74931380302792 -288.279 221.33970534846952 222.1095898700695 49.249325822198244 49.74931380302792 -289.279 222.1095898700695 222.87947439166953 49.249325822198244 49.74931380302792 -290.279 222.87947439166953 223.64935891331953 49.249325822198244 49.74931380302792 -291.279 223.64935891331953 224.41924343496953 49.249325822198244 49.74931380302792 -292.279 224.41924343496953 225.18912795656954 49.249325822198244 49.74931380302792 -293.279 225.18912795656954 225.95901247816954 49.249325822198244 49.74931380302792 -294.279 225.95901247816954 226.72889699976952 49.249325822198244 49.74931380302792 -295.279 226.72889699976952 227.4987815213695 49.249325822198244 49.74931380302792 -296.279 227.4987815213695 228.26866604296953 49.249325822198244 49.74931380302792 -297.279 228.26866604296953 229.03855056456953 49.249325822198244 49.74931380302792 -298.279 229.03855056456953 229.80843508616954 49.249325822198244 49.74931380302792 -299.279 229.80843508616954 230.5783196078195 49.249325822198244 49.74931380302792 -300.279 230.5783196078195 231.34820412946954 49.249325822198244 49.74931380302792 -301.279 231.34820412946954 232.11808865106957 49.249325822198244 49.74931380302792 -302.279 232.11808865106957 232.88797317266958 49.249325822198244 49.74931380302792 -303.279 232.88797317266958 233.65785769426952 49.249325822198244 49.74931380302792 -304.279 233.65785769426952 234.44008311036134 49.249325822198244 49.74931380302792 -316.279 242.88413105907767 243.66635647516955 49.249325822198244 49.74931380302792 -317.279 243.66635647516955 244.43624099681955 49.249325822198244 49.74931380302792 -318.279 244.43624099681955 245.20612551846955 49.249325822198244 49.74931380302792 -319.279 245.20612551846955 245.97601004006953 49.249325822198244 49.74931380302792 -320.279 245.97601004006953 246.74589456166956 49.249325822198244 49.74931380302792 -321.279 246.74589456166956 247.51577908326954 49.249325822198244 49.74931380302792 -322.279 247.51577908326954 248.28566360486954 49.249325822198244 49.74931380302792 -323.279 248.28566360486954 249.05554812646955 49.249325822198244 49.74931380302792 -324.279 249.05554812646955 249.82543264806952 49.249325822198244 49.74931380302792 -325.279 249.82543264806952 250.5953171696695 49.249325822198244 49.74931380302792 -326.279 250.5953171696695 251.36520169131953 49.249325822198244 49.74931380302792 -327.279 251.36520169131953 252.13508621296955 49.249325822198244 49.74931380302792 -328.279 252.13508621296955 252.90497073456953 49.249325822198244 49.74931380302792 -329.279 252.90497073456953 253.67485525616954 49.249325822198244 49.74931380302792 -330.279 253.67485525616954 254.44473977776954 49.249325822198244 49.74931380302792 -331.279 254.44473977776954 255.21462429936952 49.249325822198244 49.74931380302792 -332.279 255.21462429936952 255.98450882096952 49.249325822198244 49.74931380302792 -333.279 255.98450882096952 256.75439334256953 49.249325822198244 49.74931380302792 -334.279 256.75439334256953 257.52427786416956 49.249325822198244 49.74931380302792 -335.279 257.52427786416956 258.29416238581956 49.249325822198244 49.74931380302792 -336.279 258.29416238581956 259.06404690746956 49.249325822198244 49.74931380302792 -337.279 259.06404690746956 259.83393142906954 49.249325822198244 49.74931380302792 -338.279 259.83393142906954 260.6038159506695 49.249325822198244 49.74931380302792 -339.279 260.6038159506695 261.37370047226955 49.249325822198244 49.74931380302792 -340.279 261.37370047226955 262.1435849938696 49.249325822198244 49.74931380302792 -341.279 262.1435849938696 262.91346951546956 49.249325822198244 49.74931380302792 -342.279 262.91346951546956 263.68335403706953 49.249325822198244 49.74931380302792 -343.279 263.68335403706953 264.45323855866957 49.249325822198244 49.74931380302792 -344.279 264.45323855866957 265.2231230803195 49.249325822198244 49.74931380302792 -345.279 265.2231230803195 265.99300760196957 49.249325822198244 49.74931380302792 -346.279 265.99300760196957 266.76289212356954 49.249325822198244 49.74931380302792 -347.279 266.76289212356954 267.5327766451695 49.249325822198244 49.74931380302792 -348.279 267.5327766451695 268.30266116676955 49.249325822198244 49.74931380302792 -349.279 268.30266116676955 269.0725456883696 49.249325822198244 49.74931380302792 -350.279 269.0725456883696 269.8424302099695 49.249325822198244 49.74931380302792 -351.279 269.8424302099695 270.61231473156954 49.249325822198244 49.74931380302792 -352.279 270.61231473156954 271.3821992531696 49.249325822198244 49.74931380302792 -353.279 271.3821992531696 272.1520837748195 49.249325822198244 49.74931380302792 -354.279 272.1520837748195 272.9219682964696 49.249325822198244 49.74931380302792 -355.279 272.9219682964696 273.69185281806955 49.249325822198244 49.74931380302792 -356.279 273.69185281806955 274.4617373396695 49.249325822198244 49.74931380302792 -357.279 274.4617373396695 275.23162186126956 49.249325822198244 49.74931380302792 -358.279 275.23162186126956 276.00150638286954 49.249325822198244 49.74931380302792 -359.279 276.00150638286954 276.7713909044695 49.249325822198244 49.74931380302792 -360.279 276.7713909044695 277.55361632056133 49.249325822198244 49.74931380302792 -140.280 108.49711378422252 109.28744473406144 49.74931380302792 50.24930153348423 -141.280 109.28744473406144 110.06530664751143 49.74931380302792 50.24930153348423 -142.280 110.06530664751143 110.84316856091144 49.74931380302792 50.24930153348423 -143.280 110.84316856091144 111.62103047431142 49.74931380302792 50.24930153348423 -144.280 111.62103047431142 112.39889238776144 49.74931380302792 50.24930153348423 -145.280 112.39889238776144 113.17675430121143 49.74931380302792 50.24930153348423 -146.280 113.17675430121143 113.95461621461143 49.74931380302792 50.24930153348423 -147.280 113.95461621461143 114.73247812806144 49.74931380302792 50.24930153348423 -148.280 114.73247812806144 115.51034004151144 49.74931380302792 50.24930153348423 -149.280 115.51034004151144 116.28820195491144 49.74931380302792 50.24930153348423 -150.280 116.28820195491144 117.06606386836143 49.74931380302792 50.24930153348423 -151.280 117.06606386836143 117.84392578181144 49.74931380302792 50.24930153348423 -152.280 117.84392578181144 118.62178769521144 49.74931380302792 50.24930153348423 -153.280 118.62178769521144 119.39964960866143 49.74931380302792 50.24930153348423 -154.280 119.39964960866143 120.17751152211144 49.74931380302792 50.24930153348423 -155.280 120.17751152211144 120.95537343551143 49.74931380302792 50.24930153348423 -156.280 120.95537343551143 121.73323534891144 49.74931380302792 50.24930153348423 -157.280 121.73323534891144 122.51109726236143 49.74931380302792 50.24930153348423 -158.280 122.51109726236143 123.28895917581144 49.74931380302792 50.24930153348423 -159.280 123.28895917581144 124.06682108921144 49.74931380302792 50.24930153348423 -160.280 124.06682108921144 124.84468300266144 49.74931380302792 50.24930153348423 -161.280 124.84468300266144 125.62254491611142 49.74931380302792 50.24930153348423 -162.280 125.62254491611142 126.40040682951144 49.74931380302792 50.24930153348423 -163.280 126.40040682951144 127.17826874296145 49.74931380302792 50.24930153348423 -164.280 127.17826874296145 127.95613065641143 49.74931380302792 50.24930153348423 -165.280 127.95613065641143 128.73399256981145 49.74931380302792 50.24930153348423 -166.280 128.73399256981145 129.51185448321144 49.74931380302792 50.24930153348423 -167.280 129.51185448321144 130.28971639666145 49.74931380302792 50.24930153348423 -168.280 130.28971639666145 131.06757831011143 49.74931380302792 50.24930153348423 -169.280 131.06757831011143 131.85790925990034 49.74931380302792 50.24930153348423 -194.280 150.50165710952248 151.29198805931145 49.74931380302792 50.24930153348423 -195.280 151.29198805931145 152.06984997271144 49.74931380302792 50.24930153348423 -196.280 152.06984997271144 152.84771188616142 49.74931380302792 50.24930153348423 -197.280 152.84771188616142 153.62557379961143 49.74931380302792 50.24930153348423 -198.280 153.62557379961143 154.40343571301145 49.74931380302792 50.24930153348423 -199.280 154.40343571301145 155.18129762641144 49.74931380302792 50.24930153348423 -200.280 155.18129762641144 155.95915953986142 49.74931380302792 50.24930153348423 -201.280 155.95915953986142 156.73702145331143 49.74931380302792 50.24930153348423 -202.280 156.73702145331143 157.51488336671144 49.74931380302792 50.24930153348423 -203.280 157.51488336671144 158.29274528016145 49.74931380302792 50.24930153348423 -204.280 158.29274528016145 159.0706071936114 49.74931380302792 50.24930153348423 -205.280 159.0706071936114 159.84846910701143 49.74931380302792 50.24930153348423 -206.280 159.84846910701143 160.62633102046144 49.74931380302792 50.24930153348423 -207.280 160.62633102046144 161.41666197030037 49.74931380302792 50.24930153348423 -246.280 190.95047660782248 191.7408075576614 49.74931380302792 50.24930153348423 -247.280 191.7408075576614 192.51866947111142 49.74931380302792 50.24930153348423 -248.280 192.51866947111142 193.29653138451144 49.74931380302792 50.24930153348423 -249.280 193.29653138451144 194.07439329796142 49.74931380302792 50.24930153348423 -250.280 194.07439329796142 194.85225521141143 49.74931380302792 50.24930153348423 -251.280 194.85225521141143 195.63011712481142 49.74931380302792 50.24930153348423 -252.280 195.63011712481142 196.40797903821144 49.74931380302792 50.24930153348423 -253.280 196.40797903821144 197.18584095166142 49.74931380302792 50.24930153348423 -254.280 197.18584095166142 197.96370286511143 49.74931380302792 50.24930153348423 -255.280 197.96370286511143 198.74156477851142 49.74931380302792 50.24930153348423 -256.280 198.74156477851142 199.51942669196146 49.74931380302792 50.24930153348423 -257.280 199.51942669196146 200.29728860541144 49.74931380302792 50.24930153348423 -258.280 200.29728860541144 201.07515051881143 49.74931380302792 50.24930153348423 -259.280 201.07515051881143 201.8530124322614 49.74931380302792 50.24930153348423 -260.280 201.8530124322614 202.63087434571145 49.74931380302792 50.24930153348423 -261.280 202.63087434571145 203.40873625911144 49.74931380302792 50.24930153348423 -262.280 203.40873625911144 204.18659817251142 49.74931380302792 50.24930153348423 -263.280 204.18659817251142 204.9644600859614 49.74931380302792 50.24930153348423 -264.280 204.9644600859614 205.74232199941142 49.74931380302792 50.24930153348423 -265.280 205.74232199941142 206.52018391281143 49.74931380302792 50.24930153348423 -266.280 206.52018391281143 207.2980458262614 49.74931380302792 50.24930153348423 -267.280 207.2980458262614 208.0759077397114 49.74931380302792 50.24930153348423 -268.280 208.0759077397114 208.85376965311139 49.74931380302792 50.24930153348423 -269.280 208.85376965311139 209.63163156656142 49.74931380302792 50.24930153348423 -270.280 209.63163156656142 210.4094934800114 49.74931380302792 50.24930153348423 -271.280 210.4094934800114 211.18735539341142 49.74931380302792 50.24930153348423 -272.280 211.18735539341142 211.96521730681144 49.74931380302792 50.24930153348423 -273.280 211.96521730681144 212.74307922026142 49.74931380302792 50.24930153348423 -274.280 212.74307922026142 213.5209411337114 49.74931380302792 50.24930153348423 -275.280 213.5209411337114 214.29880304711145 49.74931380302792 50.24930153348423 -276.280 214.29880304711145 215.07666496056143 49.74931380302792 50.24930153348423 -277.280 215.07666496056143 215.8545268740114 49.74931380302792 50.24930153348423 -278.280 215.8545268740114 216.6323887874114 49.74931380302792 50.24930153348423 -279.280 216.6323887874114 217.4102507008614 49.74931380302792 50.24930153348423 -280.280 217.4102507008614 218.18811261431142 49.74931380302792 50.24930153348423 -281.280 218.18811261431142 218.9659745277114 49.74931380302792 50.24930153348423 -282.280 218.9659745277114 219.7438364411114 49.74931380302792 50.24930153348423 -283.280 219.7438364411114 220.5216983545614 49.74931380302792 50.24930153348423 -284.280 220.5216983545614 221.29956026801142 49.74931380302792 50.24930153348423 -285.280 221.29956026801142 222.07742218141144 49.74931380302792 50.24930153348423 -286.280 222.07742218141144 222.85528409486142 49.74931380302792 50.24930153348423 -287.280 222.85528409486142 223.6331460083114 49.74931380302792 50.24930153348423 -288.280 223.6331460083114 224.41100792171142 49.74931380302792 50.24930153348423 -289.280 224.41100792171142 225.18886983516143 49.74931380302792 50.24930153348423 -290.280 225.18886983516143 225.9667317486114 49.74931380302792 50.24930153348423 -291.280 225.9667317486114 226.74459366201143 49.74931380302792 50.24930153348423 -292.280 226.74459366201143 227.5224555754114 49.74931380302792 50.24930153348423 -293.280 227.5224555754114 228.30031748886142 49.74931380302792 50.24930153348423 -294.280 228.30031748886142 229.0781794023114 49.74931380302792 50.24930153348423 -295.280 229.0781794023114 229.85604131571142 49.74931380302792 50.24930153348423 -296.280 229.85604131571142 230.63390322916143 49.74931380302792 50.24930153348423 -297.280 230.63390322916143 231.41176514261142 49.74931380302792 50.24930153348423 -298.280 231.41176514261142 232.18962705601143 49.74931380302792 50.24930153348423 -299.280 232.18962705601143 232.96748896946139 49.74931380302792 50.24930153348423 -300.280 232.96748896946139 233.7453508829114 49.74931380302792 50.24930153348423 -301.280 233.7453508829114 234.5232127963114 49.74931380302792 50.24930153348423 -302.280 234.5232127963114 235.31354374610035 49.74931380302792 50.24930153348423 -313.280 243.06722480772248 243.8575557575114 49.74931380302792 50.24930153348423 -314.280 243.8575557575114 244.6354176709114 49.74931380302792 50.24930153348423 -315.280 244.6354176709114 245.4132795843114 49.74931380302792 50.24930153348423 -316.280 245.4132795843114 246.1911414977614 49.74931380302792 50.24930153348423 -317.280 246.1911414977614 246.96900341121142 49.74931380302792 50.24930153348423 -318.280 246.96900341121142 247.7468653246114 49.74931380302792 50.24930153348423 -319.280 247.7468653246114 248.52472723806142 49.74931380302792 50.24930153348423 -320.280 248.52472723806142 249.3025891515114 49.74931380302792 50.24930153348423 -321.280 249.3025891515114 250.08045106491141 49.74931380302792 50.24930153348423 -322.280 250.08045106491141 250.85831297836143 49.74931380302792 50.24930153348423 -323.280 250.85831297836143 251.6361748918114 49.74931380302792 50.24930153348423 -324.280 251.6361748918114 252.41403680521142 49.74931380302792 50.24930153348423 -325.280 252.41403680521142 253.19189871861144 49.74931380302792 50.24930153348423 -326.280 253.19189871861144 253.96976063206142 49.74931380302792 50.24930153348423 -327.280 253.96976063206142 254.74762254551143 49.74931380302792 50.24930153348423 -328.280 254.74762254551143 255.52548445891142 49.74931380302792 50.24930153348423 -329.280 255.52548445891142 256.30334637236143 49.74931380302792 50.24930153348423 -330.280 256.30334637236143 257.0812082858114 49.74931380302792 50.24930153348423 -331.280 257.0812082858114 257.85907019921143 49.74931380302792 50.24930153348423 -332.280 257.85907019921143 258.63693211266144 49.74931380302792 50.24930153348423 -333.280 258.63693211266144 259.4147940261114 49.74931380302792 50.24930153348423 -334.280 259.4147940261114 260.1926559395114 49.74931380302792 50.24930153348423 -335.280 260.1926559395114 260.9705178529114 49.74931380302792 50.24930153348423 -336.280 260.9705178529114 261.74837976636144 49.74931380302792 50.24930153348423 -337.280 261.74837976636144 262.52624167981145 49.74931380302792 50.24930153348423 -338.280 262.52624167981145 263.30410359321144 49.74931380302792 50.24930153348423 -339.280 263.30410359321144 264.0819655066614 49.74931380302792 50.24930153348423 -340.280 264.0819655066614 264.8598274201114 49.74931380302792 50.24930153348423 -341.280 264.8598274201114 265.6376893335114 49.74931380302792 50.24930153348423 -342.280 265.6376893335114 266.4155512469614 49.74931380302792 50.24930153348423 -343.280 266.4155512469614 267.1934131604114 49.74931380302792 50.24930153348423 -344.280 267.1934131604114 267.9712750738114 49.74931380302792 50.24930153348423 -345.280 267.9712750738114 268.7491369872614 49.74931380302792 50.24930153348423 -346.280 268.7491369872614 269.5269989007114 49.74931380302792 50.24930153348423 -347.280 269.5269989007114 270.3048608141114 49.74931380302792 50.24930153348423 -348.280 270.3048608141114 271.08272272751145 49.74931380302792 50.24930153348423 -349.280 271.08272272751145 271.8605846409614 49.74931380302792 50.24930153348423 -350.280 271.8605846409614 272.6384465544114 49.74931380302792 50.24930153348423 -351.280 272.6384465544114 273.4163084678114 49.74931380302792 50.24930153348423 -352.280 273.4163084678114 274.1941703812614 49.74931380302792 50.24930153348423 -353.280 274.1941703812614 274.9720322947114 49.74931380302792 50.24930153348423 -354.280 274.9720322947114 275.7498942081114 49.74931380302792 50.24930153348423 -355.280 275.7498942081114 276.5277561215614 49.74931380302792 50.24930153348423 -356.280 276.5277561215614 277.30561803501143 49.74931380302792 50.24930153348423 -357.280 277.30561803501143 278.0959489848004 49.74931380302792 50.24930153348423 -138.281 108.06937458184004 108.86804226912014 50.24930153348423 50.74928900373321 -139.281 108.86804226912014 109.65410911447015 50.24930153348423 50.74928900373321 -140.281 109.65410911447015 110.44017595977014 50.24930153348423 50.74928900373321 -141.281 110.44017595977014 111.22624280512015 50.24930153348423 50.74928900373321 -142.281 111.22624280512015 112.01230965047016 50.24930153348423 50.74928900373321 -143.281 112.01230965047016 112.79837649577016 50.24930153348423 50.74928900373321 -144.281 112.79837649577016 113.58444334112016 50.24930153348423 50.74928900373321 -145.281 113.58444334112016 114.37051018647017 50.24930153348423 50.74928900373321 -146.281 114.37051018647017 115.15657703177015 50.24930153348423 50.74928900373321 -147.281 115.15657703177015 115.94264387712016 50.24930153348423 50.74928900373321 -148.281 115.94264387712016 116.72871072247017 50.24930153348423 50.74928900373321 -149.281 116.72871072247017 117.51477756777015 50.24930153348423 50.74928900373321 -150.281 117.51477756777015 118.30084441312015 50.24930153348423 50.74928900373321 -151.281 118.30084441312015 119.08691125847015 50.24930153348423 50.74928900373321 -152.281 119.08691125847015 119.87297810377015 50.24930153348423 50.74928900373321 -153.281 119.87297810377015 120.65904494912016 50.24930153348423 50.74928900373321 -154.281 120.65904494912016 121.44511179447015 50.24930153348423 50.74928900373321 -155.281 121.44511179447015 122.23117863977015 50.24930153348423 50.74928900373321 -156.281 122.23117863977015 123.01724548512016 50.24930153348423 50.74928900373321 -157.281 123.01724548512016 123.80331233047016 50.24930153348423 50.74928900373321 -158.281 123.80331233047016 124.58937917582016 50.24930153348423 50.74928900373321 -159.281 124.58937917582016 125.37544602117015 50.24930153348423 50.74928900373321 -160.281 125.37544602117015 126.16151286647013 50.24930153348423 50.74928900373321 -161.281 126.16151286647013 126.94757971182014 50.24930153348423 50.74928900373321 -162.281 126.94757971182014 127.73364655717015 50.24930153348423 50.74928900373321 -163.281 127.73364655717015 128.51971340247016 50.24930153348423 50.74928900373321 -164.281 128.51971340247016 129.30578024782017 50.24930153348423 50.74928900373321 -165.281 129.30578024782017 130.09184709317014 50.24930153348423 50.74928900373321 -166.281 130.09184709317014 130.87791393847016 50.24930153348423 50.74928900373321 -167.281 130.87791393847016 131.66398078382014 50.24930153348423 50.74928900373321 -168.281 131.66398078382014 132.46264847110027 50.24930153348423 50.74928900373321 -193.281 151.30305107524003 152.1017187625202 50.24930153348423 50.74928900373321 -194.281 152.1017187625202 152.88778560787017 50.24930153348423 50.74928900373321 -195.281 152.88778560787017 153.67385245317013 50.24930153348423 50.74928900373321 -196.281 153.67385245317013 154.45991929852016 50.24930153348423 50.74928900373321 -197.281 154.45991929852016 155.24598614387014 50.24930153348423 50.74928900373321 -198.281 155.24598614387014 156.03205298922012 50.24930153348423 50.74928900373321 -199.281 156.03205298922012 156.81811983457015 50.24930153348423 50.74928900373321 -200.281 156.81811983457015 157.60418667987017 50.24930153348423 50.74928900373321 -201.281 157.60418667987017 158.39025352522015 50.24930153348423 50.74928900373321 -202.281 158.39025352522015 159.17632037057015 50.24930153348423 50.74928900373321 -203.281 159.17632037057015 159.96238721587014 50.24930153348423 50.74928900373321 -204.281 159.96238721587014 160.74845406122017 50.24930153348423 50.74928900373321 -205.281 160.74845406122017 161.54712174850027 50.24930153348423 50.74928900373321 -252.281 197.68099495004003 198.4796626372701 50.24930153348423 50.74928900373321 -253.281 198.4796626372701 199.26572948262012 50.24930153348423 50.74928900373321 -254.281 199.26572948262012 200.06439716990022 50.24930153348423 50.74928900373321 -256.281 200.82526233134004 201.62393001862017 50.24930153348423 50.74928900373321 -257.281 201.62393001862017 202.40999686397015 50.24930153348423 50.74928900373321 -258.281 202.40999686397015 203.19606370927016 50.24930153348423 50.74928900373321 -259.281 203.19606370927016 203.98213055462014 50.24930153348423 50.74928900373321 -260.281 203.98213055462014 204.76819739997012 50.24930153348423 50.74928900373321 -261.281 204.76819739997012 205.5542642453201 50.24930153348423 50.74928900373321 -262.281 205.5542642453201 206.34033109067013 50.24930153348423 50.74928900373321 -263.281 206.34033109067013 207.12639793597015 50.24930153348423 50.74928900373321 -264.281 207.12639793597015 207.91246478132015 50.24930153348423 50.74928900373321 -265.281 207.91246478132015 208.69853162667016 50.24930153348423 50.74928900373321 -266.281 208.69853162667016 209.48459847197014 50.24930153348423 50.74928900373321 -267.281 209.48459847197014 210.27066531732012 50.24930153348423 50.74928900373321 -268.281 210.27066531732012 211.05673216267013 50.24930153348423 50.74928900373321 -269.281 211.05673216267013 211.84279900797014 50.24930153348423 50.74928900373321 -270.281 211.84279900797014 212.62886585332012 50.24930153348423 50.74928900373321 -271.281 212.62886585332012 213.41493269867016 50.24930153348423 50.74928900373321 -272.281 213.41493269867016 214.20099954397014 50.24930153348423 50.74928900373321 -273.281 214.20099954397014 214.98706638932015 50.24930153348423 50.74928900373321 -274.281 214.98706638932015 215.77313323467013 50.24930153348423 50.74928900373321 -275.281 215.77313323467013 216.55920007997014 50.24930153348423 50.74928900373321 -276.281 216.55920007997014 217.34526692532012 50.24930153348423 50.74928900373321 -277.281 217.34526692532012 218.13133377067012 50.24930153348423 50.74928900373321 -278.281 218.13133377067012 218.91740061597017 50.24930153348423 50.74928900373321 -279.281 218.91740061597017 219.70346746132014 50.24930153348423 50.74928900373321 -280.281 219.70346746132014 220.48953430667012 50.24930153348423 50.74928900373321 -281.281 220.48953430667012 221.27560115202016 50.24930153348423 50.74928900373321 -282.281 221.27560115202016 222.06166799737014 50.24930153348423 50.74928900373321 -283.281 222.06166799737014 222.84773484267015 50.24930153348423 50.74928900373321 -284.281 222.84773484267015 223.63380168802013 50.24930153348423 50.74928900373321 -285.281 223.63380168802013 224.41986853337013 50.24930153348423 50.74928900373321 -286.281 224.41986853337013 225.20593537867015 50.24930153348423 50.74928900373321 -287.281 225.20593537867015 225.99200222402015 50.24930153348423 50.74928900373321 -288.281 225.99200222402015 226.77806906937013 50.24930153348423 50.74928900373321 -289.281 226.77806906937013 227.56413591467015 50.24930153348423 50.74928900373321 -290.281 227.56413591467015 228.35020276002012 50.24930153348423 50.74928900373321 -291.281 228.35020276002012 229.13626960537016 50.24930153348423 50.74928900373321 -292.281 229.13626960537016 229.92233645067014 50.24930153348423 50.74928900373321 -293.281 229.92233645067014 230.70840329602015 50.24930153348423 50.74928900373321 -294.281 230.70840329602015 231.49447014137016 50.24930153348423 50.74928900373321 -295.281 231.49447014137016 232.28053698667014 50.24930153348423 50.74928900373321 -296.281 232.28053698667014 233.06660383202012 50.24930153348423 50.74928900373321 -297.281 233.06660383202012 233.85267067737016 50.24930153348423 50.74928900373321 -298.281 233.85267067737016 234.63873752267017 50.24930153348423 50.74928900373321 -299.281 234.63873752267017 235.42480436802015 50.24930153348423 50.74928900373321 -300.281 235.42480436802015 236.22347205530025 50.24930153348423 50.74928900373321 -310.281 243.27287197944 244.07153966672013 50.24930153348423 50.74928900373321 -311.281 244.07153966672013 244.85760651207013 50.24930153348423 50.74928900373321 -312.281 244.85760651207013 245.64367335737012 50.24930153348423 50.74928900373321 -313.281 245.64367335737012 246.42974020272015 50.24930153348423 50.74928900373321 -314.281 246.42974020272015 247.21580704807013 50.24930153348423 50.74928900373321 -315.281 247.21580704807013 248.00187389337015 50.24930153348423 50.74928900373321 -316.281 248.00187389337015 248.78794073872012 50.24930153348423 50.74928900373321 -317.281 248.78794073872012 249.57400758407016 50.24930153348423 50.74928900373321 -318.281 249.57400758407016 250.36007442937012 50.24930153348423 50.74928900373321 -319.281 250.36007442937012 251.1461412747201 50.24930153348423 50.74928900373321 -320.281 251.1461412747201 251.93220812007013 50.24930153348423 50.74928900373321 -321.281 251.93220812007013 252.7182749653701 50.24930153348423 50.74928900373321 -322.281 252.7182749653701 253.50434181072012 50.24930153348423 50.74928900373321 -323.281 253.50434181072012 254.29040865607013 50.24930153348423 50.74928900373321 -324.281 254.29040865607013 255.07647550142013 50.24930153348423 50.74928900373321 -325.281 255.07647550142013 255.86254234677014 50.24930153348423 50.74928900373321 -326.281 255.86254234677014 256.6486091920701 50.24930153348423 50.74928900373321 -327.281 256.6486091920701 257.43467603742016 50.24930153348423 50.74928900373321 -328.281 257.43467603742016 258.22074288277014 50.24930153348423 50.74928900373321 -329.281 258.22074288277014 259.00680972807015 50.24930153348423 50.74928900373321 -330.281 259.00680972807015 259.79287657342013 50.24930153348423 50.74928900373321 -331.281 259.79287657342013 260.5789434187701 50.24930153348423 50.74928900373321 -332.281 260.5789434187701 261.3650102640701 50.24930153348423 50.74928900373321 -333.281 261.3650102640701 262.1510771094201 50.24930153348423 50.74928900373321 -334.281 262.1510771094201 262.93714395477014 50.24930153348423 50.74928900373321 -335.281 262.93714395477014 263.7232108000702 50.24930153348423 50.74928900373321 -336.281 263.7232108000702 264.5092776454202 50.24930153348423 50.74928900373321 -337.281 264.5092776454202 265.29534449077016 50.24930153348423 50.74928900373321 -338.281 265.29534449077016 266.0814113360701 50.24930153348423 50.74928900373321 -339.281 266.0814113360701 266.86747818142015 50.24930153348423 50.74928900373321 -340.281 266.86747818142015 267.6535450267702 50.24930153348423 50.74928900373321 -341.281 267.6535450267702 268.43961187207015 50.24930153348423 50.74928900373321 -342.281 268.43961187207015 269.2256787174202 50.24930153348423 50.74928900373321 -343.281 269.2256787174202 270.01174556277016 50.24930153348423 50.74928900373321 -344.281 270.01174556277016 270.79781240812014 50.24930153348423 50.74928900373321 -345.281 270.79781240812014 271.5838792534701 50.24930153348423 50.74928900373321 -346.281 271.5838792534701 272.36994609877013 50.24930153348423 50.74928900373321 -347.281 272.36994609877013 273.1560129441201 50.24930153348423 50.74928900373321 -348.281 273.1560129441201 273.94207978947014 50.24930153348423 50.74928900373321 -349.281 273.94207978947014 274.7281466347701 50.24930153348423 50.74928900373321 -350.281 274.7281466347701 275.5142134801201 50.24930153348423 50.74928900373321 -351.281 275.5142134801201 276.3002803254701 50.24930153348423 50.74928900373321 -352.281 276.3002803254701 277.0863471707702 50.24930153348423 50.74928900373321 -353.281 277.0863471707702 277.88501485800026 50.24930153348423 50.74928900373321 -136.282 107.64079934402825 108.44804365779106 50.74928900373321 51.24927620343834 -137.282 108.44804365779106 109.24255152229108 50.74928900373321 51.24927620343834 -138.282 109.24255152229108 110.0370593868411 50.74928900373321 51.24927620343834 -139.282 110.0370593868411 110.83156725139108 50.74928900373321 51.24927620343834 -140.282 110.83156725139108 111.62607511589108 50.74928900373321 51.24927620343834 -141.282 111.62607511589108 112.42058298044108 50.74928900373321 51.24927620343834 -142.282 112.42058298044108 113.21509084499107 50.74928900373321 51.24927620343834 -143.282 113.21509084499107 114.00959870949109 50.74928900373321 51.24927620343834 -144.282 114.00959870949109 114.80410657404107 50.74928900373321 51.24927620343834 -145.282 114.80410657404107 115.59861443859107 50.74928900373321 51.24927620343834 -146.282 115.59861443859107 116.39312230309108 50.74928900373321 51.24927620343834 -147.282 116.39312230309108 117.18763016764109 50.74928900373321 51.24927620343834 -148.282 117.18763016764109 117.98213803219109 50.74928900373321 51.24927620343834 -149.282 117.98213803219109 118.77664589669108 50.74928900373321 51.24927620343834 -150.282 118.77664589669108 119.57115376124108 50.74928900373321 51.24927620343834 -151.282 119.57115376124108 120.36566162579108 50.74928900373321 51.24927620343834 -152.282 120.36566162579108 121.16016949029108 50.74928900373321 51.24927620343834 -153.282 121.16016949029108 121.95467735484108 50.74928900373321 51.24927620343834 -154.282 121.95467735484108 122.74918521939108 50.74928900373321 51.24927620343834 -155.282 122.74918521939108 123.54369308389109 50.74928900373321 51.24927620343834 -156.282 123.54369308389109 124.33820094844108 50.74928900373321 51.24927620343834 -157.282 124.33820094844108 125.13270881299108 50.74928900373321 51.24927620343834 -158.282 125.13270881299108 125.92721667749107 50.74928900373321 51.24927620343834 -159.282 125.92721667749107 126.72172454204107 50.74928900373321 51.24927620343834 -160.282 126.72172454204107 127.51623240659109 50.74928900373321 51.24927620343834 -161.282 127.51623240659109 128.31074027109105 50.74928900373321 51.24927620343834 -162.282 128.31074027109105 129.10524813564106 50.74928900373321 51.24927620343834 -163.282 129.10524813564106 129.89975600019108 50.74928900373321 51.24927620343834 -164.282 129.89975600019108 130.69426386469107 50.74928900373321 51.24927620343834 -165.282 130.69426386469107 131.48877172924108 50.74928900373321 51.24927620343834 -166.282 131.48877172924108 132.2960160430539 50.74928900373321 51.24927620343834 -191.282 151.33873189332826 152.14597620709108 50.74928900373321 51.24927620343834 -192.282 152.14597620709108 152.94048407159107 50.74928900373321 51.24927620343834 -193.282 152.94048407159107 153.73499193614106 50.74928900373321 51.24927620343834 -194.282 153.73499193614106 154.52949980069107 50.74928900373321 51.24927620343834 -195.282 154.52949980069107 155.3240076651911 50.74928900373321 51.24927620343834 -196.282 155.3240076651911 156.1185155297411 50.74928900373321 51.24927620343834 -197.282 156.1185155297411 156.9130233942911 50.74928900373321 51.24927620343834 -198.282 156.9130233942911 157.70753125879108 50.74928900373321 51.24927620343834 -199.282 157.70753125879108 158.5020391233411 50.74928900373321 51.24927620343834 -200.282 158.5020391233411 159.29654698789108 50.74928900373321 51.24927620343834 -201.282 159.29654698789108 160.0910548523911 50.74928900373321 51.24927620343834 -202.282 160.0910548523911 160.88556271694108 50.74928900373321 51.24927620343834 -203.282 160.88556271694108 161.69280703075393 50.74928900373321 51.24927620343834 -243.282 192.65314084902826 193.46038516279108 50.74928900373321 51.24927620343834 -244.282 193.46038516279108 194.2548930273411 50.74928900373321 51.24927620343834 -245.282 194.2548930273411 195.04940089189108 50.74928900373321 51.24927620343834 -246.282 195.04940089189108 195.8439087563911 50.74928900373321 51.24927620343834 -247.282 195.8439087563911 196.6384166209411 50.74928900373321 51.24927620343834 -248.282 196.6384166209411 197.43292448549107 50.74928900373321 51.24927620343834 -249.282 197.43292448549107 198.2274323499911 50.74928900373321 51.24927620343834 -250.282 198.2274323499911 199.02194021454108 50.74928900373321 51.24927620343834 -251.282 199.02194021454108 199.8164480790911 50.74928900373321 51.24927620343834 -252.282 199.8164480790911 200.61095594359108 50.74928900373321 51.24927620343834 -253.282 200.61095594359108 201.40546380814106 50.74928900373321 51.24927620343834 -254.282 201.40546380814106 202.19997167269108 50.74928900373321 51.24927620343834 -255.282 202.19997167269108 202.99447953719107 50.74928900373321 51.24927620343834 -256.282 202.99447953719107 203.7889874016911 50.74928900373321 51.24927620343834 -257.282 203.7889874016911 204.58349526624107 50.74928900373321 51.24927620343834 -258.282 204.58349526624107 205.3780031307911 50.74928900373321 51.24927620343834 -259.282 205.3780031307911 206.17251099529108 50.74928900373321 51.24927620343834 -260.282 206.17251099529108 206.96701885984106 50.74928900373321 51.24927620343834 -261.282 206.96701885984106 207.7615267243911 50.74928900373321 51.24927620343834 -262.282 207.7615267243911 208.55603458889107 50.74928900373321 51.24927620343834 -263.282 208.55603458889107 209.35054245344105 50.74928900373321 51.24927620343834 -264.282 209.35054245344105 210.1450503179911 50.74928900373321 51.24927620343834 -265.282 210.1450503179911 210.93955818249108 50.74928900373321 51.24927620343834 -266.282 210.93955818249108 211.7340660470411 50.74928900373321 51.24927620343834 -267.282 211.7340660470411 212.52857391159108 50.74928900373321 51.24927620343834 -268.282 212.52857391159108 213.32308177609107 50.74928900373321 51.24927620343834 -269.282 213.32308177609107 214.11758964064106 50.74928900373321 51.24927620343834 -270.282 214.11758964064106 214.91209750519107 50.74928900373321 51.24927620343834 -271.282 214.91209750519107 215.70660536969106 50.74928900373321 51.24927620343834 -272.282 215.70660536969106 216.50111323424107 50.74928900373321 51.24927620343834 -273.282 216.50111323424107 217.2956210987911 50.74928900373321 51.24927620343834 -274.282 217.2956210987911 218.09012896329108 50.74928900373321 51.24927620343834 -275.282 218.09012896329108 218.88463682784106 50.74928900373321 51.24927620343834 -276.282 218.88463682784106 219.67914469239108 50.74928900373321 51.24927620343834 -277.282 219.67914469239108 220.47365255689107 50.74928900373321 51.24927620343834 -278.282 220.47365255689107 221.26816042144108 50.74928900373321 51.24927620343834 -279.282 221.26816042144108 222.0626682859911 50.74928900373321 51.24927620343834 -280.282 222.0626682859911 222.85717615049106 50.74928900373321 51.24927620343834 -281.282 222.85717615049106 223.65168401504107 50.74928900373321 51.24927620343834 -282.282 223.65168401504107 224.44619187959108 50.74928900373321 51.24927620343834 -283.282 224.44619187959108 225.2406997440911 50.74928900373321 51.24927620343834 -284.282 225.2406997440911 226.0352076086411 50.74928900373321 51.24927620343834 -285.282 226.0352076086411 226.82971547319107 50.74928900373321 51.24927620343834 -286.282 226.82971547319107 227.6242233376911 50.74928900373321 51.24927620343834 -287.282 227.6242233376911 228.41873120224108 50.74928900373321 51.24927620343834 -288.282 228.41873120224108 229.21323906679112 50.74928900373321 51.24927620343834 -289.282 229.21323906679112 230.00774693129108 50.74928900373321 51.24927620343834 -290.282 230.00774693129108 230.80225479584107 50.74928900373321 51.24927620343834 -291.282 230.80225479584107 231.59676266039108 50.74928900373321 51.24927620343834 -292.282 231.59676266039108 232.3912705248911 50.74928900373321 51.24927620343834 -293.282 232.3912705248911 233.18577838944108 50.74928900373321 51.24927620343834 -294.282 233.18577838944108 233.98028625399107 50.74928900373321 51.24927620343834 -295.282 233.98028625399107 234.77479411849106 50.74928900373321 51.24927620343834 -296.282 234.77479411849106 235.56930198304107 50.74928900373321 51.24927620343834 -297.282 235.56930198304107 236.37654629685392 50.74928900373321 51.24927620343834 -308.282 244.29615204362824 245.10339635744106 50.74928900373321 51.24927620343834 -309.282 245.10339635744106 245.89790422199107 50.74928900373321 51.24927620343834 -310.282 245.89790422199107 246.6924120864911 50.74928900373321 51.24927620343834 -311.282 246.6924120864911 247.48691995104107 50.74928900373321 51.24927620343834 -312.282 247.48691995104107 248.28142781559106 50.74928900373321 51.24927620343834 -313.282 248.28142781559106 249.07593568009105 50.74928900373321 51.24927620343834 -314.282 249.07593568009105 249.87044354464106 50.74928900373321 51.24927620343834 -315.282 249.87044354464106 250.66495140919108 50.74928900373321 51.24927620343834 -316.282 250.66495140919108 251.4594592736911 50.74928900373321 51.24927620343834 -317.282 251.4594592736911 252.25396713824108 50.74928900373321 51.24927620343834 -318.282 252.25396713824108 253.0484750027911 50.74928900373321 51.24927620343834 -319.282 253.0484750027911 253.84298286729108 50.74928900373321 51.24927620343834 -320.282 253.84298286729108 254.63749073184107 50.74928900373321 51.24927620343834 -321.282 254.63749073184107 255.43199859639105 50.74928900373321 51.24927620343834 -322.282 255.43199859639105 256.2265064608911 50.74928900373321 51.24927620343834 -323.282 256.2265064608911 257.0210143254411 50.74928900373321 51.24927620343834 -324.282 257.0210143254411 257.8155221899911 50.74928900373321 51.24927620343834 -325.282 257.8155221899911 258.61003005449106 50.74928900373321 51.24927620343834 -326.282 258.61003005449106 259.40453791904105 50.74928900373321 51.24927620343834 -327.282 259.40453791904105 260.1990457835911 50.74928900373321 51.24927620343834 -328.282 260.1990457835911 260.99355364809105 50.74928900373321 51.24927620343834 -329.282 260.99355364809105 261.78806151259107 50.74928900373321 51.24927620343834 -330.282 261.78806151259107 262.58256937714106 50.74928900373321 51.24927620343834 -331.282 262.58256937714106 263.37707724169104 50.74928900373321 51.24927620343834 -332.282 263.37707724169104 264.17158510619106 50.74928900373321 51.24927620343834 -333.282 264.17158510619106 264.9660929707411 50.74928900373321 51.24927620343834 -334.282 264.9660929707411 265.76060083529103 50.74928900373321 51.24927620343834 -335.282 265.76060083529103 266.55510869979105 50.74928900373321 51.24927620343834 -336.282 266.55510869979105 267.34961656434103 50.74928900373321 51.24927620343834 -337.282 267.34961656434103 268.1441244288911 50.74928900373321 51.24927620343834 -338.282 268.1441244288911 268.93863229339104 50.74928900373321 51.24927620343834 -339.282 268.93863229339104 269.7331401579411 50.74928900373321 51.24927620343834 -340.282 269.7331401579411 270.52764802249106 50.74928900373321 51.24927620343834 -341.282 270.52764802249106 271.32215588699114 50.74928900373321 51.24927620343834 -342.282 271.32215588699114 272.11666375154107 50.74928900373321 51.24927620343834 -343.282 272.11666375154107 272.9111716160911 50.74928900373321 51.24927620343834 -344.282 272.9111716160911 273.705679480591 50.74928900373321 51.24927620343834 -345.282 273.705679480591 274.50018734514106 50.74928900373321 51.24927620343834 -346.282 274.50018734514106 275.29469520969104 50.74928900373321 51.24927620343834 -347.282 275.29469520969104 276.08920307419106 50.74928900373321 51.24927620343834 -348.282 276.08920307419106 276.88371093874105 50.74928900373321 51.24927620343834 -349.282 276.88371093874105 277.6909552525539 50.74928900373321 51.24927620343834 -134.283 107.21117213040696 108.02724210038377 51.24927620343834 51.74926312172762 -135.283 108.02724210038377 108.83043606658379 51.24927620343834 51.74926312172762 -136.283 108.83043606658379 109.63363003273378 51.24927620343834 51.74926312172762 -137.283 109.63363003273378 110.4368239988838 51.24927620343834 51.74926312172762 -138.283 110.4368239988838 111.24001796508378 51.24927620343834 51.74926312172762 -139.283 111.24001796508378 112.04321193123378 51.24927620343834 51.74926312172762 -140.283 112.04321193123378 112.84640589738379 51.24927620343834 51.74926312172762 -141.283 112.84640589738379 113.64959986358377 51.24927620343834 51.74926312172762 -142.283 113.64959986358377 114.45279382973379 51.24927620343834 51.74926312172762 -143.283 114.45279382973379 115.25598779588378 51.24927620343834 51.74926312172762 -144.283 115.25598779588378 116.05918176208377 51.24927620343834 51.74926312172762 -145.283 116.05918176208377 116.86237572828378 51.24927620343834 51.74926312172762 -146.283 116.86237572828378 117.66556969443377 51.24927620343834 51.74926312172762 -147.283 117.66556969443377 118.46876366058379 51.24927620343834 51.74926312172762 -148.283 118.46876366058379 119.27195762678377 51.24927620343834 51.74926312172762 -149.283 119.27195762678377 120.07515159293379 51.24927620343834 51.74926312172762 -150.283 120.07515159293379 120.87834555908378 51.24927620343834 51.74926312172762 -151.283 120.87834555908378 121.6815395252838 51.24927620343834 51.74926312172762 -152.283 121.6815395252838 122.48473349143379 51.24927620343834 51.74926312172762 -153.283 122.48473349143379 123.2879274575838 51.24927620343834 51.74926312172762 -154.283 123.2879274575838 124.09112142378379 51.24927620343834 51.74926312172762 -155.283 124.09112142378379 124.89431538998377 51.24927620343834 51.74926312172762 -156.283 124.89431538998377 125.69750935613376 51.24927620343834 51.74926312172762 -157.283 125.69750935613376 126.50070332228378 51.24927620343834 51.74926312172762 -158.283 126.50070332228378 127.3038972884838 51.24927620343834 51.74926312172762 -159.283 127.3038972884838 128.1070912546338 51.24927620343834 51.74926312172762 -160.283 128.1070912546338 128.91028522078378 51.24927620343834 51.74926312172762 -161.283 128.91028522078378 129.7134791869838 51.24927620343834 51.74926312172762 -162.283 129.7134791869838 130.5166731531338 51.24927620343834 51.74926312172762 -163.283 130.5166731531338 131.3198671192838 51.24927620343834 51.74926312172762 -164.283 131.3198671192838 132.1359370892606 51.24927620343834 51.74926312172762 -188.283 150.58364630360697 151.39971627358378 51.24927620343834 51.74926312172762 -189.283 151.39971627358378 152.20291023973377 51.24927620343834 51.74926312172762 -190.283 152.20291023973377 153.0061042058838 51.24927620343834 51.74926312172762 -191.283 153.0061042058838 153.8092981720838 51.24927620343834 51.74926312172762 -192.283 153.8092981720838 154.61249213828378 51.24927620343834 51.74926312172762 -193.283 154.61249213828378 155.41568610443377 51.24927620343834 51.74926312172762 -194.283 155.41568610443377 156.2188800705838 51.24927620343834 51.74926312172762 -195.283 156.2188800705838 157.02207403678378 51.24927620343834 51.74926312172762 -196.283 157.02207403678378 157.8252680029338 51.24927620343834 51.74926312172762 -197.283 157.8252680029338 158.6284619690838 51.24927620343834 51.74926312172762 -198.283 158.6284619690838 159.4316559352838 51.24927620343834 51.74926312172762 -199.283 159.4316559352838 160.23484990143376 51.24927620343834 51.74926312172762 -200.283 160.23484990143376 161.03804386758378 51.24927620343834 51.74926312172762 -201.283 161.03804386758378 161.85411383756062 51.24927620343834 51.74926312172762 -240.283 192.34973254450694 193.16580251443378 51.24927620343834 51.74926312172762 -241.283 193.16580251443378 193.96899648058377 51.24927620343834 51.74926312172762 -242.283 193.96899648058377 194.77219044678375 51.24927620343834 51.74926312172762 -243.283 194.77219044678375 195.57538441293377 51.24927620343834 51.74926312172762 -244.283 195.57538441293377 196.37857837908376 51.24927620343834 51.74926312172762 -245.283 196.37857837908376 197.18177234528378 51.24927620343834 51.74926312172762 -246.283 197.18177234528378 197.9849663114838 51.24927620343834 51.74926312172762 -247.283 197.9849663114838 198.78816027763378 51.24927620343834 51.74926312172762 -248.283 198.78816027763378 199.59135424378377 51.24927620343834 51.74926312172762 -249.283 199.59135424378377 200.39454820998375 51.24927620343834 51.74926312172762 -250.283 200.39454820998375 201.19774217613377 51.24927620343834 51.74926312172762 -251.283 201.19774217613377 202.00093614228376 51.24927620343834 51.74926312172762 -252.283 202.00093614228376 202.80413010848378 51.24927620343834 51.74926312172762 -253.283 202.80413010848378 203.60732407463377 51.24927620343834 51.74926312172762 -254.283 203.60732407463377 204.41051804078376 51.24927620343834 51.74926312172762 -255.283 204.41051804078376 205.21371200698377 51.24927620343834 51.74926312172762 -256.283 205.21371200698377 206.01690597318378 51.24927620343834 51.74926312172762 -257.283 206.01690597318378 206.82009993933377 51.24927620343834 51.74926312172762 -258.283 206.82009993933377 207.62329390548376 51.24927620343834 51.74926312172762 -259.283 207.62329390548376 208.42648787168378 51.24927620343834 51.74926312172762 -260.283 208.42648787168378 209.22968183783377 51.24927620343834 51.74926312172762 -261.283 209.22968183783377 210.03287580398376 51.24927620343834 51.74926312172762 -262.283 210.03287580398376 210.83606977018377 51.24927620343834 51.74926312172762 -263.283 210.83606977018377 211.63926373633376 51.24927620343834 51.74926312172762 -264.283 211.63926373633376 212.44245770248375 51.24927620343834 51.74926312172762 -265.283 212.44245770248375 213.24565166868376 51.24927620343834 51.74926312172762 -266.283 213.24565166868376 214.04884563488378 51.24927620343834 51.74926312172762 -267.283 214.04884563488378 214.85203960103377 51.24927620343834 51.74926312172762 -268.283 214.85203960103377 215.65523356718376 51.24927620343834 51.74926312172762 -269.283 215.65523356718376 216.45842753338377 51.24927620343834 51.74926312172762 -270.283 216.45842753338377 217.26162149953376 51.24927620343834 51.74926312172762 -271.283 217.26162149953376 218.06481546568375 51.24927620343834 51.74926312172762 -272.283 218.06481546568375 218.8680094318838 51.24927620343834 51.74926312172762 -273.283 218.8680094318838 219.67120339803378 51.24927620343834 51.74926312172762 -274.283 219.67120339803378 220.47439736418374 51.24927620343834 51.74926312172762 -275.283 220.47439736418374 221.27759133038376 51.24927620343834 51.74926312172762 -276.283 221.27759133038376 222.08078529658377 51.24927620343834 51.74926312172762 -277.283 222.08078529658377 222.88397926273376 51.24927620343834 51.74926312172762 -278.283 222.88397926273376 223.68717322888375 51.24927620343834 51.74926312172762 -279.283 223.68717322888375 224.49036719508376 51.24927620343834 51.74926312172762 -280.283 224.49036719508376 225.29356116123375 51.24927620343834 51.74926312172762 -281.283 225.29356116123375 226.09675512738377 51.24927620343834 51.74926312172762 -282.283 226.09675512738377 226.89994909358376 51.24927620343834 51.74926312172762 -283.283 226.89994909358376 227.70314305978377 51.24927620343834 51.74926312172762 -284.283 227.70314305978377 228.50633702593376 51.24927620343834 51.74926312172762 -285.283 228.50633702593376 229.30953099208375 51.24927620343834 51.74926312172762 -286.283 229.30953099208375 230.11272495828376 51.24927620343834 51.74926312172762 -287.283 230.11272495828376 230.91591892443375 51.24927620343834 51.74926312172762 -288.283 230.91591892443375 231.71911289058374 51.24927620343834 51.74926312172762 -289.283 231.71911289058374 232.52230685678376 51.24927620343834 51.74926312172762 -290.283 232.52230685678376 233.32550082293375 51.24927620343834 51.74926312172762 -291.283 233.32550082293375 234.12869478908377 51.24927620343834 51.74926312172762 -292.283 234.12869478908377 234.93188875528378 51.24927620343834 51.74926312172762 -293.283 234.93188875528378 235.74795872526062 51.24927620343834 51.74926312172762 -306.283 245.3605343117069 246.17660428168375 51.24927620343834 51.74926312172762 -307.283 246.17660428168375 246.9797982478338 51.24927620343834 51.74926312172762 -308.283 246.9797982478338 247.78299221398376 51.24927620343834 51.74926312172762 -309.283 247.78299221398376 248.58618618018377 51.24927620343834 51.74926312172762 -310.283 248.58618618018377 249.38938014633376 51.24927620343834 51.74926312172762 -311.283 249.38938014633376 250.19257411248378 51.24927620343834 51.74926312172762 -312.283 250.19257411248378 250.9957680786838 51.24927620343834 51.74926312172762 -313.283 250.9957680786838 251.79896204488378 51.24927620343834 51.74926312172762 -314.283 251.79896204488378 252.60215601103377 51.24927620343834 51.74926312172762 -315.283 252.60215601103377 253.4053499771838 51.24927620343834 51.74926312172762 -316.283 253.4053499771838 254.2085439433838 51.24927620343834 51.74926312172762 -317.283 254.2085439433838 255.0117379095338 51.24927620343834 51.74926312172762 -318.283 255.0117379095338 255.81493187568378 51.24927620343834 51.74926312172762 -319.283 255.81493187568378 256.6181258418838 51.24927620343834 51.74926312172762 -320.283 256.6181258418838 257.42131980808375 51.24927620343834 51.74926312172762 -321.283 257.42131980808375 258.22451377423374 51.24927620343834 51.74926312172762 -322.283 258.22451377423374 259.0277077403838 51.24927620343834 51.74926312172762 -323.283 259.0277077403838 259.8309017065838 51.24927620343834 51.74926312172762 -324.283 259.8309017065838 260.6340956727338 51.24927620343834 51.74926312172762 -325.283 260.6340956727338 261.4372896388837 51.24927620343834 51.74926312172762 -326.283 261.4372896388837 262.2404836050838 51.24927620343834 51.74926312172762 -327.283 262.2404836050838 263.0436775712338 51.24927620343834 51.74926312172762 -328.283 263.0436775712338 263.8468715373838 51.24927620343834 51.74926312172762 -329.283 263.8468715373838 264.65006550358373 51.24927620343834 51.74926312172762 -330.283 264.65006550358373 265.4532594697838 51.24927620343834 51.74926312172762 -331.283 265.4532594697838 266.2564534359338 51.24927620343834 51.74926312172762 -332.283 266.2564534359338 267.0596474020838 51.24927620343834 51.74926312172762 -333.283 267.0596474020838 267.86284136828374 51.24927620343834 51.74926312172762 -334.283 267.86284136828374 268.6660353344338 51.24927620343834 51.74926312172762 -335.283 268.6660353344338 269.4692293005838 51.24927620343834 51.74926312172762 -336.283 269.4692293005838 270.2724232667838 51.24927620343834 51.74926312172762 -337.283 270.2724232667838 271.0756172329337 51.24927620343834 51.74926312172762 -338.283 271.0756172329337 271.87881119908377 51.24927620343834 51.74926312172762 -339.283 271.87881119908377 272.6820051652838 51.24927620343834 51.74926312172762 -340.283 272.6820051652838 273.4851991314838 51.24927620343834 51.74926312172762 -341.283 273.4851991314838 274.28839309763373 51.24927620343834 51.74926312172762 -342.283 274.28839309763373 275.0915870637838 51.24927620343834 51.74926312172762 -343.283 275.0915870637838 275.8947810299838 51.24927620343834 51.74926312172762 -344.283 275.8947810299838 276.6979749961338 51.24927620343834 51.74926312172762 -345.283 276.6979749961338 277.5011689622837 51.24927620343834 51.74926312172762 -346.283 277.5011689622837 278.3172389322606 51.24927620343834 51.74926312172762 -133.284 107.59240241783372 108.41755669927277 51.74926312172762 52.249249747158004 -134.284 108.41755669927277 109.22969132202276 51.74926312172762 52.249249747158004 -135.284 109.22969132202276 110.04182594477275 51.74926312172762 52.249249747158004 -136.284 110.04182594477275 110.85396056752276 51.74926312172762 52.249249747158004 -137.284 110.85396056752276 111.66609519027276 51.74926312172762 52.249249747158004 -138.284 111.66609519027276 112.47822981302276 51.74926312172762 52.249249747158004 -139.284 112.47822981302276 113.29036443577277 51.74926312172762 52.249249747158004 -140.284 113.29036443577277 114.10249905847277 51.74926312172762 52.249249747158004 -141.284 114.10249905847277 114.91463368122277 51.74926312172762 52.249249747158004 -142.284 114.91463368122277 115.72676830397276 51.74926312172762 52.249249747158004 -143.284 115.72676830397276 116.53890292672277 51.74926312172762 52.249249747158004 -144.284 116.53890292672277 117.35103754947278 51.74926312172762 52.249249747158004 -145.284 117.35103754947278 118.16317217217278 51.74926312172762 52.249249747158004 -146.284 118.16317217217278 118.97530679492277 51.74926312172762 52.249249747158004 -147.284 118.97530679492277 119.78744141767277 51.74926312172762 52.249249747158004 -148.284 119.78744141767277 120.59957604042276 51.74926312172762 52.249249747158004 -149.284 120.59957604042276 121.41171066317276 51.74926312172762 52.249249747158004 -150.284 121.41171066317276 122.22384528587276 51.74926312172762 52.249249747158004 -151.284 122.22384528587276 123.03597990862276 51.74926312172762 52.249249747158004 -152.284 123.03597990862276 123.84811453137277 51.74926312172762 52.249249747158004 -153.284 123.84811453137277 124.66024915412277 51.74926312172762 52.249249747158004 -154.284 124.66024915412277 125.47238377687276 51.74926312172762 52.249249747158004 -155.284 125.47238377687276 126.28451839962278 51.74926312172762 52.249249747158004 -156.284 126.28451839962278 127.09665302237276 51.74926312172762 52.249249747158004 -157.284 127.09665302237276 127.90878764507275 51.74926312172762 52.249249747158004 -158.284 127.90878764507275 128.72092226782274 51.74926312172762 52.249249747158004 -159.284 128.72092226782274 129.53305689057277 51.74926312172762 52.249249747158004 -160.284 129.53305689057277 130.34519151332276 51.74926312172762 52.249249747158004 -161.284 130.34519151332276 131.15732613607275 51.74926312172762 52.249249747158004 -162.284 131.15732613607275 131.98248041751182 51.74926312172762 52.249249747158004 -187.284 151.4476720458337 152.27282632732278 51.74926312172762 52.249249747158004 -188.284 152.27282632732278 153.0849609500728 51.74926312172762 52.249249747158004 -189.284 153.0849609500728 153.89709557282276 51.74926312172762 52.249249747158004 -190.284 153.89709557282276 154.70923019557276 51.74926312172762 52.249249747158004 -191.284 154.70923019557276 155.52136481827276 51.74926312172762 52.249249747158004 -192.284 155.52136481827276 156.33349944102275 51.74926312172762 52.249249747158004 -193.284 156.33349944102275 157.14563406377277 51.74926312172762 52.249249747158004 -194.284 157.14563406377277 157.95776868652274 51.74926312172762 52.249249747158004 -195.284 157.95776868652274 158.76990330927276 51.74926312172762 52.249249747158004 -196.284 158.76990330927276 159.58203793202276 51.74926312172762 52.249249747158004 -197.284 159.58203793202276 160.39417255477275 51.74926312172762 52.249249747158004 -198.284 160.39417255477275 161.20630717747275 51.74926312172762 52.249249747158004 -199.284 161.20630717747275 162.0314614589118 51.74926312172762 52.249249747158004 -237.284 192.0544031829337 192.87955746437274 51.74926312172762 52.249249747158004 -238.284 192.87955746437274 193.69169208712276 51.74926312172762 52.249249747158004 -239.284 193.69169208712276 194.50382670987273 51.74926312172762 52.249249747158004 -240.284 194.50382670987273 195.31596133262275 51.74926312172762 52.249249747158004 -241.284 195.31596133262275 196.12809595537277 51.74926312172762 52.249249747158004 -242.284 196.12809595537277 196.94023057812274 51.74926312172762 52.249249747158004 -243.284 196.94023057812274 197.75236520087273 51.74926312172762 52.249249747158004 -244.284 197.75236520087273 198.56449982357273 51.74926312172762 52.249249747158004 -245.284 198.56449982357273 199.37663444632273 51.74926312172762 52.249249747158004 -246.284 199.37663444632273 200.18876906907275 51.74926312172762 52.249249747158004 -247.284 200.18876906907275 201.0009036918227 51.74926312172762 52.249249747158004 -248.284 201.0009036918227 201.81303831457274 51.74926312172762 52.249249747158004 -249.284 201.81303831457274 202.62517293727274 51.74926312172762 52.249249747158004 -250.284 202.62517293727274 203.43730756002276 51.74926312172762 52.249249747158004 -251.284 203.43730756002276 204.24944218277273 51.74926312172762 52.249249747158004 -252.284 204.24944218277273 205.06157680552275 51.74926312172762 52.249249747158004 -253.284 205.06157680552275 205.87371142827277 51.74926312172762 52.249249747158004 -254.284 205.87371142827277 206.68584605102276 51.74926312172762 52.249249747158004 -255.284 206.68584605102276 207.49798067377273 51.74926312172762 52.249249747158004 -256.284 207.49798067377273 208.31011529647273 51.74926312172762 52.249249747158004 -257.284 208.31011529647273 209.12224991922275 51.74926312172762 52.249249747158004 -258.284 209.12224991922275 209.93438454197272 51.74926312172762 52.249249747158004 -259.284 209.93438454197272 210.74651916472274 51.74926312172762 52.249249747158004 -260.284 210.74651916472274 211.55865378747276 51.74926312172762 52.249249747158004 -261.284 211.55865378747276 212.37078841017276 51.74926312172762 52.249249747158004 -262.284 212.37078841017276 213.18292303292276 51.74926312172762 52.249249747158004 -263.284 213.18292303292276 213.99505765567272 51.74926312172762 52.249249747158004 -264.284 213.99505765567272 214.80719227842275 51.74926312172762 52.249249747158004 -265.284 214.80719227842275 215.61932690117277 51.74926312172762 52.249249747158004 -266.284 215.61932690117277 216.43146152387277 51.74926312172762 52.249249747158004 -267.284 216.43146152387277 217.24359614662274 51.74926312172762 52.249249747158004 -268.284 217.24359614662274 218.05573076937276 51.74926312172762 52.249249747158004 -269.284 218.05573076937276 218.86786539212275 51.74926312172762 52.249249747158004 -270.284 218.86786539212275 219.68000001487275 51.74926312172762 52.249249747158004 -271.284 219.68000001487275 220.49213463762277 51.74926312172762 52.249249747158004 -272.284 220.49213463762277 221.30426926037276 51.74926312172762 52.249249747158004 -273.284 221.30426926037276 222.11640388307273 51.74926312172762 52.249249747158004 -274.284 222.11640388307273 222.92853850582276 51.74926312172762 52.249249747158004 -275.284 222.92853850582276 223.74067312857275 51.74926312172762 52.249249747158004 -276.284 223.74067312857275 224.55280775132277 51.74926312172762 52.249249747158004 -277.284 224.55280775132277 225.36494237407277 51.74926312172762 52.249249747158004 -278.284 225.36494237407277 226.17707699677277 51.74926312172762 52.249249747158004 -279.284 226.17707699677277 227.00223127821178 51.74926312172762 52.249249747158004 -304.284 246.46742290663371 247.29257718807276 51.74926312172762 52.249249747158004 -305.284 247.29257718807276 248.10471181082275 51.74926312172762 52.249249747158004 -306.284 248.10471181082275 248.91684643357274 51.74926312172762 52.249249747158004 -307.284 248.91684643357274 249.72898105627274 51.74926312172762 52.249249747158004 -308.284 249.72898105627274 250.54111567902277 51.74926312172762 52.249249747158004 -309.284 250.54111567902277 251.35325030177276 51.74926312172762 52.249249747158004 -310.284 251.35325030177276 252.16538492452275 51.74926312172762 52.249249747158004 -311.284 252.16538492452275 252.97751954727275 51.74926312172762 52.249249747158004 -312.284 252.97751954727275 253.78965417002274 51.74926312172762 52.249249747158004 -313.284 253.78965417002274 254.60178879277274 51.74926312172762 52.249249747158004 -314.284 254.60178879277274 255.41392341547277 51.74926312172762 52.249249747158004 -315.284 255.41392341547277 256.22605803822273 51.74926312172762 52.249249747158004 -316.284 256.22605803822273 257.03819266097275 51.74926312172762 52.249249747158004 -317.284 257.03819266097275 257.8503272837228 51.74926312172762 52.249249747158004 -318.284 257.8503272837228 258.66246190647274 51.74926312172762 52.249249747158004 -319.284 258.66246190647274 259.4745965291728 51.74926312172762 52.249249747158004 -320.284 259.4745965291728 260.28673115192277 51.74926312172762 52.249249747158004 -321.284 260.28673115192277 261.09886577467273 51.74926312172762 52.249249747158004 -322.284 261.09886577467273 261.91100039742275 51.74926312172762 52.249249747158004 -323.284 261.91100039742275 262.7231350201728 51.74926312172762 52.249249747158004 -324.284 262.7231350201728 263.5352696428728 51.74926312172762 52.249249747158004 -325.284 263.5352696428728 264.34740426562274 51.74926312172762 52.249249747158004 -326.284 264.34740426562274 265.1595388883727 51.74926312172762 52.249249747158004 -327.284 265.1595388883727 265.97167351112273 51.74926312172762 52.249249747158004 -328.284 265.97167351112273 266.78380813387275 51.74926312172762 52.249249747158004 -329.284 266.78380813387275 267.5959427566228 51.74926312172762 52.249249747158004 -330.284 267.5959427566228 268.4080773793728 51.74926312172762 52.249249747158004 -331.284 268.4080773793728 269.2202120020728 51.74926312172762 52.249249747158004 -332.284 269.2202120020728 270.03234662482276 51.74926312172762 52.249249747158004 -333.284 270.03234662482276 270.84448124757273 51.74926312172762 52.249249747158004 -334.284 270.84448124757273 271.65661587032275 51.74926312172762 52.249249747158004 -335.284 271.65661587032275 272.4687504930728 51.74926312172762 52.249249747158004 -336.284 272.4687504930728 273.2808851157728 51.74926312172762 52.249249747158004 -337.284 273.2808851157728 274.09301973852274 51.74926312172762 52.249249747158004 -338.284 274.09301973852274 274.9051543612727 51.74926312172762 52.249249747158004 -339.284 274.9051543612727 275.71728898402273 51.74926312172762 52.249249747158004 -340.284 275.71728898402273 276.52942360677275 51.74926312172762 52.249249747158004 -341.284 276.52942360677275 277.3415582295228 51.74926312172762 52.249249747158004 -342.284 277.3415582295228 278.1536928522728 51.74926312172762 52.249249747158004 -343.284 278.1536928522728 278.97884713371184 51.74926312172762 52.249249747158004 -130.285 106.34785132494758 107.18235871629201 52.249249747158004 52.74923606767706 -131.285 107.18235871629201 108.00369853214201 52.249249747158004 52.74923606767706 -132.285 108.00369853214201 108.825038347992 52.249249747158004 52.74923606767706 -133.285 108.825038347992 109.646378163842 52.249249747158004 52.74923606767706 -134.285 109.646378163842 110.467717979692 52.249249747158004 52.74923606767706 -135.285 110.467717979692 111.28905779554202 52.249249747158004 52.74923606767706 -136.285 111.28905779554202 112.11039761139202 52.249249747158004 52.74923606767706 -137.285 112.11039761139202 112.931737427242 52.249249747158004 52.74923606767706 -138.285 112.931737427242 113.75307724309201 52.249249747158004 52.74923606767706 -139.285 113.75307724309201 114.574417058942 52.249249747158004 52.74923606767706 -140.285 114.574417058942 115.39575687479203 52.249249747158004 52.74923606767706 -141.285 115.39575687479203 116.21709669064202 52.249249747158004 52.74923606767706 -142.285 116.21709669064202 117.038436506492 52.249249747158004 52.74923606767706 -143.285 117.038436506492 117.85977632234199 52.249249747158004 52.74923606767706 -144.285 117.85977632234199 118.68111613819201 52.249249747158004 52.74923606767706 -145.285 118.68111613819201 119.502455954042 52.249249747158004 52.74923606767706 -146.285 119.502455954042 120.32379576989202 52.249249747158004 52.74923606767706 -147.285 120.32379576989202 121.14513558574203 52.249249747158004 52.74923606767706 -148.285 121.14513558574203 121.96647540159202 52.249249747158004 52.74923606767706 -149.285 121.96647540159202 122.78781521744202 52.249249747158004 52.74923606767706 -150.285 122.78781521744202 123.609155033292 52.249249747158004 52.74923606767706 -151.285 123.609155033292 124.43049484914201 52.249249747158004 52.74923606767706 -152.285 124.43049484914201 125.251834664992 52.249249747158004 52.74923606767706 -153.285 125.251834664992 126.073174480892 52.249249747158004 52.74923606767706 -154.285 126.073174480892 126.89451429674202 52.249249747158004 52.74923606767706 -155.285 126.89451429674202 127.71585411259201 52.249249747158004 52.74923606767706 -156.285 127.71585411259201 128.537193928442 52.249249747158004 52.74923606767706 -157.285 128.537193928442 129.358533744292 52.249249747158004 52.74923606767706 -158.285 129.358533744292 130.179873560142 52.249249747158004 52.74923606767706 -159.285 130.179873560142 131.00121337599202 52.249249747158004 52.74923606767706 -160.285 131.00121337599202 131.822553191842 52.249249747158004 52.74923606767706 -161.285 131.822553191842 132.65706058313643 52.249249747158004 52.74923606767706 -186.285 152.3428810126476 153.177388403992 52.249249747158004 52.74923606767706 -187.285 153.177388403992 153.998728219842 52.249249747158004 52.74923606767706 -188.285 153.998728219842 154.82006803569203 52.249249747158004 52.74923606767706 -189.285 154.82006803569203 155.641407851542 52.249249747158004 52.74923606767706 -190.285 155.641407851542 156.46274766739202 52.249249747158004 52.74923606767706 -191.285 156.46274766739202 157.284087483242 52.249249747158004 52.74923606767706 -192.285 157.284087483242 158.105427299092 52.249249747158004 52.74923606767706 -193.285 158.105427299092 158.92676711494204 52.249249747158004 52.74923606767706 -194.285 158.92676711494204 159.748106930792 52.249249747158004 52.74923606767706 -195.285 159.748106930792 160.56944674664203 52.249249747158004 52.74923606767706 -196.285 160.56944674664203 161.40395413793644 52.249249747158004 52.74923606767706 -235.285 192.58853198944757 193.423039380742 52.249249747158004 52.74923606767706 -236.285 193.423039380742 194.24437919659198 52.249249747158004 52.74923606767706 -237.285 194.24437919659198 195.065719012442 52.249249747158004 52.74923606767706 -238.285 195.065719012442 195.88705882829197 52.249249747158004 52.74923606767706 -239.285 195.88705882829197 196.708398644192 52.249249747158004 52.74923606767706 -240.285 196.708398644192 197.52973846004198 52.249249747158004 52.74923606767706 -241.285 197.52973846004198 198.351078275892 52.249249747158004 52.74923606767706 -242.285 198.351078275892 199.17241809174197 52.249249747158004 52.74923606767706 -243.285 199.17241809174197 199.993757907592 52.249249747158004 52.74923606767706 -244.285 199.993757907592 200.81509772344197 52.249249747158004 52.74923606767706 -245.285 200.81509772344197 201.636437539292 52.249249747158004 52.74923606767706 -246.285 201.636437539292 202.457777355142 52.249249747158004 52.74923606767706 -247.285 202.457777355142 203.27911717099198 52.249249747158004 52.74923606767706 -248.285 203.27911717099198 204.100456986842 52.249249747158004 52.74923606767706 -249.285 204.100456986842 204.92179680269197 52.249249747158004 52.74923606767706 -250.285 204.92179680269197 205.743136618542 52.249249747158004 52.74923606767706 -251.285 205.743136618542 206.564476434392 52.249249747158004 52.74923606767706 -252.285 206.564476434392 207.385816250242 52.249249747158004 52.74923606767706 -253.285 207.385816250242 208.207156066092 52.249249747158004 52.74923606767706 -254.285 208.207156066092 209.02849588194198 52.249249747158004 52.74923606767706 -255.285 209.02849588194198 209.849835697792 52.249249747158004 52.74923606767706 -256.285 209.849835697792 210.67117551364197 52.249249747158004 52.74923606767706 -257.285 210.67117551364197 211.492515329492 52.249249747158004 52.74923606767706 -258.285 211.492515329492 212.313855145342 52.249249747158004 52.74923606767706 -259.285 212.313855145342 213.13519496119198 52.249249747158004 52.74923606767706 -260.285 213.13519496119198 213.956534777042 52.249249747158004 52.74923606767706 -261.285 213.956534777042 214.77787459289198 52.249249747158004 52.74923606767706 -262.285 214.77787459289198 215.599214408792 52.249249747158004 52.74923606767706 -263.285 215.599214408792 216.420554224642 52.249249747158004 52.74923606767706 -264.285 216.420554224642 217.24189404049199 52.249249747158004 52.74923606767706 -265.285 217.24189404049199 218.06323385634198 52.249249747158004 52.74923606767706 -266.285 218.06323385634198 218.884573672192 52.249249747158004 52.74923606767706 -267.285 218.884573672192 219.70591348804197 52.249249747158004 52.74923606767706 -268.285 219.70591348804197 220.527253303892 52.249249747158004 52.74923606767706 -269.285 220.527253303892 221.34859311974196 52.249249747158004 52.74923606767706 -270.285 221.34859311974196 222.169932935592 52.249249747158004 52.74923606767706 -271.285 222.169932935592 222.991272751442 52.249249747158004 52.74923606767706 -272.285 222.991272751442 223.81261256729198 52.249249747158004 52.74923606767706 -273.285 223.81261256729198 224.633952383142 52.249249747158004 52.74923606767706 -274.285 224.633952383142 225.45529219899197 52.249249747158004 52.74923606767706 -275.285 225.45529219899197 226.276632014842 52.249249747158004 52.74923606767706 -276.285 226.276632014842 227.097971830692 52.249249747158004 52.74923606767706 -277.285 227.097971830692 227.93247922203642 52.249249747158004 52.74923606767706 -302.285 247.61829965154757 248.45280704284198 52.249249747158004 52.74923606767706 -303.285 248.45280704284198 249.27414685869198 52.249249747158004 52.74923606767706 -304.285 249.27414685869198 250.09548667459197 52.249249747158004 52.74923606767706 -305.285 250.09548667459197 250.91682649044196 52.249249747158004 52.74923606767706 -306.285 250.91682649044196 251.738166306292 52.249249747158004 52.74923606767706 -307.285 251.738166306292 252.559506122142 52.249249747158004 52.74923606767706 -308.285 252.559506122142 253.380845937992 52.249249747158004 52.74923606767706 -309.285 253.380845937992 254.202185753842 52.249249747158004 52.74923606767706 -310.285 254.202185753842 255.02352556969197 52.249249747158004 52.74923606767706 -311.285 255.02352556969197 255.844865385542 52.249249747158004 52.74923606767706 -312.285 255.844865385542 256.666205201392 52.249249747158004 52.74923606767706 -313.285 256.666205201392 257.487545017242 52.249249747158004 52.74923606767706 -314.285 257.487545017242 258.30888483309195 52.249249747158004 52.74923606767706 -315.285 258.30888483309195 259.130224648942 52.249249747158004 52.74923606767706 -316.285 259.130224648942 259.951564464792 52.249249747158004 52.74923606767706 -317.285 259.951564464792 260.772904280642 52.249249747158004 52.74923606767706 -318.285 260.772904280642 261.59424409649193 52.249249747158004 52.74923606767706 -319.285 261.59424409649193 262.41558391234196 52.249249747158004 52.74923606767706 -320.285 262.41558391234196 263.236923728192 52.249249747158004 52.74923606767706 -321.285 263.236923728192 264.05826354404195 52.249249747158004 52.74923606767706 -322.285 264.05826354404195 264.87960335989203 52.249249747158004 52.74923606767706 -323.285 264.87960335989203 265.700943175742 52.249249747158004 52.74923606767706 -324.285 265.700943175742 266.52228299159196 52.249249747158004 52.74923606767706 -325.285 266.52228299159196 267.343622807442 52.249249747158004 52.74923606767706 -326.285 267.343622807442 268.164962623292 52.249249747158004 52.74923606767706 -327.285 268.164962623292 268.986302439192 52.249249747158004 52.74923606767706 -328.285 268.986302439192 269.80764225504197 52.249249747158004 52.74923606767706 -329.285 269.80764225504197 270.628982070892 52.249249747158004 52.74923606767706 -330.285 270.628982070892 271.45032188674196 52.249249747158004 52.74923606767706 -331.285 271.45032188674196 272.271661702592 52.249249747158004 52.74923606767706 -332.285 272.271661702592 273.09300151844195 52.249249747158004 52.74923606767706 -333.285 273.09300151844195 273.914341334292 52.249249747158004 52.74923606767706 -334.285 273.914341334292 274.735681150142 52.249249747158004 52.74923606767706 -335.285 274.735681150142 275.557020965992 52.249249747158004 52.74923606767706 -336.285 275.557020965992 276.37836078184205 52.249249747158004 52.74923606767706 -337.285 276.37836078184205 277.199700597692 52.249249747158004 52.74923606767706 -338.285 277.199700597692 278.021040413542 52.249249747158004 52.74923606767706 -339.285 278.021040413542 278.8555478048364 52.249249747158004 52.74923606767706 -128.286 105.91367712581973 106.75781712071708 52.74923606767706 53.249222070581396 -129.286 106.75781712071708 107.58863719131708 52.74923606767706 53.249222070581396 -130.286 107.58863719131708 108.41945726186707 52.74923606767706 53.249222070581396 -131.286 108.41945726186707 109.25027733241707 52.74923606767706 53.249222070581396 -132.286 109.25027733241707 110.08109740296707 52.74923606767706 53.249222070581396 -133.286 110.08109740296707 110.91191747351708 52.74923606767706 53.249222070581396 -134.286 110.91191747351708 111.74273754411709 52.74923606767706 53.249222070581396 -135.286 111.74273754411709 112.57355761466705 52.74923606767706 53.249222070581396 -136.286 112.57355761466705 113.40437768521706 52.74923606767706 53.249222070581396 -137.286 113.40437768521706 114.23519775581707 52.74923606767706 53.249222070581396 -138.286 114.23519775581707 115.06601782636707 52.74923606767706 53.249222070581396 -139.286 115.06601782636707 115.89683789691708 52.74923606767706 53.249222070581396 -140.286 115.89683789691708 116.72765796746705 52.74923606767706 53.249222070581396 -141.286 116.72765796746705 117.55847803801706 52.74923606767706 53.249222070581396 -142.286 117.55847803801706 118.38929810861706 52.74923606767706 53.249222070581396 -143.286 118.38929810861706 119.22011817916706 52.74923606767706 53.249222070581396 -144.286 119.22011817916706 120.05093824971706 52.74923606767706 53.249222070581396 -145.286 120.05093824971706 120.88175832026707 52.74923606767706 53.249222070581396 -146.286 120.88175832026707 121.71257839081706 52.74923606767706 53.249222070581396 -147.286 121.71257839081706 122.54339846141707 52.74923606767706 53.249222070581396 -148.286 122.54339846141707 123.37421853196707 52.74923606767706 53.249222070581396 -149.286 123.37421853196707 124.20503860251708 52.74923606767706 53.249222070581396 -150.286 124.20503860251708 125.03585867306705 52.74923606767706 53.249222070581396 -151.286 125.03585867306705 125.86667874361706 52.74923606767706 53.249222070581396 -152.286 125.86667874361706 126.69749881421706 52.74923606767706 53.249222070581396 -153.286 126.69749881421706 127.52831888476706 52.74923606767706 53.249222070581396 -154.286 127.52831888476706 128.35913895531706 52.74923606767706 53.249222070581396 -155.286 128.35913895531706 129.18995902591706 52.74923606767706 53.249222070581396 -156.286 129.18995902591706 130.0207790964671 52.74923606767706 53.249222070581396 -157.286 130.0207790964671 130.85159916701707 52.74923606767706 53.249222070581396 -158.286 130.85159916701707 131.68241923756705 52.74923606767706 53.249222070581396 -159.286 131.68241923756705 132.52655923241437 52.74923606767706 53.249222070581396 -232.286 192.3189644642197 193.16310445911705 52.74923606767706 53.249222070581396 -233.286 193.16310445911705 193.99392452966705 52.74923606767706 53.249222070581396 -234.286 193.99392452966705 194.82474460021706 52.74923606767706 53.249222070581396 -235.286 194.82474460021706 195.65556467081706 52.74923606767706 53.249222070581396 -236.286 195.65556467081706 196.4863847413671 52.74923606767706 53.249222070581396 -237.286 196.4863847413671 197.31720481191707 52.74923606767706 53.249222070581396 -238.286 197.31720481191707 198.14802488246707 52.74923606767706 53.249222070581396 -239.286 198.14802488246707 198.97884495301707 52.74923606767706 53.249222070581396 -240.286 198.97884495301707 199.80966502361707 52.74923606767706 53.249222070581396 -241.286 199.80966502361707 200.64048509416705 52.74923606767706 53.249222070581396 -242.286 200.64048509416705 201.47130516471708 52.74923606767706 53.249222070581396 -243.286 201.47130516471708 202.30212523526706 52.74923606767706 53.249222070581396 -244.286 202.30212523526706 203.13294530581706 52.74923606767706 53.249222070581396 -245.286 203.13294530581706 203.96376537641706 52.74923606767706 53.249222070581396 -246.286 203.96376537641706 204.79458544696706 52.74923606767706 53.249222070581396 -247.286 204.79458544696706 205.6254055175171 52.74923606767706 53.249222070581396 -248.286 205.6254055175171 206.45622558806707 52.74923606767706 53.249222070581396 -249.286 206.45622558806707 207.28704565861705 52.74923606767706 53.249222070581396 -250.286 207.28704565861705 208.11786572921707 52.74923606767706 53.249222070581396 -251.286 208.11786572921707 208.94868579976705 52.74923606767706 53.249222070581396 -252.286 208.94868579976705 209.77950587031705 52.74923606767706 53.249222070581396 -253.286 209.77950587031705 210.61032594091705 52.74923606767706 53.249222070581396 -254.286 210.61032594091705 211.44114601146708 52.74923606767706 53.249222070581396 -255.286 211.44114601146708 212.27196608201706 52.74923606767706 53.249222070581396 -256.286 212.27196608201706 213.10278615256706 52.74923606767706 53.249222070581396 -257.286 213.10278615256706 213.93360622311707 52.74923606767706 53.249222070581396 -258.286 213.93360622311707 214.76442629371707 52.74923606767706 53.249222070581396 -259.286 214.76442629371707 215.59524636426704 52.74923606767706 53.249222070581396 -260.286 215.59524636426704 216.42606643481705 52.74923606767706 53.249222070581396 -261.286 216.42606643481705 217.25688650536705 52.74923606767706 53.249222070581396 -262.286 217.25688650536705 218.08770657591705 52.74923606767706 53.249222070581396 -263.286 218.08770657591705 218.91852664651708 52.74923606767706 53.249222070581396 -264.286 218.91852664651708 219.74934671706706 52.74923606767706 53.249222070581396 -265.286 219.74934671706706 220.5801667876171 52.74923606767706 53.249222070581396 -266.286 220.5801667876171 221.4109868582171 52.74923606767706 53.249222070581396 -267.286 221.4109868582171 222.24180692876706 52.74923606767706 53.249222070581396 -268.286 222.24180692876706 223.0726269993171 52.74923606767706 53.249222070581396 -269.286 223.0726269993171 223.90344706986707 52.74923606767706 53.249222070581396 -270.286 223.90344706986707 224.73426714041705 52.74923606767706 53.249222070581396 -271.286 224.73426714041705 225.56508721101707 52.74923606767706 53.249222070581396 -272.286 225.56508721101707 226.39590728156708 52.74923606767706 53.249222070581396 -273.286 226.39590728156708 227.22672735211705 52.74923606767706 53.249222070581396 -274.286 227.22672735211705 228.05754742266706 52.74923606767706 53.249222070581396 -275.286 228.05754742266706 228.9016874175144 52.74923606767706 53.249222070581396 -288.286 238.84488841561972 239.68902841051704 52.74923606767706 53.249222070581396 -289.286 239.68902841051704 240.5198484811171 52.74923606767706 53.249222070581396 -290.286 240.5198484811171 241.35066855166707 52.74923606767706 53.249222070581396 -291.286 241.35066855166707 242.18148862221705 52.74923606767706 53.249222070581396 -292.286 242.18148862221705 243.01230869276708 52.74923606767706 53.249222070581396 -293.286 243.01230869276708 243.84312876331705 52.74923606767706 53.249222070581396 -294.286 243.84312876331705 244.67394883391705 52.74923606767706 53.249222070581396 -295.286 244.67394883391705 245.50476890446706 52.74923606767706 53.249222070581396 -296.286 245.50476890446706 246.33558897501706 52.74923606767706 53.249222070581396 -297.286 246.33558897501706 247.16640904556704 52.74923606767706 53.249222070581396 -298.286 247.16640904556704 247.99722911611707 52.74923606767706 53.249222070581396 -299.286 247.99722911611707 248.82804918671707 52.74923606767706 53.249222070581396 -300.286 248.82804918671707 249.65886925726704 52.74923606767706 53.249222070581396 -301.286 249.65886925726704 250.48968932781708 52.74923606767706 53.249222070581396 -302.286 250.48968932781708 251.32050939841707 52.74923606767706 53.249222070581396 -303.286 251.32050939841707 252.15132946896708 52.74923606767706 53.249222070581396 -304.286 252.15132946896708 252.98214953951705 52.74923606767706 53.249222070581396 -305.286 252.98214953951705 253.81296961006706 52.74923606767706 53.249222070581396 -306.286 253.81296961006706 254.64378968061706 52.74923606767706 53.249222070581396 -307.286 254.64378968061706 255.47460975121706 52.74923606767706 53.249222070581396 -308.286 255.47460975121706 256.30542982176706 52.74923606767706 53.249222070581396 -309.286 256.30542982176706 257.1362498923171 52.74923606767706 53.249222070581396 -310.286 257.1362498923171 257.9670699628671 52.74923606767706 53.249222070581396 -311.286 257.9670699628671 258.79789003341705 52.74923606767706 53.249222070581396 -312.286 258.79789003341705 259.6287101040171 52.74923606767706 53.249222070581396 -313.286 259.6287101040171 260.45953017456713 52.74923606767706 53.249222070581396 -314.286 260.45953017456713 261.2903502451171 52.74923606767706 53.249222070581396 -315.286 261.2903502451171 262.1211703157171 52.74923606767706 53.249222070581396 -316.286 262.1211703157171 262.9519903862671 52.74923606767706 53.249222070581396 -317.286 262.9519903862671 263.78281045681706 52.74923606767706 53.249222070581396 -318.286 263.78281045681706 264.61363052736704 52.74923606767706 53.249222070581396 -319.286 264.61363052736704 265.444450597917 52.74923606767706 53.249222070581396 -320.286 265.444450597917 266.275270668517 52.74923606767706 53.249222070581396 -321.286 266.275270668517 267.10609073906704 52.74923606767706 53.249222070581396 -322.286 267.10609073906704 267.9369108096171 52.74923606767706 53.249222070581396 -323.286 267.9369108096171 268.76773088016705 52.74923606767706 53.249222070581396 -324.286 268.76773088016705 269.598550950717 52.74923606767706 53.249222070581396 -325.286 269.598550950717 270.429371021317 52.74923606767706 53.249222070581396 -326.286 270.429371021317 271.26019109186706 52.74923606767706 53.249222070581396 -327.286 271.26019109186706 272.0910111624171 52.74923606767706 53.249222070581396 -328.286 272.0910111624171 272.92183123296707 52.74923606767706 53.249222070581396 -329.286 272.92183123296707 273.75265130351704 52.74923606767706 53.249222070581396 -330.286 273.75265130351704 274.58347137411704 52.74923606767706 53.249222070581396 -331.286 274.58347137411704 275.41429144466707 52.74923606767706 53.249222070581396 -332.286 275.41429144466707 276.2451115152171 52.74923606767706 53.249222070581396 -333.286 276.2451115152171 277.0759315858171 52.74923606767706 53.249222070581396 -334.286 277.0759315858171 277.9067516563671 52.74923606767706 53.249222070581396 -335.286 277.9067516563671 278.75089165121443 52.74923606767706 53.249222070581396 -127.287 106.31807474347619 107.17213812097788 53.249222070581396 53.749207742471775 -128.287 107.17213812097788 108.0127246135279 53.249222070581396 53.749207742471775 -129.287 108.0127246135279 108.85331110607788 53.249222070581396 53.749207742471775 -130.287 108.85331110607788 109.69389759857788 53.249222070581396 53.749207742471775 -131.287 109.69389759857788 110.5344840911279 53.249222070581396 53.749207742471775 -132.287 110.5344840911279 111.37507058367788 53.249222070581396 53.749207742471775 -133.287 111.37507058367788 112.21565707622787 53.249222070581396 53.749207742471775 -134.287 112.21565707622787 113.05624356877787 53.249222070581396 53.749207742471775 -135.287 113.05624356877787 113.89683006132788 53.249222070581396 53.749207742471775 -136.287 113.89683006132788 114.73741655387786 53.249222070581396 53.749207742471775 -137.287 114.73741655387786 115.57800304637789 53.249222070581396 53.749207742471775 -138.287 115.57800304637789 116.41858953892788 53.249222070581396 53.749207742471775 -139.287 116.41858953892788 117.25917603147789 53.249222070581396 53.749207742471775 -140.287 117.25917603147789 118.0997625240279 53.249222070581396 53.749207742471775 -141.287 118.0997625240279 118.9403490165779 53.249222070581396 53.749207742471775 -142.287 118.9403490165779 119.78093550912789 53.249222070581396 53.749207742471775 -143.287 119.78093550912789 120.62152200167789 53.249222070581396 53.749207742471775 -144.287 120.62152200167789 121.4621084941779 53.249222070581396 53.749207742471775 -145.287 121.4621084941779 122.30269498672789 53.249222070581396 53.749207742471775 -146.287 122.30269498672789 123.14328147927787 53.249222070581396 53.749207742471775 -147.287 123.14328147927787 123.98386797182789 53.249222070581396 53.749207742471775 -148.287 123.98386797182789 124.8244544643779 53.249222070581396 53.749207742471775 -149.287 124.8244544643779 125.6650409569279 53.249222070581396 53.749207742471775 -150.287 125.6650409569279 126.50562744947788 53.249222070581396 53.749207742471775 -151.287 126.50562744947788 127.34621394197788 53.249222070581396 53.749207742471775 -152.287 127.34621394197788 128.1868004345279 53.249222070581396 53.749207742471775 -153.287 128.1868004345279 129.02738692707788 53.249222070581396 53.749207742471775 -154.287 129.02738692707788 129.8679734196279 53.249222070581396 53.749207742471775 -155.287 129.8679734196279 130.7085599121779 53.249222070581396 53.749207742471775 -156.287 130.7085599121779 131.54914640472788 53.249222070581396 53.749207742471775 -157.287 131.54914640472788 132.40320978227956 53.249222070581396 53.749207742471775 -230.287 192.89848347537617 193.75254685287786 53.249222070581396 53.749207742471775 -231.287 193.75254685287786 194.59313334542787 53.249222070581396 53.749207742471775 -232.287 194.59313334542787 195.4337198379779 53.249222070581396 53.749207742471775 -233.287 195.4337198379779 196.27430633052785 53.249222070581396 53.749207742471775 -234.287 196.27430633052785 197.11489282307787 53.249222070581396 53.749207742471775 -235.287 197.11489282307787 197.95547931562785 53.249222070581396 53.749207742471775 -236.287 197.95547931562785 198.79606580817784 53.249222070581396 53.749207742471775 -237.287 198.79606580817784 199.6366523006779 53.249222070581396 53.749207742471775 -238.287 199.6366523006779 200.47723879322788 53.249222070581396 53.749207742471775 -239.287 200.47723879322788 201.31782528577787 53.249222070581396 53.749207742471775 -240.287 201.31782528577787 202.15841177832783 53.249222070581396 53.749207742471775 -241.287 202.15841177832783 202.99899827087788 53.249222070581396 53.749207742471775 -242.287 202.99899827087788 203.83958476342787 53.249222070581396 53.749207742471775 -243.287 203.83958476342787 204.68017125597788 53.249222070581396 53.749207742471775 -244.287 204.68017125597788 205.52075774847788 53.249222070581396 53.749207742471775 -245.287 205.52075774847788 206.36134424102784 53.249222070581396 53.749207742471775 -246.287 206.36134424102784 207.20193073357785 53.249222070581396 53.749207742471775 -247.287 207.20193073357785 208.04251722612787 53.249222070581396 53.749207742471775 -248.287 208.04251722612787 208.8831037186779 53.249222070581396 53.749207742471775 -249.287 208.8831037186779 209.72369021122788 53.249222070581396 53.749207742471775 -250.287 209.72369021122788 210.56427670377786 53.249222070581396 53.749207742471775 -251.287 210.56427670377786 211.40486319632788 53.249222070581396 53.749207742471775 -252.287 211.40486319632788 212.24544968887787 53.249222070581396 53.749207742471775 -253.287 212.24544968887787 213.0860361813779 53.249222070581396 53.749207742471775 -254.287 213.0860361813779 213.92662267392785 53.249222070581396 53.749207742471775 -255.287 213.92662267392785 214.76720916647787 53.249222070581396 53.749207742471775 -256.287 214.76720916647787 215.6077956590279 53.249222070581396 53.749207742471775 -257.287 215.6077956590279 216.44838215157785 53.249222070581396 53.749207742471775 -258.287 216.44838215157785 217.28896864412786 53.249222070581396 53.749207742471775 -259.287 217.28896864412786 218.12955513667785 53.249222070581396 53.749207742471775 -260.287 218.12955513667785 218.97014162917787 53.249222070581396 53.749207742471775 -261.287 218.97014162917787 219.8107281217279 53.249222070581396 53.749207742471775 -262.287 219.8107281217279 220.65131461427785 53.249222070581396 53.749207742471775 -263.287 220.65131461427785 221.49190110682787 53.249222070581396 53.749207742471775 -264.287 221.49190110682787 222.33248759937786 53.249222070581396 53.749207742471775 -265.287 222.33248759937786 223.17307409192787 53.249222070581396 53.749207742471775 -266.287 223.17307409192787 224.01366058447786 53.249222070581396 53.749207742471775 -267.287 224.01366058447786 224.85424707697786 53.249222070581396 53.749207742471775 -268.287 224.85424707697786 225.69483356952787 53.249222070581396 53.749207742471775 -269.287 225.69483356952787 226.53542006207786 53.249222070581396 53.749207742471775 -270.287 226.53542006207786 227.37600655462785 53.249222070581396 53.749207742471775 -271.287 227.37600655462785 228.21659304717787 53.249222070581396 53.749207742471775 -272.287 228.21659304717787 229.05717953972788 53.249222070581396 53.749207742471775 -273.287 229.05717953972788 229.91124291727954 53.249222070581396 53.749207742471775 -284.287 238.29015407267622 239.14421745022787 53.249222070581396 53.749207742471775 -285.287 239.14421745022787 239.9848039427779 53.249222070581396 53.749207742471775 -286.287 239.9848039427779 240.8253904353279 53.249222070581396 53.749207742471775 -287.287 240.8253904353279 241.66597692787786 53.249222070581396 53.749207742471775 -288.287 241.66597692787786 242.5065634203779 53.249222070581396 53.749207742471775 -289.287 242.5065634203779 243.34714991292788 53.249222070581396 53.749207742471775 -290.287 243.34714991292788 244.1877364054779 53.249222070581396 53.749207742471775 -291.287 244.1877364054779 245.02832289802785 53.249222070581396 53.749207742471775 -292.287 245.02832289802785 245.86890939057787 53.249222070581396 53.749207742471775 -293.287 245.86890939057787 246.7094958831279 53.249222070581396 53.749207742471775 -294.287 246.7094958831279 247.55008237567785 53.249222070581396 53.749207742471775 -295.287 247.55008237567785 248.39066886817787 53.249222070581396 53.749207742471775 -296.287 248.39066886817787 249.23125536072789 53.249222070581396 53.749207742471775 -297.287 249.23125536072789 250.07184185327787 53.249222070581396 53.749207742471775 -298.287 250.07184185327787 250.9124283458279 53.249222070581396 53.749207742471775 -299.287 250.9124283458279 251.75301483837785 53.249222070581396 53.749207742471775 -300.287 251.75301483837785 252.59360133092787 53.249222070581396 53.749207742471775 -301.287 252.59360133092787 253.43418782347788 53.249222070581396 53.749207742471775 -302.287 253.43418782347788 254.27477431597788 53.249222070581396 53.749207742471775 -303.287 254.27477431597788 255.1153608085279 53.249222070581396 53.749207742471775 -304.287 255.1153608085279 255.95594730107788 53.249222070581396 53.749207742471775 -305.287 255.95594730107788 256.7965337936279 53.249222070581396 53.749207742471775 -306.287 256.7965337936279 257.6371202861779 53.249222070581396 53.749207742471775 -307.287 257.6371202861779 258.4777067787279 53.249222070581396 53.749207742471775 -308.287 258.4777067787279 259.31829327127787 53.249222070581396 53.749207742471775 -309.287 259.31829327127787 260.15887976377786 53.249222070581396 53.749207742471775 -310.287 260.15887976377786 260.9994662563279 53.249222070581396 53.749207742471775 -311.287 260.9994662563279 261.8400527488779 53.249222070581396 53.749207742471775 -312.287 261.8400527488779 262.6806392414279 53.249222070581396 53.749207742471775 -313.287 262.6806392414279 263.5212257339779 53.249222070581396 53.749207742471775 -314.287 263.5212257339779 264.3618122265279 53.249222070581396 53.749207742471775 -315.287 264.3618122265279 265.2023987190779 53.249222070581396 53.749207742471775 -316.287 265.2023987190779 266.0429852115779 53.249222070581396 53.749207742471775 -317.287 266.0429852115779 266.8835717041279 53.249222070581396 53.749207742471775 -318.287 266.8835717041279 267.7241581966779 53.249222070581396 53.749207742471775 -319.287 267.7241581966779 268.56474468922784 53.249222070581396 53.749207742471775 -320.287 268.56474468922784 269.40533118177785 53.249222070581396 53.749207742471775 -321.287 269.40533118177785 270.24591767432787 53.249222070581396 53.749207742471775 -322.287 270.24591767432787 271.0865041668779 53.249222070581396 53.749207742471775 -323.287 271.0865041668779 271.9270906594279 53.249222070581396 53.749207742471775 -324.287 271.9270906594279 272.76767715197786 53.249222070581396 53.749207742471775 -325.287 272.76767715197786 273.60826364447786 53.249222070581396 53.749207742471775 -326.287 273.60826364447786 274.4488501370279 53.249222070581396 53.749207742471775 -327.287 274.4488501370279 275.2894366295779 53.249222070581396 53.749207742471775 -328.287 275.2894366295779 276.1300231221279 53.249222070581396 53.749207742471775 -329.287 276.1300231221279 276.97060961467787 53.249222070581396 53.749207742471775 -330.287 276.97060961467787 277.8111961072279 53.249222070581396 53.749207742471775 -331.287 277.8111961072279 278.66525948477954 53.249222070581396 53.749207742471775 -126.288 106.74031718184338 107.6046066374445 53.749207742471775 54.24919306920428 -127.288 107.6046066374445 108.4552574457945 53.749207742471775 54.24919306920428 -128.288 108.4552574457945 109.3059082541445 53.749207742471775 54.24919306920428 -129.288 109.3059082541445 110.15655906249452 53.749207742471775 54.24919306920428 -130.288 110.15655906249452 111.00720987084452 53.749207742471775 54.24919306920428 -131.288 111.00720987084452 111.8578606791945 53.749207742471775 54.24919306920428 -132.288 111.8578606791945 112.7085114875445 53.749207742471775 54.24919306920428 -133.288 112.7085114875445 113.55916229589451 53.749207742471775 54.24919306920428 -134.288 113.55916229589451 114.4098131042445 53.749207742471775 54.24919306920428 -135.288 114.4098131042445 115.2604639125945 53.749207742471775 54.24919306920428 -136.288 115.2604639125945 116.1111147209445 53.749207742471775 54.24919306920428 -137.288 116.1111147209445 116.9617655292945 53.749207742471775 54.24919306920428 -138.288 116.9617655292945 117.81241633764449 53.749207742471775 54.24919306920428 -139.288 117.81241633764449 118.66306714599449 53.749207742471775 54.24919306920428 -140.288 118.66306714599449 119.51371795434451 53.749207742471775 54.24919306920428 -141.288 119.51371795434451 120.3643687626945 53.749207742471775 54.24919306920428 -142.288 120.3643687626945 121.21501957104451 53.749207742471775 54.24919306920428 -143.288 121.21501957104451 122.06567037939449 53.749207742471775 54.24919306920428 -144.288 122.06567037939449 122.9163211877445 53.749207742471775 54.24919306920428 -145.288 122.9163211877445 123.7669719960945 53.749207742471775 54.24919306920428 -146.288 123.7669719960945 124.61762280449449 53.749207742471775 54.24919306920428 -147.288 124.61762280449449 125.46827361284448 53.749207742471775 54.24919306920428 -148.288 125.46827361284448 126.3189244211945 53.749207742471775 54.24919306920428 -149.288 126.3189244211945 127.16957522954448 53.749207742471775 54.24919306920428 -150.288 127.16957522954448 128.02022603789447 53.749207742471775 54.24919306920428 -151.288 128.02022603789447 128.87087684624447 53.749207742471775 54.24919306920428 -152.288 128.87087684624447 129.7215276545945 53.749207742471775 54.24919306920428 -153.288 129.7215276545945 130.5721784629445 53.749207742471775 54.24919306920428 -154.288 130.5721784629445 131.42282927129452 53.749207742471775 54.24919306920428 -155.288 131.42282927129452 132.28711872694564 53.749207742471775 54.24919306920428 -187.288 158.63001649124337 159.49430594689449 53.749207742471775 54.24919306920428 -188.288 159.49430594689449 160.34495675524448 53.749207742471775 54.24919306920428 -189.288 160.34495675524448 161.19560756359448 53.749207742471775 54.24919306920428 -190.288 161.19560756359448 162.04625837194448 53.749207742471775 54.24919306920428 -191.288 162.04625837194448 162.8969091802945 53.749207742471775 54.24919306920428 -192.288 162.8969091802945 163.7475599886445 53.749207742471775 54.24919306920428 -193.288 163.7475599886445 164.59821079699446 53.749207742471775 54.24919306920428 -194.288 164.59821079699446 165.44886160534452 53.749207742471775 54.24919306920428 -195.288 165.44886160534452 166.29951241369452 53.749207742471775 54.24919306920428 -196.288 166.29951241369452 167.15016322209448 53.749207742471775 54.24919306920428 -197.288 167.15016322209448 168.00081403044447 53.749207742471775 54.24919306920428 -198.288 168.00081403044447 168.8514648387945 53.749207742471775 54.24919306920428 -199.288 168.8514648387945 169.70211564714452 53.749207742471775 54.24919306920428 -200.288 169.70211564714452 170.55276645549452 53.749207742471775 54.24919306920428 -201.288 170.55276645549452 171.40341726384452 53.749207742471775 54.24919306920428 -202.288 171.40341726384452 172.2677067194456 53.749207742471775 54.24919306920428 -228.288 193.50669963374335 194.3709890893445 53.749207742471775 54.24919306920428 -229.288 194.3709890893445 195.2216398976945 53.749207742471775 54.24919306920428 -230.288 195.2216398976945 196.0722907060445 53.749207742471775 54.24919306920428 -231.288 196.0722907060445 196.9229415143945 53.749207742471775 54.24919306920428 -232.288 196.9229415143945 197.77359232274452 53.749207742471775 54.24919306920428 -233.288 197.77359232274452 198.6242431310945 53.749207742471775 54.24919306920428 -234.288 198.6242431310945 199.47489393944448 53.749207742471775 54.24919306920428 -235.288 199.47489393944448 200.32554474779448 53.749207742471775 54.24919306920428 -236.288 200.32554474779448 201.17619555614448 53.749207742471775 54.24919306920428 -237.288 201.17619555614448 202.0268463644945 53.749207742471775 54.24919306920428 -238.288 202.0268463644945 202.87749717284447 53.749207742471775 54.24919306920428 -239.288 202.87749717284447 203.72814798119447 53.749207742471775 54.24919306920428 -240.288 203.72814798119447 204.57879878954452 53.749207742471775 54.24919306920428 -241.288 204.57879878954452 205.42944959789452 53.749207742471775 54.24919306920428 -242.288 205.42944959789452 206.28010040624451 53.749207742471775 54.24919306920428 -243.288 206.28010040624451 207.1307512145945 53.749207742471775 54.24919306920428 -244.288 207.1307512145945 207.9814020229945 53.749207742471775 54.24919306920428 -245.288 207.9814020229945 208.8320528313445 53.749207742471775 54.24919306920428 -246.288 208.8320528313445 209.6827036396945 53.749207742471775 54.24919306920428 -247.288 209.6827036396945 210.5333544480445 53.749207742471775 54.24919306920428 -248.288 210.5333544480445 211.38400525639452 53.749207742471775 54.24919306920428 -249.288 211.38400525639452 212.2346560647445 53.749207742471775 54.24919306920428 -250.288 212.2346560647445 213.08530687309448 53.749207742471775 54.24919306920428 -251.288 213.08530687309448 213.9359576814445 53.749207742471775 54.24919306920428 -252.288 213.9359576814445 214.7866084897945 53.749207742471775 54.24919306920428 -253.288 214.7866084897945 215.6372592981445 53.749207742471775 54.24919306920428 -254.288 215.6372592981445 216.4879101064945 53.749207742471775 54.24919306920428 -255.288 216.4879101064945 217.3385609148445 53.749207742471775 54.24919306920428 -256.288 217.3385609148445 218.1892117231945 53.749207742471775 54.24919306920428 -257.288 218.1892117231945 219.0398625315445 53.749207742471775 54.24919306920428 -258.288 219.0398625315445 219.89051333989448 53.749207742471775 54.24919306920428 -259.288 219.89051333989448 220.74116414824448 53.749207742471775 54.24919306920428 -260.288 220.74116414824448 221.59181495659448 53.749207742471775 54.24919306920428 -261.288 221.59181495659448 222.44246576494447 53.749207742471775 54.24919306920428 -262.288 222.44246576494447 223.2931165732945 53.749207742471775 54.24919306920428 -263.288 223.2931165732945 224.14376738164452 53.749207742471775 54.24919306920428 -264.288 224.14376738164452 224.99441818999452 53.749207742471775 54.24919306920428 -265.288 224.99441818999452 225.84506899834452 53.749207742471775 54.24919306920428 -266.288 225.84506899834452 226.6957198066945 53.749207742471775 54.24919306920428 -267.288 226.6957198066945 227.54637061504448 53.749207742471775 54.24919306920428 -268.288 227.54637061504448 228.3970214233945 53.749207742471775 54.24919306920428 -269.288 228.3970214233945 229.2476722317945 53.749207742471775 54.24919306920428 -270.288 229.2476722317945 230.09832304014452 53.749207742471775 54.24919306920428 -271.288 230.09832304014452 230.96261249574567 53.749207742471775 54.24919306920428 -281.288 238.59119247634334 239.45548193199448 53.749207742471775 54.24919306920428 -282.288 239.45548193199448 240.3061327403445 53.749207742471775 54.24919306920428 -283.288 240.3061327403445 241.15678354869448 53.749207742471775 54.24919306920428 -284.288 241.15678354869448 242.0074343570445 53.749207742471775 54.24919306920428 -285.288 242.0074343570445 242.8580851653945 53.749207742471775 54.24919306920428 -286.288 242.8580851653945 243.7087359737445 53.749207742471775 54.24919306920428 -287.288 243.7087359737445 244.55938678209452 53.749207742471775 54.24919306920428 -288.288 244.55938678209452 245.4100375904445 53.749207742471775 54.24919306920428 -289.288 245.4100375904445 246.2606883987945 53.749207742471775 54.24919306920428 -290.288 246.2606883987945 247.1113392071445 53.749207742471775 54.24919306920428 -291.288 247.1113392071445 247.96199001549448 53.749207742471775 54.24919306920428 -292.288 247.96199001549448 248.81264082384448 53.749207742471775 54.24919306920428 -293.288 248.81264082384448 249.6632916321945 53.749207742471775 54.24919306920428 -294.288 249.6632916321945 250.51394244059452 53.749207742471775 54.24919306920428 -295.288 250.51394244059452 251.36459324894452 53.749207742471775 54.24919306920428 -296.288 251.36459324894452 252.21524405729448 53.749207742471775 54.24919306920428 -297.288 252.21524405729448 253.06589486564448 53.749207742471775 54.24919306920428 -298.288 253.06589486564448 253.9165456739945 53.749207742471775 54.24919306920428 -299.288 253.9165456739945 254.76719648234447 53.749207742471775 54.24919306920428 -300.288 254.76719648234447 255.6178472906945 53.749207742471775 54.24919306920428 -301.288 255.6178472906945 256.4684980990445 53.749207742471775 54.24919306920428 -302.288 256.4684980990445 257.3191489073945 53.749207742471775 54.24919306920428 -303.288 257.3191489073945 258.1697997157445 53.749207742471775 54.24919306920428 -304.288 258.1697997157445 259.0204505240945 53.749207742471775 54.24919306920428 -305.288 259.0204505240945 259.8711013324445 53.749207742471775 54.24919306920428 -306.288 259.8711013324445 260.7217521407945 53.749207742471775 54.24919306920428 -307.288 260.7217521407945 261.5724029491445 53.749207742471775 54.24919306920428 -308.288 261.5724029491445 262.4230537574945 53.749207742471775 54.24919306920428 -309.288 262.4230537574945 263.27370456584447 53.749207742471775 54.24919306920428 -310.288 263.27370456584447 264.12435537419447 53.749207742471775 54.24919306920428 -311.288 264.12435537419447 264.97500618254446 53.749207742471775 54.24919306920428 -312.288 264.97500618254446 265.82565699089446 53.749207742471775 54.24919306920428 -313.288 265.82565699089446 266.6763077992445 53.749207742471775 54.24919306920428 -314.288 266.6763077992445 267.5269586075945 53.749207742471775 54.24919306920428 -315.288 267.5269586075945 268.3776094159445 53.749207742471775 54.24919306920428 -316.288 268.3776094159445 269.2282602242945 53.749207742471775 54.24919306920428 -317.288 269.2282602242945 270.07891103264444 53.749207742471775 54.24919306920428 -318.288 270.07891103264444 270.92956184099444 53.749207742471775 54.24919306920428 -319.288 270.92956184099444 271.7802126493945 53.749207742471775 54.24919306920428 -320.288 271.7802126493945 272.6308634577445 53.749207742471775 54.24919306920428 -321.288 272.6308634577445 273.4815142660945 53.749207742471775 54.24919306920428 -322.288 273.4815142660945 274.33216507444445 53.749207742471775 54.24919306920428 -323.288 274.33216507444445 275.18281588279444 53.749207742471775 54.24919306920428 -324.288 275.18281588279444 276.0334666911445 53.749207742471775 54.24919306920428 -325.288 276.0334666911445 276.8841174994945 53.749207742471775 54.24919306920428 -326.288 276.8841174994945 277.7347683078445 53.749207742471775 54.24919306920428 -327.288 277.7347683078445 278.5854191161945 53.749207742471775 54.24919306920428 -328.288 278.5854191161945 279.44970857184563 53.749207742471775 54.24919306920428 -124.289 106.32002765864965 107.19485847957705 54.24919306920428 54.74917803583754 -125.289 107.19485847957705 108.05588388867706 54.24919306920428 54.74917803583754 -126.289 108.05588388867706 108.91690929777707 54.24919306920428 54.74917803583754 -127.289 108.91690929777707 109.77793470682707 54.24919306920428 54.74917803583754 -128.289 109.77793470682707 110.63896011587707 54.24919306920428 54.74917803583754 -129.289 110.63896011587707 111.49998552497706 54.24919306920428 54.74917803583754 -130.289 111.49998552497706 112.36101093407706 54.24919306920428 54.74917803583754 -131.289 112.36101093407706 113.22203634317708 54.24919306920428 54.74917803583754 -132.289 113.22203634317708 114.08306175227708 54.24919306920428 54.74917803583754 -133.289 114.08306175227708 114.94408716137707 54.24919306920428 54.74917803583754 -134.289 114.94408716137707 115.80511257047706 54.24919306920428 54.74917803583754 -135.289 115.80511257047706 116.66613797957706 54.24919306920428 54.74917803583754 -136.289 116.66613797957706 117.52716338862706 54.24919306920428 54.74917803583754 -137.289 117.52716338862706 118.38818879767706 54.24919306920428 54.74917803583754 -138.289 118.38818879767706 119.24921420677708 54.24919306920428 54.74917803583754 -139.289 119.24921420677708 120.11023961587708 54.24919306920428 54.74917803583754 -140.289 120.11023961587708 120.97126502497707 54.24919306920428 54.74917803583754 -141.289 120.97126502497707 121.83229043407707 54.24919306920428 54.74917803583754 -142.289 121.83229043407707 122.69331584317707 54.24919306920428 54.74917803583754 -143.289 122.69331584317707 123.55434125227708 54.24919306920428 54.74917803583754 -144.289 123.55434125227708 124.41536666137706 54.24919306920428 54.74917803583754 -145.289 124.41536666137706 125.27639207042706 54.24919306920428 54.74917803583754 -146.289 125.27639207042706 126.13741747947708 54.24919306920428 54.74917803583754 -147.289 126.13741747947708 126.99844288857707 54.24919306920428 54.74917803583754 -148.289 126.99844288857707 127.85946829767707 54.24919306920428 54.74917803583754 -149.289 127.85946829767707 128.7204937067771 54.24919306920428 54.74917803583754 -150.289 128.7204937067771 129.5815191158771 54.24919306920428 54.74917803583754 -151.289 129.5815191158771 130.44254452497708 54.24919306920428 54.74917803583754 -152.289 130.44254452497708 131.30356993407707 54.24919306920428 54.74917803583754 -153.289 131.30356993407707 132.17840075500447 54.24919306920428 54.74917803583754 -185.289 158.84257761304966 159.71740843397706 54.24919306920428 54.74917803583754 -186.289 159.71740843397706 160.57843384307705 54.24919306920428 54.74917803583754 -187.289 160.57843384307705 161.43945925217707 54.24919306920428 54.74917803583754 -188.289 161.43945925217707 162.30048466127707 54.24919306920428 54.74917803583754 -189.289 162.30048466127707 163.16151007032707 54.24919306920428 54.74917803583754 -190.289 163.16151007032707 164.0225354793771 54.24919306920428 54.74917803583754 -191.289 164.0225354793771 164.8835608884771 54.24919306920428 54.74917803583754 -192.289 164.8835608884771 165.7445862975771 54.24919306920428 54.74917803583754 -193.289 165.7445862975771 166.60561170667708 54.24919306920428 54.74917803583754 -194.289 166.60561170667708 167.46663711577708 54.24919306920428 54.74917803583754 -195.289 167.46663711577708 168.32766252487704 54.24919306920428 54.74917803583754 -196.289 168.32766252487704 169.18868793397706 54.24919306920428 54.74917803583754 -197.289 169.18868793397706 170.0497133430771 54.24919306920428 54.74917803583754 -198.289 170.0497133430771 170.91073875212706 54.24919306920428 54.74917803583754 -199.289 170.91073875212706 171.7717641611771 54.24919306920428 54.74917803583754 -200.289 171.7717641611771 172.6465949821045 54.24919306920428 54.74917803583754 -225.289 193.2835939765496 194.15842479747704 54.24919306920428 54.74917803583754 -226.289 194.15842479747704 195.01945020657706 54.24919306920428 54.74917803583754 -227.289 195.01945020657706 195.88047561567703 54.24919306920428 54.74917803583754 -228.289 195.88047561567703 196.74150102477705 54.24919306920428 54.74917803583754 -229.289 196.74150102477705 197.60252643387702 54.24919306920428 54.74917803583754 -230.289 197.60252643387702 198.46355184297704 54.24919306920428 54.74917803583754 -231.289 198.46355184297704 199.32457725207706 54.24919306920428 54.74917803583754 -232.289 199.32457725207706 200.18560266117703 54.24919306920428 54.74917803583754 -233.289 200.18560266117703 201.04662807022706 54.24919306920428 54.74917803583754 -234.289 201.04662807022706 201.90765347927703 54.24919306920428 54.74917803583754 -235.289 201.90765347927703 202.76867888837705 54.24919306920428 54.74917803583754 -236.289 202.76867888837705 203.62970429747702 54.24919306920428 54.74917803583754 -237.289 203.62970429747702 204.49072970657704 54.24919306920428 54.74917803583754 -238.289 204.49072970657704 205.35175511567704 54.24919306920428 54.74917803583754 -239.289 205.35175511567704 206.21278052477706 54.24919306920428 54.74917803583754 -240.289 206.21278052477706 207.07380593387705 54.24919306920428 54.74917803583754 -241.289 207.07380593387705 207.93483134297705 54.24919306920428 54.74917803583754 -242.289 207.93483134297705 208.79585675202705 54.24919306920428 54.74917803583754 -243.289 208.79585675202705 209.65688216107705 54.24919306920428 54.74917803583754 -244.289 209.65688216107705 210.51790757017704 54.24919306920428 54.74917803583754 -245.289 210.51790757017704 211.37893297927707 54.24919306920428 54.74917803583754 -246.289 211.37893297927707 212.23995838837706 54.24919306920428 54.74917803583754 -247.289 212.23995838837706 213.10098379747706 54.24919306920428 54.74917803583754 -248.289 213.10098379747706 213.96200920657702 54.24919306920428 54.74917803583754 -249.289 213.96200920657702 214.82303461567705 54.24919306920428 54.74917803583754 -250.289 214.82303461567705 215.68406002477704 54.24919306920428 54.74917803583754 -251.289 215.68406002477704 216.54508543382707 54.24919306920428 54.74917803583754 -252.289 216.54508543382707 217.40611084287707 54.24919306920428 54.74917803583754 -253.289 217.40611084287707 218.26713625197706 54.24919306920428 54.74917803583754 -254.289 218.26713625197706 219.12816166107706 54.24919306920428 54.74917803583754 -255.289 219.12816166107706 219.98918707017708 54.24919306920428 54.74917803583754 -256.289 219.98918707017708 220.85021247927705 54.24919306920428 54.74917803583754 -257.289 220.85021247927705 221.71123788837704 54.24919306920428 54.74917803583754 -258.289 221.71123788837704 222.57226329747704 54.24919306920428 54.74917803583754 -259.289 222.57226329747704 223.43328870652704 54.24919306920428 54.74917803583754 -260.289 223.43328870652704 224.29431411557704 54.24919306920428 54.74917803583754 -261.289 224.29431411557704 225.15533952467706 54.24919306920428 54.74917803583754 -262.289 225.15533952467706 226.01636493377706 54.24919306920428 54.74917803583754 -263.289 226.01636493377706 226.87739034287705 54.24919306920428 54.74917803583754 -264.289 226.87739034287705 227.73841575197704 54.24919306920428 54.74917803583754 -265.289 227.73841575197704 228.59944116107704 54.24919306920428 54.74917803583754 -266.289 228.59944116107704 229.46046657017706 54.24919306920428 54.74917803583754 -267.289 229.46046657017706 230.32149197927706 54.24919306920428 54.74917803583754 -268.289 230.32149197927706 231.19632280020446 54.24919306920428 54.74917803583754 -279.289 239.77896606734964 240.65379688827707 54.24919306920428 54.74917803583754 -280.289 240.65379688827707 241.51482229737707 54.24919306920428 54.74917803583754 -281.289 241.51482229737707 242.37584770647706 54.24919306920428 54.74917803583754 -282.289 242.37584770647706 243.23687311557705 54.24919306920428 54.74917803583754 -283.289 243.23687311557705 244.09789852467708 54.24919306920428 54.74917803583754 -284.289 244.09789852467708 244.95892393377704 54.24919306920428 54.74917803583754 -285.289 244.95892393377704 245.81994934287707 54.24919306920428 54.74917803583754 -286.289 245.81994934287707 246.68097475192707 54.24919306920428 54.74917803583754 -287.289 246.68097475192707 247.54200016097707 54.24919306920428 54.74917803583754 -288.289 247.54200016097707 248.4030255700771 54.24919306920428 54.74917803583754 -289.289 248.4030255700771 249.26405097917706 54.24919306920428 54.74917803583754 -290.289 249.26405097917706 250.12507638827708 54.24919306920428 54.74917803583754 -291.289 250.12507638827708 250.98610179737705 54.24919306920428 54.74917803583754 -292.289 250.98610179737705 251.84712720647707 54.24919306920428 54.74917803583754 -293.289 251.84712720647707 252.70815261557706 54.24919306920428 54.74917803583754 -294.289 252.70815261557706 253.56917802467706 54.24919306920428 54.74917803583754 -295.289 253.56917802467706 254.43020343372706 54.24919306920428 54.74917803583754 -296.289 254.43020343372706 255.29122884277706 54.24919306920428 54.74917803583754 -297.289 255.29122884277706 256.1522542518771 54.24919306920428 54.74917803583754 -298.289 256.1522542518771 257.0132796609771 54.24919306920428 54.74917803583754 -299.289 257.0132796609771 257.87430507007707 54.24919306920428 54.74917803583754 -300.289 257.87430507007707 258.73533047917704 54.24919306920428 54.74917803583754 -301.289 258.73533047917704 259.59635588827706 54.24919306920428 54.74917803583754 -302.289 259.59635588827706 260.4573812973771 54.24919306920428 54.74917803583754 -303.289 260.4573812973771 261.3322121183045 54.24919306920428 54.74917803583754 -314.289 269.91485538544964 270.78968620637704 54.24919306920428 54.74917803583754 -315.289 270.78968620637704 271.650711615477 54.24919306920428 54.74917803583754 -316.289 271.650711615477 272.51173702457703 54.24919306920428 54.74917803583754 -317.289 272.51173702457703 273.37276243367705 54.24919306920428 54.74917803583754 -318.289 273.37276243367705 274.233787842777 54.24919306920428 54.74917803583754 -319.289 274.233787842777 275.0948132518771 54.24919306920428 54.74917803583754 -320.289 275.0948132518771 275.95583866097707 54.24919306920428 54.74917803583754 -321.289 275.95583866097707 276.816864070027 54.24919306920428 54.74917803583754 -322.289 276.816864070027 277.67788947907707 54.24919306920428 54.74917803583754 -323.289 277.67788947907707 278.53891488817703 54.24919306920428 54.74917803583754 -324.289 278.53891488817703 279.41374570910443 54.24919306920428 54.74917803583754 -123.290 106.76924596779752 107.65494675648009 54.74917803583754 55.24916262657524 -124.290 107.65494675648009 108.52667015428008 54.74917803583754 55.24916262657524 -125.290 108.52667015428008 109.39839355208008 54.74917803583754 55.24916262657524 -126.290 109.39839355208008 110.27011694988008 54.74917803583754 55.24916262657524 -127.290 110.27011694988008 111.1418403477301 54.74917803583754 55.24916262657524 -128.290 111.1418403477301 112.01356374558009 54.74917803583754 55.24916262657524 -129.290 112.01356374558009 112.88528714338008 54.74917803583754 55.24916262657524 -130.290 112.88528714338008 113.75701054118008 54.74917803583754 55.24916262657524 -131.290 113.75701054118008 114.62873393898009 54.74917803583754 55.24916262657524 -132.290 114.62873393898009 115.50045733678009 54.74917803583754 55.24916262657524 -133.290 115.50045733678009 116.3721807345801 54.74917803583754 55.24916262657524 -134.290 116.3721807345801 117.24390413238008 54.74917803583754 55.24916262657524 -135.290 117.24390413238008 118.11562753018009 54.74917803583754 55.24916262657524 -136.290 118.11562753018009 118.98735092798007 54.74917803583754 55.24916262657524 -137.290 118.98735092798007 119.85907432583011 54.74917803583754 55.24916262657524 -138.290 119.85907432583011 120.73079772368011 54.74917803583754 55.24916262657524 -139.290 120.73079772368011 121.6025211214801 54.74917803583754 55.24916262657524 -140.290 121.6025211214801 122.47424451928009 54.74917803583754 55.24916262657524 -141.290 122.47424451928009 123.34596791708009 54.74917803583754 55.24916262657524 -142.290 123.34596791708009 124.21769131488008 54.74917803583754 55.24916262657524 -143.290 124.21769131488008 125.0894147126801 54.74917803583754 55.24916262657524 -144.290 125.0894147126801 125.96113811048009 54.74917803583754 55.24916262657524 -145.290 125.96113811048009 126.83286150828009 54.74917803583754 55.24916262657524 -146.290 126.83286150828009 127.7045849061301 54.74917803583754 55.24916262657524 -147.290 127.7045849061301 128.5763083039801 54.74917803583754 55.24916262657524 -148.290 128.5763083039801 129.4480317017801 54.74917803583754 55.24916262657524 -149.290 129.4480317017801 130.3197550995801 54.74917803583754 55.24916262657524 -150.290 130.3197550995801 131.19147849738007 54.74917803583754 55.24916262657524 -151.290 131.19147849738007 132.0632018951801 54.74917803583754 55.24916262657524 -152.290 132.0632018951801 132.94890268386268 54.74917803583754 55.24916262657524 -183.290 159.07264983639752 159.95835062508007 54.74917803583754 55.24916262657524 -184.290 159.95835062508007 160.8300740229301 54.74917803583754 55.24916262657524 -185.290 160.8300740229301 161.7017974207801 54.74917803583754 55.24916262657524 -186.290 161.7017974207801 162.57352081858008 54.74917803583754 55.24916262657524 -187.290 162.57352081858008 163.4452442163801 54.74917803583754 55.24916262657524 -188.290 163.4452442163801 164.3169676141801 54.74917803583754 55.24916262657524 -189.290 164.3169676141801 165.18869101198007 54.74917803583754 55.24916262657524 -190.290 165.18869101198007 166.0604144097801 54.74917803583754 55.24916262657524 -191.290 166.0604144097801 166.9321378075801 54.74917803583754 55.24916262657524 -192.290 166.9321378075801 167.8038612053801 54.74917803583754 55.24916262657524 -193.290 167.8038612053801 168.67558460318008 54.74917803583754 55.24916262657524 -194.290 168.67558460318008 169.5473080010301 54.74917803583754 55.24916262657524 -195.290 169.5473080010301 170.4190313988801 54.74917803583754 55.24916262657524 -196.290 170.4190313988801 171.29075479668012 54.74917803583754 55.24916262657524 -197.290 171.29075479668012 172.1764555853627 54.74917803583754 55.24916262657524 -223.290 193.9415857488975 194.82728653758008 54.74917803583754 55.24916262657524 -224.290 194.82728653758008 195.69900993538005 54.74917803583754 55.24916262657524 -225.290 195.69900993538005 196.57073333318007 54.74917803583754 55.24916262657524 -226.290 196.57073333318007 197.44245673098007 54.74917803583754 55.24916262657524 -227.290 197.44245673098007 198.31418012878007 54.74917803583754 55.24916262657524 -228.290 198.31418012878007 199.1859035265801 54.74917803583754 55.24916262657524 -229.290 199.1859035265801 200.0576269243801 54.74917803583754 55.24916262657524 -230.290 200.0576269243801 200.92935032218008 54.74917803583754 55.24916262657524 -231.290 200.92935032218008 201.80107371998008 54.74917803583754 55.24916262657524 -232.290 201.80107371998008 202.6727971178301 54.74917803583754 55.24916262657524 -233.290 202.6727971178301 203.54452051568006 54.74917803583754 55.24916262657524 -234.290 203.54452051568006 204.4162439134801 54.74917803583754 55.24916262657524 -235.290 204.4162439134801 205.28796731128008 54.74917803583754 55.24916262657524 -236.290 205.28796731128008 206.15969070908005 54.74917803583754 55.24916262657524 -237.290 206.15969070908005 207.03141410688008 54.74917803583754 55.24916262657524 -238.290 207.03141410688008 207.90313750468007 54.74917803583754 55.24916262657524 -239.290 207.90313750468007 208.77486090248004 54.74917803583754 55.24916262657524 -240.290 208.77486090248004 209.64658430028007 54.74917803583754 55.24916262657524 -241.290 209.64658430028007 210.5183076981301 54.74917803583754 55.24916262657524 -242.290 210.5183076981301 211.39003109598008 54.74917803583754 55.24916262657524 -243.290 211.39003109598008 212.26175449378007 54.74917803583754 55.24916262657524 -244.290 212.26175449378007 213.13347789158007 54.74917803583754 55.24916262657524 -245.290 213.13347789158007 214.00520128938007 54.74917803583754 55.24916262657524 -246.290 214.00520128938007 214.8769246871801 54.74917803583754 55.24916262657524 -247.290 214.8769246871801 215.7486480849801 54.74917803583754 55.24916262657524 -248.290 215.7486480849801 216.62037148278006 54.74917803583754 55.24916262657524 -249.290 216.62037148278006 217.49209488058005 54.74917803583754 55.24916262657524 -250.290 217.49209488058005 218.36381827838008 54.74917803583754 55.24916262657524 -251.290 218.36381827838008 219.23554167623007 54.74917803583754 55.24916262657524 -252.290 219.23554167623007 220.1072650740801 54.74917803583754 55.24916262657524 -253.290 220.1072650740801 220.9789884718801 54.74917803583754 55.24916262657524 -254.290 220.9789884718801 221.85071186968008 54.74917803583754 55.24916262657524 -255.290 221.85071186968008 222.72243526748008 54.74917803583754 55.24916262657524 -256.290 222.72243526748008 223.59415866528008 54.74917803583754 55.24916262657524 -257.290 223.59415866528008 224.46588206308007 54.74917803583754 55.24916262657524 -258.290 224.46588206308007 225.33760546088007 54.74917803583754 55.24916262657524 -259.290 225.33760546088007 226.20932885868007 54.74917803583754 55.24916262657524 -260.290 226.20932885868007 227.08105225653009 54.74917803583754 55.24916262657524 -261.290 227.08105225653009 227.9527756543801 54.74917803583754 55.24916262657524 -262.290 227.9527756543801 228.82449905218007 54.74917803583754 55.24916262657524 -263.290 228.82449905218007 229.69622244998004 54.74917803583754 55.24916262657524 -264.290 229.69622244998004 230.56794584778007 54.74917803583754 55.24916262657524 -265.290 230.56794584778007 231.4396692455801 54.74917803583754 55.24916262657524 -266.290 231.4396692455801 232.32537003426268 54.74917803583754 55.24916262657524 -277.290 241.0146492305975 241.9003500192801 54.74917803583754 55.24916262657524 -278.290 241.9003500192801 242.7720734170801 54.74917803583754 55.24916262657524 -279.290 242.7720734170801 243.64379681493008 54.74917803583754 55.24916262657524 -280.290 243.64379681493008 244.51552021278007 54.74917803583754 55.24916262657524 -281.290 244.51552021278007 245.38724361058007 54.74917803583754 55.24916262657524 -282.290 245.38724361058007 246.2589670083801 54.74917803583754 55.24916262657524 -283.290 246.2589670083801 247.1306904061801 54.74917803583754 55.24916262657524 -284.290 247.1306904061801 248.00241380398006 54.74917803583754 55.24916262657524 -285.290 248.00241380398006 248.8741372017801 54.74917803583754 55.24916262657524 -286.290 248.8741372017801 249.74586059958008 54.74917803583754 55.24916262657524 -287.290 249.74586059958008 250.61758399738005 54.74917803583754 55.24916262657524 -288.290 250.61758399738005 251.48930739518005 54.74917803583754 55.24916262657524 -289.290 251.48930739518005 252.3610307930301 54.74917803583754 55.24916262657524 -290.290 252.3610307930301 253.2327541908801 54.74917803583754 55.24916262657524 -291.290 253.2327541908801 254.10447758868008 54.74917803583754 55.24916262657524 -292.290 254.10447758868008 254.97620098648008 54.74917803583754 55.24916262657524 -293.290 254.97620098648008 255.84792438428008 54.74917803583754 55.24916262657524 -294.290 255.84792438428008 256.7196477820801 54.74917803583754 55.24916262657524 -295.290 256.7196477820801 257.59137117988007 54.74917803583754 55.24916262657524 -296.290 257.59137117988007 258.46309457768007 54.74917803583754 55.24916262657524 -297.290 258.46309457768007 259.33481797548006 54.74917803583754 55.24916262657524 -298.290 259.33481797548006 260.2065413733301 54.74917803583754 55.24916262657524 -299.290 260.2065413733301 261.09224216206263 54.74917803583754 55.24916262657524 -311.290 270.6532447561975 271.53894554488005 54.74917803583754 55.24916262657524 -312.290 271.53894554488005 272.4106689426801 54.74917803583754 55.24916262657524 -313.290 272.4106689426801 273.2823923404801 54.74917803583754 55.24916262657524 -314.290 273.2823923404801 274.15411573828004 54.74917803583754 55.24916262657524 -315.290 274.15411573828004 275.0258391360801 54.74917803583754 55.24916262657524 -316.290 275.0258391360801 275.8975625338801 54.74917803583754 55.24916262657524 -317.290 275.8975625338801 276.76928593173005 54.74917803583754 55.24916262657524 -318.290 276.76928593173005 277.64100932958013 54.74917803583754 55.24916262657524 -319.290 277.64100932958013 278.5127327273801 54.74917803583754 55.24916262657524 -320.290 278.5127327273801 279.39843351606265 54.74917803583754 55.24916262657524 -121.291 106.35527684649857 107.25219029664993 55.24916262657524 55.74914682470368 -122.291 107.25219029664993 108.13494893769993 55.24916262657524 55.74914682470368 -123.291 108.13494893769993 109.01770757874993 55.24916262657524 55.74914682470368 -124.291 109.01770757874993 109.90046621984992 55.24916262657524 55.74914682470368 -125.291 109.90046621984992 110.78322486089992 55.24916262657524 55.74914682470368 -126.291 110.78322486089992 111.66598350194994 55.24916262657524 55.74914682470368 -127.291 111.66598350194994 112.54874214304992 55.24916262657524 55.74914682470368 -128.291 112.54874214304992 113.43150078409991 55.24916262657524 55.74914682470368 -129.291 113.43150078409991 114.31425942514991 55.24916262657524 55.74914682470368 -130.291 114.31425942514991 115.19701806624992 55.24916262657524 55.74914682470368 -131.291 115.19701806624992 116.07977670729993 55.24916262657524 55.74914682470368 -132.291 116.07977670729993 116.96253534834992 55.24916262657524 55.74914682470368 -133.291 116.96253534834992 117.84529398944991 55.24916262657524 55.74914682470368 -134.291 117.84529398944991 118.72805263049992 55.24916262657524 55.74914682470368 -135.291 118.72805263049992 119.61081127154992 55.24916262657524 55.74914682470368 -136.291 119.61081127154992 120.49356991264992 55.24916262657524 55.74914682470368 -137.291 120.49356991264992 121.37632855369992 55.24916262657524 55.74914682470368 -138.291 121.37632855369992 122.25908719474992 55.24916262657524 55.74914682470368 -139.291 122.25908719474992 123.14184583584992 55.24916262657524 55.74914682470368 -140.291 123.14184583584992 124.02460447689991 55.24916262657524 55.74914682470368 -141.291 124.02460447689991 124.90736311794991 55.24916262657524 55.74914682470368 -142.291 124.90736311794991 125.79012175904992 55.24916262657524 55.74914682470368 -143.291 125.79012175904992 126.67288040009993 55.24916262657524 55.74914682470368 -144.291 126.67288040009993 127.55563904114992 55.24916262657524 55.74914682470368 -145.291 127.55563904114992 128.43839768224993 55.24916262657524 55.74914682470368 -146.291 128.43839768224993 129.3211563232999 55.24916262657524 55.74914682470368 -147.291 129.3211563232999 130.2039149643499 55.24916262657524 55.74914682470368 -148.291 130.2039149643499 131.08667360544993 55.24916262657524 55.74914682470368 -149.291 131.08667360544993 131.96943224649993 55.24916262657524 55.74914682470368 -150.291 131.96943224649993 132.8663456966013 55.24916262657524 55.74914682470368 -180.291 158.4380366694986 159.3349501195999 55.24916262657524 55.74914682470368 -181.291 159.3349501195999 160.2177087606499 55.24916262657524 55.74914682470368 -182.291 160.2177087606499 161.1004674017499 55.24916262657524 55.74914682470368 -183.291 161.1004674017499 161.9832260427999 55.24916262657524 55.74914682470368 -184.291 161.9832260427999 162.86598468384992 55.24916262657524 55.74914682470368 -185.291 162.86598468384992 163.76289813400123 55.24916262657524 55.74914682470368 -221.291 194.63114095319858 195.52805440334993 55.24916262657524 55.74914682470368 -222.291 195.52805440334993 196.41081304444992 55.24916262657524 55.74914682470368 -223.291 196.41081304444992 197.29357168549993 55.24916262657524 55.74914682470368 -224.291 197.29357168549993 198.17633032654993 55.24916262657524 55.74914682470368 -225.291 198.17633032654993 199.05908896764993 55.24916262657524 55.74914682470368 -226.291 199.05908896764993 199.94184760874992 55.24916262657524 55.74914682470368 -227.291 199.94184760874992 200.82460624979996 55.24916262657524 55.74914682470368 -228.291 200.82460624979996 201.70736489084993 55.24916262657524 55.74914682470368 -229.291 201.70736489084993 202.59012353194993 55.24916262657524 55.74914682470368 -230.291 202.59012353194993 203.47288217299993 55.24916262657524 55.74914682470368 -231.291 203.47288217299993 204.35564081404993 55.24916262657524 55.74914682470368 -232.291 204.35564081404993 205.23839945514993 55.24916262657524 55.74914682470368 -233.291 205.23839945514993 206.12115809619993 55.24916262657524 55.74914682470368 -234.291 206.12115809619993 207.0039167372499 55.24916262657524 55.74914682470368 -235.291 207.0039167372499 207.88667537834993 55.24916262657524 55.74914682470368 -236.291 207.88667537834993 208.7694340193999 55.24916262657524 55.74914682470368 -237.291 208.7694340193999 209.6521926604499 55.24916262657524 55.74914682470368 -238.291 209.6521926604499 210.5349513015499 55.24916262657524 55.74914682470368 -239.291 210.5349513015499 211.4177099425999 55.24916262657524 55.74914682470368 -240.291 211.4177099425999 212.30046858364992 55.24916262657524 55.74914682470368 -241.291 212.30046858364992 213.1832272247499 55.24916262657524 55.74914682470368 -242.291 213.1832272247499 214.06598586579992 55.24916262657524 55.74914682470368 -243.291 214.06598586579992 214.94874450684992 55.24916262657524 55.74914682470368 -244.291 214.94874450684992 215.83150314794992 55.24916262657524 55.74914682470368 -245.291 215.83150314794992 216.71426178899992 55.24916262657524 55.74914682470368 -246.291 216.71426178899992 217.59702043004992 55.24916262657524 55.74914682470368 -247.291 217.59702043004992 218.47977907114992 55.24916262657524 55.74914682470368 -248.291 218.47977907114992 219.36253771219992 55.24916262657524 55.74914682470368 -249.291 219.36253771219992 220.2452963532499 55.24916262657524 55.74914682470368 -250.291 220.2452963532499 221.12805499434995 55.24916262657524 55.74914682470368 -251.291 221.12805499434995 222.01081363539993 55.24916262657524 55.74914682470368 -252.291 222.01081363539993 222.89357227644993 55.24916262657524 55.74914682470368 -253.291 222.89357227644993 223.77633091754996 55.24916262657524 55.74914682470368 -254.291 223.77633091754996 224.65908955859993 55.24916262657524 55.74914682470368 -255.291 224.65908955859993 225.5418481996499 55.24916262657524 55.74914682470368 -256.291 225.5418481996499 226.42460684074993 55.24916262657524 55.74914682470368 -257.291 226.42460684074993 227.30736548179993 55.24916262657524 55.74914682470368 -258.291 227.30736548179993 228.1901241228499 55.24916262657524 55.74914682470368 -259.291 228.1901241228499 229.0728827639499 55.24916262657524 55.74914682470368 -260.291 229.0728827639499 229.9556414050499 55.24916262657524 55.74914682470368 -261.291 229.9556414050499 230.83840004609988 55.24916262657524 55.74914682470368 -262.291 230.83840004609988 231.7211586871499 55.24916262657524 55.74914682470368 -263.291 231.7211586871499 232.6039173282499 55.24916262657524 55.74914682470368 -264.291 232.6039173282499 233.50083077840128 55.24916262657524 55.74914682470368 -274.291 241.41734892979855 242.31426237994992 55.24916262657524 55.74914682470368 -275.291 242.31426237994992 243.19702102104995 55.24916262657524 55.74914682470368 -276.291 243.19702102104995 244.07977966209995 55.24916262657524 55.74914682470368 -277.291 244.07977966209995 244.96253830314993 55.24916262657524 55.74914682470368 -278.291 244.96253830314993 245.8452969442499 55.24916262657524 55.74914682470368 -279.291 245.8452969442499 246.7280555852999 55.24916262657524 55.74914682470368 -280.291 246.7280555852999 247.61081422634993 55.24916262657524 55.74914682470368 -281.291 247.61081422634993 248.49357286744996 55.24916262657524 55.74914682470368 -282.291 248.49357286744996 249.3763315084999 55.24916262657524 55.74914682470368 -283.291 249.3763315084999 250.25909014954988 55.24916262657524 55.74914682470368 -284.291 250.25909014954988 251.1418487906499 55.24916262657524 55.74914682470368 -285.291 251.1418487906499 252.0246074316999 55.24916262657524 55.74914682470368 -286.291 252.0246074316999 252.9073660727499 55.24916262657524 55.74914682470368 -287.291 252.9073660727499 253.7901247138499 55.24916262657524 55.74914682470368 -288.291 253.7901247138499 254.6728833548999 55.24916262657524 55.74914682470368 -289.291 254.6728833548999 255.5556419959499 55.24916262657524 55.74914682470368 -290.291 255.5556419959499 256.4384006370499 55.24916262657524 55.74914682470368 -291.291 256.4384006370499 257.3211592780999 55.24916262657524 55.74914682470368 -292.291 257.3211592780999 258.20391791914994 55.24916262657524 55.74914682470368 -293.291 258.20391791914994 259.08667656024994 55.24916262657524 55.74914682470368 -294.291 259.08667656024994 259.96943520134994 55.24916262657524 55.74914682470368 -295.291 259.96943520134994 260.85219384239997 55.24916262657524 55.74914682470368 -296.291 260.85219384239997 261.74910729250126 55.24916262657524 55.74914682470368 -307.291 270.5483840850985 271.44529753519987 55.24916262657524 55.74914682470368 -308.291 271.44529753519987 272.3280561762499 55.24916262657524 55.74914682470368 -309.291 272.3280561762499 273.2108148173499 55.24916262657524 55.74914682470368 -310.291 273.2108148173499 274.0935734583999 55.24916262657524 55.74914682470368 -311.291 274.0935734583999 274.9763320994499 55.24916262657524 55.74914682470368 -312.291 274.9763320994499 275.8590907405499 55.24916262657524 55.74914682470368 -313.291 275.8590907405499 276.7418493815999 55.24916262657524 55.74914682470368 -314.291 276.7418493815999 277.6246080226499 55.24916262657524 55.74914682470368 -315.291 277.6246080226499 278.50736666374996 55.24916262657524 55.74914682470368 -316.291 278.50736666374996 279.4042801139013 55.24916262657524 55.74914682470368 -119.292 105.9388620183398 106.84734574775271 55.74914682470368 56.24913061252374 -120.292 106.84734574775271 107.74149157275272 55.74914682470368 56.24913061252374 -121.292 107.74149157275272 108.63563739775273 55.74914682470368 56.24913061252374 -122.292 108.63563739775273 109.52978322270272 55.74914682470368 56.24913061252374 -123.292 109.52978322270272 110.42392904765272 55.74914682470368 56.24913061252374 -124.292 110.42392904765272 111.31807487265272 55.74914682470368 56.24913061252374 -125.292 111.31807487265272 112.2122206976527 55.74914682470368 56.24913061252374 -126.292 112.2122206976527 113.1063665226527 55.74914682470368 56.24913061252374 -127.292 113.1063665226527 114.00051234765272 55.74914682470368 56.24913061252374 -128.292 114.00051234765272 114.89465817265271 55.74914682470368 56.24913061252374 -129.292 114.89465817265271 115.78880399760271 55.74914682470368 56.24913061252374 -130.292 115.78880399760271 116.68294982255273 55.74914682470368 56.24913061252374 -131.292 116.68294982255273 117.57709564755271 55.74914682470368 56.24913061252374 -132.292 117.57709564755271 118.47124147255269 55.74914682470368 56.24913061252374 -133.292 118.47124147255269 119.3653872975527 55.74914682470368 56.24913061252374 -134.292 119.3653872975527 120.25953312255271 55.74914682470368 56.24913061252374 -135.292 120.25953312255271 121.1536789475527 55.74914682470368 56.24913061252374 -136.292 121.1536789475527 122.04782477250271 55.74914682470368 56.24913061252374 -137.292 122.04782477250271 122.94197059745271 55.74914682470368 56.24913061252374 -138.292 122.94197059745271 123.83611642245272 55.74914682470368 56.24913061252374 -139.292 123.83611642245272 124.73026224745271 55.74914682470368 56.24913061252374 -140.292 124.73026224745271 125.6244080724527 55.74914682470368 56.24913061252374 -141.292 125.6244080724527 126.5185538974527 55.74914682470368 56.24913061252374 -142.292 126.5185538974527 127.41269972245271 55.74914682470368 56.24913061252374 -143.292 127.41269972245271 128.3068455474027 55.74914682470368 56.24913061252374 -144.292 128.3068455474027 129.20099137235272 55.74914682470368 56.24913061252374 -145.292 129.20099137235272 130.0951371973527 55.74914682470368 56.24913061252374 -146.292 130.0951371973527 130.9892830223527 55.74914682470368 56.24913061252374 -147.292 130.9892830223527 131.88342884735272 55.74914682470368 56.24913061252374 -148.292 131.88342884735272 132.7919125767656 55.74914682470368 56.24913061252374 -178.292 158.6934656925398 159.6019494219027 55.74914682470368 56.24913061252374 -179.292 159.6019494219027 160.49609524685272 55.74914682470368 56.24913061252374 -180.292 160.49609524685272 161.3902410718527 55.74914682470368 56.24913061252374 -181.292 161.3902410718527 162.2843868968527 55.74914682470368 56.24913061252374 -182.292 162.2843868968527 163.17853272185272 55.74914682470368 56.24913061252374 -183.292 163.17853272185272 164.07267854685273 55.74914682470368 56.24913061252374 -184.292 164.07267854685273 164.9668243718527 55.74914682470368 56.24913061252374 -185.292 164.9668243718527 165.8609701968027 55.74914682470368 56.24913061252374 -186.292 165.8609701968027 166.7551160217527 55.74914682470368 56.24913061252374 -187.292 166.7551160217527 167.64926184675272 55.74914682470368 56.24913061252374 -188.292 167.64926184675272 168.54340767175273 55.74914682470368 56.24913061252374 -189.292 168.54340767175273 169.4375534967527 55.74914682470368 56.24913061252374 -190.292 169.4375534967527 170.33169932175272 55.74914682470368 56.24913061252374 -191.292 170.33169932175272 171.2258451467527 55.74914682470368 56.24913061252374 -192.292 171.2258451467527 172.11999097170272 55.74914682470368 56.24913061252374 -193.292 172.11999097170272 173.02847470106562 55.74914682470368 56.24913061252374 -218.292 194.4592986919398 195.3677824213527 55.74914682470368 56.24913061252374 -219.292 195.3677824213527 196.26192824635268 55.74914682470368 56.24913061252374 -220.292 196.26192824635268 197.1560740713027 55.74914682470368 56.24913061252374 -221.292 197.1560740713027 198.0502198962527 55.74914682470368 56.24913061252374 -222.292 198.0502198962527 198.9443657212527 55.74914682470368 56.24913061252374 -223.292 198.9443657212527 199.8385115462527 55.74914682470368 56.24913061252374 -224.292 199.8385115462527 200.73265737125269 55.74914682470368 56.24913061252374 -225.292 200.73265737125269 201.6268031962527 55.74914682470368 56.24913061252374 -226.292 201.6268031962527 202.5209490212527 55.74914682470368 56.24913061252374 -227.292 202.5209490212527 203.4150948462027 55.74914682470368 56.24913061252374 -228.292 203.4150948462027 204.30924067115268 55.74914682470368 56.24913061252374 -229.292 204.30924067115268 205.2033864961527 55.74914682470368 56.24913061252374 -230.292 205.2033864961527 206.0975323211527 55.74914682470368 56.24913061252374 -231.292 206.0975323211527 206.99167814615268 55.74914682470368 56.24913061252374 -232.292 206.99167814615268 207.88582397115272 55.74914682470368 56.24913061252374 -233.292 207.88582397115272 208.7799697961527 55.74914682470368 56.24913061252374 -234.292 208.7799697961527 209.67411562110271 55.74914682470368 56.24913061252374 -235.292 209.67411562110271 210.5682614460527 55.74914682470368 56.24913061252374 -236.292 210.5682614460527 211.4624072710527 55.74914682470368 56.24913061252374 -237.292 211.4624072710527 212.35655309605272 55.74914682470368 56.24913061252374 -238.292 212.35655309605272 213.25069892105267 55.74914682470368 56.24913061252374 -239.292 213.25069892105267 214.14484474605268 55.74914682470368 56.24913061252374 -240.292 214.14484474605268 215.0389905710527 55.74914682470368 56.24913061252374 -241.292 215.0389905710527 215.9331363960027 55.74914682470368 56.24913061252374 -242.292 215.9331363960027 216.82728222095272 55.74914682470368 56.24913061252374 -243.292 216.82728222095272 217.7214280459527 55.74914682470368 56.24913061252374 -244.292 217.7214280459527 218.6155738709527 55.74914682470368 56.24913061252374 -245.292 218.6155738709527 219.5097196959527 55.74914682470368 56.24913061252374 -246.292 219.5097196959527 220.4038655209527 55.74914682470368 56.24913061252374 -247.292 220.4038655209527 221.2980113459527 55.74914682470368 56.24913061252374 -248.292 221.2980113459527 222.1921571709027 55.74914682470368 56.24913061252374 -249.292 222.1921571709027 223.0863029958527 55.74914682470368 56.24913061252374 -250.292 223.0863029958527 223.9804488208527 55.74914682470368 56.24913061252374 -251.292 223.9804488208527 224.8745946458527 55.74914682470368 56.24913061252374 -252.292 224.8745946458527 225.76874047085272 55.74914682470368 56.24913061252374 -253.292 225.76874047085272 226.66288629585267 55.74914682470368 56.24913061252374 -254.292 226.66288629585267 227.55703212085268 55.74914682470368 56.24913061252374 -255.292 227.55703212085268 228.4511779458027 55.74914682470368 56.24913061252374 -256.292 228.4511779458027 229.3453237707527 55.74914682470368 56.24913061252374 -257.292 229.3453237707527 230.23946959575272 55.74914682470368 56.24913061252374 -258.292 230.23946959575272 231.13361542075273 55.74914682470368 56.24913061252374 -259.292 231.13361542075273 232.02776124575269 55.74914682470368 56.24913061252374 -260.292 232.02776124575269 232.92190707075272 55.74914682470368 56.24913061252374 -261.292 232.92190707075272 233.83039080016562 55.74914682470368 56.24913061252374 -272.292 242.74317324113977 243.6516569705527 55.74914682470368 56.24913061252374 -273.292 243.6516569705527 244.5458027955527 55.74914682470368 56.24913061252374 -274.292 244.5458027955527 245.4399486205527 55.74914682470368 56.24913061252374 -275.292 245.4399486205527 246.3340944455527 55.74914682470368 56.24913061252374 -276.292 246.3340944455527 247.2282402705027 55.74914682470368 56.24913061252374 -277.292 247.2282402705027 248.1223860954527 55.74914682470368 56.24913061252374 -278.292 248.1223860954527 249.0165319204527 55.74914682470368 56.24913061252374 -279.292 249.0165319204527 249.9106777454527 55.74914682470368 56.24913061252374 -280.292 249.9106777454527 250.8048235704527 55.74914682470368 56.24913061252374 -281.292 250.8048235704527 251.6989693954527 55.74914682470368 56.24913061252374 -282.292 251.6989693954527 252.5931152204527 55.74914682470368 56.24913061252374 -283.292 252.5931152204527 253.48726104540273 55.74914682470368 56.24913061252374 -284.292 253.48726104540273 254.3814068703527 55.74914682470368 56.24913061252374 -285.292 254.3814068703527 255.2755526953527 55.74914682470368 56.24913061252374 -286.292 255.2755526953527 256.16969852035265 55.74914682470368 56.24913061252374 -287.292 256.16969852035265 257.0638443453527 55.74914682470368 56.24913061252374 -288.292 257.0638443453527 257.9579901703527 55.74914682470368 56.24913061252374 -289.292 257.9579901703527 258.8521359953527 55.74914682470368 56.24913061252374 -290.292 258.8521359953527 259.7462818203027 55.74914682470368 56.24913061252374 -291.292 259.7462818203027 260.6404276452527 55.74914682470368 56.24913061252374 -292.292 260.6404276452527 261.5489113746656 55.74914682470368 56.24913061252374 -303.292 270.46169381573975 271.37017754515267 55.74914682470368 56.24913061252374 -304.292 271.37017754515267 272.2643233701027 55.74914682470368 56.24913061252374 -305.292 272.2643233701027 273.1584691950527 55.74914682470368 56.24913061252374 -306.292 273.1584691950527 274.0526150200527 55.74914682470368 56.24913061252374 -307.292 274.0526150200527 274.94676084505267 55.74914682470368 56.24913061252374 -308.292 274.94676084505267 275.84090667005273 55.74914682470368 56.24913061252374 -309.292 275.84090667005273 276.7350524950527 55.74914682470368 56.24913061252374 -310.292 276.7350524950527 277.6291983200527 55.74914682470368 56.24913061252374 -311.292 277.6291983200527 278.52334414500274 55.74914682470368 56.24913061252374 -312.292 278.52334414500274 279.4318278743656 55.74914682470368 56.24913061252374 -117.293 105.51970287712075 106.44013032281848 56.24913061252374 56.74911397127674 -118.293 106.44013032281848 107.34603083921846 56.24913061252374 56.74911397127674 -119.293 107.34603083921846 108.25193135561847 56.24913061252374 56.74911397127674 -120.293 108.25193135561847 109.15783187196845 56.24913061252374 56.74911397127674 -121.293 109.15783187196845 110.06373238831847 56.24913061252374 56.74911397127674 -122.293 110.06373238831847 110.96963290471847 56.24913061252374 56.74911397127674 -123.293 110.96963290471847 111.87553342111846 56.24913061252374 56.74911397127674 -124.293 111.87553342111846 112.78143393746846 56.24913061252374 56.74911397127674 -125.293 112.78143393746846 113.68733445381847 56.24913061252374 56.74911397127674 -126.293 113.68733445381847 114.59323497021846 56.24913061252374 56.74911397127674 -127.293 114.59323497021846 115.49913548656846 56.24913061252374 56.74911397127674 -128.293 115.49913548656846 116.40503600291846 56.24913061252374 56.74911397127674 -129.293 116.40503600291846 117.31093651931846 56.24913061252374 56.74911397127674 -130.293 117.31093651931846 118.21683703571847 56.24913061252374 56.74911397127674 -131.293 118.21683703571847 119.12273755206846 56.24913061252374 56.74911397127674 -132.293 119.12273755206846 120.02863806841847 56.24913061252374 56.74911397127674 -133.293 120.02863806841847 120.93453858481845 56.24913061252374 56.74911397127674 -134.293 120.93453858481845 121.84043910121846 56.24913061252374 56.74911397127674 -135.293 121.84043910121846 122.74633961756845 56.24913061252374 56.74911397127674 -136.293 122.74633961756845 123.65224013391847 56.24913061252374 56.74911397127674 -137.293 123.65224013391847 124.55814065031845 56.24913061252374 56.74911397127674 -138.293 124.55814065031845 125.46404116671846 56.24913061252374 56.74911397127674 -139.293 125.46404116671846 126.36994168306846 56.24913061252374 56.74911397127674 -140.293 126.36994168306846 127.27584219941846 56.24913061252374 56.74911397127674 -141.293 127.27584219941846 128.18174271581847 56.24913061252374 56.74911397127674 -142.293 128.18174271581847 129.08764323221845 56.24913061252374 56.74911397127674 -143.293 129.08764323221845 129.99354374856847 56.24913061252374 56.74911397127674 -144.293 129.99354374856847 130.8994442649185 56.24913061252374 56.74911397127674 -145.293 130.8994442649185 131.80534478131847 56.24913061252374 56.74911397127674 -146.293 131.80534478131847 132.72577222701614 56.24913061252374 56.74911397127674 -175.293 158.0619328268208 158.98236027251846 56.24913061252374 56.74911397127674 -176.293 158.98236027251846 159.88826078891847 56.24913061252374 56.74911397127674 -177.293 159.88826078891847 160.79416130526846 56.24913061252374 56.74911397127674 -178.293 160.79416130526846 161.70006182161848 56.24913061252374 56.74911397127674 -179.293 161.70006182161848 162.60596233801846 56.24913061252374 56.74911397127674 -180.293 162.60596233801846 163.51186285441844 56.24913061252374 56.74911397127674 -181.293 163.51186285441844 164.41776337076845 56.24913061252374 56.74911397127674 -182.293 164.41776337076845 165.32366388711847 56.24913061252374 56.74911397127674 -183.293 165.32366388711847 166.22956440351845 56.24913061252374 56.74911397127674 -184.293 166.22956440351845 167.1354649199185 56.24913061252374 56.74911397127674 -185.293 167.1354649199185 168.04136543626845 56.24913061252374 56.74911397127674 -186.293 168.04136543626845 168.94726595261847 56.24913061252374 56.74911397127674 -187.293 168.94726595261847 169.85316646901848 56.24913061252374 56.74911397127674 -188.293 169.85316646901848 170.75906698541846 56.24913061252374 56.74911397127674 -189.293 170.75906698541846 171.66496750176844 56.24913061252374 56.74911397127674 -190.293 171.66496750176844 172.58539494741615 56.24913061252374 56.74911397127674 -216.293 195.20385399812076 196.12428144381846 56.24913061252374 56.74911397127674 -217.293 196.12428144381846 197.03018196021844 56.24913061252374 56.74911397127674 -218.293 197.03018196021844 197.93608247661845 56.24913061252374 56.74911397127674 -219.293 197.93608247661845 198.84198299296844 56.24913061252374 56.74911397127674 -220.293 198.84198299296844 199.74788350931846 56.24913061252374 56.74911397127674 -221.293 199.74788350931846 200.65378402571847 56.24913061252374 56.74911397127674 -222.293 200.65378402571847 201.55968454211848 56.24913061252374 56.74911397127674 -223.293 201.55968454211848 202.46558505846846 56.24913061252374 56.74911397127674 -224.293 202.46558505846846 203.37148557481845 56.24913061252374 56.74911397127674 -225.293 203.37148557481845 204.27738609121843 56.24913061252374 56.74911397127674 -226.293 204.27738609121843 205.18328660761844 56.24913061252374 56.74911397127674 -227.293 205.18328660761844 206.08918712396846 56.24913061252374 56.74911397127674 -228.293 206.08918712396846 206.99508764031845 56.24913061252374 56.74911397127674 -229.293 206.99508764031845 207.90098815671848 56.24913061252374 56.74911397127674 -230.293 207.90098815671848 208.80688867311846 56.24913061252374 56.74911397127674 -231.293 208.80688867311846 209.71278918946842 56.24913061252374 56.74911397127674 -232.293 209.71278918946842 210.61868970581844 56.24913061252374 56.74911397127674 -233.293 210.61868970581844 211.52459022221845 56.24913061252374 56.74911397127674 -234.293 211.52459022221845 212.43049073856844 56.24913061252374 56.74911397127674 -235.293 212.43049073856844 213.33639125491845 56.24913061252374 56.74911397127674 -236.293 213.33639125491845 214.24229177131843 56.24913061252374 56.74911397127674 -237.293 214.24229177131843 215.14819228771844 56.24913061252374 56.74911397127674 -238.293 215.14819228771844 216.05409280406843 56.24913061252374 56.74911397127674 -239.293 216.05409280406843 216.95999332041845 56.24913061252374 56.74911397127674 -240.293 216.95999332041845 217.86589383681843 56.24913061252374 56.74911397127674 -241.293 217.86589383681843 218.77179435321844 56.24913061252374 56.74911397127674 -242.293 218.77179435321844 219.67769486956846 56.24913061252374 56.74911397127674 -243.293 219.67769486956846 220.58359538591844 56.24913061252374 56.74911397127674 -244.293 220.58359538591844 221.48949590231848 56.24913061252374 56.74911397127674 -245.293 221.48949590231848 222.39539641871846 56.24913061252374 56.74911397127674 -246.293 222.39539641871846 223.30129693506842 56.24913061252374 56.74911397127674 -247.293 223.30129693506842 224.20719745141844 56.24913061252374 56.74911397127674 -248.293 224.20719745141844 225.11309796781842 56.24913061252374 56.74911397127674 -249.293 225.11309796781842 226.01899848421846 56.24913061252374 56.74911397127674 -250.293 226.01899848421846 226.92489900056847 56.24913061252374 56.74911397127674 -251.293 226.92489900056847 227.83079951691846 56.24913061252374 56.74911397127674 -252.293 227.83079951691846 228.73670003331847 56.24913061252374 56.74911397127674 -253.293 228.73670003331847 229.64260054966846 56.24913061252374 56.74911397127674 -254.293 229.64260054966846 230.54850106601845 56.24913061252374 56.74911397127674 -255.293 230.54850106601845 231.45440158241846 56.24913061252374 56.74911397127674 -256.293 231.45440158241846 232.36030209881844 56.24913061252374 56.74911397127674 -257.293 232.36030209881844 233.26620261516842 56.24913061252374 56.74911397127674 -258.293 233.26620261516842 234.17210313151844 56.24913061252374 56.74911397127674 -259.293 234.17210313151844 235.09253057721614 56.24913061252374 56.74911397127674 -269.293 243.21658136602076 244.13700881166847 56.24913061252374 56.74911397127674 -270.293 244.13700881166847 245.04290932801848 56.24913061252374 56.74911397127674 -271.293 245.04290932801848 245.94880984441846 56.24913061252374 56.74911397127674 -272.293 245.94880984441846 246.85471036081844 56.24913061252374 56.74911397127674 -273.293 246.85471036081844 247.76061087716846 56.24913061252374 56.74911397127674 -274.293 247.76061087716846 248.66651139351842 56.24913061252374 56.74911397127674 -275.293 248.66651139351842 249.57241190991846 56.24913061252374 56.74911397127674 -276.293 249.57241190991846 250.47831242626847 56.24913061252374 56.74911397127674 -277.293 250.47831242626847 251.38421294261846 56.24913061252374 56.74911397127674 -278.293 251.38421294261846 252.29011345901844 56.24913061252374 56.74911397127674 -279.293 252.29011345901844 253.19601397541845 56.24913061252374 56.74911397127674 -280.293 253.19601397541845 254.10191449176847 56.24913061252374 56.74911397127674 -281.293 254.10191449176847 255.00781500811843 56.24913061252374 56.74911397127674 -282.293 255.00781500811843 255.91371552451847 56.24913061252374 56.74911397127674 -283.293 255.91371552451847 256.81961604091845 56.24913061252374 56.74911397127674 -284.293 256.81961604091845 257.72551655726846 56.24913061252374 56.74911397127674 -285.293 257.72551655726846 258.6314170736184 56.24913061252374 56.74911397127674 -286.293 258.6314170736184 259.53731759001846 56.24913061252374 56.74911397127674 -287.293 259.53731759001846 260.44321810641844 56.24913061252374 56.74911397127674 -288.293 260.44321810641844 261.3636455521161 56.24913061252374 56.74911397127674 -299.293 270.39359685722076 271.31402430286846 56.24913061252374 56.74911397127674 -300.293 271.31402430286846 272.2199248192185 56.24913061252374 56.74911397127674 -301.293 272.2199248192185 273.12582533561846 56.24913061252374 56.74911397127674 -302.293 273.12582533561846 274.03172585201844 56.24913061252374 56.74911397127674 -303.293 274.03172585201844 274.93762636836846 56.24913061252374 56.74911397127674 -304.293 274.93762636836846 275.8435268847184 56.24913061252374 56.74911397127674 -305.293 275.8435268847184 276.74942740111845 56.24913061252374 56.74911397127674 -306.293 276.74942740111845 277.6553279175185 56.24913061252374 56.74911397127674 -307.293 277.6553279175185 278.56122843386845 56.24913061252374 56.74911397127674 -308.293 278.56122843386845 279.46712895021847 56.24913061252374 56.74911397127674 -309.293 279.46712895021847 280.3875563959162 56.24913061252374 56.74911397127674 -116.294 106.0155239488704 106.94828532983493 56.74911397127674 57.24909688106352 -117.294 106.94828532983493 107.86632455923493 56.74911397127674 57.24909688106352 -118.294 107.86632455923493 108.78436378863492 56.74911397127674 57.24909688106352 -119.294 108.78436378863492 109.70240301803494 56.74911397127674 57.24909688106352 -120.294 109.70240301803494 110.62044224743494 56.74911397127674 57.24909688106352 -121.294 110.62044224743494 111.53848147683493 56.74911397127674 57.24909688106352 -122.294 111.53848147683493 112.45652070623493 56.74911397127674 57.24909688106352 -123.294 112.45652070623493 113.37455993563492 56.74911397127674 57.24909688106352 -124.294 113.37455993563492 114.29259916498494 56.74911397127674 57.24909688106352 -125.294 114.29259916498494 115.21063839433492 56.74911397127674 57.24909688106352 -126.294 115.21063839433492 116.12867762373493 56.74911397127674 57.24909688106352 -127.294 116.12867762373493 117.04671685313492 56.74911397127674 57.24909688106352 -128.294 117.04671685313492 117.96475608253493 56.74911397127674 57.24909688106352 -129.294 117.96475608253493 118.88279531193493 56.74911397127674 57.24909688106352 -130.294 118.88279531193493 119.80083454133492 56.74911397127674 57.24909688106352 -131.294 119.80083454133492 120.71887377073493 56.74911397127674 57.24909688106352 -132.294 120.71887377073493 121.63691300008495 56.74911397127674 57.24909688106352 -133.294 121.63691300008495 122.55495222943493 56.74911397127674 57.24909688106352 -134.294 122.55495222943493 123.47299145883494 56.74911397127674 57.24909688106352 -135.294 123.47299145883494 124.39103068823493 56.74911397127674 57.24909688106352 -136.294 124.39103068823493 125.30906991763493 56.74911397127674 57.24909688106352 -137.294 125.30906991763493 126.22710914703494 56.74911397127674 57.24909688106352 -138.294 126.22710914703494 127.14514837643493 56.74911397127674 57.24909688106352 -139.294 127.14514837643493 128.06318760583494 56.74911397127674 57.24909688106352 -140.294 128.06318760583494 128.98122683523493 56.74911397127674 57.24909688106352 -141.294 128.98122683523493 129.89926606458494 56.74911397127674 57.24909688106352 -142.294 129.89926606458494 130.81730529393494 56.74911397127674 57.24909688106352 -143.294 130.81730529393494 131.73534452333493 56.74911397127674 57.24909688106352 -144.294 131.73534452333493 132.65338375273495 56.74911397127674 57.24909688106352 -145.294 132.65338375273495 133.58614513369946 56.74911397127674 57.24909688106352 -173.294 158.34376002407038 159.27652140503494 56.74911397127674 57.24909688106352 -174.294 159.27652140503494 160.19456063443494 56.74911397127674 57.24909688106352 -175.294 160.19456063443494 161.11259986378494 56.74911397127674 57.24909688106352 -176.294 161.11259986378494 162.03063909313494 56.74911397127674 57.24909688106352 -177.294 162.03063909313494 162.94867832253493 56.74911397127674 57.24909688106352 -178.294 162.94867832253493 163.86671755193493 56.74911397127674 57.24909688106352 -179.294 163.86671755193493 164.78475678133492 56.74911397127674 57.24909688106352 -180.294 164.78475678133492 165.70279601073491 56.74911397127674 57.24909688106352 -181.294 165.70279601073491 166.62083524013494 56.74911397127674 57.24909688106352 -182.294 166.62083524013494 167.53887446953493 56.74911397127674 57.24909688106352 -183.294 167.53887446953493 168.45691369893495 56.74911397127674 57.24909688106352 -184.294 168.45691369893495 169.37495292828493 56.74911397127674 57.24909688106352 -185.294 169.37495292828493 170.29299215763496 56.74911397127674 57.24909688106352 -186.294 170.29299215763496 171.21103138703492 56.74911397127674 57.24909688106352 -187.294 171.21103138703492 172.14379276799946 56.74911397127674 57.24909688106352 -213.294 195.06532919957039 195.99809058053492 56.74911397127674 57.24909688106352 -214.294 195.99809058053492 196.9161298099349 56.74911397127674 57.24909688106352 -215.294 196.9161298099349 197.83416903933494 56.74911397127674 57.24909688106352 -216.294 197.83416903933494 198.75220826873493 56.74911397127674 57.24909688106352 -217.294 198.75220826873493 199.67024749813493 56.74911397127674 57.24909688106352 -218.294 199.67024749813493 200.58828672748493 56.74911397127674 57.24909688106352 -219.294 200.58828672748493 201.50632595683493 56.74911397127674 57.24909688106352 -220.294 201.50632595683493 202.42436518623492 56.74911397127674 57.24909688106352 -221.294 202.42436518623492 203.34240441563492 56.74911397127674 57.24909688106352 -222.294 203.34240441563492 204.2604436450349 56.74911397127674 57.24909688106352 -223.294 204.2604436450349 205.17848287443496 56.74911397127674 57.24909688106352 -224.294 205.17848287443496 206.0965221038349 56.74911397127674 57.24909688106352 -225.294 206.0965221038349 207.0145613332349 56.74911397127674 57.24909688106352 -226.294 207.0145613332349 207.9326005626349 56.74911397127674 57.24909688106352 -227.294 207.9326005626349 208.85063979198492 56.74911397127674 57.24909688106352 -228.294 208.85063979198492 209.76867902133492 56.74911397127674 57.24909688106352 -229.294 209.76867902133492 210.68671825073494 56.74911397127674 57.24909688106352 -230.294 210.68671825073494 211.60475748013494 56.74911397127674 57.24909688106352 -231.294 211.60475748013494 212.52279670953493 56.74911397127674 57.24909688106352 -232.294 212.52279670953493 213.4408359389349 56.74911397127674 57.24909688106352 -233.294 213.4408359389349 214.35887516833492 56.74911397127674 57.24909688106352 -234.294 214.35887516833492 215.2769143977349 56.74911397127674 57.24909688106352 -235.294 215.2769143977349 216.19495362708494 56.74911397127674 57.24909688106352 -236.294 216.19495362708494 217.11299285643494 56.74911397127674 57.24909688106352 -237.294 217.11299285643494 218.0310320858349 56.74911397127674 57.24909688106352 -238.294 218.0310320858349 218.9490713152349 56.74911397127674 57.24909688106352 -239.294 218.9490713152349 219.8671105446349 56.74911397127674 57.24909688106352 -240.294 219.8671105446349 220.78514977403492 56.74911397127674 57.24909688106352 -241.294 220.78514977403492 221.70318900343494 56.74911397127674 57.24909688106352 -242.294 221.70318900343494 222.62122823283494 56.74911397127674 57.24909688106352 -243.294 222.62122823283494 223.53926746223493 56.74911397127674 57.24909688106352 -244.294 223.53926746223493 224.4573066915849 56.74911397127674 57.24909688106352 -245.294 224.4573066915849 225.37534592093493 56.74911397127674 57.24909688106352 -246.294 225.37534592093493 226.29338515033493 56.74911397127674 57.24909688106352 -247.294 226.29338515033493 227.21142437973492 56.74911397127674 57.24909688106352 -248.294 227.21142437973492 228.12946360913492 56.74911397127674 57.24909688106352 -249.294 228.12946360913492 229.0475028385349 56.74911397127674 57.24909688106352 -250.294 229.0475028385349 229.9655420679349 56.74911397127674 57.24909688106352 -251.294 229.9655420679349 230.8835812973349 56.74911397127674 57.24909688106352 -252.294 230.8835812973349 231.80162052668493 56.74911397127674 57.24909688106352 -253.294 231.80162052668493 232.71965975603493 56.74911397127674 57.24909688106352 -254.294 232.71965975603493 233.63769898543492 56.74911397127674 57.24909688106352 -255.294 233.63769898543492 234.55573821483492 56.74911397127674 57.24909688106352 -256.294 234.55573821483492 235.4737774442349 56.74911397127674 57.24909688106352 -257.294 235.4737774442349 236.4065388251995 56.74911397127674 57.24909688106352 -280.294 256.57395756857034 257.5067189495349 56.74911397127674 57.24909688106352 -281.294 257.5067189495349 258.42475817893495 56.74911397127674 57.24909688106352 -282.294 258.42475817893495 259.34279740833495 56.74911397127674 57.24909688106352 -283.294 259.34279740833495 260.26083663773494 56.74911397127674 57.24909688106352 -284.294 260.26083663773494 261.1935980186995 56.74911397127674 57.24909688106352 -295.294 270.3445460094704 271.277307390385 56.74911397127674 57.24909688106352 -296.294 271.277307390385 272.1953466197349 56.74911397127674 57.24909688106352 -297.294 272.1953466197349 273.11338584913494 56.74911397127674 57.24909688106352 -298.294 273.11338584913494 274.03142507853494 56.74911397127674 57.24909688106352 -299.294 274.03142507853494 274.94946430793493 56.74911397127674 57.24909688106352 -300.294 274.94946430793493 275.8675035373349 56.74911397127674 57.24909688106352 -301.294 275.8675035373349 276.7855427667349 56.74911397127674 57.24909688106352 -302.294 276.7855427667349 277.7035819961349 56.74911397127674 57.24909688106352 -303.294 277.7035819961349 278.6216212255349 56.74911397127674 57.24909688106352 -304.294 278.6216212255349 279.5396604548849 56.74911397127674 57.24909688106352 -305.294 279.5396604548849 280.4724218357995 56.74911397127674 57.24909688106352 -114.295 105.60245495891549 106.54795831297263 57.24909688106352 57.74907932075594 -115.295 106.54795831297263 107.47853781132262 57.24909688106352 57.74907932075594 -116.295 107.47853781132262 108.40911730967264 57.24909688106352 57.74907932075594 -117.295 108.40911730967264 109.33969680802264 57.24909688106352 57.74907932075594 -118.295 109.33969680802264 110.27027630637262 57.24909688106352 57.74907932075594 -119.295 110.27027630637262 111.20085580472264 57.24909688106352 57.74907932075594 -120.295 111.20085580472264 112.13143530307264 57.24909688106352 57.74907932075594 -121.295 112.13143530307264 113.06201480142263 57.24909688106352 57.74907932075594 -122.295 113.06201480142263 113.99259429977263 57.24909688106352 57.74907932075594 -123.295 113.99259429977263 114.92317379812263 57.24909688106352 57.74907932075594 -124.295 114.92317379812263 115.85375329647263 57.24909688106352 57.74907932075594 -125.295 115.85375329647263 116.78433279482263 57.24909688106352 57.74907932075594 -126.295 116.78433279482263 117.71491229317263 57.24909688106352 57.74907932075594 -127.295 117.71491229317263 118.64549179152263 57.24909688106352 57.74907932075594 -128.295 118.64549179152263 119.57607128987263 57.24909688106352 57.74907932075594 -129.295 119.57607128987263 120.50665078822263 57.24909688106352 57.74907932075594 -130.295 120.50665078822263 121.43723028657264 57.24909688106352 57.74907932075594 -131.295 121.43723028657264 122.36780978492263 57.24909688106352 57.74907932075594 -132.295 122.36780978492263 123.29838928327263 57.24909688106352 57.74907932075594 -133.295 123.29838928327263 124.22896878162263 57.24909688106352 57.74907932075594 -134.295 124.22896878162263 125.15954827997263 57.24909688106352 57.74907932075594 -135.295 125.15954827997263 126.09012777832262 57.24909688106352 57.74907932075594 -136.295 126.09012777832262 127.02070727667262 57.24909688106352 57.74907932075594 -137.295 127.02070727667262 127.95128677502262 57.24909688106352 57.74907932075594 -138.295 127.95128677502262 128.88186627337262 57.24909688106352 57.74907932075594 -139.295 128.88186627337262 129.81244577177262 57.24909688106352 57.74907932075594 -140.295 129.81244577177262 130.74302527012264 57.24909688106352 57.74907932075594 -141.295 130.74302527012264 131.67360476847261 57.24909688106352 57.74907932075594 -142.295 131.67360476847261 132.60418426682264 57.24909688106352 57.74907932075594 -143.295 132.60418426682264 133.54968762082976 57.24909688106352 57.74907932075594 -211.295 195.8686662990155 196.8141696530726 57.24909688106352 57.74907932075594 -212.295 196.8141696530726 197.74474915142264 57.24909688106352 57.74907932075594 -213.295 197.74474915142264 198.6753286497726 57.24909688106352 57.74907932075594 -214.295 198.6753286497726 199.60590814812264 57.24909688106352 57.74907932075594 -215.295 199.60590814812264 200.5364876464726 57.24909688106352 57.74907932075594 -216.295 200.5364876464726 201.46706714482264 57.24909688106352 57.74907932075594 -217.295 201.46706714482264 202.3976466431726 57.24909688106352 57.74907932075594 -218.295 202.3976466431726 203.32822614152263 57.24909688106352 57.74907932075594 -219.295 203.32822614152263 204.2588056398726 57.24909688106352 57.74907932075594 -220.295 204.2588056398726 205.18938513822263 57.24909688106352 57.74907932075594 -221.295 205.18938513822263 206.1199646365726 57.24909688106352 57.74907932075594 -222.295 206.1199646365726 207.05054413492263 57.24909688106352 57.74907932075594 -223.295 207.05054413492263 207.9811236332726 57.24909688106352 57.74907932075594 -224.295 207.9811236332726 208.9117031316726 57.24909688106352 57.74907932075594 -225.295 208.9117031316726 209.84228263002262 57.24909688106352 57.74907932075594 -226.295 209.84228263002262 210.7728621283726 57.24909688106352 57.74907932075594 -227.295 210.7728621283726 211.70344162672262 57.24909688106352 57.74907932075594 -228.295 211.70344162672262 212.63402112507262 57.24909688106352 57.74907932075594 -229.295 212.63402112507262 213.56460062342262 57.24909688106352 57.74907932075594 -230.295 213.56460062342262 214.49518012177262 57.24909688106352 57.74907932075594 -231.295 214.49518012177262 215.42575962012262 57.24909688106352 57.74907932075594 -232.295 215.42575962012262 216.35633911847262 57.24909688106352 57.74907932075594 -233.295 216.35633911847262 217.28691861682262 57.24909688106352 57.74907932075594 -234.295 217.28691861682262 218.21749811517262 57.24909688106352 57.74907932075594 -235.295 218.21749811517262 219.14807761352262 57.24909688106352 57.74907932075594 -236.295 219.14807761352262 220.07865711187262 57.24909688106352 57.74907932075594 -237.295 220.07865711187262 221.00923661022262 57.24909688106352 57.74907932075594 -238.295 221.00923661022262 221.93981610857264 57.24909688106352 57.74907932075594 -239.295 221.93981610857264 222.8703956069226 57.24909688106352 57.74907932075594 -240.295 222.8703956069226 223.80097510527264 57.24909688106352 57.74907932075594 -241.295 223.80097510527264 224.7315546036226 57.24909688106352 57.74907932075594 -242.295 224.7315546036226 225.66213410197264 57.24909688106352 57.74907932075594 -243.295 225.66213410197264 226.5927136003226 57.24909688106352 57.74907932075594 -244.295 226.5927136003226 227.52329309867264 57.24909688106352 57.74907932075594 -245.295 227.52329309867264 228.4538725970226 57.24909688106352 57.74907932075594 -246.295 228.4538725970226 229.38445209537264 57.24909688106352 57.74907932075594 -247.295 229.38445209537264 230.31503159372264 57.24909688106352 57.74907932075594 -248.295 230.31503159372264 231.24561109207264 57.24909688106352 57.74907932075594 -249.295 231.24561109207264 232.1761905904226 57.24909688106352 57.74907932075594 -250.295 232.1761905904226 233.10677008877263 57.24909688106352 57.74907932075594 -251.295 233.10677008877263 234.0373495871726 57.24909688106352 57.74907932075594 -252.295 234.0373495871726 234.9679290855226 57.24909688106352 57.74907932075594 -253.295 234.9679290855226 235.89850858387263 57.24909688106352 57.74907932075594 -254.295 235.89850858387263 236.8290880822226 57.24909688106352 57.74907932075594 -255.295 236.8290880822226 237.77459143622974 57.24909688106352 57.74907932075594 -268.295 248.9116977051155 249.8572010591226 57.24909688106352 57.74907932075594 -269.295 249.8572010591226 250.78778055747262 57.24909688106352 57.74907932075594 -270.295 250.78778055747262 251.71836005582261 57.24909688106352 57.74907932075594 -271.295 251.71836005582261 252.6489395541726 57.24909688106352 57.74907932075594 -272.295 252.6489395541726 253.5795190525226 57.24909688106352 57.74907932075594 -273.295 253.5795190525226 254.51009855087264 57.24909688106352 57.74907932075594 -274.295 254.51009855087264 255.44067804922264 57.24909688106352 57.74907932075594 -275.295 255.44067804922264 256.3712575475726 57.24909688106352 57.74907932075594 -276.295 256.3712575475726 257.3018370459226 57.24909688106352 57.74907932075594 -277.295 257.3018370459226 258.2324165442726 57.24909688106352 57.74907932075594 -278.295 258.2324165442726 259.1629960426226 57.24909688106352 57.74907932075594 -279.295 259.1629960426226 260.1084993966297 57.24909688106352 57.74907932075594 -292.295 271.24560566551554 272.19110901957265 57.24909688106352 57.74907932075594 -293.295 272.19110901957265 273.1216885179226 57.24909688106352 57.74907932075594 -294.295 273.1216885179226 274.0522680162726 57.24909688106352 57.74907932075594 -295.295 274.0522680162726 274.9828475146227 57.24909688106352 57.74907932075594 -296.295 274.9828475146227 275.91342701297265 57.24909688106352 57.74907932075594 -297.295 275.91342701297265 276.8440065113226 57.24909688106352 57.74907932075594 -298.295 276.8440065113226 277.7745860096726 57.24909688106352 57.74907932075594 -299.295 277.7745860096726 278.7051655080226 57.24909688106352 57.74907932075594 -300.295 278.7051655080226 279.63574500637264 57.24909688106352 57.74907932075594 -301.295 279.63574500637264 280.58124836042975 57.24909688106352 57.74907932075594 -113.296 106.12960414483183 107.0882764463197 57.74907932075594 58.249061267900046 -114.296 107.0882764463197 108.03181640371969 57.74907932075594 58.249061267900046 -115.296 108.03181640371969 108.97535636111971 57.74907932075594 58.249061267900046 -116.296 108.97535636111971 109.9188963185197 57.74907932075594 58.249061267900046 -117.296 109.9188963185197 110.86243627591969 57.74907932075594 58.249061267900046 -118.296 110.86243627591969 111.80597623331968 57.74907932075594 58.249061267900046 -119.296 111.80597623331968 112.7495161907197 57.74907932075594 58.249061267900046 -120.296 112.7495161907197 113.6930561481197 57.74907932075594 58.249061267900046 -121.296 113.6930561481197 114.63659610551969 57.74907932075594 58.249061267900046 -122.296 114.63659610551969 115.58013606291969 57.74907932075594 58.249061267900046 -123.296 115.58013606291969 116.52367602031967 57.74907932075594 58.249061267900046 -124.296 116.52367602031967 117.46721597771969 57.74907932075594 58.249061267900046 -125.296 117.46721597771969 118.4107559351197 57.74907932075594 58.249061267900046 -126.296 118.4107559351197 119.35429589251969 57.74907932075594 58.249061267900046 -127.296 119.35429589251969 120.2978358499197 57.74907932075594 58.249061267900046 -128.296 120.2978358499197 121.24137580731968 57.74907932075594 58.249061267900046 -129.296 121.24137580731968 122.1849157647197 57.74907932075594 58.249061267900046 -130.296 122.1849157647197 123.12845572211971 57.74907932075594 58.249061267900046 -131.296 123.12845572211971 124.0719956795197 57.74907932075594 58.249061267900046 -132.296 124.0719956795197 125.01553563691971 57.74907932075594 58.249061267900046 -133.296 125.01553563691971 125.9590755943197 57.74907932075594 58.249061267900046 -134.296 125.9590755943197 126.90261555171969 57.74907932075594 58.249061267900046 -135.296 126.90261555171969 127.84615550911968 57.74907932075594 58.249061267900046 -136.296 127.84615550911968 128.78969546651967 57.74907932075594 58.249061267900046 -137.296 128.78969546651967 129.7332354239197 57.74907932075594 58.249061267900046 -138.296 129.7332354239197 130.67677538131971 57.74907932075594 58.249061267900046 -139.296 130.67677538131971 131.6203153387197 57.74907932075594 58.249061267900046 -140.296 131.6203153387197 132.5638552961197 57.74907932075594 58.249061267900046 -141.296 132.5638552961197 133.5073952535197 57.74907932075594 58.249061267900046 -142.296 133.5073952535197 134.46606755500756 57.74907932075594 58.249061267900046 -209.296 196.70944005523182 197.6681123567197 57.74907932075594 58.249061267900046 -210.296 197.6681123567197 198.61165231411968 57.74907932075594 58.249061267900046 -211.296 198.61165231411968 199.55519227151967 57.74907932075594 58.249061267900046 -212.296 199.55519227151967 200.49873222891966 57.74907932075594 58.249061267900046 -213.296 200.49873222891966 201.44227218631968 57.74907932075594 58.249061267900046 -214.296 201.44227218631968 202.3858121437197 57.74907932075594 58.249061267900046 -215.296 202.3858121437197 203.3293521011197 57.74907932075594 58.249061267900046 -216.296 203.3293521011197 204.27289205851972 57.74907932075594 58.249061267900046 -217.296 204.27289205851972 205.21643201591968 57.74907932075594 58.249061267900046 -218.296 205.21643201591968 206.15997197331967 57.74907932075594 58.249061267900046 -219.296 206.15997197331967 207.1035119307197 57.74907932075594 58.249061267900046 -220.296 207.1035119307197 208.04705188811968 57.74907932075594 58.249061267900046 -221.296 208.04705188811968 208.99059184551967 57.74907932075594 58.249061267900046 -222.296 208.99059184551967 209.9341318029197 57.74907932075594 58.249061267900046 -223.296 209.9341318029197 210.87767176031969 57.74907932075594 58.249061267900046 -224.296 210.87767176031969 211.82121171771968 57.74907932075594 58.249061267900046 -225.296 211.82121171771968 212.76475167511967 57.74907932075594 58.249061267900046 -226.296 212.76475167511967 213.7082916325197 57.74907932075594 58.249061267900046 -227.296 213.7082916325197 214.6518315899197 57.74907932075594 58.249061267900046 -228.296 214.6518315899197 215.59537154731967 57.74907932075594 58.249061267900046 -229.296 215.59537154731967 216.5389115047197 57.74907932075594 58.249061267900046 -230.296 216.5389115047197 217.48245146211968 57.74907932075594 58.249061267900046 -231.296 217.48245146211968 218.42599141951968 57.74907932075594 58.249061267900046 -232.296 218.42599141951968 219.3695313769197 57.74907932075594 58.249061267900046 -233.296 219.3695313769197 220.31307133431972 57.74907932075594 58.249061267900046 -234.296 220.31307133431972 221.25661129171968 57.74907932075594 58.249061267900046 -235.296 221.25661129171968 222.2001512491197 57.74907932075594 58.249061267900046 -236.296 222.2001512491197 223.1436912065197 57.74907932075594 58.249061267900046 -237.296 223.1436912065197 224.08723116391968 57.74907932075594 58.249061267900046 -238.296 224.08723116391968 225.03077112131967 57.74907932075594 58.249061267900046 -239.296 225.03077112131967 225.97431107871967 57.74907932075594 58.249061267900046 -240.296 225.97431107871967 226.9178510361197 57.74907932075594 58.249061267900046 -241.296 226.9178510361197 227.8613909935197 57.74907932075594 58.249061267900046 -242.296 227.8613909935197 228.8049309509197 57.74907932075594 58.249061267900046 -243.296 228.8049309509197 229.74847090831972 57.74907932075594 58.249061267900046 -244.296 229.74847090831972 230.6920108657197 57.74907932075594 58.249061267900046 -245.296 230.6920108657197 231.63555082311967 57.74907932075594 58.249061267900046 -246.296 231.63555082311967 232.5790907805197 57.74907932075594 58.249061267900046 -247.296 232.5790907805197 233.52263073791968 57.74907932075594 58.249061267900046 -248.296 233.52263073791968 234.46617069531965 57.74907932075594 58.249061267900046 -249.296 234.46617069531965 235.4097106527197 57.74907932075594 58.249061267900046 -250.296 235.4097106527197 236.3532506101197 57.74907932075594 58.249061267900046 -251.296 236.3532506101197 237.29679056751968 57.74907932075594 58.249061267900046 -252.296 237.29679056751968 238.25546286900754 57.74907932075594 58.249061267900046 -264.296 248.60413771223182 249.56281001371968 57.74907932075594 58.249061267900046 -265.296 249.56281001371968 250.50634997111968 57.74907932075594 58.249061267900046 -266.296 250.50634997111968 251.44988992851967 57.74907932075594 58.249061267900046 -267.296 251.44988992851967 252.39342988591972 57.74907932075594 58.249061267900046 -268.296 252.39342988591972 253.3369698433197 57.74907932075594 58.249061267900046 -269.296 253.3369698433197 254.28050980071967 57.74907932075594 58.249061267900046 -270.296 254.28050980071967 255.2240497581197 57.74907932075594 58.249061267900046 -271.296 255.2240497581197 256.16758971551974 57.74907932075594 58.249061267900046 -272.296 256.16758971551974 257.1111296729197 57.74907932075594 58.249061267900046 -273.296 257.1111296729197 258.05466963031967 57.74907932075594 58.249061267900046 -274.296 258.05466963031967 258.99820958771966 57.74907932075594 58.249061267900046 -275.296 258.99820958771966 259.9417495451197 57.74907932075594 58.249061267900046 -276.296 259.9417495451197 260.9004218466076 57.74907932075594 58.249061267900046 -288.296 271.24909668983184 272.2077689913197 57.74907932075594 58.249061267900046 -289.296 272.2077689913197 273.1513089487197 57.74907932075594 58.249061267900046 -290.296 273.1513089487197 274.0948489061197 57.74907932075594 58.249061267900046 -291.296 274.0948489061197 275.0383888635197 57.74907932075594 58.249061267900046 -292.296 275.0383888635197 275.98192882091973 57.74907932075594 58.249061267900046 -293.296 275.98192882091973 276.92546877831967 57.74907932075594 58.249061267900046 -294.296 276.92546877831967 277.86900873571966 57.74907932075594 58.249061267900046 -295.296 277.86900873571966 278.81254869311965 57.74907932075594 58.249061267900046 -296.296 278.81254869311965 279.7712209946076 57.74907932075594 58.249061267900046 -112.297 106.67988111856123 107.65216948490239 58.249061267900046 58.749042698610026 -113.297 107.65216948490239 108.60910991265239 58.249061267900046 58.749042698610026 -114.297 108.60910991265239 109.56605034040238 58.249061267900046 58.749042698610026 -115.297 109.56605034040238 110.52299076810239 58.249061267900046 58.749042698610026 -116.297 110.52299076810239 111.47993119580238 58.249061267900046 58.749042698610026 -117.297 111.47993119580238 112.43687162350238 58.249061267900046 58.749042698610026 -118.297 112.43687162350238 113.39381205120239 58.249061267900046 58.749042698610026 -119.297 113.39381205120239 114.35075247895239 58.249061267900046 58.749042698610026 -120.297 114.35075247895239 115.30769290670239 58.249061267900046 58.749042698610026 -121.297 115.30769290670239 116.26463333440239 58.249061267900046 58.749042698610026 -122.297 116.26463333440239 117.2215737621024 58.249061267900046 58.749042698610026 -123.297 117.2215737621024 118.1785141898024 58.249061267900046 58.749042698610026 -124.297 118.1785141898024 119.1354546175024 58.249061267900046 58.749042698610026 -125.297 119.1354546175024 120.09239504520238 58.249061267900046 58.749042698610026 -126.297 120.09239504520238 121.0493354729524 58.249061267900046 58.749042698610026 -127.297 121.0493354729524 122.00627590070238 58.249061267900046 58.749042698610026 -128.297 122.00627590070238 122.96321632840238 58.249061267900046 58.749042698610026 -129.297 122.96321632840238 123.92015675610237 58.249061267900046 58.749042698610026 -130.297 123.92015675610237 124.87709718380239 58.249061267900046 58.749042698610026 -131.297 124.87709718380239 125.8340376115024 58.249061267900046 58.749042698610026 -132.297 125.8340376115024 126.7909780392524 58.249061267900046 58.749042698610026 -133.297 126.7909780392524 127.74791846700239 58.249061267900046 58.749042698610026 -134.297 127.74791846700239 128.70485889470237 58.249061267900046 58.749042698610026 -135.297 128.70485889470237 129.66179932240237 58.249061267900046 58.749042698610026 -136.297 129.66179932240237 130.6187397501024 58.249061267900046 58.749042698610026 -137.297 130.6187397501024 131.57568017780238 58.249061267900046 58.749042698610026 -138.297 131.57568017780238 132.5326206055524 58.249061267900046 58.749042698610026 -139.297 132.5326206055524 133.4895610333024 58.249061267900046 58.749042698610026 -140.297 133.4895610333024 134.46184939964357 58.249061267900046 58.749042698610026 -206.297 196.6322813238612 197.60456969020237 58.249061267900046 58.749042698610026 -207.297 197.60456969020237 198.56151011790237 58.249061267900046 58.749042698610026 -208.297 198.56151011790237 199.51845054560238 58.249061267900046 58.749042698610026 -209.297 199.51845054560238 200.47539097330238 58.249061267900046 58.749042698610026 -210.297 200.47539097330238 201.43233140105238 58.249061267900046 58.749042698610026 -211.297 201.43233140105238 202.38927182880238 58.249061267900046 58.749042698610026 -212.297 202.38927182880238 203.34621225650238 58.249061267900046 58.749042698610026 -213.297 203.34621225650238 204.30315268420236 58.249061267900046 58.749042698610026 -214.297 204.30315268420236 205.2600931119024 58.249061267900046 58.749042698610026 -215.297 205.2600931119024 206.21703353960237 58.249061267900046 58.749042698610026 -216.297 206.21703353960237 207.17397396735237 58.249061267900046 58.749042698610026 -217.297 207.17397396735237 208.13091439510237 58.249061267900046 58.749042698610026 -218.297 208.13091439510237 209.08785482280237 58.249061267900046 58.749042698610026 -219.297 209.08785482280237 210.04479525050237 58.249061267900046 58.749042698610026 -220.297 210.04479525050237 211.00173567820238 58.249061267900046 58.749042698610026 -221.297 211.00173567820238 211.95867610590238 58.249061267900046 58.749042698610026 -222.297 211.95867610590238 212.91561653360236 58.249061267900046 58.749042698610026 -223.297 212.91561653360236 213.87255696135236 58.249061267900046 58.749042698610026 -224.297 213.87255696135236 214.82949738910241 58.249061267900046 58.749042698610026 -225.297 214.82949738910241 215.7864378168024 58.249061267900046 58.749042698610026 -226.297 215.7864378168024 216.74337824450237 58.249061267900046 58.749042698610026 -227.297 216.74337824450237 217.7003186722024 58.249061267900046 58.749042698610026 -228.297 217.7003186722024 218.6572590999024 58.249061267900046 58.749042698610026 -229.297 218.6572590999024 219.61419952765237 58.249061267900046 58.749042698610026 -230.297 219.61419952765237 220.57113995540237 58.249061267900046 58.749042698610026 -231.297 220.57113995540237 221.52808038310238 58.249061267900046 58.749042698610026 -232.297 221.52808038310238 222.48502081080238 58.249061267900046 58.749042698610026 -233.297 222.48502081080238 223.44196123850236 58.249061267900046 58.749042698610026 -234.297 223.44196123850236 224.39890166620236 58.249061267900046 58.749042698610026 -235.297 224.39890166620236 225.3558420939524 58.249061267900046 58.749042698610026 -236.297 225.3558420939524 226.3127825217024 58.249061267900046 58.749042698610026 -237.297 226.3127825217024 227.26972294940236 58.249061267900046 58.749042698610026 -238.297 227.26972294940236 228.22666337710237 58.249061267900046 58.749042698610026 -239.297 228.22666337710237 229.18360380480237 58.249061267900046 58.749042698610026 -240.297 229.18360380480237 230.1405442325024 58.249061267900046 58.749042698610026 -241.297 230.1405442325024 231.09748466020238 58.249061267900046 58.749042698610026 -242.297 231.09748466020238 232.05442508795238 58.249061267900046 58.749042698610026 -243.297 232.05442508795238 233.01136551570238 58.249061267900046 58.749042698610026 -244.297 233.01136551570238 233.96830594340238 58.249061267900046 58.749042698610026 -245.297 233.96830594340238 234.92524637110236 58.249061267900046 58.749042698610026 -246.297 234.92524637110236 235.88218679880237 58.249061267900046 58.749042698610026 -247.297 235.88218679880237 236.83912722650237 58.249061267900046 58.749042698610026 -248.297 236.83912722650237 237.7960676542524 58.249061267900046 58.749042698610026 -249.297 237.7960676542524 238.76835602064355 58.249061267900046 58.749042698610026 -260.297 248.3070644204612 249.27935278680238 58.249061267900046 58.749042698610026 -261.297 249.27935278680238 250.2362932145524 58.249061267900046 58.749042698610026 -262.297 250.2362932145524 251.1932336423024 58.249061267900046 58.749042698610026 -263.297 251.1932336423024 252.15017407000238 58.249061267900046 58.749042698610026 -264.297 252.15017407000238 253.1071144977024 58.249061267900046 58.749042698610026 -265.297 253.1071144977024 254.0640549254024 58.249061267900046 58.749042698610026 -266.297 254.0640549254024 255.02099535310236 58.249061267900046 58.749042698610026 -267.297 255.02099535310236 255.97793578080237 58.249061267900046 58.749042698610026 -268.297 255.97793578080237 256.9348762085524 58.249061267900046 58.749042698610026 -269.297 256.9348762085524 257.89181663630234 58.249061267900046 58.749042698610026 -270.297 257.89181663630234 258.84875706400237 58.249061267900046 58.749042698610026 -271.297 258.84875706400237 259.8056974917024 58.249061267900046 58.749042698610026 -272.297 259.8056974917024 260.7626379194023 58.249061267900046 58.749042698610026 -273.297 260.7626379194023 261.73492628574354 58.249061267900046 58.749042698610026 -284.297 271.27363468566125 272.2459230520024 58.249061267900046 58.749042698610026 -285.297 272.2459230520024 273.2028634797024 58.249061267900046 58.749042698610026 -286.297 273.2028634797024 274.1598039074024 58.249061267900046 58.749042698610026 -287.297 274.1598039074024 275.11674433515236 58.249061267900046 58.749042698610026 -288.297 275.11674433515236 276.07368476290236 58.249061267900046 58.749042698610026 -289.297 276.07368476290236 277.03062519060234 58.249061267900046 58.749042698610026 -290.297 277.03062519060234 277.98756561830237 58.249061267900046 58.749042698610026 -291.297 277.98756561830237 278.9445060460024 58.249061267900046 58.749042698610026 -292.297 278.9445060460024 279.9167944123435 58.249061267900046 58.749042698610026 -111.298 107.25429713022459 108.24067012556316 58.749042698610026 59.249023587451674 -112.298 108.24067012556316 109.21147213876316 58.749042698610026 59.249023587451674 -113.298 109.21147213876316 110.18227415196316 58.749042698610026 59.249023587451674 -114.298 110.18227415196316 111.15307616516316 58.749042698610026 59.249023587451674 -115.298 111.15307616516316 112.12387817836316 58.749042698610026 59.249023587451674 -116.298 112.12387817836316 113.09468019156316 58.749042698610026 59.249023587451674 -117.298 113.09468019156316 114.06548220476316 58.749042698610026 59.249023587451674 -118.298 114.06548220476316 115.03628421796316 58.749042698610026 59.249023587451674 -119.298 115.03628421796316 116.00708623116316 58.749042698610026 59.249023587451674 -120.298 116.00708623116316 116.97788824436316 58.749042698610026 59.249023587451674 -121.298 116.97788824436316 117.94869025756317 58.749042698610026 59.249023587451674 -122.298 117.94869025756317 118.91949227076317 58.749042698610026 59.249023587451674 -123.298 118.91949227076317 119.89029428396317 58.749042698610026 59.249023587451674 -124.298 119.89029428396317 120.86109629716316 58.749042698610026 59.249023587451674 -125.298 120.86109629716316 121.83189831041315 58.749042698610026 59.249023587451674 -126.298 121.83189831041315 122.80270032366316 58.749042698610026 59.249023587451674 -127.298 122.80270032366316 123.77350233686317 58.749042698610026 59.249023587451674 -128.298 123.77350233686317 124.74430435006317 58.749042698610026 59.249023587451674 -129.298 124.74430435006317 125.71510636326316 58.749042698610026 59.249023587451674 -130.298 125.71510636326316 126.68590837646316 58.749042698610026 59.249023587451674 -131.298 126.68590837646316 127.65671038966315 58.749042698610026 59.249023587451674 -132.298 127.65671038966315 128.62751240286315 58.749042698610026 59.249023587451674 -133.298 128.62751240286315 129.59831441606315 58.749042698610026 59.249023587451674 -134.298 129.59831441606315 130.56911642926315 58.749042698610026 59.249023587451674 -135.298 130.56911642926315 131.53991844246315 58.749042698610026 59.249023587451674 -136.298 131.53991844246315 132.51072045566315 58.749042698610026 59.249023587451674 -137.298 132.51072045566315 133.48152246886315 58.749042698610026 59.249023587451674 -138.298 133.48152246886315 134.46789546420172 58.749042698610026 59.249023587451674 -204.298 197.53888435832457 198.52525735366316 58.749042698610026 59.249023587451674 -205.298 198.52525735366316 199.49605936686316 58.749042698610026 59.249023587451674 -206.298 199.49605936686316 200.46686138006316 58.749042698610026 59.249023587451674 -207.298 200.46686138006316 201.43766339326316 58.749042698610026 59.249023587451674 -208.298 201.43766339326316 202.40846540646316 58.749042698610026 59.249023587451674 -209.298 202.40846540646316 203.37926741966317 58.749042698610026 59.249023587451674 -210.298 203.37926741966317 204.35006943286317 58.749042698610026 59.249023587451674 -211.298 204.35006943286317 205.32087144606314 58.749042698610026 59.249023587451674 -212.298 205.32087144606314 206.29167345926317 58.749042698610026 59.249023587451674 -213.298 206.29167345926317 207.26247547246317 58.749042698610026 59.249023587451674 -214.298 207.26247547246317 208.23327748566317 58.749042698610026 59.249023587451674 -215.298 208.23327748566317 209.20407949886317 58.749042698610026 59.249023587451674 -216.298 209.20407949886317 210.17488151206317 58.749042698610026 59.249023587451674 -217.298 210.17488151206317 211.14568352526317 58.749042698610026 59.249023587451674 -218.298 211.14568352526317 212.11648553846317 58.749042698610026 59.249023587451674 -219.298 212.11648553846317 213.08728755166317 58.749042698610026 59.249023587451674 -220.298 213.08728755166317 214.05808956486317 58.749042698610026 59.249023587451674 -221.298 214.05808956486317 215.02889157806317 58.749042698610026 59.249023587451674 -222.298 215.02889157806317 215.99969359131313 58.749042698610026 59.249023587451674 -223.298 215.99969359131313 216.97049560456315 58.749042698610026 59.249023587451674 -224.298 216.97049560456315 217.94129761776315 58.749042698610026 59.249023587451674 -225.298 217.94129761776315 218.91209963096316 58.749042698610026 59.249023587451674 -226.298 218.91209963096316 219.88290164416316 58.749042698610026 59.249023587451674 -227.298 219.88290164416316 220.85370365736316 58.749042698610026 59.249023587451674 -228.298 220.85370365736316 221.82450567056316 58.749042698610026 59.249023587451674 -229.298 221.82450567056316 222.79530768376316 58.749042698610026 59.249023587451674 -230.298 222.79530768376316 223.76610969696316 58.749042698610026 59.249023587451674 -231.298 223.76610969696316 224.73691171016316 58.749042698610026 59.249023587451674 -232.298 224.73691171016316 225.70771372336316 58.749042698610026 59.249023587451674 -233.298 225.70771372336316 226.67851573656316 58.749042698610026 59.249023587451674 -234.298 226.67851573656316 227.64931774976316 58.749042698610026 59.249023587451674 -235.298 227.64931774976316 228.62011976296313 58.749042698610026 59.249023587451674 -236.298 228.62011976296313 229.59092177616313 58.749042698610026 59.249023587451674 -237.298 229.59092177616313 230.56172378936316 58.749042698610026 59.249023587451674 -238.298 230.56172378936316 231.53252580256316 58.749042698610026 59.249023587451674 -239.298 231.53252580256316 232.50332781576316 58.749042698610026 59.249023587451674 -240.298 232.50332781576316 233.47412982896316 58.749042698610026 59.249023587451674 -241.298 233.47412982896316 234.44493184221312 58.749042698610026 59.249023587451674 -242.298 234.44493184221312 235.41573385546315 58.749042698610026 59.249023587451674 -243.298 235.41573385546315 236.38653586866312 58.749042698610026 59.249023587451674 -244.298 236.38653586866312 237.35733788186312 58.749042698610026 59.249023587451674 -245.298 237.35733788186312 238.32813989506315 58.749042698610026 59.249023587451674 -246.298 238.32813989506315 239.31451289040172 58.749042698610026 59.249023587451674 -257.298 248.99139105812458 249.97776405346315 58.749042698610026 59.249023587451674 -258.298 249.97776405346315 250.94856606666315 58.749042698610026 59.249023587451674 -259.298 250.94856606666315 251.91936807986315 58.749042698610026 59.249023587451674 -260.298 251.91936807986315 252.89017009311317 58.749042698610026 59.249023587451674 -261.298 252.89017009311317 253.86097210636316 58.749042698610026 59.249023587451674 -262.298 253.86097210636316 254.83177411956314 58.749042698610026 59.249023587451674 -263.298 254.83177411956314 255.80257613276316 58.749042698610026 59.249023587451674 -264.298 255.80257613276316 256.77337814596314 58.749042698610026 59.249023587451674 -265.298 256.77337814596314 257.74418015916314 58.749042698610026 59.249023587451674 -266.298 257.74418015916314 258.71498217236314 58.749042698610026 59.249023587451674 -267.298 258.71498217236314 259.6857841855631 58.749042698610026 59.249023587451674 -268.298 259.6857841855631 260.65658619876314 58.749042698610026 59.249023587451674 -269.298 260.65658619876314 261.6429591941017 58.749042698610026 59.249023587451674 -280.298 271.31983736182457 272.3062103572132 58.749042698610026 59.249023587451674 -281.298 272.3062103572132 273.2770123704632 58.749042698610026 59.249023587451674 -282.298 273.2770123704632 274.2478143836632 58.749042698610026 59.249023587451674 -283.298 274.2478143836632 275.2186163968632 58.749042698610026 59.249023587451674 -284.298 275.2186163968632 276.1894184100631 58.749042698610026 59.249023587451674 -285.298 276.1894184100631 277.1602204232632 58.749042698610026 59.249023587451674 -286.298 277.1602204232632 278.1310224364632 58.749042698610026 59.249023587451674 -287.298 278.1310224364632 279.10182444966324 58.749042698610026 59.249023587451674 -288.298 279.10182444966324 280.0726264628632 58.749042698610026 59.249023587451674 -289.298 280.0726264628632 281.05899945820175 58.749042698610026 59.249023587451674 -110.299 107.8539309274975 108.8548799732144 59.249023587451674 59.74900390731439 -111.299 108.8548799732144 109.84002717881438 59.249023587451674 59.74900390731439 -112.299 109.84002717881438 110.8251743844144 59.249023587451674 59.74900390731439 -113.299 110.8251743844144 111.81032159001438 59.249023587451674 59.74900390731439 -114.299 111.81032159001438 112.79546879556439 59.249023587451674 59.74900390731439 -115.299 112.79546879556439 113.7806160011144 59.249023587451674 59.74900390731439 -116.299 113.7806160011144 114.76576320671441 59.249023587451674 59.74900390731439 -117.299 114.76576320671441 115.7509104123144 59.249023587451674 59.74900390731439 -118.299 115.7509104123144 116.7360576179144 59.249023587451674 59.74900390731439 -119.299 116.7360576179144 117.7212048235144 59.249023587451674 59.74900390731439 -120.299 117.7212048235144 118.70635202911438 59.249023587451674 59.74900390731439 -121.299 118.70635202911438 119.69149923471439 59.249023587451674 59.74900390731439 -122.299 119.69149923471439 120.67664644031439 59.249023587451674 59.74900390731439 -123.299 120.67664644031439 121.6775954860313 59.249023587451674 59.74900390731439 -201.299 197.5023266360975 198.5032756818144 59.249023587451674 59.74900390731439 -202.299 198.5032756818144 199.48842288741437 59.249023587451674 59.74900390731439 -203.299 199.48842288741437 200.4735700930144 59.249023587451674 59.74900390731439 -204.299 200.4735700930144 201.45871729861437 59.249023587451674 59.74900390731439 -205.299 201.45871729861437 202.4438645042144 59.249023587451674 59.74900390731439 -206.299 202.4438645042144 203.42901170976438 59.249023587451674 59.74900390731439 -207.299 203.42901170976438 204.41415891531437 59.249023587451674 59.74900390731439 -208.299 204.41415891531437 205.3993061209144 59.249023587451674 59.74900390731439 -209.299 205.3993061209144 206.38445332651438 59.249023587451674 59.74900390731439 -210.299 206.38445332651438 207.36960053211436 59.249023587451674 59.74900390731439 -211.299 207.36960053211436 208.35474773771438 59.249023587451674 59.74900390731439 -212.299 208.35474773771438 209.33989494331436 59.249023587451674 59.74900390731439 -213.299 209.33989494331436 210.32504214891438 59.249023587451674 59.74900390731439 -214.299 210.32504214891438 211.31018935451436 59.249023587451674 59.74900390731439 -215.299 211.31018935451436 212.29533656006436 59.249023587451674 59.74900390731439 -216.299 212.29533656006436 213.2804837656144 59.249023587451674 59.74900390731439 -217.299 213.2804837656144 214.2656309712144 59.249023587451674 59.74900390731439 -218.299 214.2656309712144 215.25077817681438 59.249023587451674 59.74900390731439 -219.299 215.25077817681438 216.2359253824144 59.249023587451674 59.74900390731439 -220.299 216.2359253824144 217.2210725880144 59.249023587451674 59.74900390731439 -221.299 217.2210725880144 218.20621979361437 59.249023587451674 59.74900390731439 -222.299 218.20621979361437 219.19136699921435 59.249023587451674 59.74900390731439 -223.299 219.19136699921435 220.17651420481437 59.249023587451674 59.74900390731439 -224.299 220.17651420481437 221.16166141036436 59.249023587451674 59.74900390731439 -225.299 221.16166141036436 222.14680861591435 59.249023587451674 59.74900390731439 -226.299 222.14680861591435 223.13195582151437 59.249023587451674 59.74900390731439 -227.299 223.13195582151437 224.11710302711435 59.249023587451674 59.74900390731439 -228.299 224.11710302711435 225.10225023271437 59.249023587451674 59.74900390731439 -229.299 225.10225023271437 226.08739743831438 59.249023587451674 59.74900390731439 -230.299 226.08739743831438 227.07254464391434 59.249023587451674 59.74900390731439 -231.299 227.07254464391434 228.05769184951438 59.249023587451674 59.74900390731439 -232.299 228.05769184951438 229.04283905511437 59.249023587451674 59.74900390731439 -233.299 229.04283905511437 230.02798626066436 59.249023587451674 59.74900390731439 -234.299 230.02798626066436 231.01313346621438 59.249023587451674 59.74900390731439 -235.299 231.01313346621438 231.9982806718144 59.249023587451674 59.74900390731439 -236.299 231.9982806718144 232.98342787741436 59.249023587451674 59.74900390731439 -237.299 232.98342787741436 233.96857508301437 59.249023587451674 59.74900390731439 -238.299 233.96857508301437 234.95372228861436 59.249023587451674 59.74900390731439 -239.299 234.95372228861436 235.93886949421437 59.249023587451674 59.74900390731439 -240.299 235.93886949421437 236.92401669981436 59.249023587451674 59.74900390731439 -241.299 236.92401669981436 237.90916390541435 59.249023587451674 59.74900390731439 -242.299 237.90916390541435 238.91011295113128 59.249023587451674 59.74900390731439 -255.299 250.70027573789747 251.70122478361438 59.249023587451674 59.74900390731439 -256.299 251.70122478361438 252.68637198921436 59.249023587451674 59.74900390731439 -257.299 252.68637198921436 253.67151919481438 59.249023587451674 59.74900390731439 -258.299 253.67151919481438 254.6566664004144 59.249023587451674 59.74900390731439 -259.299 254.6566664004144 255.64181360601438 59.249023587451674 59.74900390731439 -260.299 255.64181360601438 256.62696081161437 59.249023587451674 59.74900390731439 -261.299 256.62696081161437 257.6121080171644 59.249023587451674 59.74900390731439 -262.299 257.6121080171644 258.5972552227144 59.249023587451674 59.74900390731439 -263.299 258.5972552227144 259.58240242831437 59.249023587451674 59.74900390731439 -264.299 259.58240242831437 260.58335147403125 59.249023587451674 59.74900390731439 -276.299 271.3883670552975 272.3893161010144 59.249023587451674 59.74900390731439 -277.299 272.3893161010144 273.37446330661436 59.249023587451674 59.74900390731439 -278.299 273.37446330661436 274.3596105122144 59.249023587451674 59.74900390731439 -279.299 274.3596105122144 275.3447577177644 59.249023587451674 59.74900390731439 -280.299 275.3447577177644 276.3299049233144 59.249023587451674 59.74900390731439 -281.299 276.3299049233144 277.31505212891443 59.249023587451674 59.74900390731439 -282.299 277.31505212891443 278.3001993345144 59.249023587451674 59.74900390731439 -283.299 278.3001993345144 279.28534654011435 59.249023587451674 59.74900390731439 -284.299 279.28534654011435 280.27049374571436 59.249023587451674 59.74900390731439 -285.299 280.27049374571436 281.27144279143124 59.249023587451674 59.74900390731439 -093.300 92.4799343548446 93.49597525758085 59.74900390731439 60.248983629270306 -094.300 93.49597525758085 94.49597525758085 59.74900390731439 60.248983629270306 -095.300 94.49597525758085 95.49597525758085 59.74900390731439 60.248983629270306 -096.300 95.49597525758085 96.49597525758085 59.74900390731439 60.248983629270306 -097.300 96.49597525758085 97.49597525758084 59.74900390731439 60.248983629270306 -098.300 97.49597525758084 98.49597525758084 59.74900390731439 60.248983629270306 -099.300 98.49597525758084 99.49597525758084 59.74900390731439 60.248983629270306 -100.300 99.49597525758084 100.49597525758085 59.74900390731439 60.248983629270306 -101.300 100.49597525758085 101.49597525758085 59.74900390731439 60.248983629270306 -102.300 101.49597525758085 102.49597525758085 59.74900390731439 60.248983629270306 -103.300 102.49597525758085 103.49597525758085 59.74900390731439 60.248983629270306 -104.300 103.49597525758085 104.49597525758085 59.74900390731439 60.248983629270306 -105.300 104.49597525758085 105.49597525758085 59.74900390731439 60.248983629270306 -106.300 105.49597525758085 106.49597525758084 59.74900390731439 60.248983629270306 -107.300 106.49597525758084 107.51201616031707 59.74900390731439 60.248983629270306 -199.300 198.4799343548446 199.49597525758082 59.74900390731439 60.248983629270306 -200.300 199.49597525758082 200.49597525758082 59.74900390731439 60.248983629270306 -201.300 200.49597525758082 201.49597525758082 59.74900390731439 60.248983629270306 -202.300 201.49597525758082 202.49597525758082 59.74900390731439 60.248983629270306 -203.300 202.49597525758082 203.49597525758082 59.74900390731439 60.248983629270306 -204.300 203.49597525758082 204.49597525758082 59.74900390731439 60.248983629270306 -205.300 204.49597525758082 205.49597525758082 59.74900390731439 60.248983629270306 -206.300 205.49597525758082 206.49597525758085 59.74900390731439 60.248983629270306 -207.300 206.49597525758085 207.49597525758082 59.74900390731439 60.248983629270306 -208.300 207.49597525758082 208.49597525758082 59.74900390731439 60.248983629270306 -209.300 208.49597525758082 209.49597525758082 59.74900390731439 60.248983629270306 -210.300 209.49597525758082 210.49597525758082 59.74900390731439 60.248983629270306 -211.300 210.49597525758082 211.49597525758082 59.74900390731439 60.248983629270306 -212.300 211.49597525758082 212.49597525758082 59.74900390731439 60.248983629270306 -213.300 212.49597525758082 213.49597525758082 59.74900390731439 60.248983629270306 -214.300 213.49597525758082 214.49597525758082 59.74900390731439 60.248983629270306 -215.300 214.49597525758082 215.49597525758082 59.74900390731439 60.248983629270306 -216.300 215.49597525758082 216.49597525758082 59.74900390731439 60.248983629270306 -217.300 216.49597525758082 217.49597525758082 59.74900390731439 60.248983629270306 -218.300 217.49597525758082 218.49597525758082 59.74900390731439 60.248983629270306 -219.300 218.49597525758082 219.49597525758082 59.74900390731439 60.248983629270306 -220.300 219.49597525758082 220.49597525758082 59.74900390731439 60.248983629270306 -221.300 220.49597525758082 221.49597525758082 59.74900390731439 60.248983629270306 -222.300 221.49597525758082 222.49597525758082 59.74900390731439 60.248983629270306 -223.300 222.49597525758082 223.49597525758082 59.74900390731439 60.248983629270306 -224.300 223.49597525758082 224.49597525758085 59.74900390731439 60.248983629270306 -225.300 224.49597525758085 225.49597525758082 59.74900390731439 60.248983629270306 -226.300 225.49597525758082 226.49597525758082 59.74900390731439 60.248983629270306 -227.300 226.49597525758082 227.49597525758082 59.74900390731439 60.248983629270306 -228.300 227.49597525758082 228.49597525758085 59.74900390731439 60.248983629270306 -229.300 228.49597525758085 229.51201616031707 59.74900390731439 60.248983629270306 -272.300 271.4799343548446 272.4959752575809 59.74900390731439 60.248983629270306 -273.300 272.4959752575809 273.4959752575809 59.74900390731439 60.248983629270306 -274.300 273.4959752575809 274.4959752575809 59.74900390731439 60.248983629270306 -275.300 274.4959752575809 275.49597525758077 59.74900390731439 60.248983629270306 -276.300 275.49597525758077 276.4959752575808 59.74900390731439 60.248983629270306 -277.300 276.4959752575808 277.4959752575809 59.74900390731439 60.248983629270306 -278.300 277.4959752575809 278.4959752575809 59.74900390731439 60.248983629270306 -279.300 278.4959752575809 279.4959752575808 59.74900390731439 60.248983629270306 -280.300 279.4959752575808 280.51201616031705 59.74900390731439 60.248983629270306 -091.301 91.87197614162515 92.90365075083832 60.248983629270306 60.74896272241884 -092.301 92.90365075083832 93.91903677318831 60.248983629270306 60.74896272241884 -093.301 93.91903677318831 94.93442279553832 60.248983629270306 60.74896272241884 -094.301 94.93442279553832 95.94980881788831 60.248983629270306 60.74896272241884 -095.301 95.94980881788831 96.96519484018832 60.248983629270306 60.74896272241884 -096.301 96.96519484018832 97.98058086253832 60.248983629270306 60.74896272241884 -097.301 97.98058086253832 98.99596688488832 60.248983629270306 60.74896272241884 -098.301 98.99596688488832 100.01135290723832 60.248983629270306 60.74896272241884 -099.301 100.01135290723832 101.02673892958832 60.248983629270306 60.74896272241884 -100.301 101.02673892958832 102.04212495188831 60.248983629270306 60.74896272241884 -101.301 102.04212495188831 103.05751097423831 60.248983629270306 60.74896272241884 -102.301 103.05751097423831 104.07289699658833 60.248983629270306 60.74896272241884 -103.301 104.07289699658833 105.08828301893831 60.248983629270306 60.74896272241884 -104.301 105.08828301893831 106.10366904128833 60.248983629270306 60.74896272241884 -105.301 106.10366904128833 107.11905506358832 60.248983629270306 60.74896272241884 -106.301 107.11905506358832 108.15072967275148 60.248983629270306 60.74896272241884 -197.301 199.50289450972514 200.5345691188883 60.248983629270306 60.74896272241884 -198.301 200.5345691188883 201.54995514123829 60.248983629270306 60.74896272241884 -199.301 201.54995514123829 202.5653411635883 60.248983629270306 60.74896272241884 -200.301 202.5653411635883 203.58072718593831 60.248983629270306 60.74896272241884 -201.301 203.58072718593831 204.5961132082883 60.248983629270306 60.74896272241884 -202.301 204.5961132082883 205.61149923058832 60.248983629270306 60.74896272241884 -203.301 205.61149923058832 206.6268852529383 60.248983629270306 60.74896272241884 -204.301 206.6268852529383 207.6422712752883 60.248983629270306 60.74896272241884 -205.301 207.6422712752883 208.6576572976383 60.248983629270306 60.74896272241884 -206.301 208.6576572976383 209.67304331998832 60.248983629270306 60.74896272241884 -207.301 209.67304331998832 210.68842934228832 60.248983629270306 60.74896272241884 -208.301 210.68842934228832 211.70381536463833 60.248983629270306 60.74896272241884 -209.301 211.70381536463833 212.7192013869883 60.248983629270306 60.74896272241884 -210.301 212.7192013869883 213.7345874093383 60.248983629270306 60.74896272241884 -211.301 213.7345874093383 214.74997343168832 60.248983629270306 60.74896272241884 -212.301 214.74997343168832 215.7653594539883 60.248983629270306 60.74896272241884 -213.301 215.7653594539883 216.78074547633832 60.248983629270306 60.74896272241884 -214.301 216.78074547633832 217.7961314986883 60.248983629270306 60.74896272241884 -215.301 217.7961314986883 218.8115175210383 60.248983629270306 60.74896272241884 -216.301 218.8115175210383 219.8269035433883 60.248983629270306 60.74896272241884 -217.301 219.8269035433883 220.8422895656883 60.248983629270306 60.74896272241884 -218.301 220.8422895656883 221.85767558803832 60.248983629270306 60.74896272241884 -219.301 221.85767558803832 222.87306161038833 60.248983629270306 60.74896272241884 -220.301 222.87306161038833 223.8884476327383 60.248983629270306 60.74896272241884 -221.301 223.8884476327383 224.9038336550883 60.248983629270306 60.74896272241884 -222.301 224.9038336550883 225.9192196773883 60.248983629270306 60.74896272241884 -223.301 225.9192196773883 226.9346056997383 60.248983629270306 60.74896272241884 -224.301 226.9346056997383 227.9499917220883 60.248983629270306 60.74896272241884 -225.301 227.9499917220883 228.9653777444383 60.248983629270306 60.74896272241884 -226.301 228.9653777444383 229.9970523536515 60.248983629270306 60.74896272241884 -268.301 271.59530209582516 272.6269767050383 60.248983629270306 60.74896272241884 -269.301 272.6269767050383 273.64236272738833 60.248983629270306 60.74896272241884 -270.301 273.64236272738833 274.6577487497383 60.248983629270306 60.74896272241884 -271.301 274.6577487497383 275.6731347720883 60.248983629270306 60.74896272241884 -272.301 275.6731347720883 276.6885207943883 60.248983629270306 60.74896272241884 -273.301 276.6885207943883 277.70390681673825 60.248983629270306 60.74896272241884 -274.301 277.70390681673825 278.7192928390883 60.248983629270306 60.74896272241884 -275.301 278.7192928390883 279.73467886143834 60.248983629270306 60.74896272241884 -276.301 279.73467886143834 280.7663534706515 60.248983629270306 60.74896272241884 -090.302 92.28340522138751 93.33128322954929 60.74896272241884 61.24894115371521 -091.302 93.33128322954929 94.36261589939929 60.74896272241884 61.24894115371521 -092.302 94.36261589939929 95.39394856924926 60.74896272241884 61.24894115371521 -093.302 95.39394856924926 96.42528123904927 60.74896272241884 61.24894115371521 -094.302 96.42528123904927 97.45661390884926 60.74896272241884 61.24894115371521 -095.302 97.45661390884926 98.48794657864926 60.74896272241884 61.24894115371521 -096.302 98.48794657864926 99.51927924844927 60.74896272241884 61.24894115371521 -097.302 99.51927924844927 100.55061191824926 60.74896272241884 61.24894115371521 -098.302 100.55061191824926 101.58194458809928 60.74896272241884 61.24894115371521 -099.302 101.58194458809928 102.61327725794928 60.74896272241884 61.24894115371521 -100.302 102.61327725794928 103.64460992774929 60.74896272241884 61.24894115371521 -101.302 103.64460992774929 104.6759425975493 60.74896272241884 61.24894115371521 -102.302 104.6759425975493 105.70727526734927 60.74896272241884 61.24894115371521 -103.302 105.70727526734927 106.73860793714928 60.74896272241884 61.24894115371521 -104.302 106.73860793714928 107.78648594531104 60.74896272241884 61.24894115371521 -194.302 199.5420028819875 200.58988089019925 60.74896272241884 61.24894115371521 -195.302 200.58988089019925 201.62121356004926 60.74896272241884 61.24894115371521 -196.302 201.62121356004926 202.6525462298493 60.74896272241884 61.24894115371521 -197.302 202.6525462298493 203.68387889964927 60.74896272241884 61.24894115371521 -198.302 203.68387889964927 204.71521156944925 60.74896272241884 61.24894115371521 -199.302 204.71521156944925 205.74654423924926 60.74896272241884 61.24894115371521 -200.302 205.74654423924926 206.77787690904927 60.74896272241884 61.24894115371521 -201.302 206.77787690904927 207.8092095788993 60.74896272241884 61.24894115371521 -202.302 207.8092095788993 208.84054224874927 60.74896272241884 61.24894115371521 -203.302 208.84054224874927 209.87187491854928 60.74896272241884 61.24894115371521 -204.302 209.87187491854928 210.90320758834926 60.74896272241884 61.24894115371521 -205.302 210.90320758834926 211.93454025814927 60.74896272241884 61.24894115371521 -206.302 211.93454025814927 212.96587292794925 60.74896272241884 61.24894115371521 -207.302 212.96587292794925 213.99720559774926 60.74896272241884 61.24894115371521 -208.302 213.99720559774926 215.02853826759926 60.74896272241884 61.24894115371521 -209.302 215.02853826759926 216.05987093744926 60.74896272241884 61.24894115371521 -210.302 216.05987093744926 217.09120360724927 60.74896272241884 61.24894115371521 -211.302 217.09120360724927 218.12253627704928 60.74896272241884 61.24894115371521 -212.302 218.12253627704928 219.1538689468493 60.74896272241884 61.24894115371521 -213.302 219.1538689468493 220.18520161664924 60.74896272241884 61.24894115371521 -214.302 220.18520161664924 221.21653428644925 60.74896272241884 61.24894115371521 -215.302 221.21653428644925 222.24786695624925 60.74896272241884 61.24894115371521 -216.302 222.24786695624925 223.27919962609926 60.74896272241884 61.24894115371521 -217.302 223.27919962609926 224.31053229594926 60.74896272241884 61.24894115371521 -218.302 224.31053229594926 225.34186496574927 60.74896272241884 61.24894115371521 -219.302 225.34186496574927 226.37319763554927 60.74896272241884 61.24894115371521 -220.302 226.37319763554927 227.40453030534928 60.74896272241884 61.24894115371521 -221.302 227.40453030534928 228.4358629751493 60.74896272241884 61.24894115371521 -222.302 228.4358629751493 229.4671956449493 60.74896272241884 61.24894115371521 -223.302 229.4671956449493 230.49852831479927 60.74896272241884 61.24894115371521 -224.302 230.49852831479927 231.546406323011 60.74896272241884 61.24894115371521 -265.302 272.7666224387875 273.81450044694924 60.74896272241884 61.24894115371521 -266.302 273.81450044694924 274.84583311674925 60.74896272241884 61.24894115371521 -267.302 274.84583311674925 275.8771657865992 60.74896272241884 61.24894115371521 -268.302 275.8771657865992 276.90849845644925 60.74896272241884 61.24894115371521 -269.302 276.90849845644925 277.93983112624926 60.74896272241884 61.24894115371521 -270.302 277.93983112624926 278.97116379604927 60.74896272241884 61.24894115371521 -271.302 278.97116379604927 280.0024964658493 60.74896272241884 61.24894115371521 -272.302 280.0024964658493 281.0338291356493 60.74896272241884 61.24894115371521 -273.302 281.0338291356493 282.08170714381095 60.74896272241884 61.24894115371521 -192.303 200.64566828945883 201.7103491905383 61.24894115371521 61.74891888778053 -193.303 201.7103491905383 202.7582184567883 61.24894115371521 61.74891888778053 -194.303 202.7582184567883 203.80608772303827 61.24894115371521 61.74891888778053 -195.303 203.80608772303827 204.8539569892883 61.24894115371521 61.74891888778053 -196.303 204.8539569892883 205.9018262555383 61.24894115371521 61.74891888778053 -197.303 205.9018262555383 206.94969552178827 61.24894115371521 61.74891888778053 -198.303 206.94969552178827 207.9975647880383 61.24894115371521 61.74891888778053 -199.303 207.9975647880383 209.0454340542883 61.24894115371521 61.74891888778053 -200.303 209.0454340542883 210.0933033205383 61.24894115371521 61.74891888778053 -201.303 210.0933033205383 211.1411725867883 61.24894115371521 61.74891888778053 -202.303 211.1411725867883 212.1890418530383 61.24894115371521 61.74891888778053 -203.303 212.1890418530383 213.2369111193383 61.24894115371521 61.74891888778053 -204.303 213.2369111193383 214.2847803855883 61.24894115371521 61.74891888778053 -205.303 214.2847803855883 215.33264965183827 61.24894115371521 61.74891888778053 -206.303 215.33264965183827 216.38051891808828 61.24894115371521 61.74891888778053 -207.303 216.38051891808828 217.4283881843383 61.24894115371521 61.74891888778053 -208.303 217.4283881843383 218.4762574505883 61.24894115371521 61.74891888778053 -209.303 218.4762574505883 219.52412671683828 61.24894115371521 61.74891888778053 -210.303 219.52412671683828 220.5719959830883 61.24894115371521 61.74891888778053 -211.303 220.5719959830883 221.61986524933826 61.24894115371521 61.74891888778053 -212.303 221.61986524933826 222.66773451558828 61.24894115371521 61.74891888778053 -213.303 222.66773451558828 223.7156037818383 61.24894115371521 61.74891888778053 -214.303 223.7156037818383 224.76347304813828 61.24894115371521 61.74891888778053 -215.303 224.76347304813828 225.8113423143883 61.24894115371521 61.74891888778053 -216.303 225.8113423143883 226.8592115806383 61.24894115371521 61.74891888778053 -217.303 226.8592115806383 227.90708084688828 61.24894115371521 61.74891888778053 -218.303 227.90708084688828 228.9549501131383 61.24894115371521 61.74891888778053 -219.303 228.9549501131383 230.0028193793883 61.24894115371521 61.74891888778053 -220.303 230.0028193793883 231.05068864563827 61.24894115371521 61.74891888778053 -221.303 231.05068864563827 232.11536954671772 61.24894115371521 61.74891888778053 -260.303 271.90077839475885 272.96545929578826 61.24894115371521 61.74891888778053 -261.303 272.96545929578826 274.0133285620383 61.24894115371521 61.74891888778053 -262.303 274.0133285620383 275.0611978283383 61.24894115371521 61.74891888778053 -263.303 275.0611978283383 276.1090670945883 61.24894115371521 61.74891888778053 -264.303 276.1090670945883 277.1569363608383 61.24894115371521 61.74891888778053 -265.303 277.1569363608383 278.20480562708826 61.24894115371521 61.74891888778053 -266.303 278.20480562708826 279.2526748933383 61.24894115371521 61.74891888778053 -267.303 279.2526748933383 280.3005441595883 61.24894115371521 61.74891888778053 -268.303 280.3005441595883 281.34841342583826 61.24894115371521 61.74891888778053 -269.303 281.34841342583826 282.41309432691776 61.24894115371521 61.74891888778053 -203.304 215.6462725148078 216.72838773709123 61.74891888778053 62.248895886691656 -204.304 216.72838773709123 217.79341497119123 61.74891888778053 62.248895886691656 -205.304 217.79341497119123 218.8584422052912 61.74891888778053 62.248895886691656 -206.304 218.8584422052912 219.92346943939123 61.74891888778053 62.248895886691656 -207.304 219.92346943939123 220.98849667349123 61.74891888778053 62.248895886691656 -208.304 220.98849667349123 222.05352390759123 61.74891888778053 62.248895886691656 -209.304 222.05352390759123 223.11855114169123 61.74891888778053 62.248895886691656 -210.304 223.11855114169123 224.1835783757912 61.74891888778053 62.248895886691656 -211.304 224.1835783757912 225.24860560989123 61.74891888778053 62.248895886691656 -212.304 225.24860560989123 226.31363284399123 61.74891888778053 62.248895886691656 -213.304 226.31363284399123 227.3786600780912 61.74891888778053 62.248895886691656 -214.304 227.3786600780912 228.44368731219123 61.74891888778053 62.248895886691656 -215.304 228.44368731219123 229.50871454629123 61.74891888778053 62.248895886691656 -216.304 229.50871454629123 230.5737417803912 61.74891888778053 62.248895886691656 -217.304 230.5737417803912 231.63876901449123 61.74891888778053 62.248895886691656 -218.304 231.63876901449123 232.70379624859123 61.74891888778053 62.248895886691656 -219.304 232.70379624859123 233.78591147087462 61.74891888778053 62.248895886691656 -256.304 272.09271592190777 273.1748311441912 61.74891888778053 62.248895886691656 -257.304 273.1748311441912 274.2398583782412 61.74891888778053 62.248895886691656 -258.304 274.2398583782412 275.30488561229123 61.74891888778053 62.248895886691656 -259.304 275.30488561229123 276.36991284639123 61.74891888778053 62.248895886691656 -260.304 276.36991284639123 277.4349400804912 61.74891888778053 62.248895886691656 -261.304 277.4349400804912 278.49996731459123 61.74891888778053 62.248895886691656 -262.304 278.49996731459123 279.56499454869123 61.74891888778053 62.248895886691656 -263.304 279.56499454869123 280.63002178279123 61.74891888778053 62.248895886691656 -264.304 280.63002178279123 281.69504901689123 61.74891888778053 62.248895886691656 -265.304 281.69504901689123 282.76007625099123 61.74891888778053 62.248895886691656 -266.304 282.76007625099123 283.8421914732746 61.74891888778053 62.248895886691656 -189.305 204.0931852546081 205.19340048785065 62.248895886691656 62.74887210974755 -190.305 205.19340048785065 206.27624077295064 62.248895886691656 62.74887210974755 -191.305 206.27624077295064 207.35908105805063 62.248895886691656 62.74887210974755 -192.305 207.35908105805063 208.44192134315063 62.248895886691656 62.74887210974755 -193.305 208.44192134315063 209.52476162825064 62.248895886691656 62.74887210974755 -194.305 209.52476162825064 210.6076019133506 62.248895886691656 62.74887210974755 -195.305 210.6076019133506 211.69044219845063 62.248895886691656 62.74887210974755 -196.305 211.69044219845063 212.77328248355064 62.248895886691656 62.74887210974755 -197.305 212.77328248355064 213.8561227686506 62.248895886691656 62.74887210974755 -198.305 213.8561227686506 214.93896305375063 62.248895886691656 62.74887210974755 -199.305 214.93896305375063 216.02180333885065 62.248895886691656 62.74887210974755 -200.305 216.02180333885065 217.10464362395064 62.248895886691656 62.74887210974755 -201.305 217.10464362395064 218.18748390905063 62.248895886691656 62.74887210974755 -202.305 218.18748390905063 219.27032419415065 62.248895886691656 62.74887210974755 -203.305 219.27032419415065 220.35316447925064 62.248895886691656 62.74887210974755 -204.305 220.35316447925064 221.43600476435063 62.248895886691656 62.74887210974755 -205.305 221.43600476435063 222.51884504945065 62.248895886691656 62.74887210974755 -206.305 222.51884504945065 223.6016853345506 62.248895886691656 62.74887210974755 -207.305 223.6016853345506 224.68452561965063 62.248895886691656 62.74887210974755 -208.305 224.68452561965063 225.76736590475065 62.248895886691656 62.74887210974755 -209.305 225.76736590475065 226.85020618985064 62.248895886691656 62.74887210974755 -210.305 226.85020618985064 227.93304647495063 62.248895886691656 62.74887210974755 -211.305 227.93304647495063 229.01588676005065 62.248895886691656 62.74887210974755 -212.305 229.01588676005065 230.09872704515067 62.248895886691656 62.74887210974755 -213.305 230.09872704515067 231.18156733025063 62.248895886691656 62.74887210974755 -214.305 231.18156733025063 232.26440761535065 62.248895886691656 62.74887210974755 -215.305 232.26440761535065 233.3472479004506 62.248895886691656 62.74887210974755 -216.305 233.3472479004506 234.43008818555063 62.248895886691656 62.74887210974755 -217.305 234.43008818555063 235.51292847065065 62.248895886691656 62.74887210974755 -218.305 235.51292847065065 236.61314370389317 62.248895886691656 62.74887210974755 -252.305 272.31212321590806 273.41233844915064 62.248895886691656 62.74887210974755 -253.305 273.41233844915064 274.49517873425066 62.248895886691656 62.74887210974755 -254.305 274.49517873425066 275.5780190193506 62.248895886691656 62.74887210974755 -255.305 275.5780190193506 276.66085930445064 62.248895886691656 62.74887210974755 -256.305 276.66085930445064 277.74369958955066 62.248895886691656 62.74887210974755 -257.305 277.74369958955066 278.8265398746506 62.248895886691656 62.74887210974755 -258.305 278.8265398746506 279.90938015975064 62.248895886691656 62.74887210974755 -259.305 279.90938015975064 280.99222044485066 62.248895886691656 62.74887210974755 -260.305 280.99222044485066 282.0750607299507 62.248895886691656 62.74887210974755 -261.305 282.0750607299507 283.15790101505064 62.248895886691656 62.74887210974755 -262.305 283.15790101505064 284.2581162482932 62.248895886691656 62.74887210974755 -186.306 204.2767335127547 205.39575125051743 62.74887210974755 63.24884751320979 -187.306 205.39575125051743 206.49709588281746 62.74887210974755 63.24884751320979 -188.306 206.49709588281746 207.5984405151175 62.74887210974755 63.24884751320979 -189.306 207.5984405151175 208.69978514741746 62.74887210974755 63.24884751320979 -190.306 208.69978514741746 209.80112977971748 62.74887210974755 63.24884751320979 -191.306 209.80112977971748 210.90247441201745 62.74887210974755 63.24884751320979 -192.306 210.90247441201745 212.00381904431742 62.74887210974755 63.24884751320979 -193.306 212.00381904431742 213.10516367661745 62.74887210974755 63.24884751320979 -194.306 213.10516367661745 214.20650830891745 62.74887210974755 63.24884751320979 -195.306 214.20650830891745 215.30785294121745 62.74887210974755 63.24884751320979 -196.306 215.30785294121745 216.40919757346745 62.74887210974755 63.24884751320979 -197.306 216.40919757346745 217.51054220571746 62.74887210974755 63.24884751320979 -198.306 217.51054220571746 218.61188683801743 62.74887210974755 63.24884751320979 -199.306 218.61188683801743 219.71323147031745 62.74887210974755 63.24884751320979 -200.306 219.71323147031745 220.81457610261745 62.74887210974755 63.24884751320979 -201.306 220.81457610261745 221.91592073491745 62.74887210974755 63.24884751320979 -202.306 221.91592073491745 223.01726536721748 62.74887210974755 63.24884751320979 -203.306 223.01726536721748 224.11860999951745 62.74887210974755 63.24884751320979 -204.306 224.11860999951745 225.21995463181747 62.74887210974755 63.24884751320979 -205.306 225.21995463181747 226.32129926411744 62.74887210974755 63.24884751320979 -206.306 226.32129926411744 227.42264389641747 62.74887210974755 63.24884751320979 -207.306 227.42264389641747 228.52398852871744 62.74887210974755 63.24884751320979 -208.306 228.52398852871744 229.62533316101747 62.74887210974755 63.24884751320979 -209.306 229.62533316101747 230.72667779331744 62.74887210974755 63.24884751320979 -210.306 230.72667779331744 231.82802242556744 62.74887210974755 63.24884751320979 -211.306 231.82802242556744 232.92936705781744 62.74887210974755 63.24884751320979 -212.306 232.92936705781744 234.03071169011744 62.74887210974755 63.24884751320979 -213.306 234.03071169011744 235.13205632241744 62.74887210974755 63.24884751320979 -214.306 235.13205632241744 236.23340095471744 62.74887210974755 63.24884751320979 -215.306 236.23340095471744 237.33474558701744 62.74887210974755 63.24884751320979 -216.306 237.33474558701744 238.45376332478017 62.74887210974755 63.24884751320979 -248.306 272.56010071495473 273.6791184527175 62.74887210974755 63.24884751320979 -249.306 273.6791184527175 274.78046308501746 62.74887210974755 63.24884751320979 -250.306 274.78046308501746 275.88180771731743 62.74887210974755 63.24884751320979 -251.306 275.88180771731743 276.9831523495675 62.74887210974755 63.24884751320979 -252.306 276.9831523495675 278.08449698181744 62.74887210974755 63.24884751320979 -253.306 278.08449698181744 279.18584161411746 62.74887210974755 63.24884751320979 -254.306 279.18584161411746 280.2871862464175 62.74887210974755 63.24884751320979 -255.306 280.2871862464175 281.38853087871746 62.74887210974755 63.24884751320979 -256.306 281.38853087871746 282.48987551101743 62.74887210974755 63.24884751320979 -257.306 282.48987551101743 283.6088932487802 62.74887210974755 63.24884751320979 -183.307 204.48250306138044 205.62106538330278 63.24884751320979 63.7488220500132 -184.307 205.62106538330278 206.7416446092028 63.24884751320979 63.7488220500132 -185.307 206.7416446092028 207.86222383505282 63.24884751320979 63.7488220500132 -186.307 207.86222383505282 208.98280306090277 63.24884751320979 63.7488220500132 -187.307 208.98280306090277 210.10338228680277 63.24884751320979 63.7488220500132 -188.307 210.10338228680277 211.22396151270277 63.24884751320979 63.7488220500132 -189.307 211.22396151270277 212.34454073855278 63.24884751320979 63.7488220500132 -190.307 212.34454073855278 213.46511996440276 63.24884751320979 63.7488220500132 -191.307 213.46511996440276 214.58569919030276 63.24884751320979 63.7488220500132 -192.307 214.58569919030276 215.70627841615277 63.24884751320979 63.7488220500132 -193.307 215.70627841615277 216.82685764200278 63.24884751320979 63.7488220500132 -194.307 216.82685764200278 217.9474368679028 63.24884751320979 63.7488220500132 -195.307 217.9474368679028 219.06801609380278 63.24884751320979 63.7488220500132 -196.307 219.06801609380278 220.1885953196528 63.24884751320979 63.7488220500132 -197.307 220.1885953196528 221.3091745455028 63.24884751320979 63.7488220500132 -198.307 221.3091745455028 222.42975377140277 63.24884751320979 63.7488220500132 -199.307 222.42975377140277 223.55033299725278 63.24884751320979 63.7488220500132 -200.307 223.55033299725278 224.6709122231028 63.24884751320979 63.7488220500132 -201.307 224.6709122231028 225.79149144900276 63.24884751320979 63.7488220500132 -202.307 225.79149144900276 226.91207067485277 63.24884751320979 63.7488220500132 -203.307 226.91207067485277 228.03264990070278 63.24884751320979 63.7488220500132 -204.307 228.03264990070278 229.1532291266028 63.24884751320979 63.7488220500132 -205.307 229.1532291266028 230.27380835250278 63.24884751320979 63.7488220500132 -206.307 230.27380835250278 231.39438757835276 63.24884751320979 63.7488220500132 -207.307 231.39438757835276 232.5149668042028 63.24884751320979 63.7488220500132 -208.307 232.5149668042028 233.6355460301028 63.24884751320979 63.7488220500132 -209.307 233.6355460301028 234.75612525595278 63.24884751320979 63.7488220500132 -210.307 234.75612525595278 235.8767044818028 63.24884751320979 63.7488220500132 -211.307 235.8767044818028 236.99728370770276 63.24884751320979 63.7488220500132 -212.307 236.99728370770276 238.11786293360277 63.24884751320979 63.7488220500132 -213.307 238.11786293360277 239.25642525552513 63.24884751320979 63.7488220500132 -244.307 272.83783583958046 273.9763981614527 63.24884751320979 63.7488220500132 -245.307 273.9763981614527 275.0969773873028 63.24884751320979 63.7488220500132 -246.307 275.0969773873028 276.21755661320276 63.24884751320979 63.7488220500132 -247.307 276.21755661320276 277.3381358391028 63.24884751320979 63.7488220500132 -248.307 277.3381358391028 278.4587150649528 63.24884751320979 63.7488220500132 -249.307 278.4587150649528 279.57929429080275 63.24884751320979 63.7488220500132 -250.307 279.57929429080275 280.69987351670284 63.24884751320979 63.7488220500132 -251.307 280.69987351670284 281.8204527425528 63.24884751320979 63.7488220500132 -252.307 281.8204527425528 282.9410319684028 63.24884751320979 63.7488220500132 -253.307 282.9410319684028 284.0795942903252 63.24884751320979 63.7488220500132 -180.308 204.71145027877813 205.87034190035624 63.7488220500132 64.24879566944288 -181.308 205.87034190035624 207.01092791670624 63.7488220500132 64.24879566944288 -182.308 207.01092791670624 208.15151393305624 63.7488220500132 64.24879566944288 -183.308 208.15151393305624 209.29209994940624 63.7488220500132 64.24879566944288 -184.308 209.29209994940624 210.43268596575626 63.7488220500132 64.24879566944288 -185.308 210.43268596575626 211.57327198215626 63.7488220500132 64.24879566944288 -186.308 211.57327198215626 212.71385799850626 63.7488220500132 64.24879566944288 -187.308 212.71385799850626 213.85444401485626 63.7488220500132 64.24879566944288 -188.308 213.85444401485626 214.99503003120628 63.7488220500132 64.24879566944288 -189.308 214.99503003120628 216.13561604755625 63.7488220500132 64.24879566944288 -190.308 216.13561604755625 217.27620206390625 63.7488220500132 64.24879566944288 -191.308 217.27620206390625 218.41678808025625 63.7488220500132 64.24879566944288 -192.308 218.41678808025625 219.55737409660622 63.7488220500132 64.24879566944288 -193.308 219.55737409660622 220.69796011295625 63.7488220500132 64.24879566944288 -194.308 220.69796011295625 221.83854612930625 63.7488220500132 64.24879566944288 -195.308 221.83854612930625 222.97913214565625 63.7488220500132 64.24879566944288 -196.308 222.97913214565625 224.11971816200625 63.7488220500132 64.24879566944288 -197.308 224.11971816200625 225.26030417835625 63.7488220500132 64.24879566944288 -198.308 225.26030417835625 226.40089019470628 63.7488220500132 64.24879566944288 -199.308 226.40089019470628 227.54147621105625 63.7488220500132 64.24879566944288 -200.308 227.54147621105625 228.68206222740625 63.7488220500132 64.24879566944288 -201.308 228.68206222740625 229.82264824375625 63.7488220500132 64.24879566944288 -202.308 229.82264824375625 230.96323426010622 63.7488220500132 64.24879566944288 -203.308 230.96323426010622 232.10382027645625 63.7488220500132 64.24879566944288 -204.308 232.10382027645625 233.24440629280625 63.7488220500132 64.24879566944288 -205.308 233.24440629280625 234.38499230915625 63.7488220500132 64.24879566944288 -206.308 234.38499230915625 235.52557832555624 63.7488220500132 64.24879566944288 -207.308 235.52557832555624 236.66616434190627 63.7488220500132 64.24879566944288 -208.308 236.66616434190627 237.80675035825624 63.7488220500132 64.24879566944288 -209.308 237.80675035825624 238.94733637460624 63.7488220500132 64.24879566944288 -210.308 238.94733637460624 240.10622799613435 63.7488220500132 64.24879566944288 -241.308 274.28719727627816 275.44608889785627 63.7488220500132 64.24879566944288 -242.308 275.44608889785627 276.58667491420624 63.7488220500132 64.24879566944288 -243.308 276.58667491420624 277.72726093055627 63.7488220500132 64.24879566944288 -244.308 277.72726093055627 278.8678469469063 63.7488220500132 64.24879566944288 -245.308 278.8678469469063 280.00843296325627 63.7488220500132 64.24879566944288 -246.308 280.00843296325627 281.14901897960624 63.7488220500132 64.24879566944288 -247.308 281.14901897960624 282.28960499595627 63.7488220500132 64.24879566944288 -248.308 282.28960499595627 283.4484966175344 63.7488220500132 64.24879566944288 -178.309 206.12601971344992 207.306071334824 64.24879566944288 64.74876831677287 -179.309 207.306071334824 208.467481583524 64.24879566944288 64.74876831677287 -180.309 208.467481583524 209.628891832224 64.24879566944288 64.74876831677287 -181.309 209.628891832224 210.790302080874 64.24879566944288 64.74876831677287 -182.309 210.790302080874 211.95171232952399 64.24879566944288 64.74876831677287 -183.309 211.95171232952399 213.11312257822397 64.24879566944288 64.74876831677287 -184.309 213.11312257822397 214.27453282687398 64.24879566944288 64.74876831677287 -185.309 214.27453282687398 215.435943075524 64.24879566944288 64.74876831677287 -186.309 215.435943075524 216.597353324224 64.24879566944288 64.74876831677287 -187.309 216.597353324224 217.758763572924 64.24879566944288 64.74876831677287 -188.309 217.758763572924 218.920173821574 64.24879566944288 64.74876831677287 -189.309 218.920173821574 220.081584070224 64.24879566944288 64.74876831677287 -190.309 220.081584070224 221.242994318924 64.24879566944288 64.74876831677287 -191.309 221.242994318924 222.404404567574 64.24879566944288 64.74876831677287 -192.309 222.404404567574 223.565814816224 64.24879566944288 64.74876831677287 -193.309 223.565814816224 224.72722506492397 64.24879566944288 64.74876831677287 -194.309 224.72722506492397 225.88863531362398 64.24879566944288 64.74876831677287 -195.309 225.88863531362398 227.05004556227402 64.24879566944288 64.74876831677287 -196.309 227.05004556227402 228.211455810924 64.24879566944288 64.74876831677287 -197.309 228.211455810924 229.37286605962402 64.24879566944288 64.74876831677287 -198.309 229.37286605962402 230.534276308274 64.24879566944288 64.74876831677287 -199.309 230.534276308274 231.695686556924 64.24879566944288 64.74876831677287 -200.309 231.695686556924 232.857096805624 64.24879566944288 64.74876831677287 -201.309 232.857096805624 234.018507054324 64.24879566944288 64.74876831677287 -202.309 234.018507054324 235.179917302974 64.24879566944288 64.74876831677287 -203.309 235.179917302974 236.34132755162398 64.24879566944288 64.74876831677287 -204.309 236.34132755162398 237.502737800324 64.24879566944288 64.74876831677287 -205.309 237.502737800324 238.66414804897403 64.24879566944288 64.74876831677287 -206.309 238.66414804897403 239.84419967029805 64.24879566944288 64.74876831677287 -238.309 275.81063463374994 276.99068625512405 64.24879566944288 64.74876831677287 -239.309 276.99068625512405 278.152096503824 64.24879566944288 64.74876831677287 -240.309 278.152096503824 279.313506752524 64.24879566944288 64.74876831677287 -241.309 279.313506752524 280.474917001174 64.24879566944288 64.74876831677287 -242.309 280.474917001174 281.636327249824 64.24879566944288 64.74876831677287 -243.309 281.636327249824 282.816378871198 64.24879566944288 64.74876831677287 -188.310 221.80651164076957 223.00860363046388 64.74876831677287 66.74864201896122 -189.310 223.00860363046388 224.19170442206388 64.74876831677287 66.74864201896122 -190.310 224.19170442206388 225.37480521366393 64.74876831677287 66.74864201896122 -191.310 225.37480521366393 226.5579060052139 64.74876831677287 66.74864201896122 -192.310 226.5579060052139 227.7410067967639 64.74876831677287 66.74864201896122 -193.310 227.7410067967639 228.92410758836388 64.74876831677287 66.74864201896122 -194.310 228.92410758836388 230.10720837996388 64.74876831677287 66.74864201896122 -195.310 230.10720837996388 231.2903091715139 64.74876831677287 66.74864201896122 -196.310 231.2903091715139 232.4734099630639 64.74876831677287 66.74864201896122 -197.310 232.4734099630639 233.65651075466388 64.74876831677287 66.74864201896122 -198.310 233.65651075466388 234.8396115462639 64.74876831677287 66.74864201896122 -199.310 234.8396115462639 236.02271233781389 64.74876831677287 66.74864201896122 -200.310 236.02271233781389 237.20581312936392 64.74876831677287 66.74864201896122 -201.310 237.20581312936392 238.38891392096392 64.74876831677287 66.74864201896122 -202.310 238.38891392096392 239.59100591065823 64.74876831677287 66.74864201896122 -074.317 100.24255131306474 101.62871983408795 66.74864201896122 68.74850623532309 -075.317 101.62871983408795 102.99297174798795 66.74864201896122 68.74850623532309 -076.317 102.99297174798795 104.35722366188796 66.74864201896122 68.74850623532309 -077.317 104.35722366188796 105.72147557578793 66.74864201896122 68.74850623532309 -078.317 105.72147557578793 107.08572748968794 66.74864201896122 68.74850623532309 -079.317 107.08572748968794 108.44997940353794 66.74864201896122 68.74850623532309 -080.317 108.44997940353794 109.81423131738796 66.74864201896122 68.74850623532309 -081.317 109.81423131738796 111.17848323128796 66.74864201896122 68.74850623532309 -082.317 111.17848323128796 112.54273514518795 66.74864201896122 68.74850623532309 -083.317 112.54273514518795 113.90698705908795 66.74864201896122 68.74850623532309 -084.317 113.90698705908795 115.27123897298794 66.74864201896122 68.74850623532309 -085.317 115.27123897298794 116.63549088688796 66.74864201896122 68.74850623532309 -086.317 116.63549088688796 117.99974280073796 66.74864201896122 68.74850623532309 -087.317 117.99974280073796 119.36399471458796 66.74864201896122 68.74850623532309 -088.317 119.36399471458796 120.75016323561114 66.74864201896122 68.74850623532309 -071.318 98.33172772596913 99.74935911755605 68.74850623532309 69.24846676105042 -072.318 99.74935911755605 101.14457317235605 68.74850623532309 69.24846676105042 -073.318 101.14457317235605 102.53978722715604 68.74850623532309 69.24846676105042 -074.318 102.53978722715604 103.93500128200606 68.74850623532309 69.24846676105042 -075.318 103.93500128200606 105.33021533685604 68.74850623532309 69.24846676105042 -076.318 105.33021533685604 106.72542939165604 68.74850623532309 69.24846676105042 -077.318 106.72542939165604 108.12064344645604 68.74850623532309 69.24846676105042 -078.318 108.12064344645604 109.51585750125604 68.74850623532309 69.24846676105042 -079.318 109.51585750125604 110.91107155605604 68.74850623532309 69.24846676105042 -080.318 110.91107155605604 112.30628561085604 68.74850623532309 69.24846676105042 -081.318 112.30628561085604 113.70149966565604 68.74850623532309 69.24846676105042 -082.318 113.70149966565604 115.09671372050605 68.74850623532309 69.24846676105042 -083.318 115.09671372050605 116.49192777535605 68.74850623532309 69.24846676105042 -084.318 116.49192777535605 117.88714183015603 68.74850623532309 69.24846676105042 -085.318 117.88714183015603 119.28235588495605 68.74850623532309 69.24846676105042 -086.318 119.28235588495605 120.69998727654297 68.74850623532309 69.24846676105042 -070.319 99.19510391155953 100.6457727501001 69.24846676105042 69.74842542561765 -071.319 100.6457727501001 102.07349822580011 69.24846676105042 69.74842542561765 -072.319 102.07349822580011 103.50122370150011 69.24846676105042 69.74842542561765 -073.319 103.50122370150011 104.92894917720011 69.24846676105042 69.74842542561765 -074.319 104.92894917720011 106.3566746529001 69.24846676105042 69.74842542561765 -075.319 106.3566746529001 107.78440012860011 69.24846676105042 69.74842542561765 -076.319 107.78440012860011 109.2121256043001 69.24846676105042 69.74842542561765 -077.319 109.2121256043001 110.63985108000011 69.24846676105042 69.74842542561765 -078.319 110.63985108000011 112.0675765557001 69.24846676105042 69.74842542561765 -079.319 112.0675765557001 113.4953020314001 69.24846676105042 69.74842542561765 -080.319 113.4953020314001 114.9230275071001 69.24846676105042 69.74842542561765 -081.319 114.9230275071001 116.35075298280012 69.24846676105042 69.74842542561765 -082.319 116.35075298280012 117.77847845845011 69.24846676105042 69.74842542561765 -083.319 117.77847845845011 119.20620393410013 69.24846676105042 69.74842542561765 -084.319 119.20620393410013 120.63392940980012 69.24846676105042 69.74842542561765 -085.319 120.63392940980012 122.08459824834067 69.24846676105042 69.74842542561765 -068.320 98.64556871444923 100.1309675199425 69.74842542561765 70.25639136484793 -069.320 100.1309675199425 101.5928697200425 69.74842542561765 70.25639136484793 -070.320 101.5928697200425 103.0547719201425 69.74842542561765 70.25639136484793 -071.320 103.0547719201425 104.5166741202425 69.74842542561765 70.25639136484793 -072.320 104.5166741202425 105.97857632034251 69.74842542561765 70.25639136484793 -073.320 105.97857632034251 107.44047852039253 69.74842542561765 70.25639136484793 -074.320 107.44047852039253 108.90238072044251 69.74842542561765 70.25639136484793 -075.320 108.90238072044251 110.36428292054251 69.74842542561765 70.25639136484793 -076.320 110.36428292054251 111.8261851206425 69.74842542561765 70.25639136484793 -077.320 111.8261851206425 113.2880873207425 69.74842542561765 70.25639136484793 -078.320 113.2880873207425 114.74998952079252 69.74842542561765 70.25639136484793 -079.320 114.74998952079252 116.21189172084252 69.74842542561765 70.25639136484793 -080.320 116.21189172084252 117.67379392094252 69.74842542561765 70.25639136484793 -081.320 117.67379392094252 119.13569612104251 69.74842542561765 70.25639136484793 -082.320 119.13569612104251 120.5975983211425 69.74842542561765 70.25639136484793 -083.320 120.5975983211425 122.0829971266358 69.74842542561765 70.25639136484793 -066.321 98.07671817936645 99.59866952053102 70.24037281008577 70.7563458317989 -067.321 99.59866952053102 101.09654167678102 70.24037281008577 70.7563458317989 -068.321 101.09654167678102 102.59441383303101 70.24037281008577 70.7563458317989 -069.321 102.59441383303101 104.09228598923102 70.24037281008577 70.7563458317989 -070.321 104.09228598923102 105.59015814543102 70.24037281008577 70.7563458317989 -071.321 105.59015814543102 107.08803030163102 70.24037281008577 70.7563458317989 -072.321 107.08803030163102 108.58590245783101 70.24037281008577 70.7563458317989 -073.321 108.58590245783101 110.08377461403103 70.24037281008577 70.7563458317989 -074.321 110.08377461403103 111.58164677028103 70.24037281008577 70.7563458317989 -075.321 111.58164677028103 113.07951892653102 70.24037281008577 70.7563458317989 -076.321 113.07951892653102 114.57739108273103 70.24037281008577 70.7563458317989 -077.321 114.57739108273103 116.07526323893102 70.24037281008577 70.7563458317989 -078.321 116.07526323893102 117.573135395131 70.24037281008577 70.7563458317989 -079.321 117.573135395131 119.07100755133101 70.24037281008577 70.7563458317989 -080.321 119.07100755133101 120.56887970758102 70.24037281008577 70.7563458317989 -081.321 120.56887970758102 122.09083104879561 70.24037281008577 70.7563458317989 diff --git a/docs/source/canfar.md b/docs/source/canfar.md new file mode 100644 index 000000000..1f490c504 --- /dev/null +++ b/docs/source/canfar.md @@ -0,0 +1,94 @@ +# Running `shapepipe` on the canfar science portal + +## Introduction + +## Steps from testing to parallel running + +Before starting a batch remote session job on a large number of images (step 5.), +it is recommended to perform some or all of the testing steps (1. - 4.). + + +1. Run the basic `shapepipe` runner script to test (one or several) modules in question, specified by a given config file, on one image. + This step has to be run in the image run directory. The command is + ```bash + shapepipe_run -c config.ini + ``` + +2. Run the job script to test the job management, on one image. + This step has to be run in the image run directory. The command is + ```bash + job_sp_canfar -j JOB [OPTIONS] + ``` + +3. Run the pipeline script to test the processing step(s), on one image. + This step has to be run in the patch base directory. + + 1. First, run in dry mode: + ```bash + init_run_exclusive_canfar.sh -j JOB -e ID -p [psfex|mccd] -k [tile|exp] -n + ``` + 2. Next, perform a real run with + ```bash + init_run_exclusive_canfar.sh -j JOB -e ID -p [psfex|mccd] -k [tile|exp] -n + ``` + +4. Run remote session script to test job submission using docker images, on one image. + This step has to be run in the patch base directory. + 1. First, run in dry mode=2, to display curl command, with + ```bash + curl_canfar_local.sh -j JOB -e ID -p [psfex|mccd] -k [tile|exp] -n 2 + ``` + + 2. Next, run in dry mode=1, to use curl command without processing: + ```bash + curl_canfar_local.sh -j JOB -e ID -p [psfex|mccd] -k [tile|exp] -n 1 + ``` + 3. Then, perform a real run, to use curl with processing: + ```bash + curl_canfar_local.sh -j JOB -e ID -p [psfex|mccd] -k [tile|exp] + ``` + +5. Full run: Call remote session script and docker image with collection of images + ```bash + curl_canfar_local.sh -j JOB -f path_IDs -p [psfex|mccd] -k [tile|exp] + ``` + with `path_IDs` being a text file with one image ID per line. + +## Monitoring + + +### Status and output of submitted job + +Monitoring of the currently active remote session can be performed using the session IDs `session_IDs.txt` written by the +remote session script `curl_canfar_local.sh`. In the patch main directory, run +```bash +curl_canfar_monitor.sh events +``` +to display the remotely started docker image status, and +```bash +curl_canfar_monitor.sh logs +``` +to print `stdout` of the remotely run pipeline script. + +### Number of submitted running jobs + +The script +```bash +stats_headless_canfar.py +``` +returns the number of actively running headless jobs. + + +## Post-hoc summary + +In the patch main directory, run +```bash +summary_run PATCH +``` +to print a summary with missing image IDs per job and module. + +## Deleting jobs + +```bash + for id in `cat session_IDs.txt`; do echo $id; curl -X DELETE -E /arc/home/kilbinger/.ssl/cadcproxy.pem https://ws-uv.canfar.net/skaha/v0/session/$id; done + ``` diff --git a/docs/source/conf.py b/docs/source/conf.py index a191341a1..ab410f0db 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -14,18 +14,19 @@ # import os import sys -sys.path.insert(0, os.path.abspath('../..')) + +sys.path.insert(0, os.path.abspath("../..")) # -- Project information ----------------------------------------------------- -project = 'ShapePipe' -copyright = '2022, CosmoStat' -author = 'CosmoStat' +project = "ShapePipe" +copyright = "2022, CosmoStat" +author = "CosmoStat" # The short X.Y version -version = '1.0' +version = "1.0" # The full version, including alpha/beta/rc tags -release = '1.0.1' +release = "1.0.1" # -- General configuration --------------------------------------------------- @@ -38,34 +39,34 @@ # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.autosummary', - 'sphinx.ext.coverage', - 'sphinx.ext.doctest', - 'sphinx.ext.ifconfig', - 'sphinx.ext.intersphinx', - 'sphinx.ext.mathjax', - 'sphinx.ext.napoleon', - 'sphinx.ext.todo', - 'sphinx.ext.viewcode', - 'sphinxcontrib.bibtex', - 'myst_parser', - 'numpydoc', + "sphinx.ext.autodoc", + "sphinx.ext.autosummary", + "sphinx.ext.coverage", + "sphinx.ext.doctest", + "sphinx.ext.ifconfig", + "sphinx.ext.intersphinx", + "sphinx.ext.mathjax", + "sphinx.ext.napoleon", + "sphinx.ext.todo", + "sphinx.ext.viewcode", + "sphinxcontrib.bibtex", + "myst_parser", + "numpydoc", ] # Include module names for objects add_module_names = False # Include init in class documentation. -autoclass_content = 'class' +autoclass_content = "class" # Audodoc options autodoc_default_options = { - 'member-order': 'bysource', - 'private-members': True, - 'special-members': '__call__', - 'show-inheritance': True, - 'exclude-members': 'urand,randint' + "member-order": "bysource", + "private-members": True, + "special-members": "__call__", + "show-inheritance": True, + "exclude-members": "urand,randint", } # Generate summaries @@ -77,56 +78,56 @@ # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: # -source_suffix = ['.rst', '.md'] +source_suffix = [".rst", ".md"] # The master toctree document. -master_doc = 'index' +master_doc = "index" # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. show_authors = True # The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'default' +pygments_style = "default" # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = True # -- Options for Markdown files ---------------------------------------------- -myst_enable_extensions = ['html_image'] +myst_enable_extensions = ["html_image"] # -- Options for HTML output ------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # -html_theme = 'sphinx_book_theme' +html_theme = "sphinx_book_theme" # 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 = { - 'repository_url': 'https://github.com/CosmoStat/shapepipe', - 'use_repository_button': True, - 'use_issues_button': True, - 'use_download_button': False, - 'use_fullscreen_button': False, - 'use_edit_page_button': True, - 'path_to_docs': 'docs/source', - 'extra_navbar': "

", + "repository_url": "https://github.com/CosmoStat/shapepipe", + "use_repository_button": True, + "use_issues_button": True, + "use_download_button": False, + "use_fullscreen_button": False, + "use_edit_page_button": True, + "path_to_docs": "docs/source", + "extra_navbar": "

", } html_collapsible_definitions = True html_awesome_headerlinks = True # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". -html_title = '{0} v{1}'.format(project, version) +html_title = "{0} v{1}".format(project, version) # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. -html_last_updated_fmt = '%d %b, %Y' +html_last_updated_fmt = "%d %b, %Y" # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. @@ -142,21 +143,21 @@ # -- Options for HTMLHelp output --------------------------------------------- # Output file base name for HTML help builder. -htmlhelp_basename = 'ShapePipedoc' +htmlhelp_basename = "ShapePipedoc" # -- Intersphinx Mapping ---------------------------------------------- # Refer to the package libraries for type definitions intersphinx_mapping = { - 'python': ('http://docs.python.org/3', None), - 'numpy': ('https://numpy.org/doc/stable/', None), - 'scipy': ('https://docs.scipy.org/doc/scipy/reference', None), - 'matplotlib': ('https://matplotlib.org', None), - 'astropy': ('http://docs.astropy.org/en/latest/', None), + "python": ("http://docs.python.org/3", None), + "numpy": ("https://numpy.org/doc/stable/", None), + "scipy": ("https://docs.scipy.org/doc/scipy/reference", None), + "matplotlib": ("https://matplotlib.org", None), + "astropy": ("http://docs.astropy.org/en/latest/", None), } # -- BibTeX Setting ---------------------------------------------- -bibtex_bibfiles = ['refs.bib'] -bibtex_default_style = 'unsrt' -bibtex_reference_style = 'author_year' +bibtex_bibfiles = ["refs.bib"] +bibtex_default_style = "unsrt" +bibtex_reference_style = "author_year" diff --git a/docs/source/pipeline_canfar.md b/docs/source/pipeline_canfar.md new file mode 100644 index 000000000..9f867b85e --- /dev/null +++ b/docs/source/pipeline_canfar.md @@ -0,0 +1,154 @@ +patch="P7" +psf="psfex" + +# Terminal title +echo -ne "\033]0;$patch\007" + +# Run directory +dir=~/cosmostat/v2/pre_v2/$psf/$patch +cd $dir + +# Get tile number list +ln -s ~/shapepipe/auxdir/CFIS/tiles_202106/tiles_$patch.txt tile_numbers.txt + + +# Get images + +## Download and link separately + +### Download +### Create and link to central image storage directory +mkdir -p ~/cosmostat/v2/data_tiles/$patch +ln -s ~/cosmostat/v2/data_tiles/$patch data_tiles +mkdir -p ~/cosmostat/v2/data_exp/$patch +ln -s ~/cosmostat/v2/data_tiles/$patch data_exp + +### Download and move tiles +ln -s ~/shapepipe/example/cfis +mkdir -p output +export SP_RUN=`pwd` + +shapepipe_run -c cfis/config_Git_vos.ini +ls -l data_tiles/ | wc; mv -i output/run_sp_Git_*/get_images_runner/output/CFIS.???.???.*fits* data_tiles; ls -l data_tiles/ | wc +rm -rf output/run_sp_Git_*; update_runs_log_file.py +# repeat the above block + +### Find exposures; this run can be stopped after Fe +shapepipe_run -c cfis/config_GitFe_symlink.ini +# You can also run Fe alone + +### Download and move exposures + +shapepipe_run -c cfis/config_Gie_vos.ini +mv -i output/run_sp_Gie_*/get_images_runner/output/*.fits*fz data_exp +rm -rf output/run_sp_Gie_* +update_runs_log_file.py +# repeat the above; or: +while true; do shapepipe_run -c cfis/config_Gie_vos.ini; ls -l data_exp/ | wc; mv -i output/run_sp_Gie_*/get_images_runner/output/*.fits*fz data_exp; ls -l data_exp/ | wc; rm -rf output/run_sp_Gie_*; update_runs_log_file.py; done +# Make sure that after all images are downloaded there is no Gie run. This would +# mess up later modules since last:get_image_runner could point to this run. + +### Create links (and re-run Fe, not necessary) +job_sp_canfar.bash -p $psf `cat tile_numbers.txt` -j 1 -r symlink + +# Get single-HDU single-exposure IDs file (from missing 32 job) +~/shapepipe/scripts/python/summary_run.py P$patch [32] + +# Mask tiles + +## Run repeatedly if necessary +job_sp_canfar.bash -p $psf -n $OMP_NUM_THREADS -j 4 + +## Combine all runs +combine_runs.bash -c flag_tile + +# Tile detection +curl_canfar_local.sh -j 16 -f tile_numbers.txt -p $psf -N $OMP_NUM_THREADS + +# Option 0, global split and exp masks: sp_local=0 +# Todo: split Uz and SpMh + +# For sp_local=- both mh_local (0, 1) are ok +export mh_local=0 +#export mh_local=1 + +## Uncompress weights, split exposures into single HDUs +job_sp_canfar.bash -p $psf -n $OMP_NUM_THREADS -j 2 + +# Mask exposures + +## Run repeatedly if necessary +job_sp_canfar.bash -p $psf -n $OMP_NUM_THREADS -j 8 + +# Combine all runs +combine_runs.bash -c flag_exp + +# Option 1: sp_local=1, local split and mask exp +export mh_local=1 + +# Split exposures +curl_canfar_local.sh -j 2 -f all.txt -p $psf -N $OMP_NUM_THREADS + +# Mask exposures +curl_canfar_local.sh -j 8 -f all.txt -p $psf -N $OMP_NUM_THREADS + +# Exposure detection + +cp summary/missing_job_32_sextractor.txt all.txt +curl_canfar_local.sh -j 32 -m $mh_local -f all.txt -p $psf -N $OMP_NUM_THREADS + +# Tile preparation +curl_canfar_local.sh -j 64 -f tile_numbers.txt -p $psf -N $OMP_NUM_THREADS + +# Tile shape measurement +curl_canfar_local.sh -j 128 -f tile_numbers.txt -p $psf -N 8 + +# Merge subcatalogues +curl_canfar_local.sh -j 256 -f tile_numbers.txt -p $psf -N 8 + +# Create final cat +curl_canfar_local.sh -j 512 -f tile_numbers.txt -p $psf -N $OMP_NUM_THREADS +# Run in parallel +cat mc.txt | xargs -I {} -P 16 bash -c 'init_run_exclusive_canfar.sh -p psfex -j 512 -e {} --n_smp 1' + +# Combine all final cats in common output dir as links +combine_runs.bash -c final -p psfex + +# Merge all final cats +# (W3: 140GB RAM) +merge_final_cat -i output/run_sp_combined_final/make_catalog_runner/output -p cfis/final_cat.param -v + + +# Star catalogue +combine_runs.bash -p $psf -c psf +shapepipe_run -c $SP_CONFIG/config_Ms_$psf.ini +shapepipe_run -c $SP_CONFIG/config_Pl_$psf.ini + +# Convert star cat to WCS +## Convert all input validation psf files and create directories par patch +## psf_conv_all/P? +cd ../star_cat + ~/shapepipe/scripts/python/convert_psf_pix2world.py -i ../ -P $patch -v + +# Combine previously created files within one SP run dir +cd P$patch +combine_runs.bash -p psfex -c psf_conv + +# Merge all converted star catalogues and create final-starcat.fits +export SP_RUN=`pwd` +shapepipe_run -c ~/shapepipe/example/cfis/config_Ms_psfex_conv.ini + + +# Extra stuff + +## Delete jobs +SSL=~/.ssl/cadcproxy.pem +SESSION=https://ws-uv.canfar.net/skaha/v0/session +for ID in `cat session_IDs.txt`; do echo $ID; curl -X DELETE -E $SSL $SESSION/$ID; done + +## Run in terminal in parallel (-e needs to be last arg) +cat all.txt | xargs -P 16 -n 1 init_run_exclusive_canfar.sh -j 64 -p psfex -n -e + +## Get missing jobs that are not currently running +stats_jobs_canfar.sh +grep -F -v -f jobs_running.txt summary/missing_job_128_ngmix_runner_3.txt > all3.txt diff --git a/docs/source/post_processing.md b/docs/source/post_processing.md index ebd123889..8d9922dbb 100644 --- a/docs/source/post_processing.md +++ b/docs/source/post_processing.md @@ -3,63 +3,14 @@ This page shows all required steps of post-processing the results from one or more `ShapePipe` runs. Post-processing combines various individual `ShapePipe` output files, and creates joint results, for example combining individual tile -catalogues in a large sky area. The output of post-processing is a joint _shape +catalogues into a large sky area. The output of post-processing is a joint _shape catalogue_, containing all required information to create a calibrated shear catalogue via _metacalibration_), a joint star catalogue, and PSF diagnostic plots. -Some of the following steps pertain specifically to runs carried out on [canfar](https://www.canfar.net/en), -but most are general. +If main ShapePipe processing happened at the old canfar VM system (e.g. CFIS v0 and v1), go +[here](vos_retrieve.md) for details how to retrieve the ShapePipe output files. -1. Retrieve `ShapePipe` result files - - For a local run on the same machine as for post-processing, nothing needs to be done. - In some cases, the run was carried out on a remote machine or cluster, and the resulting `ShapePipe` - output files need to be retrieved. - - In the specific case of canfar_avail_results.py, this is done as follows. - - A. Check availability of results - - A `canfar` job can submit a large number of tiles, whose processing time can vary a lot. - We assume that the submitted tile ID list is available locally via the ascii file `tile_numbers.txt`. - To check which tiles have finished running, and whose results have been uploaded, use - ```bash - canfar_avail_results -i tile_numbers.txt -v -p PSF --input_path INPUT_PATH - ``` - where PSF is one in [`psfex`|`mccd`], and INPUT_PATH the input path on vos, default `vos:cfis/cosmostat/kilbinger/results`. - See `-h` for all options. - - B. Download results - - All results files will be downloaded with - ```bash - canfar_download_results -i tile_numbers.txt -v -p PSF --input_vos INPUT_VOS - ``` - Use the same options as for same as for `canfar_avail_results`. - - This command can be run in the same directory at subsequent times, to complete an ongoing run: Only newer files will be downloaded - from the `vos` directory. This also assures that partially downloaded or corrupt files will be replaced. - - Checking the `vos` directorty can be slow for large patches. - To only download files that are not yet present locally (in `.`), first write the missing ones to an ascii file, using again the - script `canfar_avail_results`, but this time with `.` as input path: - ```bash - canfar_avail_results -i tile_numbers.txt --input_path . -p PSF -v -o missing.txt - ''' - Then, download only the missing files with - ```bash - canfar_download_results -i missing.txt --input_vos cosmostat/kilbinger/results_mccd_oc2 -p mccd -v - ``` - - C. Un-tar results - ```bash - untar_results -p PSF - ``` - On success, `ShapePipe` output `fits` and `log` files will be now in various subdirs of the `output` directory. - -At this step all required `ShapePipe` resulting output files are available in the current working directory. - -2. Optional: Split output in sub-samples +1. Optional: Split output into sub-samples An optional intermediate step is to create directories for sub-samples, for example one directory for each patch on the sky. This will create symbolic links to the results `.tgz` files downloaded in @@ -70,33 +21,34 @@ At this step all required `ShapePipe` resulting output files are available in th ``` The following steps will then be done in the directory `tiles_W3`. -3. Run PSF diagnostics, create merged catalogue +2. Run PSF diagnostics, create merged catalogue Type ```bash post_proc_sp -p PSF ``` - to automatically perform a number of post-processing steps. Chose the PSF model with the option + to automatically perform a number of post-processing steps. Choose the PSF model with the option `-p psfex|mccd`. In detail, these are (and can also be done individually by hand): - A. Analyse psf validation files + 1. Analyse psf validation files ```bash - prepare_star_cat -p PSF + combine_runs -t psf -p PSF ``` with options as for `post_proc_sp`. - This script identifies all psf validation files (from all processed tiles downloaded to `pwd`), creates symbolic links, - merges the catalogues, and creates plots of PSF ellipticity, size, and residuals over the focal plane. + This script creates a new combined psf run in the ShapePipe `output` directory, by identifying all psf validation files + and creating symbolic links. The run log file is updated. - B. Create plots of the PSF and their residuals in the focal plane, as a diagnostic of the overall PSF model. - As a scale-dependend test, which propagates directly to the shear correlation function, the rho statistics are computed, - see {cite:p}`rowe:10` and {cite:p}`jarvis:16`, + 3. Merge individual psf validation files into one catalogue. Create plots of the PSF and their residuals in the focal plane, + as a diagnostic of the overall PSF model. + As a scale-dependend test, which propagates directly to the shear correlation function, the rho statistics are computed, + see {cite:p}`rowe:10` and {cite:p}`jarvis:16`, ```bash shapepipe_run -c /path/to/shapepipe/example/cfis/config_MsPl_PSF.ini ``` - C. Prepare output directory + 4. Prepare output directory Create links to all 'final_cat' result files with ```bash @@ -105,7 +57,7 @@ At this step all required `ShapePipe` resulting output files are available in th The corresponding output directory that is created is `output/run_sp_combined/make_catalog_runner/output`. On success, it contains links to all `final_cat` output catalogues - D. Merge final output files + 5. Merge final output files Create a single main shape catalog: ```bash diff --git a/docs/source/vos_retrieve.md b/docs/source/vos_retrieve.md new file mode 100644 index 000000000..3606752c8 --- /dev/null +++ b/docs/source/vos_retrieve.md @@ -0,0 +1,51 @@ +## Retrieve files from VOspace + +This page describes how ShapePipe output files can be retrieved via the Virtual Observatory Space +on canfar. This system was used for the CFIS v0 and v1 runs, and is now obsolete. + +1. Retrieve ShapePipe result files + + For a local run on the same machine as for post-processing, nothing needs to be done. In some cases, the run was carried out on a remote machine or cluster, and the resulting ShapePipe output files + need to be retrieved. + + In the specific case of canfar_avail_results.py, this is done as follows. + + 1. Check availability of results + + A canfar job can submit a large number of tiles, whose processing time can vary a lot. We assume that the submitted tile ID list is available locally via the ascii file tile_numbers.txt. To check + which tiles have finished running, and whose results have been uploaded, use + ```bash + canfar_avail_results -i tile_numbers.txt -v -p PSF --input_path INPUT_PATH + ``` + where PSF is one in [`psfex`|`mccd`], and INPUT_PATH the input path on vos, default `vos:cfis/cosmostat/kilbinger/results`. + See `-h` for all options. + + 2. Download results + + All results files will be downloaded with + ```bash + canfar_download_results -i tile_numbers.txt -v -p PSF --input_vos INPUT_VOS + ``` + Use the same options as for same as for `canfar_avail_results`. + + This command can be run in the same directory at subsequent times, to complete an ongoing run: Only newer files will be downloaded + from the `vos` directory. This also assures that partially downloaded or corrupt files will be replaced. + + Checking the `vos` directorty can be slow for large patches. + To only download files that are not yet present locally (in `.`), first write the missing ones to an ascii file, using again the + script `canfar_avail_results`, but this time with `.` as input path: + ```bash + canfar_avail_results -i tile_numbers.txt --input_path . -p PSF -v -o missing.txt + ``` + Then, download only the missing files with + ```bash + canfar_download_results -i missing.txt --input_vos cosmostat/kilbinger/results_mccd_oc2 -p mccd -v + ``` + + 3. Un-tar results + ```bash + untar_results -p PSF + ``` + On success, `ShapePipe` output `fits` and `log` files will be now in various subdirs of the `output` directory. + +At this step all required `ShapePipe` resulting output files are available in the current working directory. diff --git a/environment-dev.yml b/environment-dev.yml new file mode 100644 index 000000000..703c19172 --- /dev/null +++ b/environment-dev.yml @@ -0,0 +1,38 @@ +# ShapePipe Development Environment +# --------------------------------- +# This environment should only be used for development and testing of +# ShapePipe (i.e. nothing that could be published). Packages need only +# specify the minimum compatible versions. This environment can updated +# as needed. +name: shapepipe-dev +channels: + - conda-forge +dependencies: + - python>=3.9.18 + - pip>=23.3.1 + - astropy>=5.1.1 + - autoconf>=2.71 + - automake>=1.16.5 + - cmake>=3.27.7 + - galsim>=2.5.1 + - joblib>=1.3.2 + - libtool>=2.4 + - matplotlib>=3.8.1 + - numba>=0.58.1 + - pandas>=2.1 + - pyqt5-sip>=12.13 + - pyqtgraph>=0.13.3 + - reproject>=0.12 + - sqlitedict>=2.1 + - termcolor>=2.3 + - tqdm>=4.66.1 + - treecorr>=4.3.3 + - pip: + - cs_util==0.0.5 + - mccd==1.2.4 + - modopt==1.6.1 + - sip_tpv==1.1 + - sf_tools==2.0.4 + - git+https://github.com/CEA-COSMIC/pysap@develop + - git+https://github.com/aguinot/ngmix@stable_version + - git+https://github.com/tobias-liaudat/Stile@v0.1 diff --git a/environment.yml b/environment.yml index 9279402ef..de62b5a37 100644 --- a/environment.yml +++ b/environment.yml @@ -1,33 +1,42 @@ -name: shapepipe +name: shapepipe_v1.4 +# ShapePipe Production Environment +# -------------------------------- +# This environment should be used for any production runs of ShapePipe +# (i.e. anything that could be published). All packages are pinned to +# specific versions to maximise the reproducibility of the results. +# This environment should be updated for each release of ShapePipe. channels: - conda-forge dependencies: - python=3.9 - pip>=21.2.4 - - numpy==1.21.6 - - astropy==5.0 - - automake==1.16.2 - - autoconf==2.69 - - cmake==3.19.6 - - galsim==2.2.5 - - joblib==1.1.0 - - libtool==2.4.6 - - matplotlib==3.5.1 - - numba==0.54.1 - - pandas==1.4.1 + - astromatic-psfex==3.21.1 + - astromatic-source-extractor==2.25.0 + - astropy==5.2 + - automake + - autoconf + - cmake + - galsim + - joblib + - libtool + - matplotlib==3.8.4 + - numba==0.58.1 + - numpy==1.26.4 - pip: - - cs_util==0.0.5 - - mccd==1.2.3 - - modopt==1.6.0 - - PyQt5==5.15.6 - - pyqtgraph==0.12.4 - - python-pysap==0.0.6 - - reproject==0.8 - - sip_tpv==1.1 - - sf_tools==2.0.4 - - sqlitedict==2.0.0 - - termcolor==1.1.0 - - tqdm==4.63.0 - - treecorr==4.2.6 + - cs_util==0.1 + - modopt + - PyQt5 + - pyqtgraph + - python-pysap==0.2.1 + - reproject + - shear_psf_leakage + - skaha + - sip_tpv + - sf_tools + - sqlitedict + - termcolor + - tqdm + - treecorr + - vos - git+https://github.com/aguinot/ngmix@stable_version - git+https://github.com/tobias-liaudat/Stile@v0.1 diff --git a/example/cfis/config_Fe.ini b/example/cfis/config_Fe.ini new file mode 100644 index 000000000..240c3a747 --- /dev/null +++ b/example/cfis/config_Fe.ini @@ -0,0 +1,72 @@ +# ShapePipe configuration file for: find exposures + + +## Default ShapePipe options +[DEFAULT] + +# verbose mode (optional), default: True, print messages on terminal +VERBOSE = False + +# Name of run (optional) default: shapepipe_run +RUN_NAME = run_sp_Fe + +# Add date and time to RUN_NAME, optional, default: False +RUN_DATETIME = True + + +## ShapePipe execution options +[EXECUTION] + +# Module name, single string or comma-separated list of valid module runner names +MODULE = find_exposures_runner + +# Parallel processing mode, SMP or MPI +MODE = SMP + + +## ShapePipe file handling options +[FILE] + +# Log file master name, optional, default: shapepipe +LOG_NAME = log_sp + +# Runner log file name, optional, default: shapepipe_runs +RUN_LOG_NAME = log_run_sp + +# Input directory, containing input files, single string or list of names +INPUT_DIR = $SP_RUN + +# Output directory +OUTPUT_DIR = $SP_RUN/output + + +## ShapePipe job handling options +[JOB] + +# Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial +SMP_BATCH_SIZE = 1 + +# Timeout value (optional), default is None, i.e. no timeout limit applied +TIMEOUT = 96:00:00 + + +## Module options + +# Get tiles +[FIND_EXPOSURES_RUNNER] + +INPUT_DIR = run_sp_Git:get_images_runner_run_1 + +FILE_PATTERN = CFIS_image + +FILE_EXT = .fits + +# NUMBERING_SCHEME (optional) string with numbering pattern for input files +NUMBERING_SCHEME = -000-000 + +# Column number of exposure name in FITS header +COLNUM = 3 + +# Prefix to remove from exposure name +EXP_PREFIX = p + diff --git a/example/cfis/config_Gie_symlink.ini b/example/cfis/config_Gie_symlink.ini new file mode 100644 index 000000000..e6fa49f4c --- /dev/null +++ b/example/cfis/config_Gie_symlink.ini @@ -0,0 +1,97 @@ +# ShapePipe configuration file for: get images + + +## Default ShapePipe options +[DEFAULT] + +# verbose mode (optional), default: True, print messages on terminal +VERBOSE = False + +# Name of run (optional) default: shapepipe_run +RUN_NAME = run_sp_Gie + +# Add date and time to RUN_NAME, optional, default: False +RUN_DATETIME = True + + +## ShapePipe execution options +[EXECUTION] + +# Module name, single string or comma-separated list of valid module runner names +MODULE = get_images_runner + +# Parallel processing mode, SMP or MPI +MODE = SMP + + +## ShapePipe file handling options +[FILE] + +# Log file master name, optional, default: shapepipe +LOG_NAME = log_sp + +# Runner log file name, optional, default: shapepipe_runs +RUN_LOG_NAME = log_run_sp + +# Input directory, containing input files, single string or list of names +INPUT_DIR = $SP_RUN + +# Output directory +OUTPUT_DIR = $SP_RUN/output + + +## ShapePipe job handling options +[JOB] + +# Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial +SMP_BATCH_SIZE = 1 + +# Timeout value (optional), default is None, i.e. no timeout limit applied +TIMEOUT = 96:00:00 + + +## Module options + +# Get exposures +[GET_IMAGES_RUNNER] + +INPUT_DIR = last:find_exposures_runner + +FILE_PATTERN = exp_numbers + +FILE_EXT = .txt + +# NUMBERING_SCHEME (optional) string with numbering pattern for input files +NUMBERING_SCHEME = -000-000 + + +# Paths + +# Output path (optional, default is [FILE]:OUTPUT_DIR +# OUTPUT_PATH = input_images + +# Input path where original images are stored. Can be local path or vos url. +# Single string or list of strings +INPUT_PATH = $SP_RUN/data_exp, $SP_RUN/data_exp, $SP_RUN/data_exp + +# Input file pattern including tile number as dummy template +INPUT_FILE_PATTERN = 000000, 000000.weight, 000000.flag + +# Input file extensions +INPUT_FILE_EXT = .fits.fz, .fits.fz, .fits.fz + +# Input numbering scheme, python regexp +INPUT_NUMBERING = \d{6} + +# Output file pattern without number +OUTPUT_FILE_PATTERN = image-, weight-, flag- + +# Method to retrieve images, one in 'vos', 'symlink' +RETRIEVE = symlink + +# If RETRIEVE=vos, number of attempts to download +# Optional, default=3 +N_TRY = 3 + +# Retrieve command options, optional +RETRIEVE_OPTIONS = --certfile=$HOME/.ssl/cadcproxy.pem diff --git a/example/cfis/config_Gie_vos.ini b/example/cfis/config_Gie_vos.ini new file mode 100644 index 000000000..ee4b92f30 --- /dev/null +++ b/example/cfis/config_Gie_vos.ini @@ -0,0 +1,103 @@ +# ShapePipe configuration file for: get images + + +## Default ShapePipe options +[DEFAULT] + +# verbose mode (optional), default: True, print messages on terminal +VERBOSE = False + +# Name of run (optional) default: shapepipe_run +RUN_NAME = run_sp_Gie + +# Add date and time to RUN_NAME, optional, default: False +RUN_DATETIME = True + + +## ShapePipe execution options +[EXECUTION] + +# Module name, single string or comma-separated list of valid module runner names +MODULE = get_images_runner + +# Parallel processing mode, SMP or MPI +MODE = SMP + + +## ShapePipe file handling options +[FILE] + +# Log file master name, optional, default: shapepipe +LOG_NAME = log_sp + +# Runner log file name, optional, default: shapepipe_runs +RUN_LOG_NAME = log_run_sp + +# Input directory, containing input files, single string or list of names +INPUT_DIR = $SP_RUN + +# Output directory +OUTPUT_DIR = $SP_RUN/output + + +## ShapePipe job handling options +[JOB] + +# Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial +SMP_BATCH_SIZE = 1 + +# Timeout value (optional), default is None, i.e. no timeout limit applied +TIMEOUT = 96:00:00 + + +## Module options + +# Get exposures +[GET_IMAGES_RUNNER] + +INPUT_DIR = last:find_exposures_runner + +FILE_PATTERN = exp_numbers + +FILE_EXT = .txt + +# NUMBERING_SCHEME (optional) string with numbering pattern for input files +NUMBERING_SCHEME = -000-000 + + +# Paths + +# Output path (optional, default is [FILE]:OUTPUT_DIR +# OUTPUT_PATH = input_images + +# Input path where original images are stored. Can be local path or vos url. +# Single string or list of strings +INPUT_PATH = vos:cfis/pitcairn, vos:cfis/weights, vos:cfis/flags +# LSB images: +#INPUT_PATH = vos:cfis/lsb_individual, vos:cfis/weights, vos:cfis/flags + +# Input file pattern including tile number as dummy template +INPUT_FILE_PATTERN = 000000, 000000.weight, 000000.flag +# LSB images +#INPUT_FILE_PATTERN = 000000s, 000000p.weight, 000000p.flag + +# Input file extensions +INPUT_FILE_EXT = .fits.fz, .fits.fz, .fits.fz + +# Input numbering scheme, python regexp +INPUT_NUMBERING = \d{6} + +# Output file pattern without number +OUTPUT_FILE_PATTERN = image-, weight-, flag- + +# Method to retrieve images, one in 'vos', 'symlink' +RETRIEVE = vos + +# If RETRIEVE=vos, number of attempts to download +# Optional, default=3 +N_TRY = 3 + +# Retrieve command options, optional +RETRIEVE_OPTIONS = --certfile=$HOME/.ssl/cadcproxy.pem + +CHECK_EXISTING_DIR = $SP_RUN/data_exp diff --git a/example/cfis/config_GitFeGie_symlink.ini b/example/cfis/config_GitFeGie_symlink.ini index 22e834533..6f84d1482 100644 --- a/example/cfis/config_GitFeGie_symlink.ini +++ b/example/cfis/config_GitFeGie_symlink.ini @@ -80,6 +80,8 @@ INPUT_NUMBERING = \d{3}\.\d{3} # Output file pattern without number OUTPUT_FILE_PATTERN = CFIS_image-, CFIS_weight- +#CHECK_EXISTING_DIR = $SP_RUN/output/run_sp_Git/get_images_runner_run_1/output + # Copy/download method, one in 'vos', 'symlink' RETRIEVE = symlink @@ -98,8 +100,12 @@ FILE_EXT = .fits # NUMBERING_SCHEME (optional) string with numbering pattern for input files NUMBERING_SCHEME = -000-000 +# Column number of exposure name in FITS header COLNUM = 3 +# Prefix to remove from exposure name +EXP_PREFIX = p + # Get exposures [GET_IMAGES_RUNNER_RUN_2] diff --git a/example/cfis/config_GitFeGie_vos.ini b/example/cfis/config_GitFeGie_vos.ini index fd3207bb3..75044bf44 100644 --- a/example/cfis/config_GitFeGie_vos.ini +++ b/example/cfis/config_GitFeGie_vos.ini @@ -66,7 +66,7 @@ NUMBERING_SCHEME = # Input path where original images are stored. Can be local path or vos url. # Single string or list of strings -INPUT_PATH = vos:cfis/tiles_DR3, vos:cfis/tiles_DR3 +INPUT_PATH = vos:cfis/tiles_DR5, vos:cfis/tiles_DR5 # Input file pattern including tile number as dummy template INPUT_FILE_PATTERN = CFIS.000.000.r, CFIS.000.000.r.weight @@ -84,8 +84,9 @@ OUTPUT_FILE_PATTERN = CFIS_image-, CFIS_weight- RETRIEVE = vos # Copy command options, optional -RETRIEVE_OPTIONS = --certfile=$VM_HOME/.ssl/cadcproxy.pem +RETRIEVE_OPTIONS = --certfile=$HOME/.ssl/cadcproxy.pem +CHECK_EXISTING_DIR = $SP_RUN/output/run_sp_Git/get_images_runner_run_1/output [FIND_EXPOSURES_RUNNER] @@ -98,6 +99,12 @@ FILE_EXT = .fits # NUMBERING_SCHEME (optional) string with numbering pattern for input files NUMBERING_SCHEME = -000-000 +# Column number of exposure name in FITS header +COLNUM = 3 + +# Prefix to remove from exposure name +EXP_PREFIX = p + # Get exposures [GET_IMAGES_RUNNER_RUN_2] @@ -145,4 +152,4 @@ RETRIEVE = vos N_TRY = 3 # Retrieve command options, optional -RETRIEVE_OPTIONS = --certfile=$VM_HOME/.ssl/cadcproxy.pem +RETRIEVE_OPTIONS = --certfile=$HOME/.ssl/cadcproxy.pem diff --git a/example/cfis/config_GitFe_symlink.ini b/example/cfis/config_GitFe_symlink.ini new file mode 100644 index 000000000..4e7ce75cb --- /dev/null +++ b/example/cfis/config_GitFe_symlink.ini @@ -0,0 +1,105 @@ +# ShapePipe configuration file for: get images and find exposures + + +## Default ShapePipe options +[DEFAULT] + +# verbose mode (optional), default: True, print messages on terminal +VERBOSE = False + +# Name of run (optional) default: shapepipe_run +RUN_NAME = run_sp_GitFe + +# Add date and time to RUN_NAME, optional, default: False +RUN_DATETIME = True + + +## ShapePipe execution options +[EXECUTION] + +# Module name, single string or comma-separated list of valid module runner names +MODULE = get_images_runner, find_exposures_runner + +# Parallel processing mode, SMP or MPI +MODE = SMP + + +## ShapePipe file handling options +[FILE] + +# Log file master name, optional, default: shapepipe +LOG_NAME = log_sp + +# Runner log file name, optional, default: shapepipe_runs +RUN_LOG_NAME = log_run_sp + +# Input directory, containing input files, single string or list of names +INPUT_DIR = $SP_RUN + +# Output directory +OUTPUT_DIR = $SP_RUN/output + + +## ShapePipe job handling options +[JOB] + +# Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial +SMP_BATCH_SIZE = 1 + +# Timeout value (optional), default is None, i.e. no timeout limit applied +TIMEOUT = 96:00:00 + + +## Module options + +# Get tiles +[GET_IMAGES_RUNNER] + +FILE_PATTERN = tile_numbers + +FILE_EXT = .txt + +# NUMBERING_SCHEME (optional) string with numbering pattern for input files +NUMBERING_SCHEME = + +# Paths + +# Input path where original images are stored. Can be local path or vos url. +# Single string or list of strings +INPUT_PATH = $SP_RUN/data_tiles, $SP_RUN/data_tiles + +# Input file pattern including tile number as dummy template +INPUT_FILE_PATTERN = CFIS.000.000.r, CFIS.000.000.r.weight + +# Input file extensions +INPUT_FILE_EXT = .fits, .fits.fz + +# Input numbering scheme, python regexp +INPUT_NUMBERING = \d{3}\.\d{3} + +# Output file pattern without number +OUTPUT_FILE_PATTERN = CFIS_image-, CFIS_weight- + +# Copy/download method, one in 'vos', 'symlink' +RETRIEVE = symlink + +# Copy command options, optional +RETRIEVE_OPTIONS = -L + + +[FIND_EXPOSURES_RUNNER] + +INPUT_MODULE = get_images_runner + +FILE_PATTERN = CFIS_image + +FILE_EXT = .fits + +# NUMBERING_SCHEME (optional) string with numbering pattern for input files +NUMBERING_SCHEME = -000-000 + +# Column number of exposure name in FITS header +COLNUM = 3 + +# Prefix to remove from exposure name +EXP_PREFIX = p diff --git a/example/cfis/config_Git_vos.ini b/example/cfis/config_Git_vos.ini new file mode 100644 index 000000000..26edf3efc --- /dev/null +++ b/example/cfis/config_Git_vos.ini @@ -0,0 +1,93 @@ +# ShapePipe configuration file for: get images + + +## Default ShapePipe options +[DEFAULT] + +# verbose mode (optional), default: True, print messages on terminal +VERBOSE = False + +# Name of run (optional) default: shapepipe_run +RUN_NAME = run_sp_Git + +# Add date and time to RUN_NAME, optional, default: False +RUN_DATETIME = True + + +## ShapePipe execution options +[EXECUTION] + +# Module name, single string or comma-separated list of valid module runner names +MODULE = get_images_runner + +# Parallel processing mode, SMP or MPI +MODE = SMP + + +## ShapePipe file handling options +[FILE] + +# Log file master name, optional, default: shapepipe +LOG_NAME = log_sp + +# Runner log file name, optional, default: shapepipe_runs +RUN_LOG_NAME = log_run_sp + +# Input directory, containing input files, single string or list of names +INPUT_DIR = $SP_RUN + +# Output directory +OUTPUT_DIR = $SP_RUN/output + + +## ShapePipe job handling options +[JOB] + +# Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial +SMP_BATCH_SIZE = 1 + +# Timeout value (optional), default is None, i.e. no timeout limit applied +TIMEOUT = 96:00:00 + + +## Module options + +# Get tiles +[GET_IMAGES_RUNNER] + +FILE_PATTERN = tile_numbers + +FILE_EXT = .txt + +# NUMBERING_SCHEME (optional) string with numbering pattern for input files +NUMBERING_SCHEME = + +# Paths + +# Input path where original images are stored. Can be local path or vos url. +# Single string or list of strings +INPUT_PATH = vos:cfis/tiles_DR5, vos:cfis/tiles_DR5 + +# Input file pattern including tile number as dummy template +INPUT_FILE_PATTERN = CFIS.000.000.r, CFIS.000.000.r.weight + +# Input file extensions +INPUT_FILE_EXT = .fits, .fits.fz + +# Input numbering scheme, python regexp +INPUT_NUMBERING = \d{3}\.\d{3} + +# Output file pattern without number +OUTPUT_FILE_PATTERN = CFIS_image-, CFIS_weight- + +# Copy/download method, one in 'vos', 'symlink' +RETRIEVE = vos + +# If RETRIEVE=vos, number of attempts to download +# Optional, default=3 +N_TRY = 3 + +# Copy command options, optional +RETRIEVE_OPTIONS = --certfile=$HOME/.ssl/cadcproxy.pem + +CHECK_EXISTING_DIR = $SP_RUN/data_tiles diff --git a/example/cfis/config_MaMa_onthefly.ini b/example/cfis/config_MaMa_onthefly.ini index bde813940..84f117e65 100644 --- a/example/cfis/config_MaMa_onthefly.ini +++ b/example/cfis/config_MaMa_onthefly.ini @@ -44,7 +44,7 @@ OUTPUT_DIR = $SP_RUN/output [JOB] # Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial -SMP_BATCH_SIZE = 8 +SMP_BATCH_SIZE = 16 # Timeout value (optional), default is None, i.e. no timeout limit applied TIMEOUT = 96:00:00 diff --git a/example/cfis/config_MsPl_psfex.ini b/example/cfis/config_MsPl_psfex.ini index 7fcb3ba20..d21fdd126 100644 --- a/example/cfis/config_MsPl_psfex.ini +++ b/example/cfis/config_MsPl_psfex.ini @@ -35,7 +35,7 @@ LOG_NAME = log_sp RUN_LOG_NAME = log_run_sp # Input directory, containing input files, single string or list of names -INPUT_DIR = $SP_RUN/psf_validation_ind +INPUT_DIR = $SP_RUN/output # Output directory OUTPUT_DIR = $SP_RUN/output @@ -54,7 +54,7 @@ TIMEOUT = 96:00:00 ## Module options [MERGE_STARCAT_RUNNER] -INPUT_DIR = psf_validation_ind +INPUT_DIR = last:psfex_interp_runner PSF_MODEL = psfex diff --git a/example/cfis/config_Ms_psfex.ini b/example/cfis/config_Ms_psfex.ini new file mode 100644 index 000000000..5698ee6dd --- /dev/null +++ b/example/cfis/config_Ms_psfex.ini @@ -0,0 +1,70 @@ +# ShapePipe configuration file for post-processing. +# merge star cat. + + +## Default ShapePipe options +[DEFAULT] + +# verbose mode (optional), default: True, print messages on terminal +VERBOSE = True + +# Name of run (optional) default: shapepipe_run +RUN_NAME = run_sp_Ms + +# Add date and time to RUN_NAME, optional, default: False +RUN_DATETIME = False + + +## ShapePipe execution options +[EXECUTION] + +# Module name, single string or comma-separated list of valid module runner names +MODULE = merge_starcat_runner + +# Parallel processing mode, SMP or MPI +MODE = SMP + + +## ShapePipe file handling options +[FILE] + +# Log file master name, optional, default: shapepipe +LOG_NAME = log_sp + +# Runner log file name, optional, default: shapepipe_runs +RUN_LOG_NAME = log_run_sp + +# Input directory, containing input files, single string or list of names +INPUT_DIR = $SP_RUN/output + +# Output directory +OUTPUT_DIR = $SP_RUN/output + + +## ShapePipe job handling options +[JOB] + +# Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial +SMP_BATCH_SIZE = 4 + +# Timeout value (optional), default is None, i.e. no timeout limit applied +TIMEOUT = 96:00:00 + + +## Module options +[MERGE_STARCAT_RUNNER] + +INPUT_DIR = last:psfex_interp_runner + +PSF_MODEL = psfex + +NUMBERING_SCHEME = -0000000-0 + +# Input file pattern(s), list of strings with length matching number of expected input file types +# Cannot contain wild cards +FILE_PATTERN = validation_psf + +# FILE_EXT (optional) list of string extensions to identify input files +FILE_EXT = .fits + +HDU = 2 diff --git a/example/cfis/config_Ms_psfex_conv.ini b/example/cfis/config_Ms_psfex_conv.ini new file mode 100644 index 000000000..9c8b763e5 --- /dev/null +++ b/example/cfis/config_Ms_psfex_conv.ini @@ -0,0 +1,68 @@ +# ShapePipe configuration file for post-processing. +# merge star cat (converted to WCS) + + +## Default ShapePipe options +[DEFAULT] + +# verbose mode (optional), default: True, print messages on terminal +VERBOSE = True + +# Name of run (optional) default: shapepipe_run +RUN_NAME = run_sp_Ms + +# Add date and time to RUN_NAME, optional, default: False +RUN_DATETIME = False + + +## ShapePipe execution options +[EXECUTION] + +# Module name, single string or comma-separated list of valid module runner names +MODULE = merge_starcat_runner + +# Parallel processing mode, SMP or MPI +MODE = SMP + + +## ShapePipe file handling options +[FILE] + +# Log file master name, optional, default: shapepipe +LOG_NAME = log_sp + +# Runner log file name, optional, default: shapepipe_runs +RUN_LOG_NAME = log_run_sp + +# Input directory, containing input files, single string or list of names +INPUT_DIR = $SP_RUN/output + +# Output directory +OUTPUT_DIR = $SP_RUN/output + + +## ShapePipe job handling options +[JOB] + +# Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial +SMP_BATCH_SIZE = 4 + +# Timeout value (optional), default is None, i.e. no timeout limit applied +TIMEOUT = 96:00:00 + + +## Module options +[MERGE_STARCAT_RUNNER] + +INPUT_DIR = last:psfex_interp_runner + +PSF_MODEL = psfex + +NUMBERING_SCHEME = -0-0 + +# Input file pattern(s), list of strings with length matching number of expected input file types +# Cannot contain wild cards +FILE_PATTERN = validation_psf_conv + +# FILE_EXT (optional) list of string extensions to identify input files +FILE_EXT = .fits diff --git a/example/cfis/config_Pl_mccd.ini b/example/cfis/config_Pl_mccd.ini index a666d09dd..844246019 100644 --- a/example/cfis/config_Pl_mccd.ini +++ b/example/cfis/config_Pl_mccd.ini @@ -35,7 +35,7 @@ LOG_NAME = log_sp RUN_LOG_NAME = log_run_sp # Input directory, containing input files, single string or list of names -INPUT_DIR = . +INPUT_DIR = $SP_RUN/output # Output directory OUTPUT_DIR = $SP_RUN/output diff --git a/example/cfis/config_Pl_psfex.ini b/example/cfis/config_Pl_psfex.ini index c561f15a5..f1c8904cf 100644 --- a/example/cfis/config_Pl_psfex.ini +++ b/example/cfis/config_Pl_psfex.ini @@ -12,7 +12,7 @@ VERBOSE = True RUN_NAME = run_sp_Pl # Add date and time to RUN_NAME, optional, default: False -RUN_DATETIME = True +RUN_DATETIME = False ## ShapePipe execution options @@ -35,7 +35,7 @@ LOG_NAME = log_sp RUN_LOG_NAME = log_run_sp # Input directory, containing input files, single string or list of names -INPUT_DIR = . +INPUT_DIR = $SP_RUN/output # Output directory OUTPUT_DIR = $SP_RUN/output @@ -57,11 +57,16 @@ TIMEOUT = 96:00:00 # NUMBERING_SCHEME (optional) string with numbering pattern for input files NUMBERING_SCHEME = -0000000 +#FILE_PATTERN = test FILE_PATTERN = full_starcat FILE_EXT = .fits +HDU = 1 + PSF = psfex -PLOT_MEANSHAPES = True + +# was True +PLOT_MEANSHAPES = False X_GRID = 5 Y_GRID = 10 @@ -72,7 +77,8 @@ MIN_R2 = 4.5 MAX_R2 = 7 MAX_DR2 = 0.03 -PLOT_HISTOGRAMS = True +# was True +PLOT_HISTOGRAMS = False REMOVE_OUTLIERS = False # X_GRID, Y_GRID: correspond to the number of bins in each direction of each @@ -82,7 +88,7 @@ REMOVE_OUTLIERS = False # before drawing the plots. PLOT_RHO_STATS = True -RHO_STATS_STYLE = HSC +RHO_STATS_STYLE = UNIONS RHO_STATS_YLIM_L = 1e-10, 4e-5 RHO_STATS_YLIM_R = 1e-8, 4e-5 diff --git a/example/cfis/config_Pl_psfex_conv.ini b/example/cfis/config_Pl_psfex_conv.ini new file mode 100644 index 000000000..de2c0679d --- /dev/null +++ b/example/cfis/config_Pl_psfex_conv.ini @@ -0,0 +1,93 @@ +# ShapePipe configuration file for post-processing. +# merge star cat and PSF plots. + + +## Default ShapePipe options +[DEFAULT] + +# verbose mode (optional), default: True, print messages on terminal +VERBOSE = True + +# Name of run (optional) default: shapepipe_run +RUN_NAME = run_sp_Pl + +# Add date and time to RUN_NAME, optional, default: False +RUN_DATETIME = False + + +## ShapePipe execution options +[EXECUTION] + +# Module name, single string or comma-separated list of valid module runner names +MODULE = mccd_plots_runner + +# Parallel processing mode, SMP or MPI +MODE = SMP + + +## ShapePipe file handling options +[FILE] + +# Log file master name, optional, default: shapepipe +LOG_NAME = log_sp + +# Runner log file name, optional, default: shapepipe_runs +RUN_LOG_NAME = log_run_sp + +# Input directory, containing input files, single string or list of names +INPUT_DIR = $SP_RUN/output + +# Output directory +OUTPUT_DIR = $SP_RUN/output + + +## ShapePipe job handling options +[JOB] + +# Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial +SMP_BATCH_SIZE = 4 + +# Timeout value (optional), default is None, i.e. no timeout limit applied +TIMEOUT = 96:00:00 + + +## Module options +[MCCD_PLOTS_RUNNER] + +# NUMBERING_SCHEME (optional) string with numbering pattern for input files +NUMBERING_SCHEME = -0000000 + +FILE_PATTERN = full_starcat +FILE_EXT = .fits + +HDU = 1 + +PSF = psfex + +# was True +PLOT_MEANSHAPES = False +X_GRID = 5 +Y_GRID = 10 + +# Optional: max values for elliptity and residual ellipticities +MAX_E = 0.1 +MAX_DE = 0.01 +MIN_R2 = 4.5 +MAX_R2 = 7 +MAX_DR2 = 0.03 + +# was True +PLOT_HISTOGRAMS = False +REMOVE_OUTLIERS = False + +# X_GRID, Y_GRID: correspond to the number of bins in each direction of each +# CCD from the focal plane. Ex: each CCD will be binned in 5x10 regular grids. +# +# REMOVE_OUTLIERS: Remove validated stars that are outliers in terms of shape +# before drawing the plots. + +PLOT_RHO_STATS = True +RHO_STATS_STYLE = UNIONS + +RHO_STATS_YLIM_L = 1e-10, 4e-5 +RHO_STATS_YLIM_R = 1e-8, 4e-5 diff --git a/example/cfis/config_exp_Ma_onthefly.ini b/example/cfis/config_exp_Ma_onthefly.ini new file mode 100644 index 000000000..a2ff95fe6 --- /dev/null +++ b/example/cfis/config_exp_Ma_onthefly.ini @@ -0,0 +1,79 @@ +# ShapePipe configuration file for masking of exposures + + +## Default ShapePipe options +[DEFAULT] + +# verbose mode (optional), default: True, print messages on terminal +VERBOSE = True + +# Name of run (optional) default: shapepipe_run +RUN_NAME = run_sp_exp_Ma + +# Add date and time to RUN_NAME, optional, default: False +; RUN_DATETIME = False + + +## ShapePipe execution options +[EXECUTION] + +# Module name, single string or comma-separated list of valid module runner names +MODULE = mask_runner + +# Parallel processing mode, SMP or MPI +MODE = SMP + + +## ShapePipe file handling options +[FILE] + +# Log file master name, optional, default: shapepipe +LOG_NAME = log_sp + +# Runner log file name, optional, default: shapepipe_runs +RUN_LOG_NAME = log_run_sp + +# Input directory, containing input files, single string or list of names +INPUT_DIR = . + +# Output directory +OUTPUT_DIR = $SP_RUN/output + + +## ShapePipe job handling options +[JOB] + +# Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial +SMP_BATCH_SIZE = 16 + +# Timeout value (optional), default is None, i.e. no timeout limit applied +TIMEOUT = 96:00:00 + + +## Module options + +### Mask exposures +[MASK_RUNNER] + +# Parent module +INPUT_DIR = last:split_exp_runner + +# Update numbering convention, accounting for HDU number of +# single-exposure single-HDU files +NUMBERING_SCHEME = -0000000-0 + +# Path of mask config file +MASK_CONFIG_PATH = $SP_CONFIG/config_onthefly.mask + +# External mask file flag, use if True, otherwise ignore +USE_EXT_FLAG = True + +# External star catalogue flag, use external cat if True, +# obtain from online catalogue if False +USE_EXT_STAR = False + +# File name suffix for the output flag files (optional) +PREFIX = pipeline + +# Path to check for existing output mask files +CHECK_EXISTING_DIR = $SP_RUN/output/run_sp_Ma_exp/mask_runner/output diff --git a/example/cfis/config_exp_Mh.ini b/example/cfis/config_exp_Mh.ini new file mode 100644 index 000000000..2ad16ef0d --- /dev/null +++ b/example/cfis/config_exp_Mh.ini @@ -0,0 +1,67 @@ +# ShapePipe configuration file for single-exposures, +# merge headers + + +## Default ShapePipe options +[DEFAULT] + +# verbose mode (optional), default: True, print messages on terminal +VERBOSE = True + +# Name of run (optional) default: shapepipe_run +RUN_NAME = run_sp_exp_Mh + +# Add date and time to RUN_NAME, optional, default: True +; RUN_DATETIME = False + + +## ShapePipe execution options +[EXECUTION] + +# Module name, single string or comma-separated list of valid module runner names +MODULE = merge_headers_runner + +# Run mode, SMP or MPI +MODE = SMP + + +## ShapePipe file handling options +[FILE] + +# Log file master name, optional, default: shapepipe +LOG_NAME = log_sp + +# Runner log file name, optional, default: shapepipe_runs +RUN_LOG_NAME = log_run_sp + +# Input directory, containing input files, single string or list of names with length matching FILE_PATTERN +INPUT_DIR = . + +# Output directory +OUTPUT_DIR = $SP_RUN/output + + +## ShapePipe job handling options +[JOB] + +# Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial +SMP_BATCH_SIZE = 16 + +# Timeout value (optional), default is None, i.e. no timeout limit applied +TIMEOUT = 96:00:00 + + +## Module options + +[MERGE_HEADERS_RUNNER] + +INPUT_DIR = last:split_exp_runner + +FILE_PATTERN = headers + +FILE_EXT = .npy + +# Single-exposure numbering scheme +NUMBERING_SCHEME = -0000000 + +OUTPUT_PATH = $SP_RUN/output diff --git a/example/cfis/config_exp_Pi.ini b/example/cfis/config_exp_Pi.ini new file mode 100644 index 000000000..12056341b --- /dev/null +++ b/example/cfis/config_exp_Pi.ini @@ -0,0 +1,82 @@ +# ShapePipe configuration file for single-HDU single exposure images.. +# PSFex PSF model; interpolation for validation. + + +## Default ShapePipe options +[DEFAULT] + +# verbose mode (optional), default: True, print messages on terminal +VERBOSE = True + +# Name of run (optional) default: shapepipe_run +RUN_NAME = run_sp_exp_Pi + +# Add date and time to RUN_NAME, optional, default: True +; RUN_DATETIME = False + + +## ShapePipe execution options +[EXECUTION] + +# Module name, single string or comma-separated list of valid module runner names +MODULE = psfex_interp_runner + + +# Run mode, SMP or MPI +MODE = SMP + + +## ShapePipe file handling options +[FILE] + +# Log file master name, optional, default: shapepipe +LOG_NAME = log_sp + +# Runner log file name, optional, default: shapepipe_runs +RUN_LOG_NAME = log_run_sp + +# Input directory, containing input files, single string or list of names with length matching FILE_PATTERN +INPUT_DIR = . + +# Output directory +OUTPUT_DIR = $SP_RUN/output + + +## ShapePipe job handling options +[JOB] + +# Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial +SMP_BATCH_SIZE = 1 + +# Timeout value (optional), default is None, i.e. no timeout limit applied +TIMEOUT = 96:00:00 + + +## Module options + +[PSFEX_INTERP_RUNNER] + +# Use 20% sample for PSF validation +FILE_PATTERN = star_split_ratio_80, star_split_ratio_20, psfex_cat + +FILE_EXT = .psf, .fits, .cat + +NUMBERING_SCHEME = -0000000-0 + +# Run mode for psfex interpolation: +# CLASSIC: 'classical' run, interpolate to object positions +# MULTI-EPOCH: interpolate for multi-epoch images +# VALIDATION: validation for single-epoch images +MODE = VALIDATION + +# Column names of position parameters +POSITION_PARAMS = XWIN_IMAGE,YWIN_IMAGE + +# If True, measure and store ellipticity of the PSF (using moments) +GET_SHAPES = True + +# Minimum number of stars per CCD for PSF model to be computed +STAR_THRESH = 22 + +# Maximum chi^2 for PSF model to be computed on CCD +CHI2_THRESH = 2 diff --git a/example/cfis/config_exp_Sp.ini b/example/cfis/config_exp_Sp.ini new file mode 100644 index 000000000..2ee1676b8 --- /dev/null +++ b/example/cfis/config_exp_Sp.ini @@ -0,0 +1,74 @@ +# ShapePipe configuration file for single-exposures, +# split images, merge headers + + +## Default ShapePipe options +[DEFAULT] + +# verbose mode (optional), default: True, print messages on terminal +VERBOSE = True + +# Name of run (optional) default: shapepipe_run +RUN_NAME = run_sp_exp_Sp + +# Add date and time to RUN_NAME, optional, default: True +RUN_DATETIME = False + + +## ShapePipe execution options +[EXECUTION] + +# Module name, single string or comma-separated list of valid module runner names +MODULE = split_exp_runner + +# Run mode, SMP or MPI +MODE = SMP + + +## ShapePipe file handling options +[FILE] + +# Log file master name, optional, default: shapepipe +LOG_NAME = log_sp + +# Runner log file name, optional, default: shapepipe_runs +RUN_LOG_NAME = log_run_sp + +# Input directory, containing input files, single string or list of names with length matching FILE_PATTERN +INPUT_DIR = . + +# Output directory +OUTPUT_DIR = $SP_RUN/output + + +## ShapePipe job handling options +[JOB] + +# Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial +SMP_BATCH_SIZE = 16 + +# Timeout value (optional), default is None, i.e. no timeout limit applied +TIMEOUT = 96:00:00 + + +## Module options + +[SPLIT_EXP_RUNNER] + +INPUT_DIR = last:get_images_runner_run_2 + +FILE_PATTERN = image, weight, flag + +# Matches compressed single-exposure files +FILE_EXT = .fitsfz, .fitsfz, .fitsfz + +NUMBERING_SCHEME = -0000000 + +# OUTPUT_SUFFIX, actually file name prefixes. +# Expected keyword "flag" will lead to a behavior where the data are saved as int. +# The code also expects the image data to use the "image" suffix +# (default value in the pipeline). +OUTPUT_SUFFIX = image, weight, flag + +# Number of HDUs/CCDs of mosaic +N_HDU = 40 diff --git a/example/cfis/config_exp_SpMh.ini b/example/cfis/config_exp_SpMh.ini index 76f87ddd7..b05b8f0c2 100644 --- a/example/cfis/config_exp_SpMh.ini +++ b/example/cfis/config_exp_SpMh.ini @@ -12,7 +12,7 @@ VERBOSE = True RUN_NAME = run_sp_exp_SpMh # Add date and time to RUN_NAME, optional, default: True -; RUN_DATETIME = False +RUN_DATETIME = False ## ShapePipe execution options @@ -57,13 +57,15 @@ TIMEOUT = 96:00:00 INPUT_DIR = last:get_images_runner_run_2 +FILE_PATTERN = image, weight, flag + # Matches compressed single-exposure files FILE_EXT = .fitsfz, .fitsfz, .fitsfz NUMBERING_SCHEME = -0000000 # OUTPUT_SUFFIX, actually file name prefixes. -# Expected keyword "flag" will lead to a behavior where the data are save as int. +# Expected keyword "flag" will lead to a behavior where the data are saved as int. # The code also expects the image data to use the "image" suffix # (default value in the pipeline). OUTPUT_SUFFIX = image, weight, flag diff --git a/example/cfis/config_exp_mccd.ini b/example/cfis/config_exp_mccd.ini new file mode 100644 index 000000000..e838f1733 --- /dev/null +++ b/example/cfis/config_exp_mccd.ini @@ -0,0 +1,244 @@ +# ShapePipe configuration file for single-exposures, MCCD PSF model. +# Process exposures after masking, from star detection to PSF model. + + +## Default ShapePipe options +[DEFAULT] + +# verbose mode (optional), default: True, print messages on terminal +VERBOSE = True + +# Name of run (optional) default: shapepipe_run +RUN_NAME = run_sp_exp_SxSePsf + +# Add date and time to RUN_NAME, optional, default: True +; RUN_DATETIME = False + + +## ShapePipe execution options +[EXECUTION] + +# Module name, single string or comma-separated list of valid module runner names +MODULE = sextractor_runner, setools_runner, + mccd_preprocessing_runner, mccd_fit_val_runner, + merge_starcat_runner, mccd_plots_runner + +# Run mode, SMP or MPI +MODE = SMP + + +## ShapePipe file handling options +[FILE] + +# Log file master name, optional, default: shapepipe +LOG_NAME = log_sp + +# Runner log file name, optional, default: shapepipe_runs +RUN_LOG_NAME = log_run_sp + +# Input directory, containing input files, single string or list of names with length matching FILE_PATTERN +INPUT_DIR = . + +# Output directory +OUTPUT_DIR = $SP_RUN/output + + +## ShapePipe job handling options +[JOB] + +# Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial +SMP_BATCH_SIZE = 1 + +# Timeout value (optional), default is None, i.e. no timeout limit applied +TIMEOUT = 96:00:00 + + +## Module options + +[SEXTRACTOR_RUNNER] + +# Somehow this works but not +# - omitting +# - $SP_RUN/output +#INPUT_DIR = . + +# Input from two modules +INPUT_MODULE = split_exp_runner, mask_runner + +# Read pipeline flag files created by mask module +FILE_PATTERN = image, weight, pipeline_flag + +NUMBERING_SCHEME = -0000000-0 + +# SExtractor executable path +EXEC_PATH = sex + +# SExtractor configuration files +DOT_SEX_FILE = $SP_CONFIG/default_exp.sex +DOT_PARAM_FILE = $SP_CONFIG//default.param +DOT_CONV_FILE = $SP_CONFIG/default.conv + +# Use input weight image if True +WEIGHT_IMAGE = True + +# Use input flag image if True +FLAG_IMAGE = True + +# Use input PSF file if True +PSF_FILE = False + +# Use distinct image for detection (SExtractor in +# dual-image mode) if True. +DETECTION_IMAGE = False + +# Distinct weight image for detection (SExtractor +# in dual-image mode) +DETECTION_WEIGHT = False + +# True if photometry zero-point is to be read from exposure image header +ZP_FROM_HEADER = True + +# If ZP_FROM_HEADER is True, zero-point key name +ZP_KEY = PHOTZP + +# Background information from image header. +# If BKG_FROM_HEADER is True, background value will be read from header. +# In that case, the value of BACK_TYPE will be set atomatically to MANUAL. +# This is used e.g. for the LSB images. +BKG_FROM_HEADER = False +# LSB images: +# BKG_FROM_HEADER = True + +# If BKG_FROM_HEADER is True, background value key name +# LSB images: +#BKG_KEY = IMMODE + +# Type of image check (optional), default not used, can be a list of +# BACKGROUND, BACKGROUND_RMS, INIBACKGROUND, MINIBACK_RMS, -BACKGROUND, +# FILTERED, OBJECTS, -OBJECTS, SEGMENTATION, APERTURES +CHECKIMAGE = BACKGROUND + +# File name suffix for the output sextractor files (optional) SUFFIX = tile +SUFFIX = sexcat + +## Post-processing + +# Not required for single exposures +MAKE_POST_PROCESS = FALSE + + +[SETOOLS_RUNNER] + +INPUT_MODULE = last:sextractor_runner + +# Note: Make sure this doe not match the SExtractor background images +# (sexcat_background*) +FILE_PATTERN = sexcat_sexcat + +NUMBERING_SCHEME = -0000000-0 + +# SETools config file +SETOOLS_CONFIG_PATH = $SP_CONFIG/star_selection.setools + + +[MCCD_PREPROCESSING_RUNNER] + +# Path to MCCD config file +CONFIG_PATH = $SP_CONFIG/config_MCCD.ini + +MODE = FIT_VALIDATION + +VERBOSE = False + +INPUT_DIR = last:setools_runner + +# Input are individual CCDs, thus single-exposure single-HDU images +NUMBERING_SCHEME = -0000000-0 + +FILE_PATTERN = star_split_ratio_80, star_split_ratio_20 + +FILE_EXT = .fits, .fits + + +[MCCD_FIT_VAL_RUNNER] + +# Path to MCCD config file +CONFIG_PATH = $SP_CONFIG/config_MCCD.ini + +MODE = FIT_VALIDATION + +VERBOSE = False + +NUMBERING_SCHEME = -0000000 + + +[MCCD_MERGE_STARCAT_RUNNER] + +# Path to MCCD config file +CONFIG_PATH = $SP_CONFIG/config_MCCD.ini + +MODE = FIT_VALIDATION + +VERBOSE = False + +NUMBERING_SCHEME = -0000000 + + +[MCCD_PLOTS_RUNNER] + +# Path to MCCD config file +CONFIG_PATH = $SP_CONFIG/config_MCCD.ini + +MODE = FIT_VALIDATION + +VERBOSE = False + +# Now MCCD has created a focal-plane PSF model, including all CCDS per images, +# thus single-exposure files +NUMBERING_SCHEME = -0000000 + +PLOT_MEANSHAPES = True + +# X_GRID, Y_GRID: correspond to the number of bins in each direction of each +# CCD from the focal plane. Ex: each CCD will be binned in 5x10 regular grids. +X_GRID = 5 +Y_GRID = 10 + +PLOT_HISTOGRAMS = True + +# REMOVE_OUTLIERS: Remove validated stars that are outliers in terms of shape +# before drawing the plots. +REMOVE_OUTLIERS = False + +PLOT_RHO_STATS = True + +# RHO_STATS_STYLE: can be 'HSC' or 'DES' +RHO_STATS_STYLE = HSC + + +[MCCD_INTERP_RUNNER] + +# MODE: Define the way the MCCD interpolation will run. +# CLASSIC for classical run. +# MULTI-EPOCH for multi epoch. +MODE = CLASSIC + +# Position parameter names +# for multi-epoch XWIN_WORLD,YWIN_WORLD +# For classical XWIN_IMAGE,YWIN_IMAGE: +POSITION_PARAMS = XWIN_IMAGE,YWIN_IMAGE + +# Get PSF shapes calculated and saved on the output dict +GET_SHAPES = True + +# Directory with PSF models +PSF_MODEL_DIR = /Users/tliaudat/Documents/PhD/codes/venv_p3/MCCD_pipeline_integration/test_val_data/fitted_model/ + +# PSF model patterns +PSF_MODEL_PATTERN = fitted_model + +# PSF model separator +PSF_MODEL_SEPARATOR = - + +# For multi-epoch purposes +ME_LOG_WCS = $SP_RUN/output/log_exp_headers.sqlite diff --git a/example/cfis/config_exp_psfex.ini b/example/cfis/config_exp_psfex.ini new file mode 100644 index 000000000..22bc877f4 --- /dev/null +++ b/example/cfis/config_exp_psfex.ini @@ -0,0 +1,178 @@ +# ShapePipe configuration file for single-exposures. PSFex PSF model. +# Process exposures after masking, from star detection to PSF model. + + +## Default ShapePipe options +[DEFAULT] + +# verbose mode (optional), default: True, print messages on terminal +VERBOSE = True + +# Name of run (optional) default: shapepipe_run +RUN_NAME = run_sp_exp_SxSePsfPi +#RUN_NAME = run_sp_exp_SxSePsf + +# Add date and time to RUN_NAME, optional, default: True +; RUN_DATETIME = False + + +## ShapePipe execution options +[EXECUTION] + +# Module name, single string or comma-separated list of valid module runner names +MODULE = sextractor_runner, setools_runner, psfex_runner, psfex_interp_runner + + +# Run mode, SMP or MPI +MODE = SMP + + +## ShapePipe file handling options +[FILE] + +# Log file master name, optional, default: shapepipe +LOG_NAME = log_sp + +# Runner log file name, optional, default: shapepipe_runs +RUN_LOG_NAME = log_run_sp + +# Input directory, containing input files, single string or list of names with length matching FILE_PATTERN +INPUT_DIR = $SP_RUN/output + +# Output directory +OUTPUT_DIR = $SP_RUN/output + + +## ShapePipe job handling options +[JOB] + +# Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial +SMP_BATCH_SIZE = 16 + +# Timeout value (optional), default is None, i.e. no timeout limit applied +TIMEOUT = 96:00:00 + + +## Module options + +[SEXTRACTOR_RUNNER] + +# Input from two modules +#INPUT_DIR = last:split_exp_runner, run_sp_Ma_exp:mask_runner +INPUT_DIR = last:split_exp_runner, last:mask_runner + +# Read pipeline flag files created by mask module +FILE_PATTERN = image, weight, pipeline_flag + +NUMBERING_SCHEME = -0000000-0 + +# SExtractor executable path +EXEC_PATH = sex + +# SExtractor configuration files +DOT_SEX_FILE = $SP_CONFIG/default_exp.sex +DOT_PARAM_FILE = $SP_CONFIG//default.param +DOT_CONV_FILE = $SP_CONFIG/default.conv + +# Use input weight image if True +WEIGHT_IMAGE = True + +# Use input flag image if True +FLAG_IMAGE = True + +# Use input PSF file if True +PSF_FILE = False + +# Use distinct image for detection (SExtractor in +# dual-image mode) if True. +DETECTION_IMAGE = False + +# Distinct weight image for detection (SExtractor +# in dual-image mode) +DETECTION_WEIGHT = False + +# True if photometry zero-point is to be read from exposure image header +ZP_FROM_HEADER = True + +# If ZP_FROM_HEADER is True, zero-point key name +ZP_KEY = PHOTZP + +# Background information from image header. +# If BKG_FROM_HEADER is True, background value will be read from header. +# In that case, the value of BACK_TYPE will be set atomatically to MANUAL. +# This is used e.g. for the LSB images. +BKG_FROM_HEADER = False +# LSB images: +# BKG_FROM_HEADER = True + +# If BKG_FROM_HEADER is True, background value key name +# LSB images: +#BKG_KEY = IMMODE + +# Type of image check (optional), default not used, can be a list of +# BACKGROUND, BACKGROUND_RMS, INIBACKGROUND, MINIBACK_RMS, -BACKGROUND, +# FILTERED, OBJECTS, -OBJECTS, SEGMENTATION, APERTURES +CHECKIMAGE = BACKGROUND + +# File name suffix for the output sextractor files (optional) SUFFIX = tile +SUFFIX = sexcat + +## Post-processing + +# Not required for single exposures +MAKE_POST_PROCESS = FALSE + + +[SETOOLS_RUNNER] + +INPUT_DIR = last:sextractor_runner + +# Note: Make sure this doe not match the SExtractor background images +# (sexcat_background*) +FILE_PATTERN = sexcat + +NUMBERING_SCHEME = -0000000-0 + +# SETools config file +SETOOLS_CONFIG_PATH = $SP_CONFIG/star_selection.setools + + +[PSFEX_RUNNER] + +# Use 80% sample for PSF model +FILE_PATTERN = star_split_ratio_80 + +NUMBERING_SCHEME = -0000000-0 + +# Path to executable for the PSF model (optional) +EXEC_PATH = psfex + +# Default psfex configuration file +DOT_PSFEX_FILE = $SP_CONFIG/default.psfex + +[PSFEX_INTERP_RUNNER] + +# Use 20% sample for PSF validation +FILE_PATTERN = star_split_ratio_80, star_split_ratio_20, psfex_cat + +FILE_EXT = .psf, .fits, .cat + +NUMBERING_SCHEME = -0000000-0 + +# Run mode for psfex interpolation: +# CLASSIC: 'classical' run, interpolate to object positions +# MULTI-EPOCH: interpolate for multi-epoch images +# VALIDATION: validation for single-epoch images +MODE = VALIDATION + +# Column names of position parameters +POSITION_PARAMS = XWIN_IMAGE,YWIN_IMAGE + +# If True, measure and store ellipticity of the PSF (using moments) +GET_SHAPES = True + +# Minimum number of stars per CCD for PSF model to be computed +STAR_THRESH = 22 + +# Maximum chi^2 for PSF model to be computed on CCD +CHI2_THRESH = 2 diff --git a/example/cfis/config_get_tiles_vos_headers.ini b/example/cfis/config_get_tiles_vos_headers.ini index e28347ebf..4b79a2493 100644 --- a/example/cfis/config_get_tiles_vos_headers.ini +++ b/example/cfis/config_get_tiles_vos_headers.ini @@ -69,7 +69,7 @@ NUMBERING_SCHEME = # Input path where original images are stored. Can be local path or vos url. # Single string or list of strings -INPUT_PATH = vos:cfis/tiles_DR3 +INPUT_PATH = vos:cfis/tiles_DR5 # Input file pattern including tile number as dummy template INPUT_FILE_PATTERN = CFIS.000.000.r diff --git a/example/cfis/config_make_cat_psfex.ini b/example/cfis/config_make_cat_psfex.ini index fdf5414b5..a7407d990 100644 --- a/example/cfis/config_make_cat_psfex.ini +++ b/example/cfis/config_make_cat_psfex.ini @@ -55,7 +55,7 @@ TIMEOUT = 96:00:00 [MAKE_CAT_RUNNER] # Input directory, containing input files, single string or list of names with length matching FILE_PATTERN -INPUT_DIR = last:sextractor_runner_run_1, last:spread_model_runner, last:psfex_interp_runner, last:merge_sep_cats_runner +INPUT_DIR = run_sp_tile_Sx:sextractor_runner, last:spread_model_runner, last:psfex_interp_runner, last:merge_sep_cats_runner # Input file pattern(s), list of strings with length matching number of expected input file types # Cannot contain wild cards diff --git a/example/cfis/config_merge_sep_cats_template.ini b/example/cfis/config_merge_sep_cats_template.ini index e14e5fe74..36b99e8da 100644 --- a/example/cfis/config_merge_sep_cats_template.ini +++ b/example/cfis/config_merge_sep_cats_template.ini @@ -35,7 +35,6 @@ RUN_LOG_NAME = log_run_sp # Input directory, containing input files, single string or list of names with length matching FILE_PATTERN INPUT_DIR = ./output/run_sp_tile_ngmix_Ng1u/ngmix_runner/output -#, ./output/run_sp_tile_ngmix_Ng1u/galsim_shapes_v2_runner/output # Output directory OUTPUT_DIR = ./output @@ -58,11 +57,9 @@ TIMEOUT = 96:00:00 # Input file pattern(s), list of strings with length matching number of expected input file types # Cannot contain wild cards FILE_PATTERN = ngmix -#, galsim # FILE_EXT (optional) list of string extensions to identify input files FILE_EXT = .fits -#, .fits # Numbering convention, string that exemplifies a numbering pattern. NUMBERING_SCHEME = -000-000 diff --git a/example/cfis/config_tile_Ma_onthefly.ini b/example/cfis/config_tile_Ma_onthefly.ini new file mode 100644 index 000000000..1b1fbbbea --- /dev/null +++ b/example/cfis/config_tile_Ma_onthefly.ini @@ -0,0 +1,82 @@ +# ShapePipe configuration file for masking of tiles + + +## Default ShapePipe options +[DEFAULT] + +# verbose mode (optional), default: True, print messages on terminal +VERBOSE = True + +# Name of run (optional) default: shapepipe_run +RUN_NAME = run_sp_tile_Ma + +# Add date and time to RUN_NAME, optional, default: False +; RUN_DATETIME = False + + +## ShapePipe execution options +[EXECUTION] + +# Module name, single string or comma-separated list of valid module runner names +MODULE = mask_runner + +# Parallel processing mode, SMP or MPI +MODE = SMP + + +## ShapePipe file handling options +[FILE] + +# Log file master name, optional, default: shapepipe +LOG_NAME = log_sp + +# Runner log file name, optional, default: shapepipe_runs +RUN_LOG_NAME = log_run_sp + +# Input directory, containing input files, single string or list of names +INPUT_DIR = $SP_RUN/output + +# Output directory +OUTPUT_DIR = $SP_RUN/output + + +## ShapePipe job handling options +[JOB] + +# Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial +SMP_BATCH_SIZE = 8 + +# Timeout value (optional), default is None, i.e. no timeout limit applied +TIMEOUT = 96:00:00 + + +## Module options + +### Mask tiles +[MASK_RUNNER] + +# Input directory, containing input files, single string or list of names +INPUT_DIR = last:get_images_runner_run_1, last:uncompress_fits_runner + +# NUMBERING_SCHEME (optional) string with numbering pattern for input files +NUMBERING_SCHEME = -000-000 + +# Input file pattern(s), list of strings with length matching number of expected input file types +# Cannot contain wild cards +FILE_PATTERN = CFIS_image, CFIS_weight + +# FILE_EXT (optional) list of string extensions to identify input files +FILE_EXT = .fits, .fits + +# Path of mask config file +MASK_CONFIG_PATH = $SP_CONFIG/config_tile_onthefly.mask + +# External mask file flag, use if True, otherwise ignore +USE_EXT_FLAG = False + +# External star catalogue flag, use external cat if True, +# obtain from online catalogue if False +USE_EXT_STAR = False + +# File name suffix for the output flag files (optional) +PREFIX = pipeline diff --git a/example/cfis/config_tile_MiViSmVi.ini b/example/cfis/config_tile_MiViSmVi.ini index 6198c324c..7dcbe6c50 100644 --- a/example/cfis/config_tile_MiViSmVi.ini +++ b/example/cfis/config_tile_MiViSmVi.ini @@ -47,7 +47,7 @@ OUTPUT_DIR = $SP_RUN/output [JOB] # Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial -SMP_BATCH_SIZE = 12 +SMP_BATCH_SIZE = 1 # Timeout value (optional), default is None, i.e. no timeout limit applied TIMEOUT = 96:00:00 diff --git a/example/cfis/config_tile_Ng_template.ini b/example/cfis/config_tile_Ng_template.ini index f9d733d71..cf988f2b5 100644 --- a/example/cfis/config_tile_Ng_template.ini +++ b/example/cfis/config_tile_Ng_template.ini @@ -21,7 +21,7 @@ RUN_DATETIME = False MODULE = ngmix_runner # Parallel processing mode, SMP or MPI -MODE = SMP +MODE = MPI ## ShapePipe file handling options @@ -44,10 +44,10 @@ OUTPUT_DIR = $SP_RUN/output [JOB] # Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial -SMP_BATCH_SIZE = 1 +SMP_BATCH_SIZE = 8 # Timeout value (optional), default is None, i.e. no timeout limit applied -TIMEOUT = 96:00:00 +TIMEOUT = 48:00:00 ## Module options @@ -55,13 +55,14 @@ TIMEOUT = 96:00:00 # Model-fitting shapes with ngmix [NGMIX_RUNNER] -INPUT_DIR = last:sextractor_runner_run_1,last:X_interp_runner,last:vignetmaker_runner_run_2 +INPUT_DIR = run_sp_tile_Sx:sextractor_runner,last:X_interp_runner,last:vignetmaker_runner_run_2 FILE_PATTERN = sexcat, image_vignet, background_vignet, galaxy_psf, weight_vignet, flag_vignet FILE_EXT = .fits, .sqlite, .sqlite, .sqlite, .sqlite, .sqlite # NUMBERING_SCHEME (optional) string with numbering pattern for input files +#NUMBERING_SCHEME = \d{0}-\d{3}-\d{2}9 NUMBERING_SCHEME = -000-000 # Multi-epoch mode: Path to file with single-exposure WCS header information @@ -75,25 +76,3 @@ PIXEL_SCALE = 0.186 ID_OBJ_MIN = X ID_OBJ_MAX = X - - -# Moment-based (KSB) shapes with galsim -[GALSIM_SHAPES_V2_RUNNER] - -INPUT_DIR = last:sextractor_runner_run_2, last:vignetmaker_runner_run_1, last:X_interp_runner,last:vignetmaker_runner_run_2 - -FILE_PATTERN = sexcat, weight_vignet, image_vignet, background_vignet, galaxy_psf, weight_vignet, flag_vignet - -FILE_EXT = .fits, .fits, .sqlite, .sqlite, .sqlite, .sqlite, .sqlite - -# NUMBERING_SCHEME (optional) string with numbering pattern for input files -NUMBERING_SCHEME = -000-000 - -# Multi-epoch mode: Path to file with single-exposure WCS header information -LOG_WCS = $SP_RUN/output/log_exp_headers.sqlite - -# Magnitude zero-point -MAG_ZP = 30.0 - -ID_OBJ_MIN = X -ID_OBJ_MAX = X diff --git a/example/cfis/config_tile_PiViSmVi_canfar.ini b/example/cfis/config_tile_PiViSmVi_canfar.ini new file mode 100644 index 000000000..0ce5fe056 --- /dev/null +++ b/example/cfis/config_tile_PiViSmVi_canfar.ini @@ -0,0 +1,188 @@ +# ShapePipe configuration file for tile, from detection up to shape measurement. +# PSFEx PSF model. + + +## Default ShapePipe options +[DEFAULT] + +# verbose mode (optional), default: True, print messages on terminal +VERBOSE = True + +# Name of run (optional) default: shapepipe_run +RUN_NAME = run_sp_tile_PsViSmVi + +# Add date and time to RUN_NAME, optional, default: False +; RUN_DATETIME = False + + +## ShapePipe execution options +[EXECUTION] + +# Module name, single string or comma-separated list of valid module runner names +#MODULE = psfex_interp_runner, + +MODULE = psfex_interp_runner, vignetmaker_runner, spread_model_runner, + vignetmaker_runner + +# Parallel processing mode, SMP or MPI +MODE = SMP + + +## ShapePipe file handling options +[FILE] + +# Log file master name, optional, default: shapepipe +LOG_NAME = log_sp + +# Runner log file name, optional, default: shapepipe_runs +RUN_LOG_NAME = log_run_sp + +# Input directory, containing input files, single string or list of names +INPUT_DIR = . + +# Output directory +OUTPUT_DIR = $SP_RUN/output + + +## ShapePipe job handling options +[JOB] + +# Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial +SMP_BATCH_SIZE = 16 + +# Timeout value (optional), default is None, i.e. no timeout limit applied +TIMEOUT = 96:00:00 + + +## Module options + +[PSFEX_INTERP_RUNNER] + +INPUT_DIR = run_sp_tile_Sx:sextractor_runner + +FILE_PATTERN = sexcat + +FILE_EXT = .fits + +# NUMBERING_SCHEME (optional) string with numbering pattern for input files +NUMBERING_SCHEME = -000-000 + +# Run mode for psfex interpolation: +# CLASSIC: 'classical' run, interpolate to object positions +# MULTI-EPOCH: interpolate for multi-epoch images +# VALIDATION: validation for single-epoch images +MODE = MULTI-EPOCH + +# Column names of position parameters +POSITION_PARAMS = XWIN_WORLD,YWIN_WORLD + +# If True, measure and store ellipticity of the PSF +GET_SHAPES = True + +# Number of stars threshold +STAR_THRESH = 20 + +# chi^2 threshold +CHI2_THRESH = 2 + +# Multi-epoch mode parameters + +ME_DOT_PSF_DIR = all:psfex_runner + +# Input psf file pattern +ME_DOT_PSF_PATTERN = star_split_ratio_80 + +# Multi-epoch mode: Path to file with single-exposure WCS header information +ME_LOG_WCS = $SP_RUN/output/log_exp_headers.sqlite + + +# Create vignets for tiles weights +[VIGNETMAKER_RUNNER_RUN_1] + +INPUT_DIR = run_sp_tile_Sx:sextractor_runner, last:uncompress_fits_runner + +FILE_PATTERN = sexcat, CFIS_weight + +FILE_EXT = .fits, .fits + +# NUMBERING_SCHEME (optional) string with numbering pattern for input files +NUMBERING_SCHEME = -000-000 + +MASKING = False +MASK_VALUE = 0 + +# Run mode for psfex interpolation: +# CLASSIC: 'classical' run, interpolate to object positions +# MULTI-EPOCH: interpolate for multi-epoch images +# VALIDATION: validation for single-epoch images +MODE = CLASSIC + +# Coordinate frame type, one in PIX (pixel frame), SPHE (spherical coordinates) +COORD = PIX +POSITION_PARAMS = XWIN_IMAGE,YWIN_IMAGE + +# Vignet size in pixels +STAMP_SIZE = 51 + +# Output file name prefix, file name is _vignet.fits +PREFIX = weight + + +[SPREAD_MODEL_RUNNER] + +INPUT_DIR = run_sp_tile_Sx:sextractor_runner, last:psfex_interp_runner, last:vignetmaker_runner_run_1 + +FILE_PATTERN = sexcat, galaxy_psf, weight_vignet + +FILE_EXT = .fits, .sqlite, .fits + +# NUMBERING_SCHEME (optional) string with numbering pattern for input files +NUMBERING_SCHEME = -000-000 + +# Pixel scale in arcsec +PIXEL_SCALE = 0.186 + +# Output mode: +# new: create a new catalog with: [number, mag, sm, sm_err] +# add: create a copy of the input SExtractor with the column sm and sm_err +OUTPUT_MODE = new + + +[VIGNETMAKER_RUNNER_RUN_2] + +# Create multi-epoch vignets for tiles corresponding to +# positions on single-exposures + +INPUT_DIR = run_sp_tile_Sx:sextractor_runner + +FILE_PATTERN = sexcat + +FILE_EXT = .fits + +# NUMBERING_SCHEME (optional) string with numbering pattern for input files +NUMBERING_SCHEME = -000-000 + +MASKING = False +MASK_VALUE = 0 + +# Run mode for psfex interpolation: +# CLASSIC: 'classical' run, interpolate to object positions +# MULTI-EPOCH: interpolate for multi-epoch images +# VALIDATION: validation for single-epoch images +MODE = MULTI-EPOCH + +# Coordinate frame type, one in PIX (pixel frame), SPHE (spherical coordinates) +COORD = SPHE +POSITION_PARAMS = XWIN_WORLD,YWIN_WORLD + +# Vignet size in pixels +STAMP_SIZE = 51 + +# Output file name prefix, file name is vignet.fits +PREFIX = + +# Additional parameters for path and file pattern corresponding to single-exposure +# run outputs +ME_IMAGE_DIR = all:split_exp_runner, all:split_exp_runner, all:split_exp_runner, all:sextractor_runner +ME_IMAGE_PATTERN = flag, image, weight, background +ME_LOG_WCS = $SP_RUN/output/log_exp_headers.sqlite diff --git a/example/cfis/config_tile_Sx.ini b/example/cfis/config_tile_Sx.ini new file mode 100644 index 000000000..42b3a09a9 --- /dev/null +++ b/example/cfis/config_tile_Sx.ini @@ -0,0 +1,117 @@ +# ShapePipe configuration file for tile detection + + +## Default ShapePipe options +[DEFAULT] + +# verbose mode (optional), default: True, print messages on terminal +VERBOSE = True + +# Name of run (optional) default: shapepipe_run +RUN_NAME = run_sp_tile_Sx + +# Add date and time to RUN_NAME, optional, default: True +; RUN_DATETIME = False + + +## ShapePipe execution options +[EXECUTION] + +# Module name, single string or comma-separated list of valid module runner names +MODULE = sextractor_runner + + +# Run mode, SMP or MPI +MODE = SMP + + +## ShapePipe file handling options +[FILE] + +# Log file master name, optional, default: shapepipe +LOG_NAME = log_sp + +# Runner log file name, optional, default: shapepipe_runs +RUN_LOG_NAME = log_run_sp + +# Input directory, containing input files, single string or list of names with length matching FILE_PATTERN +INPUT_DIR = $SP_RUN/output + +# Output directory +OUTPUT_DIR = $SP_RUN/output + + +## ShapePipe job handling options +[JOB] + +# Batch size of parallel processing (optional), default is 1, i.e. run all jobs in serial +SMP_BATCH_SIZE = 16 + +# Timeout value (optional), default is None, i.e. no timeout limit applied +TIMEOUT = 96:00:00 + + +## Module options + +[SEXTRACTOR_RUNNER] + +INPUT_DIR = last:get_images_runner_run_1, last:uncompress_fits_runner, run_sp_Ma_tile:mask_runner + +FILE_PATTERN = CFIS_image, CFIS_weight, pipeline_flag + +FILE_EXT = .fits, .fits, .fits + +# NUMBERING_SCHEME (optional) string with numbering pattern for input files +NUMBERING_SCHEME = -000-000 + +# SExtractor executable path +EXEC_PATH = sex + +# SExtractor configuration files +DOT_SEX_FILE = $SP_CONFIG/default_tile.sex +DOT_PARAM_FILE = $SP_CONFIG/default.param +DOT_CONV_FILE = $SP_CONFIG/default.conv + +# Use input weight image if True +WEIGHT_IMAGE = True + +# Use input flag image if True +FLAG_IMAGE = True + +# Use input PSF file if True +PSF_FILE = False + +# Use distinct image for detection (SExtractor in +# dual-image mode) if True +DETECTION_IMAGE = False + +# Distinct weight image for detection (SExtractor +# in dual-image mode) +DETECTION_WEIGHT = False + +ZP_FROM_HEADER = False + +BKG_FROM_HEADER = False + +# Type of image check (optional), default not used, can be a list of +# BACKGROUND, BACKGROUND_RMS, INIBACKGROUND, +# MINIBACK_RMS, -BACKGROUND, #FILTERED, +# OBJECTS, -OBJECTS, SEGMENTATION, APERTURES +CHECKIMAGE = BACKGROUND + +# File name suffix for the output sextractor files (optional) +SUFFIX = sexcat + +## Post-processing + +# Necessary for tiles, to enable multi-exposure processing +MAKE_POST_PROCESS = True + +# Multi-epoch mode: Path to file with single-exposure WCS header information +LOG_WCS = $SP_RUN/output/log_exp_headers.sqlite + +# World coordinate keywords, SExtractor output. Format: KEY_X,KEY_Y +WORLD_POSITION = XWIN_WORLD,YWIN_WORLD + +# Number of pixels in x,y of a CCD. Format: Nx,Ny +CCD_SIZE = 33,2080,1,4612 diff --git a/example/cfis/default.param b/example/cfis/default.param index 6521a94d5..09ad8405e 100644 --- a/example/cfis/default.param +++ b/example/cfis/default.param @@ -51,7 +51,7 @@ MU_MAX #Peak surface brightness above background FLAGS #Extraction flags FLAGS_WIN #Flags for WINdowed parameters -#!!! REQUIRE FLAG_IMAGE !!! +# The following flag requires a flag image IMAFLAGS_ISO #FLAG-image flags OR'ed over the iso. profile !!! REQUIRE FLAG_IMAGE !!! FWHM_IMAGE #FWHM assuming a gaussian core [pixel] @@ -61,9 +61,8 @@ ELLIPTICITY #1 - B_IMAGE/A_IMAGE VIGNET(51,51) #Pixel data around detection [count] -#VECTOR_ASSOC #ASSOCiated parameter vector -#NUMBER_ASSOC #Number of ASSOCiated IDs +# For GaaP photometry +A_WORLD +B_WORLD +THETA_J2000 -#SPREAD_MODEL -#SPREADERR_MODEL -#FWHMPSF_IMAGE diff --git a/example/cfis/final_cat.param b/example/cfis/final_cat.param index 6372a13e8..a70de962d 100644 --- a/example/cfis/final_cat.param +++ b/example/cfis/final_cat.param @@ -76,12 +76,23 @@ NGMIX_FLUX_ERR_2M NGMIX_FLUX_ERR_2P NGMIX_FLUX_ERR_NOSHEAR -# magnitude, mainly for plots +# magnitudes MAG_AUTO - -# SNR from SExtractor, used for cuts on GALSIM shapes +MAGERR_AUTO +MAG_WIN +MAGERR_WIN +FLUX_AUTO +FLUXERR_AUTO +FLUX_APER +FLUXERR_APER +FLUX_RADIUS + +# SNR from SExtractor SNR_WIN +FWHM_IMAGE +FWHM_WORLD + # PSF size measured on original image NGMIX_T_PSFo_NOSHEAR diff --git a/example/config.ini b/example/config.ini index 49541f944..51d1479b5 100644 --- a/example/config.ini +++ b/example/config.ini @@ -14,7 +14,7 @@ # MODULE (required) must be a valid module runner name (or a comma separated list of names) MODULE = python_example_runner, serial_example_runner, execute_example_runner, python_example_runner, execute_example_runner # MODE (optional) options are smp or mpi, default is smp -; MODE = mpi +MODE = mpi ## ShapePipe file handling options [FILE] diff --git a/example/output/.gitkeep b/example/output/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/example/pbs/candide_mpi.sh b/example/pbs/candide_mpi.sh index 0abbbb7f4..41f7a5a25 100644 --- a/example/pbs/candide_mpi.sh +++ b/example/pbs/candide_mpi.sh @@ -21,20 +21,36 @@ #PBS -l nodes=2:ppn=2 # Full path to environment -export SPENV="$HOME/.conda/envs/shapepipe" +export SPENV="$HOME/.conda/envs/shapepipe_mpi" # Full path to example config file and input data export SPDIR="$HOME/shapepipe" # Load modules -module load intelpython/3 -module load openmpi/4.0.5 +module load gcc/9.3.0 +module load intelpython/3-2023.1.0 +module load openmpi/5.0.0 # Activate conda environment source activate $SPENV -# Run ShapePipe using full paths to executables -$SPENV/bin/mpiexec --map-by node $SPENV/bin/shapepipe_run -c $SPDIR/example/config_mpi.ini +# Other options to test +# -map-by + +if [ -f "$PBS_NODEFILE" ]; then + NSLOTS=`cat $PBS_NODEFILE | wc -l` + echo "Using $NSLOTS CPUs from PBS_NODEFILE $PBS_NODEFILE" +else + NSLOTS=4 + echo "Using $NSLOTS CPUs set by hand" +fi + +# Creates #node output dirs +MPI_CMD=/softs/openmpi/5.0.0-torque-CentOS7/bin/mpirun +MPI_ARGS="-np $NSLOTS" + +${MPI_CMD} ${MPI_ARGS} hostname +${MPI_CMD} ${MPI_ARGS} $SPENV/bin/shapepipe_run -c $SPDIR/example/pbs/config_mpi.ini # Return exit code exit 0 diff --git a/example/pbs/config_mpi.ini b/example/pbs/config_mpi.ini index bb2b8f95d..559fe1151 100644 --- a/example/pbs/config_mpi.ini +++ b/example/pbs/config_mpi.ini @@ -1,8 +1,14 @@ # ShapePipe Configuration File Example for MPI +## Default ShapePipe options +[DEFAULT] + +# Add date and time to RUN_NAME, optional, default: False +RUN_DATETIME = True + ## ShapePipe execution options [EXECUTION] -MODULE = python_example, serial_example, execute_example +MODULE = python_example_runner, serial_example_runner, execute_example_runner MODE = mpi ## ShapePipe file handling options @@ -15,8 +21,8 @@ OUTPUT_DIR = $SPDIR/example/output TIMEOUT = 00:01:35 ## Module options -[PYTHON_EXAMPLE] +[PYTHON_EXAMPLE_RUNNER] MESSAGE = The obtained value is: -[SERIAL_EXAMPLE] +[SERIAL_EXAMPLE_RUNNER] ADD_INPUT_DIR = $SPDIR/example/data/numbers, $SPDIR/example/data/letters diff --git a/install_shapepipe b/install_shapepipe index c370d91d0..584540d6b 100755 --- a/install_shapepipe +++ b/install_shapepipe @@ -22,23 +22,9 @@ last_update="08/03/22" # Conda package versions fftw_ver="3.3.10" libpng_ver="1.6.37" -mpi4py_ver="3.1.3" +mpi4py_ver="3.1.5" openblas_ver="0.3.18" -# SExtractor Package -sex_url="https://github.com/astromatic/sextractor/archive/2.25.0.tar.gz" -sex_tar="2.25.0.tar.gz" -sex_dir="sextractor-2.25.0" -sex_bin="sex" -sex_version=TRUE - -# PSFEx Package -psfex_url="https://github.com/astromatic/psfex/archive/3.21.1.tar.gz" -psfex_tar="3.21.1.tar.gz" -psfex_dir="psfex-3.21.1" -psfex_bin="psfex" -psfex_version=TRUE - # WeightWatcher Package ww_url="http://snapshot.debian.org/archive/debian/20171211T160522Z/pool/main/w/weightwatcher/weightwatcher_1.12.orig.tar.gz" ww_tar="weightwatcher_1.12.orig.tar.gz" @@ -81,11 +67,11 @@ NC='\033[0m' PIPE_DIR=$PWD BUILD_DIR=$PIPE_DIR/build ENV_NAME='shapepipe' +ENV_DEV=FALSE +USE_CONDA_SOURCE=FALSE BUILD_ENV=TRUE DEVELOP=FALSE VOS=FALSE -INSTALL_SEX=TRUE -INSTALL_PSFEX=TRUE INSTALL_WW=TRUE INSTALL_CDSCLIENT=TRUE ATLAS_SEARCH=FALSE @@ -105,66 +91,6 @@ download_package() { rm $2 } -# Function to build SExtractor with OpenBLAS -build_sex_blas() { - astromatic_setup - cd $BUILD_DIR/$1 - ./autogen.sh - ./configure --prefix=$CONDA_PREFIX --enable-openblas --with-fftw-libdir=$FFTW_LIB \ - --with-fftw-incdir=$FFTW_INC --with-openblas-libdir=$BLAS_LIB \ - --with-openblas-incdir=$BLAS_INC --quiet - make -j --quiet - make install -} - -# Function to build SExtractor with ATLAS -build_sex_atlas() { - astromatic_setup - cd $BUILD_DIR/$1 - ./autogen.sh - if [ "$ATLAS_SEARCH" == TRUE ] - then - ./configure --prefix=$CONDA_PREFIX --with-fftw-libdir=$FFTW_LIB \ - --with-fftw-incdir=$FFTW_INC --quiet - else - ./configure --prefix=$CONDA_PREFIX --with-fftw-libdir=$FFTW_LIB \ - --with-fftw-incdir=$FFTW_INC --with-atlas-libdir=$ATLAS_LIB \ - --with-atlas-incdir=$ATLAS_INC --quiet - fi - make -j --quiet - make install -} - -# Function to build PSFEx with OpenBLAS -build_psfex_blas() { - astromatic_setup - cd $BUILD_DIR/$1 - ./autogen.sh - ./configure --prefix=$CONDA_PREFIX --enable-openblas --enable-plplot=no \ - --with-fftw-libdir=$FFTW_LIB --with-fftw-incdir=$FFTW_INC \ - --with-openblas-libdir=$BLAS_LIB --with-openblas-incdir=$BLAS_INC --quiet - make -j --quiet - make install -} - -# Function to build PSFEx with ATLAS -build_psfex_atlas() { - astromatic_setup - cd $BUILD_DIR/$1 - ./autogen.sh - if [ "$ATLAS_SEARCH" == TRUE ] - then - ./configure --prefix=$CONDA_PREFIX --enable-plplot=no \ - --with-fftw-libdir=$FFTW_LIB --with-fftw-incdir=$FFTW_INC --quiet - else - ./configure --prefix=$CONDA_PREFIX --enable-plplot=no \ - --with-fftw-libdir=$FFTW_LIB --with-fftw-incdir=$FFTW_INC \ - --with-atlas-libdir=$ATLAS_LIB --with-atlas-incdir=$ATLAS_INC --quiet - fi - make -j --quiet - make install -} - # Function to build a standard package build_standard() { cd $BUILD_DIR/$1 @@ -200,26 +126,28 @@ check_conda() { echo -ne "${RED}ERROR: Found Conda version $CONDA_VERSION but require 4.0.0 or greater.${NC}\n" exit 1 fi - # Check Conda minor version - if [ "$CONDA_VERSION_MINOR" -gt 4 ] + # Look for conda.sh file + if [ -f "/opt/conda/$CONDA_SH" ] then - if [ -f "$CONDA_PREFIX_1$CONDA_SH" ] - then - source "$CONDA_PREFIX_1$CONDA_SH" - elif [ -f "$CONDA_PREFIX$CONDA_SH" ] - then - source "$CONDA_PREFIX$CONDA_SH" - else - echo -ne "${RED}ERROR: Could not find $CONDA_SH in \$CONDA_PREFIX.${NC}\n" - echo -ne "${RED}Activate the base/root Conda environment and try again.${NC}\n" - exit 1 - fi - CONDA_ACTIVATE="conda activate" - CONDA_DEACTIVATE="conda deactivate" + source "/opt/conda/$CONDA_SH" + elif [ -f "$CONDA_PREFIX$CONDA_SH" ] + then + source "$CONDA_PREFIX$CONDA_SH" else + echo -ne "${RED}ERROR: Could not find $CONDA_SH in /opt/conda or \$CONDA_PREFIX.${NC}\n" + echo -ne "${RED}Activate the base/root Conda environment and try again.${NC}\n" + exit 1 + fi + # Set environment activation command + if [ "$USE_CONDA_SOURCE" == TRUE ] + then CONDA_ACTIVATE="source activate" CONDA_DEACTIVATE="source deactivate" + else + CONDA_ACTIVATE="conda activate" + CONDA_DEACTIVATE="conda deactivate" fi + } # Check if a binary executable is already installed in the conda environment @@ -256,6 +184,14 @@ check_binary2() { echo "" } +# Check the environment name +check_env_name() { +if [ "$ENV_DEV" == TRUE ] +then + ENV_NAME='shapepipe-dev' +fi +} + # Check if a python site-package is installed correctly in the conda environment check_site_pkg() { if compgen -G "$CONDA_PREFIX/lib/python3.*/site-packages/$1*" > /dev/null @@ -290,8 +226,6 @@ start() { # Function to report package versions packages() { - check_binary2 $sex_bin "SExtractor" $sex_version $INSTALL_SEX - check_binary2 $psfex_bin "PSFEx" $psfex_version $INSTALL_PSFEX check_binary2 $ww_bin "WeightWatcher" $ww_version $INSTALL_WW check_binary2 $cdsclient_bin "CDSclient" $cdsclient_version $INSTALL_CDSCLIENT check_binary2 $mpi_bin "MPI" $mpi_version $USE_MPI $MPI_ROOT @@ -332,8 +266,6 @@ package_report() { then activate_shapepipe fi - INSTALL_SEX=FALSE - INSTALL_PSFEX=FALSE INSTALL_WW=FALSE INSTALL_CDSCLIENT=FALSE USE_MPI=FALSE @@ -341,7 +273,9 @@ package_report() { echo 'Package Report' echo '' packages - python -m piplist + echo 'Python Package Check List:' + echo '' + site-packages echo '' exit_code } @@ -381,8 +315,6 @@ setup() { check_status 'Operating System:' $SYSOS check_status 'Conda Version:' $CONDA_VERSION check_status 'Build Conda Environment:' $BUILD_ENV $ENV_NAME - check_status 'Install SExtractor:' $INSTALL_SEX - check_status 'Install PSFEx:' $INSTALL_PSFEX check_status 'Install WeightWatcher:' $INSTALL_WW check_status 'Install CDSclient:' $INSTALL_CDSCLIENT check_status 'Use MPI:' $USE_MPI $MPI_ROOT @@ -408,6 +340,7 @@ astromatic_setup() { # Function to uninstall ShapePipe and dependencies uninstall() { + check_env_name read -p "Uninstall $ENV_NAME environment [y/N]: " response response=${response:-n} if [ $response == "y" ] @@ -463,12 +396,12 @@ Options:\n \t--uninstall\t uninstall ShapePipe\n \t--pipe-dir\t set the path to the ShapePipe base directory (default is \$PWD)\n \t--build-dir\t set the path to the ShapePipe build (default is \$PWD/build)\n -\t--env-name\t set the name of the conda environment (default is shapepipe)\n +\t--env-name\t set the name of the Conda environment (default is shapepipe)\n +\t--env-dev\t use the developers Conda environment instead of the standard production environment\n +\t--use-conda-source\t use 'conda source' instead of the default 'conda activate' to activate the shapepipe environment\n \t--develop\t option to install additional development packages\n \t--vos\t\t option to install virtual observatory software\n \t--no-env\t do not build Conda environment\n -\t--no-sex\t do not build SExtractor\n -\t--no-psfex\t do not build PSFEx\n \t--no-ww\t\t do not build WeightWatcher\n \t--no-cds\t do not build CDSclient\n \t--no-exe\t do not build any system executables\n\n @@ -525,6 +458,14 @@ case $i in ENV_NAME="${i#*=}" shift ;; + --env-dev) + ENV_DEV=TRUE + shift + ;; + --use-conda-source) + USE_CONDA_SOURCE=TRUE + shift + ;; --develop) DEVELOP=TRUE shift @@ -537,14 +478,6 @@ case $i in BUILD_ENV=FALSE shift ;; - --no-sex) - INSTALL_SEX=FALSE - shift - ;; - --no-psfex) - INSTALL_PSFEX=FALSE - shift - ;; --no-ww) INSTALL_WW=FALSE shift @@ -590,8 +523,6 @@ case $i in shift ;; --no-exe) - INSTALL_SEX=FALSE - INSTALL_PSFEX=FALSE INSTALL_WW=FALSE INSTALL_CDSCLIENT=FALSE shift @@ -613,6 +544,9 @@ start # Check if conda is installed check_conda +# Check the Conda environment name +check_env_name + # Find the operating system case "$OSTYPE" in darwin*) @@ -645,7 +579,12 @@ setup if [ "$BUILD_ENV" == TRUE ] then report_progress 'ShapePipe Environment' - conda env create -f environment.yml -n $ENV_NAME + if [ "$ENV_DEV" == TRUE ] + then + conda env create -f environment-dev.yml -n $ENV_NAME + else + conda env create -f environment.yml -n $ENV_NAME + fi fi # Activate conda environment @@ -716,37 +655,6 @@ fi # BUILD EXTERNAL EXECUTABLES ############################################################################## -# Build SExtractor -if [ "$INSTALL_SEX" == TRUE ] && check_binary $sex_bin -then - report_progress 'SExtractor' - conda install -n $ENV_NAME -c conda-forge "fftw==${fftw_ver}" -y - download_package $sex_url $sex_tar - if [ "$use_atlas" == TRUE ] - then - build_sex_atlas $sex_dir - else - conda install -n $ENV_NAME -c conda-forge "openblas==${openblas_ver}" -y - build_sex_blas $sex_dir - fi -fi - -# Build PSFEx -if [ "$INSTALL_PSFEX" == TRUE ] && check_binary $psfex_bin -then - report_progress 'PSFEx' - conda install "libpng==${libpng_ver}" -y - conda install -n $ENV_NAME -c conda-forge "fftw==${fftw_ver}" -y - download_package $psfex_url $psfex_tar - if [ "$use_atlas" == TRUE ] - then - build_psfex_atlas $psfex_dir - else - conda install -n $ENV_NAME -c conda-forge "openblas==${openblas_ver}" -y - build_psfex_blas $psfex_dir - fi -fi - # Build WeightWatcher if [ "$INSTALL_WW" == TRUE ] && check_binary $ww_bin then diff --git a/nsswitch.conf b/nsswitch.conf new file mode 100644 index 000000000..22d8d9949 --- /dev/null +++ b/nsswitch.conf @@ -0,0 +1,62 @@ +# +# /etc/nsswitch.conf +# +# An example Name Service Switch config file. This file should be +# sorted with the most-used services at the beginning. +# +# The entry '[NOTFOUND=return]' means that the search for an +# entry should stop if the search in the previous entry turned +# up nothing. Note that if the search failed due to some other reason +# (like no NIS server responding) then the search continues with the +# next entry. +# +# Valid entries include: +# +# nisplus Use NIS+ (NIS version 3) +# nis Use NIS (NIS version 2), also called YP +# dns Use DNS (Domain Name Service) +# files Use the local files +# db Use the local database (.db) files +# compat Use NIS on compat mode +# hesiod Use Hesiod for user lookups +# [NOTFOUND=return] Stop searching if not found so far +# + +# To use db, put the "db" in front of "files" for entries you want to be +# looked up first in the databases +# +# Example: +#passwd: db files nisplus nis +#shadow: db files nisplus nis +#group: db files nisplus nis + +passwd: sss files +shadow: files sss +group: sss files + +#hosts: db files nisplus nis dns +hosts: files dns + +# Example - obey only what nisplus tells us... +#services: nisplus [NOTFOUND=return] files +#networks: nisplus [NOTFOUND=return] files +#protocols: nisplus [NOTFOUND=return] files +#rpc: nisplus [NOTFOUND=return] files +#ethers: nisplus [NOTFOUND=return] files +#netmasks: nisplus [NOTFOUND=return] files + +bootparams: nisplus [NOTFOUND=return] files + +ethers: files +netmasks: files +networks: files +protocols: files +rpc: files +services: files + +netgroup: nisplus + +publickey: nisplus + +automount: files nisplus +aliases: files nisplus diff --git a/scripts/jupyter/summary_run.ipynb b/scripts/jupyter/summary_run.ipynb new file mode 100644 index 000000000..44f2f2545 --- /dev/null +++ b/scripts/jupyter/summary_run.ipynb @@ -0,0 +1,399 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "130112a4-f2ca-4d26-b884-d8b054676f9c", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "%load_ext autoreload\n", + "%autoreload 3\n", + "%reload_ext autoreload" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "196beca5-10a1-4cf5-9462-be145167cc70", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "ename": "ModuleNotFoundError", + "evalue": "No module named 'shapepipe'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[1], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mshapepipe\u001b[39;00m\n\u001b[1;32m 2\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mshapepipe\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mutilities\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01msummary\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;241m*\u001b[39m\n", + "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'shapepipe'" + ] + } + ], + "source": [ + "import shapepipe\n", + "from shapepipe.utilities.summary import *" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "ca63c72d-212c-463e-a792-71efbac0b908", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Setting\n", + "patch = \"P7\"\n", + "\n", + "verbose = False" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "dcb5604c-d61f-4705-8295-63875455cadb", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Load parameters\n", + "%run ~/shapepipe/scripts/python/summary_params_pre_v2" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "e69b7dab-1fea-4fcc-a8d9-0720e1d628c3", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Checking main directory = /arc/home/kilbinger/cosmostat/v2/pre_v2/psfex/P7\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Set job info for patch P7\n" + ] + } + ], + "source": [ + "jobs, list_tile_IDs = set_jobs_v2_pre_v2(patch, verbose)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "2c3a9dde-cf88-493f-926e-7ae7e8e10916", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Initialize runtime dicionary.\n", + "par_runtime = init_par_runtime(list_tile_IDs)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "1e9c1487-3cec-4394-9fcf-c12e92a0f984", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# No effect in notebook\n", + "#print_par_runtime(par_runtime, verbose=verbose)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "b7c63a22-ead1-4d6a-b081-a74ade515439", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "module expected found miss_expl missing uniq_miss fr_found\n", + "====================================================================================================\n" + ] + } + ], + "source": [ + "# Start program\n", + "job_data.print_stats_header()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "4720ae18-0633-4646-b392-b1b24e0294c3", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " (Job 1)\n", + "get_images_runner_run_1 462 462 0 0 0.0 100.0%\n", + "find_exposures_runner 231 231 0 0 0.0 100.0%\n", + "get_images_runner_run_2 537 0 0 537 179.0 0.0%\n" + ] + } + ], + "source": [ + "for key in \"1\":\n", + " jobs[key].print_intro()\n", + " jobs[key].check_numbers(par_runtime=par_runtime, indices=[0, 1])\n", + "\n", + " all_exposures = get_all_exposures(jobs[key]._paths_in_dir[1], verbose=verbose)\n", + " par_runtime[\"n_exposures\"] = len(all_exposures)\n", + " par_runtime[\"list_exposures\"] = all_exposures\n", + "\n", + " jobs[key].check_numbers(par_runtime, indices=[2])" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "f149f404-64e7-4d92-8f54-f300ed620130", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Update runtime dictionary with numbers of exposures\n", + "par_runtime = update_par_runtime_after_find_exp(par_runtime, all_exposures)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "78a9065f-8983-41cf-a34c-21892fc52dd2", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Get all keys after \"1\"\n", + "keys = sorted(jobs.keys(), key=int)\n", + "_ = keys.pop(0)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "79e39954-1155-4ca3-b0b2-64bc5670db53", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " (Job 2)\n", + "uncompress_fits_runner 1268 1268 0 0 0.0 100.0%\n", + "merge_headers_runner 0 0 0 0 0.0 100.0%\n", + "split_exp_runner 137940 137940 0 0 0.0 100.0%\n", + " (Job 4)\n", + "mask_runner 1268 1268 0 0 0.0 100.0%\n", + " (Job 8)\n", + "mask_runner 45600 45600 0 0 0.0 100.0%\n", + " (Job 16)\n", + "sextractor_runner 2536 2536 0 0 0.0 100.0%\n", + " (Job 32)\n", + "sextractor_runner 91200 91200 0 0 0.0 100.0%\n", + "setools_runner 91200 91032 0 168 84.0 99.8%\n", + "psfex_runner 91200 91032 0 168 84.0 99.8%\n", + " (Job 64)\n", + "psfex_interp_runner 1268 1268 0 0 0.0 100.0%\n", + "vignetmaker_runner_run_1 1268 1268 0 0 0.0 100.0%\n", + "spread_model_runner 1268 1268 0 0 0.0 100.0%\n", + "vignetmaker_runner_run_2 5072 5072 0 0 0.0 100.0%\n", + " (Job 128)\n", + "ngmix_runner 1268 1225 0 43 43.0 96.6%\n", + "ngmix_runner 1268 1216 0 52 52.0 95.9%\n", + "ngmix_runner 1268 1216 0 52 52.0 95.9%\n", + "ngmix_runner 1268 1217 0 51 51.0 96.0%\n", + "ngmix_runner 1268 1228 0 40 40.0 96.8%\n", + "ngmix_runner 1268 1216 0 52 52.0 95.9%\n", + "ngmix_runner 1268 1216 0 52 52.0 95.9%\n", + "ngmix_runner 1268 1216 0 52 52.0 95.9%\n", + " (Job 256)\n", + "merge_sep_cats_runner 1268 0 0 1268 1268.0 0.0%\n", + "make_cat_runner 1268 0 0 1268 1268.0 0.0%\n", + " (Job 1024)\n", + "psfex_interp_runner 45600 41132 0 4468 4468.0 90.2%\n" + ] + } + ], + "source": [ + "for key in keys:\n", + " jobs[key].print_intro()\n", + " jobs[key].check_numbers(par_runtime=par_runtime)" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "id": "b3d51a05-ecca-420b-b8b3-1fb2b1ec9fe3", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " (Job 128)\n", + "ngmix_runner 1268 1267 0 1 1.0 99.9%\n", + "ngmix_runner 1268 1265 0 3 3.0 99.8%\n", + "ngmix_runner 1268 1267 0 1 1.0 99.9%\n", + "ngmix_runner 1268 1267 0 1 1.0 99.9%\n", + "ngmix_runner 1268 1267 0 1 1.0 99.9%\n", + "ngmix_runner 1268 1266 0 2 2.0 99.8%\n", + "ngmix_runner 1268 1268 0 0 0.0 100.0%\n", + "ngmix_runner 1268 1266 0 2 2.0 99.8%\n" + ] + } + ], + "source": [ + "## Update some runs\n", + "for key in [\"128\"]:\n", + " jobs[key].print_intro()\n", + " jobs[key].check_numbers(par_runtime=par_runtime)" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "id": "67b50a61-e3cc-4559-941d-f39c6a200294", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " (Job 128)\n", + "ngmix_runner 1268 1267 0 1 1.0 99.9%\n", + "ngmix_runner 1268 1265 0 3 3.0 99.8%\n", + "ngmix_runner 1268 1267 0 1 1.0 99.9%\n", + "ngmix_runner 1268 1267 0 1 1.0 99.9%\n", + "ngmix_runner 1268 1267 0 1 1.0 99.9%\n", + "ngmix_runner 1268 1266 0 2 2.0 99.8%\n", + "ngmix_runner 1268 1268 0 0 0.0 100.0%\n", + "ngmix_runner 1268 1266 0 2 2.0 99.8%\n" + ] + } + ], + "source": [ + "for key in [\"128\"]:\n", + " jobs[key].print_intro()\n", + " \n", + " \n", + " jobs[key].check_numbers(par_runtime=par_runtime)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "affa8293-daf9-4d2b-9215-fe19f8e2c1e2", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "session = Session()" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "269496d1-cd89-4d13-a5e4-41b897669e22", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "ids = [session[\"id\"] for session in session.fetch(kind=\"headless\")]" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "80af8dff-98c7-4db4-8bcc-06936e1875cf", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "ename": "RuntimeError", + "evalue": "This event loop is already running", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mRuntimeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/tmp/ipykernel_69/559116804.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0msession\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdestroy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mids\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/.local/lib/python3.7/site-packages/skaha/session.py\u001b[0m in \u001b[0;36mdestroy\u001b[0;34m(self, id)\u001b[0m\n\u001b[1;32m 264\u001b[0m \u001b[0marguments\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;34m\"url\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mserver\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m\"/\"\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 265\u001b[0m \u001b[0mloop\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_event_loop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 266\u001b[0;31m \u001b[0mresults\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mloop\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun_until_complete\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mscale\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msession\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdelete\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0marguments\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 267\u001b[0m \u001b[0mresponses\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mDict\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbool\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 268\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mindex\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0midentity\u001b[0m \u001b[0;32min\u001b[0m \u001b[0menumerate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mid\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/conda/lib/python3.7/asyncio/base_events.py\u001b[0m in \u001b[0;36mrun_until_complete\u001b[0;34m(self, future)\u001b[0m\n\u001b[1;32m 561\u001b[0m \"\"\"\n\u001b[1;32m 562\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_check_closed\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 563\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_check_runnung\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 564\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 565\u001b[0m \u001b[0mnew_task\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mfutures\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0misfuture\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfuture\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/conda/lib/python3.7/asyncio/base_events.py\u001b[0m in \u001b[0;36m_check_runnung\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 521\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_check_runnung\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 522\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_running\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 523\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mRuntimeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'This event loop is already running'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 524\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mevents\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_running_loop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 525\u001b[0m raise RuntimeError(\n", + "\u001b[0;31mRuntimeError\u001b[0m: This event loop is already running" + ] + } + ], + "source": [ + "session.destroy(ids[0])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "66a3ed14-8aaf-4028-b933-10ecb7376d68", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/scripts/python/canfar_avail_results.py b/scripts/python/canfar_avail_results.py index c44c90e31..62fbf0564 100755 --- a/scripts/python/canfar_avail_results.py +++ b/scripts/python/canfar_avail_results.py @@ -38,10 +38,10 @@ def params_default(): """ p_def = cfis.param( - input_IDs = '.', - input_path = 'vos:cfis/cosmostat/kilbinger/results', - psf = 'mccd', - extension = 'tgz', + input_IDs=".", + input_path="vos:cfis/cosmostat/kilbinger/results", + psf="mccd", + extension="tgz", ) return p_def @@ -63,25 +63,78 @@ def parse_options(p_def): Command line string """ - usage = "%prog [OPTIONS]" + usage = "%prog [OPTIONS]" parser = OptionParser(usage=usage) # I/O - parser.add_option('-i', '--input_IDs', dest='input_IDs', type='string', default=p_def.input_IDs, - help='input tile ID file(s) or directory path, default=\'{}\''.format(p_def.input_IDs)) - parser.add_option('', '--input_path', dest='input_path', type='string', default=p_def.input_path, - help='input path, local or vos url, default=\'{}\''.format(p_def.input_path)) - parser.add_option('-o', '--output_not_avail', dest='output_not_avail', type='string', - help='output file for not-available IDs, default no output') - - parser.add_option('-p', '--psf', dest='psf', type='string', default=p_def.psf, - help='PSF model, one in [\'psfex\'|\'mccd\'], default=\'{}\''.format(p_def.psf)) - - parser.add_option('-f', '--final_only', dest='final_only', action='store_true', help='only check final catalogues') - parser.add_option('-m', '--mask_only', dest='mask_only', action='store_true', help='only check mask files (pipeline_flag)') - parser.add_option('-x', '--extension', dest='extension', type='string', default=p_def.extension, - help=f'file extension, default=\'{p_def.extension}\'') - parser.add_option('-v', '--verbose', dest='verbose', action='store_true', help='verbose output') + parser.add_option( + "-i", + "--input_IDs", + dest="input_IDs", + type="string", + default=p_def.input_IDs, + help="input tile ID file(s) or directory path, default='{}'".format( + p_def.input_IDs + ), + ) + parser.add_option( + "", + "--input_path", + dest="input_path", + type="string", + default=p_def.input_path, + help="input path, local or vos url, default='{}'".format( + p_def.input_path + ), + ) + parser.add_option( + "-o", + "--output_not_avail", + dest="output_not_avail", + type="string", + help="output file for not-available IDs, default no output", + ) + + parser.add_option( + "-p", + "--psf", + dest="psf", + type="string", + default=p_def.psf, + help="PSF model, one in ['psfex'|'mccd'], default='{}'".format( + p_def.psf + ), + ) + + parser.add_option( + "-f", + "--final_only", + dest="final_only", + action="store_true", + help="only check final catalogues", + ) + parser.add_option( + "-m", + "--mask_only", + dest="mask_only", + action="store_true", + help="only check mask files (pipeline_flag)", + ) + parser.add_option( + "-x", + "--extension", + dest="extension", + type="string", + default=p_def.extension, + help=f"file extension, default='{p_def.extension}'", + ) + parser.add_option( + "-v", + "--verbose", + dest="verbose", + action="store_true", + help="verbose output", + ) options, args = parser.parse_args() @@ -102,12 +155,12 @@ def check_options(options): Result of option check. False if invalid option value. """ - if options.psf not in ['psfex', 'mccd']: - print('Invalid PSF model \'{}\''.format(options.psf)) + if options.psf not in ["psfex", "mccd"]: + print("Invalid PSF model '{}'".format(options.psf)) return False if options.final_only and options.mask_only: - print('One one of the options \'-f\' or \'-m\' can be given') + print("One one of the options '-f' or '-m' can be given") return False return True @@ -163,25 +216,32 @@ def read_input_files(input_path, verbose=False): """ if os.path.isdir(input_path): - input_files = glob.glob('{}/*'.format(input_path)) + input_files = glob.glob("{}/*".format(input_path)) else: - input_files = cfis.my_string_split(input_path, stop=True, sep=' ') + input_files = cfis.my_string_split(input_path, stop=True, sep=" ") ID_files = [] for f in input_files: if os.path.isdir(f): if verbose: - print('Skipping directory \'{}\''.format(f)) + print("Skipping directory '{}'".format(f)) else: ID_files.append(f) if verbose: - print('{} input files found'.format(len(ID_files))) + print("{} input files found".format(len(ID_files))) return ID_files -def check_results(ID_files, input_path, result_base_names, n_complete, extension, verbose=False): +def check_results( + ID_files, + input_path, + result_base_names, + n_complete, + extension, + verbose=False, +): """Count the number of result files uploaded to vos for each input ID file. Parameters @@ -207,11 +267,11 @@ def check_results(ID_files, input_path, result_base_names, n_complete, extension IDs that are not available on vos """ - m = re.match('vos:', input_path) + m = re.match("vos:", input_path) if m: ls_tmp = dir_list(input_path) else: - ls_tmp = glob.glob(f'{input_path}/*') + ls_tmp = glob.glob(f"{input_path}/*") ls_out = [os.path.basename(path) for path in ls_tmp] n_found = {} @@ -222,7 +282,7 @@ def check_results(ID_files, input_path, result_base_names, n_complete, extension for ID_list in ID_files: with open(ID_list) as f: if verbose: - print('Checking ID list file {}...'.format(ID_list)) + print("Checking ID list file {}...".format(ID_list)) n_found[ID_list] = {} n_IDs[ID_list] = 0 @@ -231,14 +291,14 @@ def check_results(ID_files, input_path, result_base_names, n_complete, extension ID = line.rstrip() n_found[ID_list][ID] = 0 - if extension == 'fits': - ID_fname = ID.replace('.', '-') - ID_fname = f'-{ID_fname}' + if extension == "fits": + ID_fname = ID.replace(".", "-") + ID_fname = f"-{ID_fname}" else: - ID_fname = f'_{ID}' + ID_fname = f"_{ID}" # Count how many result files are available for base in result_base_names: - name = '{}{}.{}'.format(base, ID_fname, extension) + name = "{}{}.{}".format(base, ID_fname, extension) if name in ls_out: n_found[ID_list][ID] = n_found[ID_list][ID] + 1 n_IDs[ID_list] = n_IDs[ID_list] + 1 @@ -265,7 +325,14 @@ def output_summary(n_found, n_IDs, n_complete): for ID_list in n_found.keys(): nf = sum(value == n_complete for value in n_found[ID_list].values()) - print('{}: {}/{} ({:.1f}%) complete'.format(os.path.basename(ID_list), nf, n_IDs[ID_list], nf/n_IDs[ID_list]*100)) + print( + "{}: {}/{} ({:.1f}%) complete".format( + os.path.basename(ID_list), + nf, + n_IDs[ID_list], + nf / n_IDs[ID_list] * 100, + ) + ) def output_IDs(ID_list, output): @@ -279,7 +346,7 @@ def output_IDs(ID_list, output): output file name """ - f = open(output, 'w') + f = open(output, "w") for ID in ID_list: print(ID, file=f) f.close() @@ -301,52 +368,57 @@ def main(argv=None): # Save calling command cfis.log_command(argv) if param.verbose: - cfis.log_command(argv, name='sys.stdout') - + cfis.log_command(argv, name="sys.stdout") ### Start main program ### if param.verbose: - print('Start of program {}'.format(os.path.basename(argv[0]))) + print("Start of program {}".format(os.path.basename(argv[0]))) ID_files = read_input_files(param.input_IDs, verbose=param.verbose) if param.final_only: - result_base_names = ['final_cat'] + result_base_names = ["final_cat"] elif param.mask_only: - result_base_names = ['pipeline_flag'] + result_base_names = ["pipeline_flag"] else: result_base_names = [] types = [ - 'final_cat', - 'pipeline_flag', - 'logs', - 'setools_mask', - 'setools_stat', - 'setools_plot', + "final_cat", + "pipeline_flag", + "logs", + "setools_mask", + "setools_stat", + "setools_plot", ] for t in types: result_base_names.append(t) - if param.psf == 'psfex': - result_base_names.append('psfex_interp_exp') - elif param.psf == 'mccd': - result_base_names.append('mccd_fit_val_runner') + if param.psf == "psfex": + result_base_names.append("psfex_interp_exp") + elif param.psf == "mccd": + result_base_names.append("mccd_fit_val_runner") n_complete = len(result_base_names) - n_found, n_IDs, IDs_not_avail = check_results(ID_files, param.input_path, result_base_names, n_complete, param.extension, verbose=param.verbose) + n_found, n_IDs, IDs_not_avail = check_results( + ID_files, + param.input_path, + result_base_names, + n_complete, + param.extension, + verbose=param.verbose, + ) output_summary(n_found, n_IDs, n_complete) if param.output_not_avail: output_IDs(IDs_not_avail, param.output_not_avail) - ### End main program if param.verbose: - print('End of program {}'.format(os.path.basename(argv[0]))) + print("End of program {}".format(os.path.basename(argv[0]))) return 0 diff --git a/scripts/python/canfar_run_analyse.py b/scripts/python/canfar_run_analyse.py index f43ef69bc..72da60474 100755 --- a/scripts/python/canfar_run_analyse.py +++ b/scripts/python/canfar_run_analyse.py @@ -19,8 +19,7 @@ class param: - """General class to store (default) variables - """ + """General class to store (default) variables""" def __init__(self, **kwds): self.__dict__.update(kwds) @@ -46,7 +45,7 @@ def params_default(): """ p_def = param( - input_job = 'job_tile.sh', + input_job="job_tile.sh", ) return p_def @@ -68,16 +67,33 @@ def parse_options(p_def): Command line string """ - usage = "%prog [OPTIONS]" + usage = "%prog [OPTIONS]" parser = OptionParser(usage=usage) # I/O - parser.add_option('-i', '--input_job', dest='input_job', type='string', default=p_def.input_job, - help='input job file, default=\'{}\''.format(p_def.input_job)) - parser.add_option('-o', '--output_fail', dest='output_fail', type='string', - help='output file for failed jobs, none if not given') + parser.add_option( + "-i", + "--input_job", + dest="input_job", + type="string", + default=p_def.input_job, + help="input job file, default='{}'".format(p_def.input_job), + ) + parser.add_option( + "-o", + "--output_fail", + dest="output_fail", + type="string", + help="output file for failed jobs, none if not given", + ) - parser.add_option('-v', '--verbose', dest='verbose', action='store_true', help='verbose output') + parser.add_option( + "-v", + "--verbose", + dest="verbose", + action="store_true", + help="verbose output", + ) options, args = parser.parse_args() @@ -159,61 +175,83 @@ def update_param(p_def, options): def get_status(tile_num): - base_name = 'log_canfar_sp_' - #base_name = 'log_sp_tile_' + base_name = "log_canfar_sp_" + # base_name = 'log_sp_tile_' - log_name = '{}{}.log'.format(base_name, tile_num) - out_name = '{}{}.out'.format(base_name, tile_num) - err_name = '{}{}.err'.format(base_name, tile_num) + log_name = "{}{}.log".format(base_name, tile_num) + out_name = "{}{}.out".format(base_name, tile_num) + err_name = "{}{}.err".format(base_name, tile_num) - status = res_unk, 'unknown status' + status = res_unk, "unknown status" if not os.path.exists(log_name): - status = res_wait, 'waiting for submission' + status = res_wait, "waiting for submission" else: if os.path.exists(out_name): final_cat_found = False with open(out_name) as out_file: for line in out_file: - m = re.match('Upload.*final_cat_*', line) + m = re.match("Upload.*final_cat_*", line) if m: final_cat_found = True - status = res_ok, 'successful upload of final_cat' + status = res_ok, "successful upload of final_cat" # TODO: check next line for upload success if final_cat_found == False: - status = res_unk, 'Failed before final_cat' + status = res_unk, "Failed before final_cat" # Look for known errors in error log file with open(err_name) as err_file: for line_err in err_file: - mm = re.search('NodeNotFound', line_err) + mm = re.search("NodeNotFound", line_err) if mm: - status = status + (fail_vos_not_found, 'vos file not found') + status = status + ( + fail_vos_not_found, + "vos file not found", + ) break - mm = re.search('Empty or corrupt FITS file', line_err) + mm = re.search("Empty or corrupt FITS file", line_err) if mm: - status = status + (fail_corrupt_fits, 'corrupt input FITS file') + status = status + ( + fail_corrupt_fits, + "corrupt input FITS file", + ) break - mm = re.search('ERROR:: HTTPSConnectionPool.*Max retries', line_err) + mm = re.search( + "ERROR:: HTTPSConnectionPool.*Max retries", line_err + ) if mm: - status = status + (fail_time_out, 'vos time out') + status = status + (fail_time_out, "vos time out") break - mm = re.search('ERROR:: __str__ returned non-string', line_err) + mm = re.search( + "ERROR:: __str__ returned non-string", line_err + ) if mm: - status = status + (fail_connection, 'Connection/HTTP error') + status = status + ( + fail_connection, + "Connection/HTTP error", + ) break - mm = re.search('ERROR:: 503 Server Error', line_err) + mm = re.search("ERROR:: 503 Server Error", line_err) if mm: - status = status + (fail_server, 'server connection error') + status = status + ( + fail_server, + "server connection error", + ) break - mm = re.search('ERROR:: \[Errno 14\] vos', line_err) + mm = re.search("ERROR:: \[Errno 14\] vos", line_err) if mm: - status = status + (fail_transient, 'TransientException') + status = status + ( + fail_transient, + "TransientException", + ) break - mm = re.search('Connection aborted', line_err) + mm = re.search("Connection aborted", line_err) if mm: - status = status + (fail_vos_no_resp, 'vos no response') + status = status + ( + fail_vos_no_resp, + "vos no response", + ) break if len(status) == 2: @@ -222,53 +260,59 @@ def get_status(tile_num): module_last = None with open(out_name) as out_file: for line in out_file: - mmm = re.search('\- Module: (.*)', line) + mmm = re.search("\- Module: (.*)", line) if mmm: module_last = mmm[1] - mmm = re.search('A total of (\d+) errors were recorded.', line) + mmm = re.search( + "A total of (\d+) errors were recorded.", line + ) if mmm and int(mmm[1]) != 0: - status = status + (fail_res_err_mod, '{} errors recorded, last module was {}'.format(mmm[1], module_last)) + status = status + ( + fail_res_err_mod, + "{} errors recorded, last module was {}".format( + mmm[1], module_last + ), + ) break if len(status) == 2: - status = status + (fail_unknown, 'unknown error') - + status = status + (fail_unknown, "unknown error") else: log_file = open(log_name) lines = log_file.readlines() log_file.close() for line in lines: - if re.match('.*aborted', line): - status = res_abort, 'job aborted by user' + if re.match(".*aborted", line): + status = res_abort, "job aborted by user" return status for line in lines: - if re.match('.*executing', line): - status = res_wait, 'job running' + if re.match(".*executing", line): + status = res_wait, "job running" return status - status = res_subm, 'job submitted, not started yet' + status = res_subm, "job submitted, not started yet" return status def output(status): - print('## Issues') + print("## Issues") n_issue = 0 for tile_num in sorted(status.keys()): if status[tile_num][0] == res_noout or status[tile_num][0] == res_unk: - print(' ', tile_num, status[tile_num]) + print(" ", tile_num, status[tile_num]) n_issue = n_issue + 1 if n_issue == 0: - print(' none') + print(" none") hist = Counter(status.values()) - print('## Summary') - print('# Nb: status (code)') + print("## Summary") + print("# Nb: status (code)") for s in hist: - print('{:6d}: {} ({})'.format(hist[s], s[1], int(s[0])), end='') + print("{:6d}: {} ({})".format(hist[s], s[1], int(s[0])), end="") if len(s) == 4: - print('; {} ({})'.format(s[3], int(s[2])), end='') + print("; {} ({})".format(s[3], int(s[2])), end="") print() @@ -276,11 +320,14 @@ def output_failed(output_fail, status): if output_fail: - with open(output_fail, 'w') as f_out: + with open(output_fail, "w") as f_out: for tile_num in status.keys(): - if status[tile_num][0] == res_noout or status[tile_num][0] == res_unk: + if ( + status[tile_num][0] == res_noout + or status[tile_num][0] == res_unk + ): print(tile_num, file=f_out) - + def main(argv=None): @@ -295,7 +342,6 @@ def main(argv=None): param = update_param(p_def, options) - ### Start main program ### job_tile_path = param.input_job @@ -303,7 +349,7 @@ def main(argv=None): status = {} with open(job_tile_path) as job_file: for line in job_file: - m = re.match('(\d{3}\.\d{3})', line) + m = re.match("(\d{3}\.\d{3})", line) if m: tile_num = m[0] diff --git a/scripts/python/cfis_field_select.py b/scripts/python/cfis_field_select.py index efe961ca7..08f79d804 100755 --- a/scripts/python/cfis_field_select.py +++ b/scripts/python/cfis_field_select.py @@ -51,17 +51,23 @@ def get_images_used_in_tiles(images, band, image_type): try: hdu = fits.open(img.name) - hist = hdu[0].header['HISTORY'] + hist = hdu[0].header["HISTORY"] except: - raise cfis.CfisError('Error while reading tile FITS file {}'.format(img.name)) + raise cfis.CfisError( + "Error while reading tile FITS file {}".format(img.name) + ) for h in hist: - temp = h.split(' ') + temp = h.split(" ") - pattern = r'(.*)p\.{1}.*' + pattern = r"(.*)p\.{1}.*" m = re.search(pattern, temp[3]) if not m: - raise cfis.CfisError('re match \'{}\' failed for filename \'{}\''.format(pattern, temp[3])) + raise cfis.CfisError( + "re match '{}' failed for filename '{}'".format( + pattern, temp[3] + ) + ) exp_name = m.group(1) exp_list.append(exp_name) @@ -71,7 +77,9 @@ def get_images_used_in_tiles(images, band, image_type): return exp_list_uniq -def get_coord_at_image(number, band, image_type, images, no_cuts=False, verbose=False): +def get_coord_at_image( + number, band, image_type, images, no_cuts=False, verbose=False +): """Return coordinate of image with given number. Parameters @@ -97,18 +105,22 @@ def get_coord_at_image(number, band, image_type, images, no_cuts=False, verbose= img_found = None - if image_type == 'tile': + if image_type == "tile": nix, niy = cfis.my_string_split(number, num=2, stop=True) tile_name = cfis.get_tile_name(nix, niy, band) if verbose == True: - print('Looking for coordinates for tile with numbers ({},{})'.format(nix, niy)) + print( + "Looking for coordinates for tile with numbers ({},{})".format( + nix, niy + ) + ) - ra, dec = cfis.get_tile_coord_from_nixy(nix, niy) + ra, dec = cfis.get_tile_coord_from_nixy(nix, niy) img_found = cfis.image(tile_name, ra, dec) - elif image_type == 'exposure': - ra = [] + elif image_type == "exposure": + ra = [] dec = [] for img in images: m = re.findall(number, img.name) @@ -117,18 +129,19 @@ def get_coord_at_image(number, band, image_type, images, no_cuts=False, verbose= img_found = img else: - raise cfis.CfisError('Image type \'{}\' not implemented yet'.format(image_type)) + raise cfis.CfisError( + "Image type '{}' not implemented yet".format(image_type) + ) return img_found - def test_tile_number(): - #ra = Angle(180, unit=units.deg) - #dec = Angle(35, unit=units.deg) - ra = Angle('10:44:00.0 hours') - dec = Angle('30:00:00 degrees') + # ra = Angle(180, unit=units.deg) + # dec = Angle(35, unit=units.deg) + ra = Angle("10:44:00.0 hours") + dec = Angle("30:00:00 degrees") print(ra, dec) print(ra.deg, dec.deg) @@ -153,11 +166,11 @@ def params_default(): """ p_def = cfis.param( - input = '.', - input_format = 'full', - mode = 'c', - band = 'r', - image_type = 'tile', + input=".", + input_format="full", + mode="c", + band="r", + image_type="tile", ) return p_def @@ -179,53 +192,147 @@ def parse_options(p_def): Command line string """ - usage = "%prog [OPTIONS]" + usage = "%prog [OPTIONS]" parser = OptionParser(usage=usage) # I/O - parser.add_option('-i', '--input', dest='input', type='string', default=p_def.input, - help='input image list, can be ascii file or directory path') - parser.add_option('-c', '--column', dest='col', type='string', default=None, - help='column name if input is file, default=file has only one column)') - parser.add_option('', '--input_format', dest='input_format', type='string', - default=p_def.input_format, - help='input format, one of \'full\', \'ID_only\', default=\'{}\''.format(p_def.input_format)) - parser.add_option('-o', '--outbase', dest='outbase', type='string', default=None, - help='output file name base (\'.txt\' is added), default=stdout') - parser.add_option('', '--plot', dest='plot', action='store_true', - help='create plots') - parser.add_option('', '--out_base_name', dest='out_base_name', action='store_true', - help='output base names, not entire path if input is directory') - parser.add_option('', '--out_name_only', dest='out_name_only', action='store_true', - help='output only file names, not coordinates and metainfo') - parser.add_option('', '--out_ID_only', dest='out_ID_only', action='store_true', - help='output only file IDs, not full file names') - parser.add_option('', '--interactive', dest='interactive', action='store_true', - help='interactive mode (showing plots, recommended for call from jupyer notebook)') - parser.add_option('-s', '--short', dest='short', action='store_true', help='short output') + parser.add_option( + "-i", + "--input", + dest="input", + type="string", + default=p_def.input, + help="input image list, can be ascii file or directory path", + ) + parser.add_option( + "-c", + "--column", + dest="col", + type="string", + default=None, + help="column name if input is file, default=file has only one column)", + ) + parser.add_option( + "", + "--input_format", + dest="input_format", + type="string", + default=p_def.input_format, + help="input format, one of 'full', 'ID_only', default='{}'".format( + p_def.input_format + ), + ) + parser.add_option( + "-o", + "--outbase", + dest="outbase", + type="string", + default=None, + help="output file name base ('.txt' is added), default=stdout", + ) + parser.add_option( + "", "--plot", dest="plot", action="store_true", help="create plots" + ) + parser.add_option( + "", + "--out_base_name", + dest="out_base_name", + action="store_true", + help="output base names, not entire path if input is directory", + ) + parser.add_option( + "", + "--out_name_only", + dest="out_name_only", + action="store_true", + help="output only file names, not coordinates and metainfo", + ) + parser.add_option( + "", + "--out_ID_only", + dest="out_ID_only", + action="store_true", + help="output only file IDs, not full file names", + ) + parser.add_option( + "", + "--interactive", + dest="interactive", + action="store_true", + help="interactive mode (showing plots, recommended for call from jupyer notebook)", + ) + parser.add_option( + "-s", "--short", dest="short", action="store_true", help="short output" + ) # Job control - parser.add_option('', '--no_cuts', dest='no_cuts', action='store_true', - help='output all exposures, no cuts (default: cut short and invalid exposures)') + parser.add_option( + "", + "--no_cuts", + dest="no_cuts", + action="store_true", + help="output all exposures, no cuts (default: cut short and invalid exposures)", + ) # Field and image options - parser.add_option('-b', '--band', dest='band', type='string', default=p_def.band, - help='band, one of \'r\' (default)|\'u\'') - parser.add_option('-t', '--type', dest='image_type', type='string', default=p_def.image_type, - help='image type, one of \'tile\' (default)|\'weight\'|\'weight.fz\'|\'exposure\'|\'exposure_weight\'' - '|\'exposure_weight.fz\'|\'exposure_flag\'|\'exposure_flag.fz\'|\'cat\'') - - parser.add_option('', '--coord', dest='coord', type='string', default=None, - help='(white-space or \'_\' separated) string of input coordinates, as astropy.coordinates.Angle') - parser.add_option('', '--number', dest='number', type='string', default=None, - help='input image number') - parser.add_option('', '--area', dest='area', type='string', default=None, - help='area corner coordinates ra0_dec0_ra1_dec1') - parser.add_option('', '--tile', dest='tile', action='store_true', - help='return exposures used in input tile(s)') + parser.add_option( + "-b", + "--band", + dest="band", + type="string", + default=p_def.band, + help="band, one of 'r' (default)|'u'", + ) + parser.add_option( + "-t", + "--type", + dest="image_type", + type="string", + default=p_def.image_type, + help="image type, one of 'tile' (default)|'weight'|'weight.fz'|'exposure'|'exposure_weight'" + "|'exposure_weight.fz'|'exposure_flag'|'exposure_flag.fz'|'cat'", + ) + + parser.add_option( + "", + "--coord", + dest="coord", + type="string", + default=None, + help="(white-space or '_' separated) string of input coordinates, as astropy.coordinates.Angle", + ) + parser.add_option( + "", + "--number", + dest="number", + type="string", + default=None, + help="input image number", + ) + parser.add_option( + "", + "--area", + dest="area", + type="string", + default=None, + help="area corner coordinates ra0_dec0_ra1_dec1", + ) + parser.add_option( + "", + "--tile", + dest="tile", + action="store_true", + help="return exposures used in input tile(s)", + ) # Monitoring - parser.add_option('-v', '--verbose', dest='verbose', action='store_true', help='verbose output') + parser.add_option( + "-v", + "--verbose", + dest="verbose", + action="store_true", + help="verbose output", + ) options, args = parser.parse_args() @@ -246,34 +353,51 @@ def check_options(options): Result of option check. False if invalid option value. """ - if int(options.number != None) + int(options.coord != None) \ - + int(options.area != None) + int(options.tile != None) > 1: - raise cfis.CfisError('Only one option out of \'--number\', \'--coord\', \'--area\', \'--tile\' can be given') - - if options.image_type != 'exposure' and options.no_cuts == True: - raise cfis.CfisError('option \'--no_cuts\' only possible for image_type=exposure') - - if options.input in ['{}.txt'.format(options.outbase), '{}.pdf',format(options.outbase)]: - raise cfis.CfisError('Output base same as input, latter will be overwritten!') - - if options.input_format not in ['full', 'ID_only']: - raise cfis.CfisError('input_format needs to be one of \'fulll\', \'ID_only\'') - - see_help = 'See option \'-h\' for help.' + if ( + int(options.number != None) + + int(options.coord != None) + + int(options.area != None) + + int(options.tile != None) + > 1 + ): + raise cfis.CfisError( + "Only one option out of '--number', '--coord', '--area', '--tile' can be given" + ) + + if options.image_type != "exposure" and options.no_cuts == True: + raise cfis.CfisError( + "option '--no_cuts' only possible for image_type=exposure" + ) + + if options.input in [ + "{}.txt".format(options.outbase), + "{}.pdf", + format(options.outbase), + ]: + raise cfis.CfisError( + "Output base same as input, latter will be overwritten!" + ) + + if options.input_format not in ["full", "ID_only"]: + raise cfis.CfisError( + "input_format needs to be one of 'fulll', 'ID_only'" + ) + + see_help = "See option '-h' for help." return True def update_param(p_def, options): """Return default parameter, updated and complemented according to options. - + Parameters ---------- p_def: class param parameter values optiosn: tuple command line options - + Returns ------- param: class param @@ -294,7 +418,7 @@ def update_param(p_def, options): # Do extra stuff if necessary if param.outbase is not None: - param.fout = open('{}.txt'.format(param.outbase), 'w') + param.fout = open("{}.txt".format(param.outbase), "w") else: param.fout = sys.stdout @@ -323,70 +447,117 @@ def run_mode(images, param): if param.coord: # Image number search: Return name of image(s) covering input coordinate - images_found = cfis.find_image_at_coord(images, param.coord, param.band, param.image_type, - no_cuts=param.no_cuts, input_format=param.input_format, - verbose=param.verbose) + images_found = cfis.find_image_at_coord( + images, + param.coord, + param.band, + param.image_type, + no_cuts=param.no_cuts, + input_format=param.input_format, + verbose=param.verbose, + ) if len(images_found) > 0: if not param.short: images_found[0].print_header(file=param.fout) for img in images_found: - img.print(file=param.fout, base_name=param.out_base_name, name_only=param.out_name_only, ID_only=param.out_ID_only) + img.print( + file=param.fout, + base_name=param.out_base_name, + name_only=param.out_name_only, + ID_only=param.out_ID_only, + ) ex = 0 elif param.number: # Coordinate search: Return coordinate covered by image with input number/file name - img_found = get_coord_at_image(param.number, param.band, param.image_type, images, no_cuts=param.no_cuts, verbose=param.verbose) + img_found = get_coord_at_image( + param.number, + param.band, + param.image_type, + images, + no_cuts=param.no_cuts, + verbose=param.verbose, + ) if img_found != None: if not param.short: img_found.print_header(file=param.fout) - img_found.print(file=param.fout, base_name=param.out_base_name, name_only=param.out_name_only, ID_only=param.out_ID_only) + img_found.print( + file=param.fout, + base_name=param.out_base_name, + name_only=param.out_name_only, + ID_only=param.out_ID_only, + ) ex = 0 else: if param.verbose: - print('No image found, try with --no_cuts', file=sys.stderr) + print("No image found, try with --no_cuts", file=sys.stderr) elif param.area: # Area search: Return images within input area angles = cfis.get_Angle_arr(param.area, num=4, verbose=param.verbose) - images_found = cfis.find_images_in_area(images, angles, param.band, param.image_type, no_cuts=param.no_cuts, verbose=param.verbose) + images_found = cfis.find_images_in_area( + images, + angles, + param.band, + param.image_type, + no_cuts=param.no_cuts, + verbose=param.verbose, + ) if len(images_found) > 0: if not param.short: images_found[0].print_header(file=param.fout) for img in images_found: - img.print(file=param.fout, base_name=param.out_base_name, name_only=param.out_name_only, ID_only=param.out_ID_only) + img.print( + file=param.fout, + base_name=param.out_base_name, + name_only=param.out_name_only, + ID_only=param.out_ID_only, + ) if param.plot == True: if param.verbose == True: - print('Creating plots') - ra_c, dec_c, radius = cfis.plot_area(images_found, angles, param.image_type, param.outbase, param.interactive, show_numbers=True) + print("Creating plots") + ra_c, dec_c, radius = cfis.plot_area( + images_found, + angles, + param.image_type, + param.outbase, + param.interactive, + show_numbers=True, + ) if param.verbose: - print('RA_c[deg] DEC_c[deg] radius[argmin] = {:.2f} {:.2f} {:.2f}'.format(ra_c.deg, dec_c.deg, radius*60)) + print( + "RA_c[deg] DEC_c[deg] radius[argmin] = {:.2f} {:.2f} {:.2f}".format( + ra_c.deg, dec_c.deg, radius * 60 + ) + ) ex = 0 elif param.tile: # Search exposures used in input tile(s) - images_found = get_images_used_in_tiles(images, param.band, param.image_type) + images_found = get_images_used_in_tiles( + images, param.band, param.image_type + ) if len(images_found) > 0: for img in images_found: print(img, file=param.fout) ex = 0 - else: - raise cfis.CfisError('One of \'--coord\', \'--number\', ' - '\'--area\', \'--tile\' needs to be specified') + raise cfis.CfisError( + "One of '--coord', '--number', " + "'--area', '--tile' needs to be specified" + ) return ex def main(argv=None): - """Main program. - """ + """Main program.""" - # Set default parameters p_def = params_default() @@ -399,54 +570,57 @@ def main(argv=None): param = update_param(p_def, options) - # Save calling command cfis.log_command(argv) if param.verbose: - cfis.log_command(argv, name='sys.stdout') - + cfis.log_command(argv, name="sys.stdout") if param.verbose and not param.short: - print('Start of program {}'.format(os.path.basename(argv[0]))) - + print("Start of program {}".format(os.path.basename(argv[0]))) ### Start main program ### if param.tile: # For search of exposures in tiles, image list from directory needs to be tiles - image_type = 'tile' + image_type = "tile" else: image_type = param.image_type - images = cfis.get_image_list(param.input, param.band, image_type, col=param.col, - input_format=param.input_format, verbose=param.verbose) - + images = cfis.get_image_list( + param.input, + param.band, + image_type, + col=param.col, + input_format=param.input_format, + verbose=param.verbose, + ) # Check wether images have been found, if necessary if param.number: if images is None: - raise cfis.CfisError('Input list file \'{}\' not found, neither ' - 'existing file nor directory'.format(param.input)) + raise cfis.CfisError( + "Input list file '{}' not found, neither " + "existing file nor directory".format(param.input) + ) if len(images) == 0: - raise cfis.CfisError('No corresponding image files found in input \'{}\''.format(param.input)) - + raise cfis.CfisError( + "No corresponding image files found in input '{}'".format( + param.input + ) + ) # Run ex = run_mode(images, param) - if param.outbase is not None: param.fout.close() - ### End main program if param.verbose and not param.short: - print('End of program {}'.format(os.path.basename(argv[0]))) + print("End of program {}".format(os.path.basename(argv[0]))) return ex - if __name__ == "__main__": sys.exit(main(sys.argv)) - diff --git a/scripts/python/convert_psf_pix2world.py b/scripts/python/convert_psf_pix2world.py new file mode 100755 index 000000000..dea99656b --- /dev/null +++ b/scripts/python/convert_psf_pix2world.py @@ -0,0 +1,826 @@ +#! /usr/bin/env python3 + +import sys +import os +import re +import glob +from tqdm import tqdm +from joblib import Parallel, delayed +import gc + +import numpy as np +from astropy.io import fits +import galsim + +from cs_util import args as cs_args +from cs_util import logging + + +def transform_shape(mom_list, jac): + """Transform Shape. + + Transform shape (ellipticity and size) using a Jacobian. + + Parameters + ---------- + mom_list : list + input moment measurements; each list element contains + first and second ellipticity component and size + jac : galsim.JacobianWCS + Jacobian transformation matrix information + + Returns + ------- + list + transformed shape parameters, which are + first and second ellipticity component and size + + """ + scale, shear, theta, flip = jac.getDecomposition() + + sig_tmp = mom_list[2] * scale + shape = galsim.Shear(g1=mom_list[0], g2=mom_list[1]) + if flip: + # The following output is not observed + print("FLIP!") + shape = galsim.Shear(g1=-shape.g1, g2=shape.g2) + shape = galsim.Shear(g=shape.g, beta=shape.beta + theta) + shape = shear + shape + + return shape.g1, shape.g2, sig_tmp + + +class Loc2Glob(object): + r"""Change from local to global coordinates. + + Class to pass from local coordinates to global coordinates under + CFIS (CFHT) MegaCam instrument. The geometrical informcation of the + instrument is encoded in this function. + + Parameters + ---------- + x_gap : int + Gap between the CCDs along the horizontal direction; + default is ``70`` (MegaCam value) + y_gap : int + Gap between the CCDs along the vertical direction; + Default is ``425`` (MegaCam value) + x_npix : int + Number of pixels per CCD along the horizontal direction; + default is ``2048`` (MegaCam value) + y_npix : int + Number of pixels per CCD along the vertical direction; + default to ``4612`` (MegaCam value) + ccd_tot : int + Total number of CCDs; + default to ``40`` (MegaCam value) + + Notes + ----- + This is the geometry of MegaCam. Watch out with the conventions ba,ab that means where + is the local coordinate system origin for each CCD. + For more info check out MegaCam's instrument webpage. + + Examples + -------- + 'COMMENT (North on top, East to the left)', + 'COMMENT --------------------------', + 'COMMENT ba ba ba ba ba ba ba ba ba', + 'COMMENT 00 01 02 03 04 05 06 07 08', + 'COMMENT --------------------------------', + 'COMMENT ba ba ba ba ba ba ba ba ba ba ba', + 'COMMENT 36 09 10 11 12 13 14 15 16 17 37', + 'COMMENT --------------*-----------------', + 'COMMENT 38 18 19 20 21 22 23 24 25 26 39', + 'COMMENT ab ab ab ab ab ab ab ab ab ab ab', + 'COMMENT --------------------------------', + 'COMMENT 27 28 29 30 31 32 33 34 35', + 'COMMENT ab ab ab ab ab ab ab ab ab', + 'COMMENT __________________________' + """ + + def __init__( + self, x_gap=70, y_gap=425, x_npix=2048, y_npix=4612, ccd_tot=40 + ): + r"""Initialize with instrument geometry.""" + self.x_gap = x_gap + self.y_gap = y_gap + self.x_npix = x_npix + self.y_npix = y_npix + self.ccd_tot = ccd_tot + + def loc2glob_img_coord(self, ccd_n, x_coor, y_coor): + """loc2glob Img Coord. + + Go from the local to the global img (pixel) coordinate system. + + Global system with (0,0) in the intersection of ccds [12,13,21,22]. + + Parameters + ---------- + ccd_n: int + CCD number of the considered positions + x_coor: float + Local coordinate system hotizontal value + y_coor: float + Local coordinate system vertical value + + Returns + ------- + glob_x_coor: float + Horizontal position in global coordinate system + glob_y_coor: float + Vertical position in global coordinate system + + """ + # Flip axes + x_coor, y_coor = self.flip_coord(ccd_n, x_coor, y_coor) + + # Calculate the shift + x_shift, y_shift = self.shift_coord(ccd_n) + + # Return new coordinates + return x_coor + x_shift, y_coor + y_shift + + def flip_coord(self, ccd_n, x_coor, y_coor): + r"""Change of coordinate convention. + + So that all of them are coherent on the global coordinate system. + So that the origin is on the south-west corner. + Positive: South to North ; West to East. + """ + if ccd_n < 18 or ccd_n in [36, 37]: + x_coor = self.x_npix - x_coor + 1 + y_coor = self.y_npix - y_coor + 1 + else: + pass + + return x_coor, y_coor + + def x_coord_range(self): + r"""Return range of the x coordinate.""" + max_x = self.x_npix * 6 + self.x_gap * 5 + min_x = self.x_npix * (-5) + self.x_gap * (-5) + return min_x, max_x + + def y_coord_range(self): + r"""Return range of the y coordinate.""" + max_y = self.y_npix * 2 + self.y_gap * 1 + min_y = self.y_npix * (-2) + self.y_gap * (-2) + return min_y, max_y + + def shift_coord(self, ccd_n): + r"""Provide the shifting. + + It is needed to go from the local coordinate + system origin to the global coordinate system origin. + """ + if ccd_n < 9: + # first row + x_shift = (ccd_n - 4) * (self.x_gap + self.x_npix) + y_shift = self.y_gap + self.y_npix + return x_shift, y_shift + + elif ccd_n < 18: + # second row, non-ears + x_shift = (ccd_n - 13) * (self.x_gap + self.x_npix) + y_shift = 0.0 + return x_shift, y_shift + + elif ccd_n < 27: + # third row non-ears + x_shift = (ccd_n - 22) * (self.x_gap + self.x_npix) + y_shift = -1.0 * (self.y_gap + self.y_npix) + return x_shift, y_shift + + elif ccd_n < 36: + # fourth row + x_shift = (ccd_n - 31) * (self.x_gap + self.x_npix) + y_shift = -2.0 * (self.y_gap + self.y_npix) + return x_shift, y_shift + + elif ccd_n < 37: + # ccd= 36 ears, second row + x_shift = (-5.0) * (self.x_gap + self.x_npix) + y_shift = 0.0 + return x_shift, y_shift + + elif ccd_n < 38: + # ccd= 37 ears, second row + x_shift = 5.0 * (self.x_gap + self.x_npix) + y_shift = 0.0 + return x_shift, y_shift + + elif ccd_n < 39: + # ccd= 38 ears, third row + x_shift = (-5.0) * (self.x_gap + self.x_npix) + y_shift = -1.0 * (self.y_gap + self.y_npix) + return x_shift, y_shift + + elif ccd_n < 40: + # ccd= 39 ears, third row + x_shift = 5.0 * (self.x_gap + self.x_npix) + y_shift = -1.0 * (self.y_gap + self.y_npix) + return x_shift, y_shift + + +class Glob2CCD(object): + r"""Get the CCD ID number from the global coordinate position. + + The Loc2Glob() object as input is the one that defines the instrument's + geometry. + + Parameters + ---------- + loc2glob: Loc2Glob object + Object with the desired focal plane geometry. + with_gaps: bool + If add the gaps to the CCD area. + """ + + def __init__(self, loc2glob, with_gaps=True): + # Save loc2glob object + self.loc2glob = loc2glob + self.with_gaps = with_gaps + self.ccd_list = np.arange(self.loc2glob.ccd_tot) + # Init edges defininf the CCDs + self.edge_x_list, self.edge_y_list = self.build_all_edges() + + def build_all_edges(self): + """Build the edges for all the CCDs in the focal plane.""" + edge_xy_list = [] + for idx in (0, 1): + edge_list = np.array( + [self.build_edge(ccd_n)[idx] for ccd_n in self.ccd_list] + ) + edge_xy_list.append(edge_list) + + return edge_xy_list + + def build_edge(self, ccd_n): + """Build the edges of the `ccd_n` in global coordinates.""" + if self.with_gaps: + corners = np.array( + [ + [-self.loc2glob.x_gap / 2, -self.loc2glob.y_gap / 2], + [ + self.loc2glob.x_npix + self.loc2glob.x_gap / 2, + -self.loc2glob.y_gap / 2, + ], + [ + -self.loc2glob.x_gap / 2, + self.loc2glob.y_npix + self.loc2glob.y_gap / 2, + ], + [ + self.loc2glob.x_npix + self.loc2glob.x_gap / 2, + self.loc2glob.y_npix + self.loc2glob.y_gap / 2, + ], + ] + ) + else: + corners = np.array( + [ + [0, 0], + [self.loc2glob.x_npix, 0], + [0, self.loc2glob.y_npix], + [self.loc2glob.x_npix, self.loc2glob.y_npix], + ] + ) + + glob_corners = np.array( + [ + self.loc2glob.loc2glob_img_coord(ccd_n, pos[0], pos[1]) + for pos in corners + ] + ) + + edge_xy = [] + for idx in (0, 1): + edge = np.array( + [np.min(glob_corners[:, idx]), np.max(glob_corners[:, idx])] + ) + edge_xy.append(edge) + + return edge_xy + + def is_inside(self, x, y, edge_x, edge_y): + """Is the position inside the edges. + + Return True if the position is within the rectangle + defined by the edges. + + Parameters + ---------- + x: float + Horizontal position in global coordinate system. + y: float + Vertical position in global coordinate system. + edge_x: np.ndarray + Edge defined as `np.array([min_x, max_x])`. + edge_y: np.ndarray + Edge defined as `np.array([min_y, max_y])`. + """ + if ( + (x > edge_x[0]) + and (x < edge_x[1]) + and (y > edge_y[0]) + and (y < edge_y[1]) + ): + return True + else: + return False + + def get_ccd_n(self, x, y): + """Returns the CCD number from the position `(x, y)`. + + Returns `None` if the position is not found. + """ + bool_list = np.array( + [ + self.is_inside(x, y, edge_x, edge_y) + for edge_x, edge_y in zip(self.edge_x_list, self.edge_y_list) + ] + ) + + try: + return self.ccd_list[bool_list][0] + except Exception: + return None + + +class Convert(object): + + def __init__(self): + + self.params_default() + + def set_params_from_command_line(self, args): + """Set Params From Command line. + + Only use when calling using python from command line. + Does not work from ipython or jupyter. + + """ + # Read command line options + options = cs_args.parse_options( + self._params, + self._short_options, + self._types, + self._help_strings, + ) + self._params = options + + # Save calling command + logging.log_command(args) + + def params_default(self): + + self._params = { + "input_base_dir": ".", + "output_base_dir": ".", + "mode": "merge", + "patches": "", + "psf": "psfex", + "file_pattern_psfint": "validation_psf", + } + + self._short_options = { + "input_base_dir": "-i", + "mode": "-m", + "psf": "-p", + "patches": "-P", + } + + self._types = {} + + self._help_strings = { + "input_base_dir": ( + "input base dir, runs are expected in" + + " /P/output;" + " default is {}" + ), + "mode": ( + "run mode, allowed are 'merge', 'test'; default is" + " '{}'" + ), + "psf": "PSF model, allowed are 'psfex' and 'mccd'; default is {}", + "patches": "(list of) input patches", + } + + # Output column names with types + self._dt = [ + ("X", float), + ("Y", float), + ("RA", float), + ("DEC", float), + ("E1_PSF_HSM", float), + ("E2_PSF_HSM", float), + ("SIGMA_PSF_HSM", float), + ("FLAG_PSF_HSM", float), + ("E1_STAR_HSM", float), + ("E2_STAR_HSM", float), + ("SIGMA_STAR_HSM", float), + ("FLAG_STAR_HSM", float), + ("CCD_NB", int), + ] + + # Extra columns for MCCD:737 + self._dt_mccd = self._dt.copy() + self._dt_mccd.append(("GLOB_X", float)) + self._dt_mccd.append(("GLOB_Y", float)) + + def update_params(self): + """Update Params. + + Update parameters. + + """ + if self._params["psf"] == "psfex": + #self._params["sub_dir_pattern"] = "run_sp_exp_202" + self._params["sub_dir_pattern"] = "run_sp_combined_psf" + self._params["sub_dir_psfint"] = "psfex_interp_runner" + elif self._params["psf"] == "mccd": + self._params["sub_dir_pattern"] = "run_sp_exp_SxSePsf_202" + self._params["sub_dir_psfint"] = "mccd_fit_val_runner" + self._params["sub_dir_setools"] = "setools_runner/output/mask" + else: + raise ValueError(f"Invalid PSF model {self._params['psf']}") + self._params["sub_dir_psfint"] = ( + f"{self._params['sub_dir_psfint']}/output" + ) + + def run(self): + """Run. + + Main processing function. + + """ + if self._params["mode"] == "test": + patch_nums = ["3", "4"] + else: + patch_nums = cs_args.my_string_split(self._params["patches"]) + + do_parallel = True + + # Loop over patches + for patch in patch_nums: + + output_dir = f"{self._params['output_base_dir']}/P{patch}" + if not os.path.isdir(output_dir): + os.makedirs(output_dir, exist_ok=False) + + print("Running patch:", patch) + + patch_dir = f"{self._params['input_base_dir']}/P{patch}/output/" + subdirs = f"{patch_dir}/{self._params['sub_dir_pattern']}*" + exp_run_dirs = glob.glob(subdirs) + n_exp_runs = len(exp_run_dirs) + print( + f"Found {n_exp_runs} input single-exposure run(s) for patch" + + f" {patch_dir} ({subdirs})" + ) + + if self._params["mode"] == "test": + exp_run_dirs = exp_run_dirs[:2] + n_exp_runs = len(exp_run_dirs) + print( + f"test mode: only using {n_exp_runs} input single-exposure" + + f" runs" + ) + + # Loop over exposure runs + if not do_parallel: + for idx_exp, exp_run_dir in tqdm( + enumerate(exp_run_dirs), + total=n_exp_runs, + disable=self._params["verbose"], + ): + self.transform_exposures( + output_dir, patch, idx_exp, exp_run_dir + ) + else: + res = Parallel(n_jobs=-1, backend="loky")( + delayed(self.transform_exposures)( + output_dir, patch, idx_exp, exp_run_dir + ) + for idx_exp, exp_run_dir in tqdm( + enumerate(exp_run_dirs), + total=n_exp_runs, + disable=self._params["verbose"], + ) + ) + + def transform_exposures(self, output_dir, patch, idx, exp_run_dir): + """Transform exposures. + + Transform shapes for exposure for a given run (input exp run dir). + + """ + output_path = ( + f"{output_dir}/{self._params['file_pattern_psfint']}_conv" + + f"-{patch}-{idx}.fits" + ) + if os.path.exists(output_path): + print(f"Skipping transform_exposures, file {output_path} exists") + return + + psf_dir = f"{exp_run_dir}/{self._params['sub_dir_psfint']}" + try: + all_files = os.listdir(psf_dir) + if self._params["verbose"]: + print(f"Found {len(all_files)} file(s) in {psf_dir}") + except Exception: + if self._params["verbose"]: + print(f"Found zero PSFEx files in {psf_dir}, skipping") + return + + cat_list = [] + for file_name in all_files: + if self._params["file_pattern_psfint"] not in file_name: + continue + + tmp = re.findall(r"\d+", file_name) + + if self._params["psf"] == "psfex": + exp_name, ccd_id = int(tmp[0]), int(tmp[1]) + elif self._params["psf"] == "mccd": + exp_name = int(tmp[0]) + ccd_id = -1 + + if self._params["verbose"]: + print("Match found ", exp_name, ccd_id) + + psf_file_path = f"{psf_dir}/{file_name}" + + try: + if self._params["psf"] == "psfex": + psf_file_hdus = fits.open(psf_file_path, memmap=False) + psf_file = psf_file_hdus[2].data + header_file = psf_file_hdus[1].data + psf_file_hdus.close() + mod = "RA" + else: + psf_file = fits.getdata(psf_file_path, 1, memmap=True) + mod = "RA_LIST" + except Exception: + continue + + new_e1_psf = np.zeros_like(psf_file[mod]) + new_e2_psf = np.zeros_like(psf_file[mod]) + new_sig_psf = np.zeros_like(psf_file[mod]) + new_e1_star = np.zeros_like(psf_file[mod]) + new_e2_star = np.zeros_like(psf_file[mod]) + new_sig_star = np.zeros_like(psf_file[mod]) + + if self._params["psf"] == "psfex": + header = fits.Header.fromstring( + "\n".join(header_file[0][0]), sep="\n" + ) + wcs = galsim.AstropyWCS(header=header) + + k = 0 + for ind, obj in enumerate(psf_file): + try: + # jac = wcs.jacobian(world_pos=galsim.CelestialCoord( + # ra=obj["RA"]*galsim.degrees, + # dec=obj["DEC"]*galsim.degrees + # )) + jac = wcs.jacobian( + image_pos=galsim.PositionD( + obj["X"], + obj["Y"], + ) + ) + except Exception: + continue + g1_psf_tmp, g2_psf_tmp, sig_psf_tmp = transform_shape( + [ + obj["E1_PSF_HSM"], + obj["E2_PSF_HSM"], + obj["SIGMA_PSF_HSM"], + ], + jac, + ) + + new_e1_psf[ind] = g1_psf_tmp + new_e2_psf[ind] = g2_psf_tmp + new_sig_psf[ind] = sig_psf_tmp + + g1_star_tmp, g2_star_tmp, sig_star_tmp = transform_shape( + [ + obj["E1_STAR_HSM"], + obj["E2_STAR_HSM"], + obj["SIGMA_STAR_HSM"], + ], + jac, + ) + new_e1_star[ind] = g1_star_tmp + new_e2_star[ind] = g2_star_tmp + new_sig_star[ind] = sig_star_tmp + k += 1 + + exp_cat = np.array( + list( + map( + tuple, + np.array( + [ + psf_file["X"], + psf_file["Y"], + psf_file["RA"], + psf_file["DEC"], + new_e1_psf, + new_e2_psf, + new_sig_psf, + psf_file["FLAG_PSF_HSM"], + new_e1_star, + new_e2_star, + new_sig_star, + psf_file["FLAG_STAR_HSM"], + np.ones_like(psf_file["RA"], dtype=int) + * ccd_id, + ] + ).T.tolist(), + ) + ), + dtype=self._dt, + ) + cat_list.append(exp_cat) + + else: + l2g = Loc2Glob() + g2c = Glob2CCD(l2g) + new_ccd_id = np.array( + [ + int( + g2c.get_ccd_n( + psf_file["GLOB_POSITION_IMG_LIST"][ii, 0], + psf_file["GLOB_POSITION_IMG_LIST"][ii, 1], + ) + ) + for ii in range(len(psf_file)) + ] + ) + + new_x = np.zeros_like(psf_file[mod]) + new_y = np.zeros_like(psf_file[mod]) + new_flag_psf = np.zeros_like(psf_file[mod]) + new_flag_star = np.zeros_like(psf_file[mod]) + for ccd_id in range(40): + m_ccd_id = new_ccd_id == ccd_id + if sum(m_ccd_id) == 0: + continue + + x_shift, y_shift = l2g.shift_coord(ccd_id) + + new_x[m_ccd_id] = ( + psf_file["GLOB_POSITION_IMG_LIST"][:, 0][m_ccd_id] + - x_shift + ) + new_y[m_ccd_id] = ( + psf_file["GLOB_POSITION_IMG_LIST"][:, 1][m_ccd_id] + - y_shift + ) + + header_file_path = ( + self._params["sub_dir_setools"] + + self._params["file_pattern_psfint"] + + f"{exp_name}-{ccd_id}.fits" + ) + try: + header_file = fits.getdata(header_file_path, 1) + except Exception: + continue + header = fits.Header.fromstring( + "\n".join(header_file[0][0]), sep="\n" + ) + wcs = galsim.AstropyWCS(header=header) + + g1_psf_tmp_l = [] + g2_psf_tmp_l = [] + sig_psf_tmp_l = [] + g1_star_tmp_l = [] + g2_star_tmp_l = [] + sig_star_tmp_l = [] + flag_psf_tmp_l = [] + flag_star_tmp_l = [] + + for obj in psf_file[m_ccd_id]: + try: + jac = wcs.jacobian( + world_pos=galsim.CelestialCoord( + ra=obj["RA_LIST"] * galsim.degrees, + dec=obj["DEC_LIST"] * galsim.degrees, + ) + ) + except Exception: + flag_star_tmp_l.append(16) + flag_psf_tmp_l.append(16) + g1_psf_tmp_l.append(0) + g2_psf_tmp_l.append(0) + sig_psf_tmp_l.append(0) + g1_star_tmp_l.append(0) + g2_star_tmp_l.append(0) + sig_star_tmp_l.append(0) + continue + g1_psf_tmp, g2_psf_tmp, sig_psf_tmp = transform_shape( + obj["PSF_MOM_LIST"], jac + ) + + g1_psf_tmp_l.append(g1_psf_tmp) + g2_psf_tmp_l.append(g2_psf_tmp) + sig_psf_tmp_l.append(sig_psf_tmp) + flag_psf_tmp_l.append(obj["PSF_MOM_LIST"][3]) + + g1_star_tmp, g2_star_tmp, sig_star_tmp = ( + transform_shape(obj["STAR_MOM_LIST"], jac) + ) + g1_star_tmp_l.append(g1_star_tmp) + g2_star_tmp_l.append(g2_star_tmp) + sig_star_tmp_l.append(sig_star_tmp) + flag_star_tmp_l.append(obj["STAR_MOM_LIST"][3]) + + new_e1_psf[m_ccd_id] = g1_psf_tmp_l + new_e2_psf[m_ccd_id] = g2_psf_tmp_l + new_sig_psf[m_ccd_id] = sig_psf_tmp_l + new_flag_psf[m_ccd_id] = flag_psf_tmp_l + new_e1_star[m_ccd_id] = g1_star_tmp_l + new_e2_star[m_ccd_id] = g2_star_tmp_l + new_sig_star[m_ccd_id] = sig_star_tmp_l + new_flag_star[m_ccd_id] = flag_star_tmp_l + + exp_cat = np.array( + list( + map( + tuple, + np.array( + [ + new_x, + new_y, + psf_file["RA_LIST"], + psf_file["DEC_LIST"], + new_e1_psf, + new_e2_psf, + new_sig_psf, + psf_file["PSF_MOM_LIST"][:, 3], + new_e1_star, + new_e2_star, + new_sig_star, + psf_file["STAR_MOM_LIST"][:, 3], + new_ccd_id, + psf_file["GLOB_POSITION_IMG_LIST"][:, 0], + psf_file["GLOB_POSITION_IMG_LIST"][:, 1], + ] + ).T.tolist(), + ) + ), + dtype=self._dt_mccd, + ) + cat_list.append(exp_cat) + + del psf_file + + if len(cat_list) == 0: + return + + # Finalize catalogue + patch_cat = np.concatenate(cat_list) + hdul = fits.HDUList() + hdul.append(fits.PrimaryHDU()) + hdul.append(fits.BinTableHDU(patch_cat)) + + # Write catalogue + hdul.writeto( + output_path, + overwrite=True, + ) + + del cat_list + del hdul + gc.collect() + + +def run_convert(*args): + + # Create instance + obj = Convert() + + obj.set_params_from_command_line(args) + obj.update_params() + + obj.run() + + +def main(argv=None): + """Main + + Main program + """ + if argv is None: + argv = sys.argv[1:] + run_convert(*argv) + + return 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv)) diff --git a/scripts/python/create_sample_results.py b/scripts/python/create_sample_results.py index 25e00ec39..0e0223ffe 100755 --- a/scripts/python/create_sample_results.py +++ b/scripts/python/create_sample_results.py @@ -34,9 +34,7 @@ def params_default(): parameter values """ - p_def = cfis.param( - psf = 'mccd' - ) + p_def = cfis.param(psf="mccd") return p_def @@ -57,49 +55,49 @@ def parse_options(p_def): Command line string """ - usage = "%prog [OPTIONS]" + usage = "%prog [OPTIONS]" parser = OptionParser(usage=usage) # I/O parser.add_option( - '', - '--input_IDs', - dest='input_IDs', - type='string', - help='input tile ID file specifying sample' + "", + "--input_IDs", + dest="input_IDs", + type="string", + help="input tile ID file specifying sample", ) parser.add_option( - '-i', - '--input_dir', - dest='input_dir', - type='string', - help='input directory name' + "-i", + "--input_dir", + dest="input_dir", + type="string", + help="input directory name", ) parser.add_option( - '-o', - '--output_dir', - dest='output_dir', - type='string', - help='output directory name' + "-o", + "--output_dir", + dest="output_dir", + type="string", + help="output directory name", ) # Misc parser.add_option( - '-p', - '--psf', - dest='psf', - type='string', + "-p", + "--psf", + dest="psf", + type="string", default=p_def.psf, - help=f'PSF model, one in [\'psfex\'|\'mccd\'], default=\'{p_def.psf}\'' + help=f"PSF model, one in ['psfex'|'mccd'], default='{p_def.psf}'", ) # Control parser.add_option( - '-v', - '--verbose', - dest='verbose', - action='store_true', - help='verbose output' + "-v", + "--verbose", + dest="verbose", + action="store_true", + help="verbose output", ) options, args = parser.parse_args() @@ -122,13 +120,13 @@ def check_options(options): """ if options.input_IDs is None: - print('No input ID file list given (option \'--input_IDs\')') + print("No input ID file list given (option '--input_IDs')") return False if options.input_dir is None: - print('No input directory name given (option \'--input_dir\')') + print("No input directory name given (option '--input_dir')") return False if options.output_dir is None: - print('No output directory name given (option \'--output_dir\')') + print("No output directory name given (option '--output_dir')") return False return True @@ -184,7 +182,7 @@ def read_ID_list(input_ID_path, verbose=False): """ if verbose: - print('Reading input ID list...') + print("Reading input ID list...") input_IDs = [] with open(input_ID_path) as f: @@ -192,12 +190,14 @@ def read_ID_list(input_ID_path, verbose=False): input_IDs.append(line.rstrip()) if verbose: - print('{} IDs found in input file'.format(len(input_IDs))) + print("{} IDs found in input file".format(len(input_IDs))) return input_IDs -def create_links(input_dir, output_dir, input_IDs, result_base_names, verbose=False): +def create_links( + input_dir, output_dir, input_IDs, result_base_names, verbose=False +): """Create symbolic links to result files corresponding to (sub-)sample. Parameters @@ -215,7 +215,7 @@ def create_links(input_dir, output_dir, input_IDs, result_base_names, verbose=Fa """ if verbose: - print('Creating links...') + print("Creating links...") n_total = {} n_created = 0 @@ -223,16 +223,16 @@ def create_links(input_dir, output_dir, input_IDs, result_base_names, verbose=Fa for ID in input_IDs: n_total[ID] = 0 for base in result_base_names: - name = '{}_{}.tgz'.format(base, ID) - src = '{}/{}'.format(os.path.abspath(input_dir), name) - link_name = '{}/{}'.format(output_dir, name) + name = "{}_{}.tgz".format(base, ID) + src = "{}/{}".format(os.path.abspath(input_dir), name) + link_name = "{}/{}".format(output_dir, name) - #if verbose: - #print('Creating link {} <- {}'.format(src, link_name)) + # if verbose: + # print('Creating link {} <- {}'.format(src, link_name)) if not os.path.exists(src): - #raise IOError('Source file \'{}\' does not exist'.format(src)) - print('Source file \'{}\' does not exist, skipping'.format(src)) + # raise IOError('Source file \'{}\' does not exist'.format(src)) + print("Source file '{}' does not exist, skipping".format(src)) elif not os.path.exists(link_name): os.symlink(src, link_name) n_created = n_created + 1 @@ -243,11 +243,15 @@ def create_links(input_dir, output_dir, input_IDs, result_base_names, verbose=Fa n_expected = len(input_IDs) * len(result_base_names) if verbose: - print('{:5d} links created'.format(n_created)) - print('{:5d} links existed already'.format(n_existed)) - print('{:5d}/{} links available now'.format(n_created + n_existed, n_expected)) + print("{:5d} links created".format(n_created)) + print("{:5d} links existed already".format(n_existed)) + print( + "{:5d}/{} links available now".format( + n_created + n_existed, n_expected + ) + ) n_tot = sum(n_total.values()) - print('{:5d} as cross-check'.format(n_tot)) + print("{:5d} as cross-check".format(n_tot)) def main(argv=None): @@ -267,42 +271,50 @@ def main(argv=None): # Save calling command cfis.log_command(argv) if param.verbose: - cfis.log_command(argv, name='sys.stdout') - + cfis.log_command(argv, name="sys.stdout") ### Start main program ### if param.verbose: - print('Start of program {}'.format(os.path.basename(argv[0]))) + print("Start of program {}".format(os.path.basename(argv[0]))) input_IDs = read_ID_list(param.input_IDs, verbose=param.verbose) result_base_names = [ - 'final_cat', - 'logs', - 'setools_mask', - 'setools_stat', - 'setools_plot', - 'pipeline_flag', + "final_cat", + "logs", + "setools_mask", + "setools_stat", + "setools_plot", + "pipeline_flag", ] - if param.psf == 'psfex': - result_base_names.append('psfex_interp_exp') - elif param.psf == 'mccd': - result_base_names.append('mccd_fit_val_runner') + if param.psf == "psfex": + result_base_names.append("psfex_interp_exp") + elif param.psf == "mccd": + result_base_names.append("mccd_fit_val_runner") if os.path.isdir(param.output_dir): if param.verbose: - print('Directory {} already exists, continuing...'.format(param.output_dir)) + print( + "Directory {} already exists, continuing...".format( + param.output_dir + ) + ) else: mkdir(param.output_dir) - create_links(param.input_dir, param.output_dir, input_IDs, result_base_names, verbose=param.verbose) - + create_links( + param.input_dir, + param.output_dir, + input_IDs, + result_base_names, + verbose=param.verbose, + ) ### End main program if param.verbose: - print('End of program {}'.format(os.path.basename(argv[0]))) + print("End of program {}".format(os.path.basename(argv[0]))) return 0 diff --git a/scripts/python/create_star_cat.py b/scripts/python/create_star_cat.py index 2c87d3f8d..f990942f7 100755 --- a/scripts/python/create_star_cat.py +++ b/scripts/python/create_star_cat.py @@ -45,16 +45,16 @@ def _get_wcs(header): """ final_wcs = WCS(naxis=2) - final_wcs.wcs.ctype = [header['CTYPE1'], header['CTYPE2']] + final_wcs.wcs.ctype = [header["CTYPE1"], header["CTYPE2"]] try: - final_wcs.wcs.cunit = [header['CUNIT1'], header['CUNIT2']] + final_wcs.wcs.cunit = [header["CUNIT1"], header["CUNIT2"]] except: - final_wcs.wcs.cunit = ['deg', 'deg'] - final_wcs.wcs.crpix = [header['CRPIX1'], header['CRPIX2']] - final_wcs.wcs.crval = [header['CRVAL1'], header['CRVAL2']] + final_wcs.wcs.cunit = ["deg", "deg"] + final_wcs.wcs.crpix = [header["CRPIX1"], header["CRPIX2"]] + final_wcs.wcs.crval = [header["CRVAL1"], header["CRVAL2"]] final_wcs.wcs.cd = [ - [header['CD1_1'], header['CD1_2']], - [header['CD2_1'], header['CD2_2']] + [header["CD1_1"], header["CD1_2"]], + [header["CD2_1"], header["CD2_2"]], ] return final_wcs @@ -79,17 +79,17 @@ def _get_image_radius(center, wcs): """ if center is None: - raise ValueError('center cannot be None') + raise ValueError("center cannot be None") else: if type(center) is np.ndarray: return SphereDist(center, np.zeros(2), wcs) / 60.0 else: - raise TypeError('center has to be a numpy.ndarray') + raise TypeError("center has to be a numpy.ndarray") def SphereDist(position1, position2, wcs): """Sphere Dist. - + Compute distance between two points on the sphere. Parameters @@ -105,11 +105,10 @@ def SphereDist(position1, position2, wcs): distance (in degrees) """ - if ( - (type(position1) is not np.ndarray) - & (type(position2) is not np.ndarray) + if (type(position1) is not np.ndarray) & ( + type(position2) is not np.ndarray ): - raise ValueError('Positions need to be of type numpy.ndarray') + raise ValueError("Positions need to be of type numpy.ndarray") rad2deg = np.pi / 180.0 p1 = rad2deg * np.hstack(wcs.all_pix2world(position1[0], position1[1], 1)) @@ -120,10 +119,13 @@ def SphereDist(position1, position2, wcs): dLat = dTheta[1] dist = 2 * np.arcsin( - np.sqrt(np.sin(dLat/2.0)**2 + np.cos(p1[1])*np.cos(p2[1])*np.sin(dLong/2.0)**2) + np.sqrt( + np.sin(dLat / 2.0) ** 2 + + np.cos(p1[1]) * np.cos(p2[1]) * np.sin(dLong / 2.0) ** 2 + ) ) - return dist*(180./np.pi)*3600. + return dist * (180.0 / np.pi) * 3600.0 def find_stars(position, output_name, radius=None): @@ -145,16 +147,16 @@ def find_stars(position, output_name, radius=None): # check ra dec types - if dec > 0.: - sign = '+' + if dec > 0.0: + sign = "+" else: - sign = '' + sign = "" - cmd_line = f'findgsc2.2 {ra} {sign}{dec} -r {radius} -n 1000000' + cmd_line = f"findgsc2.2 {ra} {sign}{dec} -r {radius} -n 1000000" CDS_stdout, CDS_stderr = execute(cmd_line) - output_file = open(output_name, 'w') + output_file = open(output_name, "w") output_file.write(CDS_stdout) output_file.close() @@ -164,38 +166,36 @@ def main(input_dir, output_dir, kind): file_list = os.listdir(input_dir) for f in file_list: - if 'image' not in f: + if "image" not in f: continue - if kind == 'exp': + if kind == "exp": list_ind = range(1, 41) else: list_ind = [0] for ind in list_ind: - if kind == 'exp': - exp_suff = '-{}'.format(ind-1) + if kind == "exp": + exp_suff = "-{}".format(ind - 1) else: - exp_suff = '' + exp_suff = "" - img_number = re.split('image', os.path.splitext(f)[0])[1] - output_name = f'{output_dir}/star_cat{img_number}{exp_suff}.cat' + img_number = re.split("image", os.path.splitext(f)[0])[1] + output_name = f"{output_dir}/star_cat{img_number}{exp_suff}.cat" if os.path.isfile(output_name): continue - h = fits.getheader(input_dir + '/' + f, ind) + h = fits.getheader(input_dir + "/" + f, ind) w = _get_wcs(h) - img_shape = (h['NAXIS2'], h['NAXIS1']) - img_center = np.array([img_shape[1]/2., img_shape[0]/2.]) + img_shape = (h["NAXIS2"], h["NAXIS1"]) + img_center = np.array([img_shape[1] / 2.0, img_shape[0] / 2.0]) wcs_center = w.all_pix2world([img_center], 1)[0] astropy_center = SkyCoord( - ra=wcs_center[0], - dec=wcs_center[1], - unit='deg' + ra=wcs_center[0], dec=wcs_center[1], unit="deg" ) rad = _get_image_radius(img_center, w) @@ -203,29 +203,29 @@ def main(input_dir, output_dir, kind): find_stars( np.array([astropy_center.ra.value, astropy_center.dec.value]), output_name, - rad + rad, ) return 0 -if __name__ == '__main__': +if __name__ == "__main__": argv = sys.argv try: input_path = argv[1] except: - input_path = '.' + input_path = "." try: output_path = argv[2] except: - output_path = '.' + output_path = "." try: kind = argv[3] except: - kind = '' + kind = "" main(input_path, output_path, kind) diff --git a/scripts/python/get_number_objects.py b/scripts/python/get_number_objects.py index 67cdb294d..e2b6c9a15 100755 --- a/scripts/python/get_number_objects.py +++ b/scripts/python/get_number_objects.py @@ -14,15 +14,16 @@ import copy import glob -from optparse import OptionParser +from optparse import OptionParser from astropy.io import fits -from shapepipe.pipeline.run_log import get_last_dir -from shapepipe.utilities import cfis +from shapepipe.pipeline.run_log import get_last_dir, get_all_dirs +from shapepipe.utilities import cfis class param: """General class to store (default) variables""" + def __init__(self, **kwds): self.__dict__.update(kwds) @@ -43,8 +44,8 @@ class param """ p_def = param( - input_path='.', - input_name_base='final_cat', + input_path=".", + input_name_base="final_cat", hdu_num=1, ) @@ -66,60 +67,60 @@ def parse_options(p_def): command line str """ - usage = "%prog [OPTIONS]" + usage = "%prog [OPTIONS]" parser = OptionParser(usage=usage) # IO parser.add_option( - '-i', - '--input_path', - dest='input_path', - type='string', + "-i", + "--input_path", + dest="input_path", + type="string", default=p_def.input_path, - help=f'input path, default=\'{p_def.input_path}\'' + help=f"input path, default='{p_def.input_path}'", ) parser.add_option( - '-n', - '--input_name_base', - dest='input_name_base', - type='string', + "-n", + "--input_name_base", + dest="input_name_base", + type="string", default=p_def.input_name_base, - help=f'input name base, default=\'{p_def.input_name_base}\'' + help=f"input name base, default='{p_def.input_name_base}'", ) parser.add_option( - '-l', - '--list_tile_ID_path', - dest='tile_ID_list_path', - type='string', + "-l", + "--list_tile_ID_path", + dest="tile_ID_list_path", + type="string", default=None, - help=f'tile ID list, default: Use all data in input files' + help=f"tile ID list, default: Use all data in input files", ) # Control parser.add_option( - '-p', - '--param_path', - dest='param_path', - type='string', + "-p", + "--param_path", + dest="param_path", + type="string", default=None, - help='parameter file path, default=None' + help="parameter file path, default=None", ) parser.add_option( - '', - '--hdu_num', - dest='hdu_num', - type='int', + "", + "--hdu_num", + dest="hdu_num", + type="int", default=p_def.hdu_num, - help=f'input HDU number, default=\'{p_def.hdu_num}\'' + help=f"input HDU number, default='{p_def.hdu_num}'", ) parser.add_option( - '-v', - '--verbose', - dest='verbose', - action='store_true', - help='verbose output' + "-v", + "--verbose", + dest="verbose", + action="store_true", + help="verbose output", ) options, args = parser.parse_args() @@ -177,94 +178,6 @@ class param return param -def read_param_file(path, verbose=False): - """Return parameter list read from file - - Parameters - ---------- - path: str - input file name - verbose: bool, optional, default=False - verbose output if True - - Returns - ------- - list of str - parameter names - - """ - param_list = [] - - if path: - - with open(path) as f: - for line in f: - if line.startswith('#'): - continue - entry = line.rstrip() - if not entry or entry == '': - continue - param_list.append(entry) - - if verbose: - if len(param_list) > 0: - print(f'Copying {len(param_list)} columns', end='') - else: - print('Copying all columns', end='') - print(' into merged catalogue') - - # Check for multiples - multiples = [] - for param in param_list: - if param_list.count(param) > 1: - multiples.append(param) - - if len(multiples) > 0: - print('The following parameters are more than one times ' - 'in the parameter file: ', end='') - for m in multiples: - print(m, end=' ') - print() - raise ValueError('Multiple identical keys found') - - return param_list - - -def get_data(path, hdu_num, param_list): - """Return data of selected columns from FITS file. - - Parameters - ---------- - path: str - input file name - hdu_num: int - HDU number - param_list: list of str - parameters to be extracted. If none, copy - all columns - - Returns - ------- - numpy array - data columns - - """ - hdu_list = fits.open(path) - hdu = hdu_list[hdu_num] - - if param_list: - cols = [] - for p in param_list: - cols.append(hdu.columns[p]) - coldefs = fits.ColDefs(cols) - hdu_new = fits.BinTableHDU.from_columns(coldefs) - d = hdu_new.data - else: - d = hdu.data - - return d - - def main(argv=None): # Set default parameters @@ -281,22 +194,46 @@ def main(argv=None): # Save command line arguments to log file f_log = cfis.log_command(argv, close_no_return=False) - module = 'sextractor_runner_run_1' - pattern = 'sexcat' - run_log_file = 'output/log_run_sp.txt' - last_dir = get_last_dir(run_log_file, module) + pattern = "sexcat" + run_log_file = "output/log_run_sp.txt" + + # For v1 + # module = 'sextractor_runner_run_1' + + # For v2 + module = "sextractor_runner" + + # Get all sextractor output directories + all_dir = get_all_dirs(run_log_file, module) + paths = [] + + # Find tile runs + for path in all_dir: + if "run_sp_tile_Sx" in path: + paths.append(path) + paths = sorted(paths) + + # Get latest run + last_dir = paths[-1] +<<<<<<< HEAD + # Get all output SExtractor catalogues file_list = glob.glob(f'{last_dir}/{pattern}*.fits') +======= + file_list = glob.glob(f"{last_dir}/{pattern}*.fits") +>>>>>>> origin/v1.4 if len(file_list) == 0: - raise ValueError(f'No files {last_dir}/{pattern}*.fits found') + raise ValueError(f"No files {last_dir}/{pattern}*.fits found") + # Add up number of objects over all catalogues n_obj = 0 hdu_no = -1 for fpath in file_list: hdu_list = fits.open(fpath) header = hdu_list[-1].header - n_obj += int(header['NAXIS2']) + n_obj += int(header["NAXIS2"]) + # Compute average n_obj = int(n_obj / len(file_list)) print(n_obj) diff --git a/scripts/python/link_to_exp_for_tile.py b/scripts/python/link_to_exp_for_tile.py new file mode 100755 index 000000000..069121740 --- /dev/null +++ b/scripts/python/link_to_exp_for_tile.py @@ -0,0 +1,340 @@ +#!/usr/bin/env python + +# -*- coding: utf-8 -*- + +"""Script link_to_exp_for_tile.py + +:Description: Link to exposure and PSF catalogue + for a given tile. + +:Author: Martin Kilbinger + +""" + +import os +import sys +import re +import copy + +from optparse import OptionParser + + +class param: + """General class to store (default) variables""" + + def __init__(self, **kwds): + self.__dict__.update(kwds) + + def print(self, **kwds): + print(self.__dict__) + + def var_list(self, **kwds): + return vars(self) + + +def params_default(): + """Params Default. + + Set default parameter values. + + Returns + ------- + class param + parameter values + + """ + p_def = param( + tile_base_dir=".", + exp_base_dir=".", + ) + + return p_def + + +def parse_options(p_def): + """Parse Options. + + Parse command line options. + + Parameters + ---------- + p_def: class param + parameter values + + Returns + ------- + list + command line options + command line str + + """ + usage = "%prog [OPTIONS]" + parser = OptionParser(usage=usage) + + # IO + parser.add_option( + "-i", + "--input_tile_dir", + dest="tile_base_dir", + type="string", + default=p_def.tile_base_dir, + help=f"input tile base directory, default='{p_def.tile_base_dir}'", + ) + parser.add_option( + "-t", + "--tile_ID", + dest="tile_ID", + type="string", + help=f"input tile ID", + ) + parser.add_option( + "-I", + "--input_exp_dir", + dest="exp_base_dir", + type="string", + default=p_def.exp_base_dir, + help=f"input exposure base directory, default='{p_def.exp_base_dir}'", + ) + parser.add_option( + "-v", + "--verbose", + dest="verbose", + action="store_true", + help="verbose output", + ) + + options, args = parser.parse_args() + + return options, args + + +def check_options(options): + """Check Options. + + Check command line options. + + Parameters + ---------- + options: tuple + Command line options + + Returns + ------- + bool + Result of option check. False if invalid option value. + + """ + return True + + +def update_param(p_def, options): + """Update Param. + + Return default parameter, updated and complemented according to options. + + Parameters + ---------- + p_def: class param + parameter values + optiosn: tuple + command line options + + Returns + ------- + class param + updated paramter values + + """ + param = copy.copy(p_def) + + # Update keys in param according to options values + for key in vars(param): + if key in vars(options): + setattr(param, key, getattr(options, key)) + + # Add remaining keys from options to param + for key in vars(options): + if not key in vars(param): + setattr(param, key, getattr(options, key)) + + # Do extra stuff if necessary + + return param + + +# TODO: move to cs_util +def matching_subdirs(base_dir, pattern): + + # Find all matching subdirectories + subdirs = [] + if os.path.exists(base_dir): + for entry in os.listdir(base_dir): + full_path = os.path.join(base_dir, entry) + if os.path.isdir(full_path) and entry.startswith(pattern): + subdirs.append(full_path) + else: + print(f"Warning: {base_dir} does not exist, continuing...") + + # Sort according to creation date + subdirs.sort(key=os.path.getctime) + + return subdirs + + +def get_tile_out_dir(tile_base_dir, tile_ID): + + tile_out_dir = f"{tile_base_dir}/{tile_ID}/output" + + return tile_out_dir + + +def get_exp_IDs(tile_base_dir, tile_ID, verbose=False): + + tile_out_dir = get_tile_out_dir(tile_base_dir, tile_ID) + + pattern = "run_sp_GitFeGie" + subdirs = matching_subdirs(tile_out_dir, pattern) + + if len(subdirs) == 0: + raise IOError( + f"No matching directory '{pattern}' in {tile_out_dir} found" + ) + if len(subdirs) != 1: + raise IOError( + f"Exactly one directory natching {pattern} in {tile_out_dir} " + + f"expected, not {len(subdirs)}" + ) + + # Replace dot with dash in tile ID + tile_ID_sp = re.sub(r"\.", "-", tile_ID) + exp_ID_file = ( + f"{subdirs[0]}/find_exposures_runner/output/" + + f"exp_numbers-{tile_ID_sp}.txt" + ) + + exp_IDs = [] + with open(exp_ID_file) as f_in: + for line in f_in: + name = line.strip() + # Remove any letter + ID = re.sub("[a-zA-Z]", "", name) + exp_IDs.append(ID) + + if verbose: + print("Exposures: ", exp_IDs) + return exp_IDs + + +def get_exp_single_HDU_IDs(exp_IDs, n_CPU): + + exp_shdu_IDs = [] + for exp_ID in exp_IDs: + for idx in range(n_CPU): + ID = f"{exp_ID}-{idx}" + exp_shdu_IDs.append(ID) + + return exp_shdu_IDs + + +def get_paths(exp_base_dir, exp_shdu_IDs, pattern): + + number = {} + paths = [] + for exp_shdu_ID in exp_shdu_IDs: + + name = f"{exp_base_dir}/{exp_shdu_ID}/output" + path = os.path.abspath(name) + subdirs = matching_subdirs(path, pattern) + n_subdirs = len(subdirs) + + if n_subdirs not in number: + number[n_subdirs] = 1 + else: + number[n_subdirs] += 1 + + if n_subdirs != 1: + msg = ( + f"Exactly one directory matching {pattern} in {path} expected," + + f" not {n_subdirs}" + ) + print(msg) + # More than one match: sort according to name = creation time + subdirs = sorted(subdirs) + if n_subdirs == 0: + continue + + # Append matching subdir; if more than one append newest + paths.append(f"{subdirs[-1]}") + + return paths, number + + +def create_links_paths(tile_base_dir, tile_ID, paths, verbose=False): + + tile_out_dir = get_tile_out_dir(tile_base_dir, tile_ID) + + for path in paths: + + head, tail = os.path.split(path) + src = path + dst = f"{tile_out_dir}/{tail}" + if os.path.exists(dst): + src_existing = os.readlink(dst) + if src_existing == src: + if verbose: + # print("link {src} <- {dst}") + f"Warning: {src} <- {dst} already exists, no link created" + # ) + continue + else: + idx = 1 + dst_orig = dst + while True: + dst = f"{dst_orig}_{idx}" + if os.path.exists(dst): + idx += 1 + else: + if verbose: + print(f"link {src} <- {dst}") + os.symlink(src, dst) + break + else: + if verbose: + print(f"link {src} <- {dst}") + os.symlink(src, dst) + + +def main(argv=None): + + # Set default parameters + p_def = params_default() + + # Command line options + options, args = parse_options(p_def) + + if check_options(options) is False: + return 1 + + param = update_param(p_def, options) + + tile_base_dir = param.tile_base_dir + exp_base_dir = param.exp_base_dir + tile_ID = param.tile_ID + n_CPU = 40 + verbose = param.verbose + + exp_IDs = get_exp_IDs(tile_base_dir, tile_ID, verbose=verbose) + exp_shdu_IDs = get_exp_single_HDU_IDs(exp_IDs, n_CPU) + + # Note: psfex P3 is mostly run_sp_exp_SxSePsf + patterns = ["run_sp_exp_SxSePsfPi"] # , "run_sp_exp_Pi"] + for pattern in patterns: + paths, number = get_paths(exp_base_dir, exp_shdu_IDs, pattern) + + create_links_paths(tile_base_dir, tile_ID, paths, verbose=verbose) + + return 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv)) diff --git a/scripts/python/merge_final_cat.py b/scripts/python/merge_final_cat.py index 1a160c449..ed0b962e8 100755 --- a/scripts/python/merge_final_cat.py +++ b/scripts/python/merge_final_cat.py @@ -20,15 +20,12 @@ from optparse import OptionParser -from tqdm import tqdm - from shapepipe.utilities import cfis class param: - """General class to store (default) variables + """General class to store (default) variables""" - """ def __init__(self, **kwds): self.__dict__.update(kwds) @@ -41,7 +38,7 @@ def var_list(self, **kwds): def params_default(): """Params Default. - + Set default parameter values. Returns @@ -51,9 +48,9 @@ class param """ p_def = param( - input_path = '.', - input_name_base = 'final_cat', - hdu_num = 1, + input_path=".", + input_name_base="final_cat", + hdu_num=1, ) return p_def @@ -61,7 +58,7 @@ class param def parse_options(p_def): """Parse Options. - + Parse command line options. Parameters @@ -76,60 +73,60 @@ def parse_options(p_def): command line str """ - usage = "%prog [OPTIONS]" + usage = "%prog [OPTIONS]" parser = OptionParser(usage=usage) # IO parser.add_option( - '-i', - '--input_path', - dest='input_path', - type='string', + "-i", + "--input_path", + dest="input_path", + type="string", default=p_def.input_path, - help=f'input path, default=\'{p_def.input_path}\'' + help=f"input path, default='{p_def.input_path}'", ) parser.add_option( - '-n', - '--input_name_base', - dest='input_name_base', - type='string', + "-n", + "--input_name_base", + dest="input_name_base", + type="string", default=p_def.input_name_base, - help=f'input name base, default=\'{p_def.input_name_base}\'' + help=f"input name base, default='{p_def.input_name_base}'", ) parser.add_option( - '-l', - '--list_tile_ID_path', - dest='tile_ID_list_path', - type='string', + "-l", + "--list_tile_ID_path", + dest="tile_ID_list_path", + type="string", default=None, - help=f'tile ID list, default: Use all data in input files' + help=f"tile ID list, default: Use all data in input files", ) # Control parser.add_option( - '-p', - '--param_path', - dest='param_path', - type='string', + "-p", + "--param_path", + dest="param_path", + type="string", default=None, - help='parameter file path, default=None' + help="parameter file path, default=None", ) parser.add_option( - '', - '--hdu_num', - dest='hdu_num', - type='int', + "", + "--hdu_num", + dest="hdu_num", + type="int", default=p_def.hdu_num, - help=f'input HDU number, default=\'{p_def.hdu_num}\'' + help=f"input HDU number, default='{p_def.hdu_num}'", ) parser.add_option( - '-v', - '--verbose', - dest='verbose', - action='store_true', - help='verbose output' + "-v", + "--verbose", + dest="verbose", + action="store_true", + help="verbose output", ) options, args = parser.parse_args() @@ -139,7 +136,7 @@ def parse_options(p_def): def check_options(options): """Check Options. - + Check command line options. Parameters @@ -158,7 +155,7 @@ def check_options(options): def update_param(p_def, options): """Update Param. - + Return default parameter, updated and complemented according to options. Parameters @@ -193,7 +190,7 @@ class param def read_param_file(path, verbose=False): """Read Param File. - + Return parameter list read from file. Parameters @@ -215,19 +212,19 @@ def read_param_file(path, verbose=False): with open(path) as f: for line in f: - if line.startswith('#'): - continue + if line.startswith("#"): + continue entry = line.rstrip() - if not entry or entry == '': + if not entry or entry == "": continue param_list.append(entry) if verbose: - if len(param_list) > 0: - print(f'Copying {len(param_list)} columns', end='') + if len(param_list) > 0: + print(f"Copying {len(param_list)} columns", end="") else: - print('Copying all columns', end='') - print(' into merged catalogue') + print("Copying all columns", end="") + print(" into merged catalogue") # Check for multiples multiples = [] @@ -236,19 +233,22 @@ def read_param_file(path, verbose=False): multiples.append(param) if len(multiples) > 0: - print('The following parameters are more than one times ' - 'in the parameter file: ', end='') + print( + "The following parameters are more than one times " + "in the parameter file: ", + end="", + ) for m in multiples: - print(m, end=' ') + print(m, end=" ") print() - raise ValueError('Multiple identical keys found') + raise ValueError("Multiple identical keys found") return param_list - + def get_data(path, hdu_num, param_list): """Get Data. - + Return data of selected columns from FITS file. Parameters @@ -273,7 +273,7 @@ def get_data(path, hdu_num, param_list): if param_list: cols = [] for p in param_list: - cols.append(hdu.columns[p]) + cols.append(hdu.columns[p]) coldefs = fits.ColDefs(cols) hdu_new = fits.BinTableHDU.from_columns(coldefs) d = hdu_new.data @@ -285,6 +285,7 @@ def get_data(path, hdu_num, param_list): def main(argv=None): + # Set default parameters p_def = params_default() @@ -296,20 +297,28 @@ def main(argv=None): param = update_param(p_def, options) + if param.verbose: + print("Start") + # Save command line arguments to log file f_log = cfis.log_command(argv, close_no_return=False) path = param.input_path + if param.verbose: + print("Read parameter file") param.param_list = read_param_file(param.param_path, verbose=param.verbose) # read (optional) input tile ID file if param.tile_ID_list_path: + if param.verbose: + print("Read tile ID list") tile_ID_list = cfis.read_list(param.tile_ID_list_path) - # find input catalogue FITS files + if param.verbose: + print("Find input catalogue FITS files") l = os.listdir(path=path) - ext = 'fits' + ext = "fits" lpath = [] for this_l in l: @@ -318,22 +327,22 @@ def main(argv=None): # mark to add if correct extension, matches input pattern, if ( this_l.endswith(ext) - and (f'{param.input_name_base}' in this_l) - and ('.npy' not in this_l) + and (f"{param.input_name_base}" in this_l) + and (".npy" not in this_l) ): add_this_l = True # unmark to add if no in (optional) input tile ID file - if param.tile_ID_list_path: + if param.tile_ID_list_path: nix, niy = cfis.get_tile_number(this_l) - tile_ID = f'{nix}.{niy}' + tile_ID = f"{nix}.{niy}" if tile_ID not in tile_ID_list: add_this_l = False if add_this_l: lpath.append(os.path.join(path, this_l)) if param.verbose: - print(f'{len(lpath)} files files to merge found') + print(f"{len(lpath)} files files to merge found") count = 0 @@ -344,7 +353,7 @@ def main(argv=None): d[key] = d_tmp[key] count = count + 1 if param.verbose: - print(f'File \'{lpath[0]}\' copied ({count}/{len(lpath)})') + print(f"File '{lpath[0]}' copied ({count}/{len(lpath)})") # merge remaining catalogue files for fname in lpath[1:]: @@ -358,21 +367,21 @@ def main(argv=None): count = count + 1 if param.verbose: - print(f'File \'{fname}\' copied ({count}/{len(lpath)})') + print(f"File '{fname}' copied ({count}/{len(lpath)})") d = np.concatenate((d, dd)) except: print( - f'Error while adding file \'{fname}\', {len(dd)} objects' - ' not in final cat' + f"Error while adding file '{fname}', {len(dd)} objects" + " not in final cat" ) # Save merged catalogue as numpy binary file if param.verbose: - print('Saving merged catalogue') - np.save(f'{param.input_name_base}.npy', d) + print("Saving merged catalogue") + np.save(f"{param.input_name_base}.npy", d) - msg = f'{count} catalog files merged with success' + msg = f"{count} catalog files merged with success" if param.verbose: print(msg) print(msg, file=f_log) diff --git a/scripts/python/shapepipe_run.py b/scripts/python/shapepipe_run.py index 18d7de774..a60f1eaed 100755 --- a/scripts/python/shapepipe_run.py +++ b/scripts/python/shapepipe_run.py @@ -1,4 +1,4 @@ -#! /usr/bin/env python +#!/arc/home/kilbinger/.conda/envs/shapepipe/bin/python """SHAPEPIPE RUN SCRIPT diff --git a/scripts/python/stats_global.py b/scripts/python/stats_global.py index 950abba78..b3a6964b7 100755 --- a/scripts/python/stats_global.py +++ b/scripts/python/stats_global.py @@ -40,9 +40,9 @@ def params_default(): """ p_def = cfis.param( - input_dir = '.', - output_dir = '.', - pattern = 'star_stat-', + input_dir=".", + output_dir=".", + pattern="star_stat-", ) return p_def @@ -64,23 +64,49 @@ def parse_options(p_def): Command line string """ - usage = "%prog [OPTIONS]" + usage = "%prog [OPTIONS]" parser = OptionParser(usage=usage) # I/O - parser.add_option('-i', '--input_dir', dest='input_dir', type='string', \ - default=p_def.input_dir, \ - help='input directory, default=\'{}\''.format(p_def.input_dir)) - parser.add_option('-o', '--output_dir', dest='output_dir', type='string', \ - default=p_def.output_dir, \ - help='output directory, default=\'{}\''.format(p_def.output_dir)) - parser.add_option('-c', '--config', dest='config', type='string', \ - help='configuration file, default=none') - parser.add_option('-p', '--pattern', dest='pattern', type='string', \ - default=p_def.pattern, \ - help='input file pattern, default=\'{}\''.format(p_def.pattern)) - - parser.add_option('-v', '--verbose', dest='verbose', action='store_true', help='verbose output') + parser.add_option( + "-i", + "--input_dir", + dest="input_dir", + type="string", + default=p_def.input_dir, + help="input directory, default='{}'".format(p_def.input_dir), + ) + parser.add_option( + "-o", + "--output_dir", + dest="output_dir", + type="string", + default=p_def.output_dir, + help="output directory, default='{}'".format(p_def.output_dir), + ) + parser.add_option( + "-c", + "--config", + dest="config", + type="string", + help="configuration file, default=none", + ) + parser.add_option( + "-p", + "--pattern", + dest="pattern", + type="string", + default=p_def.pattern, + help="input file pattern, default='{}'".format(p_def.pattern), + ) + + parser.add_option( + "-v", + "--verbose", + dest="verbose", + action="store_true", + help="verbose output", + ) options, args = parser.parse_args() @@ -106,14 +132,14 @@ def check_options(options): def update_param(p_def, options): """Return default parameter, updated and complemented according to options. - + Parameters ---------- p_def: class param parameter values options: tuple command line options - + Returns ------- param: class param @@ -152,8 +178,11 @@ def get_stats_file_list(param): """ # Full paths - paths = glob.glob('{}/output/*/setools_runner/output/stat/{}*'. - format(param.input_dir, param.pattern)) + paths = glob.glob( + "{}/output/*/setools_runner/output/stat/{}*".format( + param.input_dir, param.pattern + ) + ) # File names w/o directories names = [] @@ -170,8 +199,11 @@ def get_stats_file_list(param): paths_unq.append(paths[i]) if param.verbose: - print('{} files in total, {} unique files found'. - format(len(paths), len(paths_unq))) + print( + "{} files in total, {} unique files found".format( + len(paths), len(paths_unq) + ) + ) return paths_unq @@ -196,11 +228,11 @@ def gather_values(paths, verbose=False): for path in paths: with open(path) as f: lines = f.readlines() - for line in lines: + for line in lines: m = re.search("#", line) if m: continue - m = re.search('(.*) = (\S*)', line) + m = re.search("(.*) = (\S*)", line) if m: key = m[1] val = float(m[2]) @@ -210,13 +242,14 @@ def gather_values(paths, verbose=False): values[key].append(val) else: if verbose: - print('NaN found in file \'{}\', key \'{}\'' - .format(path, key)) + print( + "NaN found in file '{}', key '{}'".format(path, key) + ) if verbose: - print('{} keys created'.format(len(values))) + print("{} keys created".format(len(values))) for key in values: - print('#{{values[{}]}} = {}'.format(key, len(values[key]))) + print("#{{values[{}]}} = {}".format(key, len(values[key]))) return values @@ -239,12 +272,12 @@ def compute_histograms(values, config=None, verbose=False): histograms for all keys """ - if config and config.has_option('ALL', 'nbins'): - nbins_global = config.getint('ALL', 'nbins') + if config and config.has_option("ALL", "nbins"): + nbins_global = config.getint("ALL", "nbins") else: nbins_global = 50 - print('nbins_global = {}'.format(nbins_global)) + print("nbins_global = {}".format(nbins_global)) hists = {} i = 0 @@ -252,22 +285,22 @@ def compute_histograms(values, config=None, verbose=False): si = str(i) - if config and config.has_option(si, 'nbins'): - nbins = config.getint(si, 'nbins') + if config and config.has_option(si, "nbins"): + nbins = config.getint(si, "nbins") else: nbins = nbins_global try: hists[key] = np.histogram(values[key], bins=nbins) except ValueError as err: - print('Skipping histogram #{}: {}'.format(i, err)) + print("Skipping histogram #{}: {}".format(i, err)) i = i + 1 return hists -def plot_histograms(hists, config=None, output_dir='.', verbose=False): +def plot_histograms(hists, config=None, output_dir=".", verbose=False): """Create histogram plots. Parameters @@ -285,9 +318,9 @@ def plot_histograms(hists, config=None, output_dir='.', verbose=False): fig, (ax) = plt.subplots() plt.tight_layout() - if config and config.has_option('ALL', 'fontsize'): - fontsize = config.getint('ALL', 'fontsize') - plt.rcParams.update({'font.size': fontsize}) + if config and config.has_option("ALL", "fontsize"): + fontsize = config.getint("ALL", "fontsize") + plt.rcParams.update({"font.size": fontsize}) xlim_fac = 0.05 @@ -296,11 +329,13 @@ def plot_histograms(hists, config=None, output_dir='.', verbose=False): si = str(i) - if config and \ - config.has_option(si, 'plot') and \ - config.getboolean(si, 'plot') == False: + if ( + config + and config.has_option(si, "plot") + and config.getboolean(si, "plot") == False + ): if verbose: - print('Skipping histogram #{} {}'.format(i, key)) + print("Skipping histogram #{} {}".format(i, key)) else: @@ -314,12 +349,12 @@ def plot_histograms(hists, config=None, output_dir='.', verbose=False): # Overwrite limits if found in config file. # If not stretch bin boundaries - if config and config.has_option(si, 'xmin'): - xmin = config.getfloat(si, 'xmin') + if config and config.has_option(si, "xmin"): + xmin = config.getfloat(si, "xmin") else: xmin = min(bins) - if config and config.has_option(si, 'xmax'): - xmax = config.getfloat(si, 'xmax') + if config and config.has_option(si, "xmax"): + xmax = config.getfloat(si, "xmax") else: xmax = max(bins) @@ -327,19 +362,19 @@ def plot_histograms(hists, config=None, output_dir='.', verbose=False): # If limits from bin boundaries: extend by small # amount - if config and config.has_option(si, 'xmin'): + if config and config.has_option(si, "xmin"): xxmin = xmin else: xxmin = xmin - dx * xlim_fac - if config and config.has_option(si, 'xmax'): + if config and config.has_option(si, "xmax"): xxmax = xmax else: xxmax = xmax + dx * xlim_fac plt.xlim(xxmin, xxmax) - if config and config.has_option(si, 'xlabel'): - xlabel = config.get(si, 'xlabel') + if config and config.has_option(si, "xlabel"): + xlabel = config.get(si, "xlabel") else: xlabel = key plt.xlabel(xlabel) @@ -347,28 +382,33 @@ def plot_histograms(hists, config=None, output_dir='.', verbose=False): ymin = min(freq) ymax = max(freq) plt.ylim(ymin, ymax) - ylabel = 'frequency' + ylabel = "frequency" plt.ylabel(ylabel) - if config and config.has_option(si, 'title'): - plt.title(config.get(si, 'title')) + if config and config.has_option(si, "title"): + plt.title(config.get(si, "title")) - if config and config.has_option(si, 'fname'): - file_base = config.getexpanded(si, 'fname') + if config and config.has_option(si, "fname"): + file_base = config.getexpanded(si, "fname") else: - file_base = 'hist_{}'.format(i) + file_base = "hist_{}".format(i) if verbose: - print('Creating files \'{}.*\''.format(file_base)) - - plt.savefig('{}/{}.png'.format(output_dir, file_base), bbox_inches='tight') - np.savetxt('{}/{}.txt'.format(output_dir, file_base), np.transpose([bins, freq]), - fmt='%10g', header='[{}] [{}]'.format(xlabel, ylabel)), + print("Creating files '{}.*'".format(file_base)) + + plt.savefig( + "{}/{}.png".format(output_dir, file_base), bbox_inches="tight" + ) + np.savetxt( + "{}/{}.txt".format(output_dir, file_base), + np.transpose([bins, freq]), + fmt="%10g", + header="[{}] [{}]".format(xlabel, ylabel), + ), i = i + 1 - def get_config(config_path, verbose=False): """Return configuration file values. @@ -391,10 +431,12 @@ def get_config(config_path, verbose=False): from shapepipe.pipeline.config import CustomParser if verbose: - print('Reading configuration file \'{}\''.format(config_path)) + print("Reading configuration file '{}'".format(config_path)) if not os.path.exists(config_path): - raise OSError('Configuration file \'{}\' does not exist'.format(config_path)) + raise OSError( + "Configuration file '{}' does not exist".format(config_path) + ) conf = CustomParser() conf.read(config_path) @@ -419,13 +461,12 @@ def main(argv=None): # Save calling command cfis.log_command(argv) if param.verbose: - cfis.log_command(argv, name='sys.stdout') - + cfis.log_command(argv, name="sys.stdout") ### Start main program ### if param.verbose: - print('Start of program {}'.format(os.path.basename(argv[0]))) + print("Start of program {}".format(os.path.basename(argv[0]))) files = get_stats_file_list(param) @@ -436,22 +477,23 @@ def main(argv=None): hists = compute_histograms(values, config=config, verbose=param.verbose) if os.path.isfile(param.output_dir): - raise OSError('Output path \'{}\' is a regular file' - ''.format(param.output_dir)) + raise OSError( + "Output path '{}' is a regular file" "".format(param.output_dir) + ) if not os.path.isdir(param.output_dir): os.mkdir(param.output_dir) - plot_histograms(hists, config=config, output_dir=param.output_dir, - verbose=param.verbose) + plot_histograms( + hists, config=config, output_dir=param.output_dir, verbose=param.verbose + ) ### End main program if param.verbose: - print('End of program {}'.format(os.path.basename(argv[0]))) + print("End of program {}".format(os.path.basename(argv[0]))) return 0 if __name__ == "__main__": sys.exit(main(sys.argv)) - diff --git a/scripts/python/stats_headless_canfar.py b/scripts/python/stats_headless_canfar.py new file mode 100755 index 000000000..1f728949d --- /dev/null +++ b/scripts/python/stats_headless_canfar.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python + +# Name: stats_headless_canfar.py + +# Caution: Does not show all running or pending +# headless jobs, for some reason. + +import sys +from skaha.session import Session + + +def main(argv=None): + + print( + "# Depreciated, does not show pending jobs; use stats_jobs_canfar.sh", + file=sys.stderr, + ) + + session = Session() + + n_headless = session.stats()["instances"]["headless"] + + print(n_headless) + + return 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv)) diff --git a/scripts/python/summary_params_pre_v2.py b/scripts/python/summary_params_pre_v2.py new file mode 100644 index 000000000..70eda073c --- /dev/null +++ b/scripts/python/summary_params_pre_v2.py @@ -0,0 +1,240 @@ +# Parameters for summary run + +import os +from shapepipe.utilities.summary import * + + +def set_jobs_v2_pre_v2(patch, verbose): + """Return information about shapepipe jobs""" + print(f"Set job info for patch {patch}") + + # Main input and output directory + path_main = f"{os.environ['HOME']}/cosmostat/v2/pre_v2/psfex/{patch}" + + # Logging + path = f"{path_main}/summary" + if not os.path.isdir(path): + os.mkdir(path) + log_file_name = f"{path}/summary_log.txt" + handlers = [ + logging.FileHandler(log_file_name, mode="w"), + logging.StreamHandler(), + ] + logging.basicConfig( + level=logging.INFO, format="%(message)s", handlers=handlers + ) + + logging.info(f"Checking main directory = {path_main}") + + # Tile IDs + tile_ID_path = f"{path_main}/tile_numbers.txt" + + ## Tile IDs with dots + list_tile_IDs_dot = get_IDs_from_file(tile_ID_path) + + jobs = {} + + # Set the first job (retrieve images) + + # With "CFIS_" only the linked images are counted. The original + # ones do not match the IDdash pattern. + # If images were downloaded in several runs: + # - Only copy original images, then (re-)set links in SP numbering format + # - get_images_runner_run_[12] consistent + # - remove previous output dirs since only last is searched + jobs["1"] = job_data( + 1, + "run_sp_GitFeGie", + [ + "get_images_runner_run_1", + "find_exposures_runner", + "get_images_runner_run_2", + ], + ["tile_IDs", "tile_IDs", "exposures"], + pattern=["CFIS_", "", ""], + n_mult=[2, 1, 3], + path_main=path_main, + path_left="output", + verbose=verbose, + ) + + jobs["2"] = job_data( + 2, + ["run_sp_Uz", "run_sp_exp_SpMh", "run_sp_exp_SpMh"], + ["uncompress_fits_runner", "merge_headers_runner", "split_exp_runner"], + ["tile_IDs", 0, "exposures"], + n_mult=[1, 1, 121], + path_main=path_main, + path_left="output", + verbose=verbose, + ) + + jobs["4"] = job_data( + 4, + ["run_sp_Ma_tile"], + ["mask_runner"], + ["tile_IDs"], + path_main=path_main, + path_left="output", + verbose=verbose, + ) + + jobs["8"] = job_data( + 8, + ["run_sp_Ma_exp"], + ["mask_runner"], + ["shdus"], + path_main=path_main, + path_left="output", + verbose=verbose, + ) + + jobs["16"] = job_data( + 16, + "run_sp_tile_Sx", + ["sextractor_runner"], + ["tile_IDs"], + n_mult=2, + path_main=path_main, + path_left="tile_runs", + output_subdirs=[f"{tile_ID}/output" for tile_ID in list_tile_IDs_dot], + verbose=verbose, + ) + + # TODO 1 setools_runner output/rand_split + # TODO 2 add back Pi + jobs["32"] = job_data( + 32, + [ + "run_sp_exp_SxSePsf", + "run_sp_exp_SxSePsf", + "run_sp_exp_SxSePsf", + "run_sp_exp_SxSePsf", + "run_sp_exp_SxSePsf", + #"run_sp_exp_Pi" + ], + [ + "sextractor_runner", + "setools_runner", + "setools_runner", + "setools_runner", + "psfex_runner", + # "psfex_interp_runner"], + ], + "shdus", + n_mult=[2, 2, 1, 1, 2], + path_main=path_main, + path_left="exp_runs", + output_subdirs="shdus", + path_right="output", + path_output=[ + "output", + "output/rand_split", + "output/stat", + "logs", + "output", + ], + special=[False, False, True, True, False], + verbose=verbose, + ) + + # For P3 + # jobs["33"] = job_data( + # 33, + # "run_sp_exp_Pi", + # ["psfex_interp_runner"], + # "shdus", + # path_main=path_main, + # path_left="exp_runs", + # output_subdirs="shdus", + # path_right="output", + # verbose=verbose, + # ) + + jobs["64"] = job_data( + "64", + "run_sp_tile_PsViSmVi", + [ + "psfex_interp_runner", + "psfex_interp_runner", + "vignetmaker_runner_run_1", + "spread_model_runner", + "vignetmaker_runner_run_2", + ], + "tile_IDs", + n_mult=[1, 1, 1, 1, 4], + path_main=path_main, + path_left="tile_runs", + output_subdirs=[f"{tile_ID}/output" for tile_ID in list_tile_IDs_dot], + path_output=["output", "logs", "output", "output", "output"], + special=[False, True, False, False, False], + verbose=verbose, + ) + + if patch in ("P2", "P5"): + n_sh = 1 + else: + n_sh = 8 + run_dirs = [f"run_sp_tile_ngmix_Ng{idx+1}u" for idx in range(n_sh)] + output_path_missing_IDs = [ + f"{path_main}/summary/missing_job_128_ngmix_runner_{idx+1}.txt" + for idx in range(n_sh) + ] + jobs["128"] = job_data( + "128", + run_dirs, + ["ngmix_runner"] * n_sh, + "tile_IDs", + path_main=path_main, + path_left="tile_runs", + output_subdirs=[f"{tile_ID}/output" for tile_ID in list_tile_IDs_dot], + output_path_missing_IDs=output_path_missing_IDs, + verbose=verbose, + ) + + jobs["256"] = job_data( + "256", + ["run_sp_Ms"], + ["merge_sep_cats_runner"], + "tile_IDs", + path_main=path_main, + path_left="tile_runs", + output_subdirs=[f"{tile_ID}/output" for tile_ID in list_tile_IDs_dot], + verbose=verbose, + ) + + jobs["512"] = job_data( + "512", + ["run_sp_Mc"], + ["make_cat_runner"], + "tile_IDs", + path_main=path_main, + path_left="tile_runs", + output_subdirs=[f"{tile_ID}/output" for tile_ID in list_tile_IDs_dot], + verbose=verbose, + ) + + # Post-processing + jobs["1024"] = job_data( + "1024", + ["run_sp_combined_final"], + ["make_catalog_runner"], + "tile_IDs", + path_main=path_main, + path_left="output", + verbose=verbose, + ) + + jobs["2048"] = job_data( + "2048", + "run_sp_combined_psf", + ["psfex_interp_runner"], + "shdus", + path_main=path_main, + path_left="output", + verbose=verbose, + ) + + return jobs, list_tile_IDs_dot + + diff --git a/scripts/python/summary_run.py b/scripts/python/summary_run.py new file mode 100755 index 000000000..f24d6574d --- /dev/null +++ b/scripts/python/summary_run.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python + +import sys +import os + +from shapepipe.utilities.summary import * + +from summary_params_pre_v2 import * + + +def main(argv=None): + + patch = argv[1] + + if len(argv) == 3: + job_exclusive = argv[2] + else: + job_exclusive = None + + verbose = False + + jobs, list_tile_IDs_dot = set_jobs_v2_pre_v2(patch, verbose) + + list_tile_IDs = job_data.replace_dot_dash(list_tile_IDs_dot) + + # Numbers updated at runtime + par_runtime = init_par_runtime(list_tile_IDs) + + job_data.print_stats_header() + + exp_IDs_path = "exp_numbers.txt" + if os.path.exists(exp_IDs_path): + # Read exposure ID list if file exists + all_exposures = get_IDs_from_file(exp_IDs_path) + par_runtime = update_par_runtime_after_find_exp( + par_runtime, all_exposures + ) + + if ( + not os.path.exists(exp_IDs_path) + or not job_exclusive + or int(job_exclusive) & 1 + ): + # Run job 1 if exposure ID list file does not exist or + # job_exclusive is 1 or not set + key = "1" + jobs[key].print_intro() + jobs[key].check_numbers(par_runtime=par_runtime, indices=[0, 1]) + + all_exposures = get_all_exposures( + jobs[key]._paths_in_dir[1], verbose=True + ) + par_runtime = update_par_runtime_after_find_exp( + par_runtime, all_exposures + ) + + jobs[key].write_IDs_to_file("exp_numbers.txt", all_exposures) + + jobs[key].check_numbers(par_runtime, indices=[2]) + + print_par_runtime(par_runtime, verbose=verbose) + + # Get all keys after "1" + keys = sorted(jobs.keys(), key=int) + _ = keys.pop(0) + + for key in keys: + if job_exclusive and not int(key) & int(job_exclusive): + continue + jobs[key].print_intro() + jobs[key].check_numbers(par_runtime=par_runtime) + + return 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv)) diff --git a/scripts/python/update_runs_log_file.py b/scripts/python/update_runs_log_file.py new file mode 100644 index 000000000..6cd1fde63 --- /dev/null +++ b/scripts/python/update_runs_log_file.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python + +import re +import sys +import os + + +# TODO: move to cs_util +def matching_subdirs(base_dir, pattern, tail=False): + + # Find all matching subdirectories + subdirs = [] + for entry in os.listdir(base_dir): + full_path = os.path.join(base_dir, entry) + if os.path.isdir(full_path): + found = False + + # Look for pattern at start or end + if pattern in entry: + + # Get full path or last part ("tail") + if not tail: + path = full_path + else: + head, tail = os.path.split(full_path) + path = tail + + # Remove postfix in case of multiple runs of same module + path = re.sub("_run_.\d?", "", path) + + # Append to result + subdirs.append(path) + + # Sort according to creation date + if not tail: + subdirs.sort(key=os.path.getctime) + + return subdirs + + +def get_module_runs(subdirs): + + all_runs = {} + for subdir in subdirs: + runs = matching_subdirs(subdir, "_runner", tail=True) + if len(runs) > 0: + all_runs[subdir] = runs + + return all_runs + + +def update_log_file(module_runs, log_name): + + with open(log_name, "w") as f_out: + for key in module_runs: + print(key, file=f_out, end=" ") + print(",".join(module_runs[key]), file=f_out) + + +def main(argv=None): + + # Set default parameters + # p_def = params_default() + + # Command line options + # options, args = parse_options(p_def) + + # if check_options(options) is False: + # return 1 + + # param = update_param(p_def, options) + + base_dir = "./output" + pattern = "run_sp_" + log_name = f"{base_dir}/log_run_sp.txt" + + subdirs = matching_subdirs(base_dir, pattern) + module_runs = get_module_runs(subdirs) + # save_prev(log_name) + update_log_file(module_runs, log_name) + + return 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv)) diff --git a/scripts/python/vignets2image.py b/scripts/python/vignets2image.py index 7fb444246..60933173c 100755 --- a/scripts/python/vignets2image.py +++ b/scripts/python/vignets2image.py @@ -35,48 +35,47 @@ def map_vignet(img_arr, dtype): ys = img_arr[0].shape[1] nx = int(np.sqrt(n_obj)) - if nx*nx != n_obj: + if nx * nx != n_obj: nx += 1 ny = nx - img_map=np.ones((xs*nx,ys*ny), dtype=dtype) + img_map = np.ones((xs * nx, ys * ny), dtype=dtype) - ii=0 - jj=0 + ii = 0 + jj = 0 for i in range(n_obj): - if jj>nx-1: - jj=0 - ii+=1 - img_map[ii*xs:(ii+1)*xs,jj*ys:(jj+1)*ys]=img_arr[i] - jj+=1 + if jj > nx - 1: + jj = 0 + ii += 1 + img_map[ii * xs : (ii + 1) * xs, jj * ys : (jj + 1) * ys] = img_arr[i] + jj += 1 return img_map, nx - def main(argv=None): - path = '.' - pattern = 'UNIONS_' - prefix_out = 'img_' + path = "." + pattern = "UNIONS_" + prefix_out = "img_" - files = glob.glob('{}/{}*.fits'.format(path, pattern)) + files = glob.glob("{}/{}*.fits".format(path, pattern)) for input_path in files: - output_path = '{}{}'.format(prefix_out, os.path.basename(input_path)) + output_path = "{}{}".format(prefix_out, os.path.basename(input_path)) hdu = fits.open(input_path) - image, nx = map_vignet(hdu[2].data['VIGNET'], 'float32') - print('file = {}, nx = {}'.format(input_path, nx)) + image, nx = map_vignet(hdu[2].data["VIGNET"], "float32") + print("file = {}, nx = {}".format(input_path, nx)) - fout = io.FITSCatalog(output_path, open_mode=io.BaseCatalog.OpenMode.ReadWrite) + fout = io.FITSCatalog( + output_path, open_mode=io.BaseCatalog.OpenMode.ReadWrite + ) fout.save_as_fits(image, image=True) return 0 - if __name__ == "__main__": sys.exit(main(sys.argv)) - diff --git a/scripts/sh/combine_runs.bash b/scripts/sh/combine_runs.bash new file mode 100755 index 000000000..c264f3cbf --- /dev/null +++ b/scripts/sh/combine_runs.bash @@ -0,0 +1,216 @@ +#!/usr/bin/env bash + +# Name: combine_runs.bash +# Description: Create new shapepipe run directory with +# links to source files from combined existing runs +# Author: Martin Kilbinger + + +# Command line arguments + +## Default values +cat='final' +psf="mccd" + +## Help string +usage="Usage: $(basename "$0") [OPTIONS] +\n\nOptions:\n + -h\tthis message\n + -p, --psf MODEL\n + \tPSF model, allowed are 'psfex', 'mccd', 'setools', default='$psf'\n + -c, --cat TYPE\n + \tCatalogue type, allowed are 'final', 'flag_tile', 'flag_exp', \n + \t'psf', 'psf_conv', 'image', default='$cat'\n +" + +## Parse command line +while [ $# -gt 0 ]; do + case "$1" in + -h) + echo -ne $usage + exit 0 + ;; + -c|--cat) + cat="$2" + shift + ;; + -p|--psf) + psf="$2" + shift + ;; + *) + echo -ne $usage + exit 1 + ;; + esac + shift +done + + +## Check options +if [ "$cat" != "final" ] \ + && [ "$cat" != "flag_tile" ] \ + && [ "$cat" != "tile_detection" ] \ + && [ "$cat" != "flag_exp" ] \ + && [ "$cat" != "psf" ] \ + && [ "$cat" != "psf_conv" ] \ + && [ "$cat" != "image" ]; then + echo "cat (option -c) needs to be 'final', 'tile_detection', 'flag_tile', 'flag_exp', 'psf', 'psf_conv' or 'image'" + exit 2 +fi + +## Check options +if [ "$psf" != "psfex" ] \ + && [ "$psf" != "mccd" ] \ + && [ "$psf" != "setools" ]; then + echo "PSF (option -p) needs to be 'psfex' or 'mccd'" + exit 2 +fi + + +## Functions +function link_s () { + target=$1 + link_name=$2 + + if [ -L "$link_name" ]; then + echo "link with name $link_name already exists, skipping..." + let "n_skipped+=1" + else + echo "create link $target <- $link_name" + ln -s $target $link_name + let "n_created+=1" + fi +} + + +# Start program + +n_skipped=0 +n_created=0 + +pwd=`pwd` +out_base="output" + +# Set paths: +## run_out: target output new run directory +## run_in: source input run base directory +## module: source input module runner sub-directory +## pattern: source file pattern + +run_out="run_sp_combined_$cat" + +if [ "$cat" == "final" ]; then + + # v1 + #run_in="$pwd/$out_base/run_sp_Mc_*" + # v2 + run_in="$pwd/tile_runs/*/$out_base/run_sp_Mc_*" + + module="make_catalog_runner" + pattern="final_cat-*" + +elif [ "$cat" == "tile_detection" ]; then + + run_in="$pwd/P?/tile_runs/*/$out_base/run_sp_tile_Sx_*" + module="sextractor_runner" + pattern="sexcat-*" + +elif [ "$cat" == "flag_tile" ]; then + + # v1 + #run_in="$pwd/$out_base/run_sp_MaMa_*/mask_runner_run_1" + # v2 + run_in="$pwd/$out_base/run_sp_tile_Ma_*" + run_out="run_sp_Ma_tile" + + module="mask_runner" + pattern="pipeline_flag-*" + +elif [ "$cat" == "flag_exp" ]; then + + # v1 + #run_in="$pwd/$out_base/run_sp_MaMa_*/mask_runner_run_2" + # v2 + run_in="$pwd/$out_base/run_sp_exp_Ma_*" + run_out="run_sp_Ma_exp" + + module="mask_runner" + pattern="pipeline_flag-*" + +elif [ "$cat" == "image" ]; then + + run_in="$pwd/$out_base/run_sp_Git_*" + module="get_images_runner" + pattern="CFIS_image-*" + +elif [ "$cat" == "psf" ]; then + + #MKDEBUG TODO: add option + # v1 + #run_in="$pwf/$out_base/run_sp_exp_Pi_*" + # v2 + #run_in="$pwd/exp_runs/*/$out_base/run_sp_exp_Pi_*" + run_in="$pwd/exp_runs/*/$out_base/run_sp_exp_SxSePsfPi_*" + + pattern="validation_psf-*" + if [ "$psf" == "psfex" ]; then + module="psfex_interp_runner" + elif [ "$psf" == "setools" ]; then + module="setools_runner" + else + module="mccd_interp_runner" + fi + +elif [ "$cat" == "psf_conv" ]; then + + run_in="$pwd/../P?" + pattern="validation_psf_conv-*" + module="psfex_interp_runner" + +else + + echo "Invalid catalogue type $cat" + exit 2 + +fi + + +OUTPUT="$pwd/$out_base/$run_out" +mkdir -p $OUTPUT + + +# Create links + +## target directory +outdir=$OUTPUT/$module/output +mkdir -p $outdir + +## identify source files + +# The following can result in an "Argument list too long" error +#FILES=(`find $run_in -type f -name "$pattern" -print0 | xargs -0 echo`) + +i=0 +for dir in $run_in; do + FILES=(`find $dir -type f -name "$pattern" -print0 | xargs -0 echo`) + + echo "$dir $pattern" + + ## Look over source files + for file in ${FILES[@]}; do + + target=$file + link_name=$outdir/`basename $file` + link_s $target $link_name + ((i=i+1)) + + done + +done + +#echo " $n_files target files, $i links created/skipped" +echo " $i total, "$n_skipped skipped, "$n_created links created" + +# Update log file +update_runs_log_file.py diff --git a/scripts/sh/curl_canfar_local.sh b/scripts/sh/curl_canfar_local.sh new file mode 100755 index 000000000..13e087936 --- /dev/null +++ b/scripts/sh/curl_canfar_local.sh @@ -0,0 +1,296 @@ +#!/usr/bin/env bash + +# Global variables +SSL=~/.ssl/cadcproxy.pem +SESSION=https://ws-uv.canfar.net/skaha/v0/session +IMAGE=images.canfar.net/unions/shapepipe +NAME=shapepipe + + +# Command line arguments + +## Default values +job=-1 +psf="psfex" +ID=-1 +file_IDs=-1 +N_SMP=1 +version="1.1" +cmd_remote="$HOME/shapepipe/scripts/sh/init_run_exclusive_canfar.sh" +batch_max=200 +dry_run=0 +mh_local=0 +debug_out="-1" + +pat="- " + +## Help string +usage="Usage: $(basename "$0") -j JOB -[e ID |-f file_IDs] -k KIND [OPTIONS] +\n\nOptions:\n + -h\tthis message\n + -j, --job JOB\tRunning JOB, bit-coded\n + -e, --exclusive ID + \timage ID\n + -f, --file_IDs path + \tfile containing IDs\n + -p, --psf MODEL\n + \tPSF model, one in ['psfex'|'mccd'], default='$psf'\n + -m, --mh_local MH\n + \tmerged header file local (MH=0) or global (MH=1); default is $mh_local\n + -N, --N_SMP N_SMOp\n + \tnumber of jobs (SMP mode only), default=$N_SMP\n + -V, --version\n + \tversion of docker image, default='$version'\n + -C, --command_remote\n + \tremote command to run on canfar, default='$cmd_remote'\n + -b, --batch_max\n + \tmaximum batch size = number of jobs run simultaneously, default=$batch_max\n + --debug_out PATH\n + \tdebug output file PATH, default not used\n + -n, --dry_run LEVEL\n + \tdry run, from LEVEL=2 (no processing) to 0 (full run)\n +" + +## Help if no arguments +if [ -z $1 ]; then + echo -ne $usage + exit 1 +fi + +## Parse command line +while [ $# -gt 0 ]; do + case "$1" in + -h) + echo -ne $usage + exit 0 + ;; + -j|--job) + job="$2" + shift + ;; + -p|--psf) + psf="$2" + shift + ;; + -m|--mh_local) + mh_local="$2" + shift + ;; + -e|--exclusive) + ID="$2" + shift + ;; + -f|--file_IDs) + file_IDs="$2" + shift + ;; + -N|--N_SMP) + N_SMP="$2" + shift + ;; + -b|--batch_max) + batch_max="$2" + shift + ;; + --debug_out) + debug_out="$2" + shift + ;; + -n|--dry_run) + dry_run="$2" + shift + ;; + esac + shift +done + +## Check options +if [ "$job" == "-1" ]; then + echo "No job indicated, use option -j" + exit 2 +fi + +if [ "$ID" == "-1" ] && [ "$file_IDs" == "-1" ]; then + echo "No image ID(s) indicated, use option -e ID or -f file_IDs" + exit 3 +fi + +if [ "$psf" != "psfex" ] && [ "$psf" != "mccd" ]; then + echo "PSF (option -p) needs to be 'psfex' or 'mccd'" + exit 4 +fi + +if [ "$dry_run" != 0 ] && [ "$dry_run" != 1 ] && [ "$dry_run" != 2 ]; then + echo "Invalid dry_run option, allowed are 0, 1, and 2" + exit 5 +fi + +if [ "$debug_out" != "-1" ]; then + echo "${pat}Starting $(basename "$0")" >> $debug_out + echo $pat`date`$ >> $debug_out +fi + +. /opt/conda/etc/profile.d/conda.sh +conda activate shapepipe +if [ "$debug_out" != "-1" ]; then + echo "${pat}conda prefix = ${CONDA_PREFIX}" >> $debug_out +fi + +# command line arguments for remote script: +# collect into string + +if [ "$dry_run" == "1" ]; then + arg_dry_run="-n $dry_run" +else + arg_dry_run="" +fi + +RESOURCES="ram=4&cores=$N_SMP" +dir=`pwd` + + +# Return argument for local script to be called via curl +function set_arg() { + my_arg="-j $job -p $psf -e $ID -N $N_SMP $arg_dry_run -d $dir -m $mh_local --debug_out $debug_out" + echo $my_arg +} + + +function call_curl() { + my_name=$1 + dry_run=$2 + + my_arg=$(set_arg) + + if [ "$dry_run" == "0" ]; then + + cp ~/sicher.pem ~/.ssl/cadcproxy.pem + my_session=`curl -E $SSL "$SESSION?$RESOURCES" -d "image=$IMAGE:$version" -d "name=${my_name}" -d "cmd=$cmd_remote" --data-urlencode "args=${my_arg[@]}" &> /dev/null` + fi + + + cmd=("curl" "-E" "$SSL" "$SESSION?$RESOURCES" "-d" "image=$IMAGE:$version" "-d" "name=${my_name}" "-d" "cmd=$cmd_remote" "--data-urlencode" "args=\"${my_arg}\"") + + if [ "$debug_out" != "-1" ]; then + echo "${pat}call_curl $my_name $my_arg" >> $debug_out + echo "${pat}Running ${cmd[@]} (dry_run=$dry_run)" >> $debug_out + fi + echo "${cmd[@]} (dry_run=$dry_run)" + cp ~/sicher.pem ~/.ssl/cadcproxy.pem + + + # Running $cmd does not work due to unknown problems with passing of args + + update_session_logs +} + +# Add session and image IDs to log files +function update_session_logs() { + echo $my_session >> session_IDs.txt + echo "$my_session $ID" >> session_image_IDs.txt + +} + +function submit_batch() { + path=$1 + + for ID in `cat $path`; do + IDt=`echo $ID | tr "." "-"` + my_name="SP-${patch}-J${job}-${IDt}" + + call_curl $my_name $dry_run + + done + +} + +batch=50 +sleep=75 + +((n_thresh=batch_max-batch)) + + +if [ "$dry_run" == 2 ]; then + + # Do not call curl (dry run = 2) + echo "Running command dry run:" + + if [ "$ID" == "-1" ]; then + + + # Submit file (dry run = 2) + for ID in `cat $file_IDs`; do + IDt=`echo $ID | tr "." "-"` + my_name="SP-${patch}-J${job}-${IDt}" + call_curl $my_name $dry_run + done + + else + + # Submit image (dry run = 2) + IDt=`echo $ID | tr "." "-"` + my_name="SP-${patch}-J${job}-${IDt}" + call_curl $my_name $dry_run + + fi + +else + + # Call curl + rm -rf session_IDs.txt session_image_IDs.txt + + if [ "$ID" == "-1" ]; then + + # Submit file + n_jobs=`cat $file_IDs | wc -l` + if [ "$n_jobs" -gt "$batch_max" ]; then + + # Split into batches + prefix="${file_IDs}_split_" + split -d -l $batch $file_IDs $prefix + n_split=`ls -l $prefix* | wc -l` + echo "Split '$file_IDs' into $n_split batches of size $batch" + + count=1 + n_running=`stats_jobs_canfar.sh` + for batch in $prefix*; do + echo "Number of running jobs = $n_running" + echo "Submitting batch $batch ($count/$n_split)" + echo -ne "\033]0;curl patch=$patch job=$job $count/$n_split\007" + submit_batch $batch + ((count=count+1)) + + n_running=`stats_jobs_canfar.sh` + + while [ "$n_running" -gt "$n_thresh" ]; do + echo "Wait for #jobs = $n_running jobs to go < $n_thresh ..." + sleep $sleep + n_running=`stats_jobs_canfar.sh` + done + + done + + else + + # Submit entire file (single batch) + echo "Submit '$file_IDs' in single batch" + submit_batch $file_IDs + + fi + + else + + # Submit image + IDt=`echo $ID | tr "." "-"` + my_name="SP-${patch}-J${job}-${IDt}" + call_curl $my_name $dry_run + + fi + +fi + +echo "Done $(basename "$0")" + +if [ "$debug_out" != "-1" ]; then + echo "${pat}End $(basename "$0")" >> $debug_out +fi diff --git a/scripts/sh/curl_canfar_monitor_local.sh b/scripts/sh/curl_canfar_monitor_local.sh new file mode 100755 index 000000000..d2b115c1f --- /dev/null +++ b/scripts/sh/curl_canfar_monitor_local.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +# -H "Accept-Encoding: gzip" faster? + +SSL=~/.ssl/cadcproxy.pem +SESSION=https://ws-uv.canfar.net/skaha/v0/session + +type=$1 + +echo "type=$type" + +for session_ID in `cat ids.txt`; do + cmd="curl -E $SSL $SESSION/$session_ID?view=$type" + echo $cmd + $cmd +done + +exit 0 + +while [ 1 ]; do + session_ID=`tail -n 1 ids.txt` + cmd="curl -E $SSL $SESSION/$session_ID?view=$type" + echo $cmd + $cmd +done diff --git a/scripts/sh/init_run_exclusive_canfar.sh b/scripts/sh/init_run_exclusive_canfar.sh new file mode 100755 index 000000000..1faedc767 --- /dev/null +++ b/scripts/sh/init_run_exclusive_canfar.sh @@ -0,0 +1,453 @@ +#!/bin/bash + +# init_run_exclusive_canfar.sh + +# Command line arguments +## Default values +job=-1 +ID=-1 +N_SMP=1 +dry_run=0 +dir=`pwd` +debug_out=-1 + +# mh_local is 0 (1) if merge_header_runner is run on all exposures, +# which is standard so far (run on exposures of given tile only; new) +mh_local=0 + +# sp_local is 0 (1) is split_headers_runner and mask_runner is run +# on all exposures (locally). Not 100% automatic yet. +sp_local=1 +VERBOSE=1 + +pat="-- " + + +## Help string +usage="Usage: $(basename "$0") -j JOB -e ID -k KIND [OPTIONS] +\n\nOptions:\n + -h\tthis message\n + -j, --job JOB\tRUnning JOB, bit-coded\n + -e, --exclusive ID + \timage ID\n + -p, --psf MODEL\n + \tPSF model, one in ['psfex'|'mccd'], default='$psf'\n + -m, --mh_local MH\n + \tmerged header file local (MH=0) or global (MH=1); default is $mh_local\n + -N, --N_SMP N_SMOp\n + \tnumber of jobs (SMP mode only), default from original config files\n + -d, --directory\n + \trun directory, default is pwd ($dir)\n + -n, --dry_run\n + \tdry run, no actuall processing\n + --debug_out PATH\n + \tdebug output file PATH, default not used\n +" + +## Help if no arguments +if [ -z $1 ]; then + echo -ne $usage + exit 1 +fi + +## Parse command line +while [ $# -gt 0 ]; do + case "$1" in + -h) + echo -ne $usage + exit 0 + ;; + -j|--job) + job="$2" + shift + ;; + -e|--exclusive) + ID="$2" + shift + ;; + -p|--psf) + psf="$2" + shift + ;; + -m|--mh_local) + mh_local="$2" + shift + ;; + -N|--N_SMP) + N_SMP="$2" + shift + ;; + -d|--directory) + dir="$2" + shift + ;; + -n|--dry_run) + dry_run=1 + ;; + --debug_out) + debug_out="$2" + shift + ;; + esac + shift +done + +## Check options +if [ "$job" == "-1" ]; then + echo "No job indicated, use option -j" + exit 2 +fi + +if [ "$exclusive" == "-1" ]; then + echo "No image ID indicated, use option -e" + exit 3 +fi + +if [ "$psf" != "psfex" ] && [ "$psf" != "mccd" ]; then + echo "PSF (option -p) needs to be 'psfex' or 'mccd'" + exit 4 +fi + +if [ "$mh_local" != "0" ] && [ "$mh_local" != "1" ]; then + echo "mh_local (option -m) needs to be 0 or 1" + exit 5 +fi + +# Functions + +## Print string, executes command, and prints return value. +function command () { + cmd=$1 + dry_run=$2 + + RED='\033[0;31m' + GREEN='\033[0;32m' + NC='\033[0m' # No Color + # Color escape characters show up in log files + #RED='' + #GREEN='' + #NC='' + + msg="running '$cmd' (dry run=$dry_run)" + if [ $VERBOSE == 1 ]; then + echo $msg + fi + if [ "$debug_out" != "-1" ]; then + echo ${pat}$msg >> $debug_out + fi + + if [ "$dry_run" == "0" ]; then + $cmd + res=$? + + if [ "$debug_out" != "-1" ]; then + echo "${pat}exit code = $res" >> $debug_out + fi + + if [ $VERBOSE == 1 ]; then + if [ $res == 0 ]; then + echo -e "${GREEN}success, return value = $res${NC}" + else + echo -e "${RED}error, return value = $res${NC}" + if [ $STOP == 1 ]; then + echo "${RED}exiting $(basename "$0")', error in command '$cmd'${NC}" + exit $res + else + echo "${RED}continuing '$(basename "$0")', error in command '$cmd'${NC}" + fi + fi + fi + fi +} + +msg="Starting $(basename "$0")" +echo $msg +if [ "$debug_out" != "-1" ]; then + echo $pat$msg >> $debug_out + echo ${pat}`date` >> $debug_out +fi + +# Set kind +job_to_test=2 +kind="none" + +# loop over possible job numbers +while [ $job_to_test -le 1024 ]; do + + (( do_job = $job & $job_to_test )) + if [[ $do_job != 0 ]]; then + + if [ $job_to_test == 32 ]; then + if [ "$kind" == "tile" ]; then + echo "Error: Invalid job $job. mixing tile and exp kinds" + exit 6 + fi + + # job=32 -> set kind to exp + kind="exp" + elif [ $job_to_test == 2 ]; then + if [ "$kind" == "tile" ]; then + echo "Error: Invalid job $job. mixing tile and exp kinds" + exit 6 + fi + + kind="exp" + elif [ $job_to_test == 8 ]; then + if [ "$kind" == "tile" ]; then + echo "Error: Invalid job $job. mixing tile and exp kinds" + exit 6 + fi + + kind="exp" + else + if [ "$kind" == "exp" ]; then + echo "Error: Invalid job $job. mixing tile and exp kinds" + exit 6 + fi + + # job != 32 -> set kind to tile + kind="tile" + fi + + fi + + # Multiply job number by two to get next biwise number + job_to_test=$((job_to_test * 2)) +done + +if [ "$kind" == "none" ]; then + echo "Error: invalid job $job" + exit 5 +fi + + +if [ "$dry_run" == 1 ]; then + echo "in dry run mode" +fi + +CONDA_PREFIX=/arc/home/kilbinger/.conda/envs/shapepipe +PATH=$PATH:$CONDA_PREFIX/bin +if [ "$debug_out" != "-1" ]; then + echo "${pat}conda prefix = ${CONDA_PREFIX}" >> $debug_out + echo "${pat}HOME = ${HOME}" >> $debug_out + echo "${pat}path = ${PATH}" >> $debug_out +fi + +cd $dir +echo $pwd + +if [ ! -d ${kind}_runs ]; then + command "mkdir ${kind}_runs" $dry_run +fi + + +cd ${kind}_runs + +if [ ! -d "$ID" ]; then + command "mkdir $ID" $dry_run +fi + +cd $ID +pwd + + +if [ ! -d "output" ]; then + command "mkdir output" $dry_run +fi + +cd output + +if [ "$mh_local" == "0" ]; then + if [ ! -f log_exp_headers.sqlite ]; then + # Global Mh and file does not exist -> symlink to + # gllobal mh file + command "ln -s $dir/output/log_exp_headers.sqlite" $dry_run + fi +fi + + +# Update links to global run directories (GiFeGie, Uz) +for my_dir in $dir/output/run_sp_[GU]*; do + command "ln -sf $my_dir" $dry_run +done + +# Combined flags + +## Tiles +command "ln -sf $dir/output/run_sp_Ma_tile" $dry_run + +if [ "$sp_local" == "0" ]; then + # Exposures + command "ln -sf $dir/output/run_sp_Ma_exp" $dry_run +else + command "rm -f $dir/output/run_sp_Ma_exp" $dry_run +fi + +# Check for existing exp SpMh dir +if [[ -d "$dir/output/run_sp_exp_SpMh" ]]; then + # create link + command "ln -sf $dir/output/run_sp_exp_SpMh" $dry_run +else + echo "No global SpMh directory found" +fi + +(( do_job = $job & 2 )) +if [ $do_job != 0 ] && [ "$sp_local" == "1" ]; then + # run local Sp; works only with mh_local=1; this step needs to be done + # before following mh_local=1 steps + command "rm -rf run_sp_GitFeGie*" $dry_run + command "rm -rf run_sp_Gie*" $dry_run + command "rm -rf run_sp_exp_Sp*" $dry_run + + # Create new get_image dir + new_dir="run_sp_Gie/get_images_runner_run_2/output" + command "rm -rf $new_dir" $dry_run + command "mkdir -p $new_dir" $dry_run + + # Link to image, weight, and flag file of current exposure + + # Remove HDU extension + command "cd $new_dir" $dry_run + exp_ID=$(echo "$ID" | sed 's/-[0-9]\{1,2\}//') + for file in $dir/output//run_sp_GitFeGie_20*/get_images_runner_run_2/output/*${exp_ID}* ; do + echo $file + command "ln -s $file" $dry_run + done + command "cd ../../.." $dry_run + + # Run Sp + cd .. + command "update_runs_log_file.py" $dry_run + export SP_RUN=`pwd` + command "shapepipe_run -c cfis/config_exp_Sp.ini -e $exp_ID" $dry_run + + # Only keep CCD of this ID + command "mkdir -p output/run_sp_exp_Sp_shdu/split_exp_runner/output" $dry_run + command "mv output/run_sp_exp_Sp/split_exp_runner/output/*$ID* output/run_sp_exp_Sp_shdu/split_exp_runner/output" $dry_run + command "mv output/run_sp_exp_Sp/split_exp_runner/output/headers* output/run_sp_exp_Sp_shdu/split_exp_runner/output" $dry_run + command "rm -rf output/run_sp_exp_Sp" $dry_run + command "update_runs_log_file.py" $dry_run + cd output + + # Exception: Do not carry out actual job call + exit 0 +fi + +if [ "$mh_local" == "1" ]; then + + # Remove previous Sx runs + command "rm -rf run_sp_tile_Sx_*" $dry_run + + if [ "$ID" == "-1" ]; then + echo "ID needs to be given (option -e) for mh_local and job&16" + exit 6 + fi + + if [ -L log_exp_headers.sqlite ]; then + # Local Mh and symlink -> remove previous link to + # (potentially incomplete) global mh file + echo "Removing previous mh sym link" + command "rm log_exp_headers.sqlite" $dry_run + else + echo "no mh link found" + fi + + echo "Creating local mh file" + + ## Remove previous (local) split_exp dir + #command "rm -rf run_sp_exp_Sp" $dry_run + + ## Create new split exp run dir + #new_dir="run_sp_exp_Sp//split_exp_runner/output" + #command "mkdir -p $new_dir" $dry_run + + ## Link to all header files of exposures used for the current tile + #IDs=`echo $ID | tr "." "-"` + #for exp_ID in `cat run_sp_GitFeGie_*/find_exposures_runner/output/exp_numbers-$IDs.txt` ; do + #x=`echo $exp_ID | tr -d p ` + #command "ln -s $dir/output/run_sp_exp_SpMh/split_exp_runner/output/headers-$x.npy $new_dir/headers-$x.npy" $dry_run + #done + + # Run merge_headers_runner on local exposure selection + cd .. + command "update_runs_log_file.py" $dry_run + export SP_RUN=`pwd` + command "shapepipe_run -c cfis/config_exp_Mh.ini" $dry_run + cd output + +fi + +(( do_job = $job & 8 )) +if [ $do_job != 0 ] && [ "$sp_local" == "1" ]; then + # Remove previous local Ma runs + echo "cdsclient = $CDSCLIENT" + command "rm -rf run_sp_exp_Ma*" $dry_run +fi + +(( do_job = $job & 16 )) +if [[ $do_job != 0 ]]; then + # Remove previous Sx runs + command "rm -rf run_sp_tile_Sx_*" $dry_run +fi + +# Update links to exposure run directories, which were created in job 32 +(( do_job = $job & 64 )) +if [[ $do_job != 0 ]]; then + if [ "$kind" == "tile" ]; then + cd ../../.. + command "link_to_exp_for_tile.py -t $ID -i tile_runs -I exp_runs" $dry_run + cd ${kind}_runs/$ID/output + + # Remove duplicate job-16 runs (tile detection) + n_16=`ls -rt1d run_sp_tile_Sx_* | wc -l` + if [ "$n_16" != "1" ]; then + n_remove="$(($n_16-1))" + echo "removing $n_remove duplicate old job-16 runs" + command "rm -rf `ls -rt1d run_sp_tile_Sx_* | head -$n_remove`" $dry_run + fi + + # Remove previous runs of this job + rm -rf run_sp_tile_PsViSmVi* + fi +fi + +(( do_job = $job & 256 )) +if [[ $do_job != 0 ]]; then + + # Remove previous runs of this job + rm -rf run_sp_Ms_20??_* + +fi + +(( do_job = $job & 512 )) +if [[ $do_job != 0 ]]; then + + # Remove previous runs of this job + rm -rf run_sp_Mc_20??_* + +fi + + +cd .. + +# Update log file +command update_runs_log_file.py $dry_run + +echo -n "pwd: " +pwd + +echo -n "environment: " +echo $CONDA_PREFIX + +# To avoid (new?) qt error with setools (-j 32) +export DISPLAY=:1.0 + +command "job_sp_canfar.bash -p psfex -j $job -e $ID --n_smp $N_SMP --nsh_jobs $N_SMP --debug_out $debug_out" $dry_run + +cd $dir + +msg="End $(basename "$0")" +echo $msg +if [ "$debug_out" != "-1" ]; then + echo $pat$msg >> $debug_out- +fi diff --git a/scripts/sh/job_sp.bash b/scripts/sh/job_sp.bash index 15cb1428a..67aa73444 100755 --- a/scripts/sh/job_sp.bash +++ b/scripts/sh/job_sp.bash @@ -8,11 +8,6 @@ # called in interactive mode on a virtual # machine. # Author: Martin Kilbinger -# Date: v1.0 11/2020 -# v1.1 01/2021 - -# MKDEBUG TODO: -# Option to change SMP_BATCH_SIZE, not for MPI # VM home, required for canfar run. @@ -294,23 +289,6 @@ function upload_logs() { upload "logs" "$id" "$verbose" "${upl[@]}" } -# Print script variables -function print_env() { - echo "*** Environment ***" - echo "Data:" - echo " TILE_ARR=${TILE_ARR[@]}" - echo "Paths:" - echo " VM_HOME=$VM_HOME" - echo " SP_RUN=$SP_RUN" - echo " TILE_NUMBERS_PATH=$TILE_NUMBERS_PATH" - echo " OUTPUT=$OUTPUT" - echo " SP_CONFIG=$SP_CONFIG" - echo "Other variables:" - echo " VCP=$VCP" - echo " CERTFILE=$CERTFILE" - echo "***" -} - function set_config_n_smp() { local config_name=$1 local _n_smp=$2 @@ -420,7 +398,7 @@ if [[ $do_job != 0 ]]; then ### Star detection, selection, PSF model. setools can exit with an error for CCD with insufficient stars, ### the script should continue STOP=0 - command_sp "shapepipe_run -c $SP_CONFIG/config_tile_Sx_exp_${psf}.ini" "Run shapepipe (tile detection, exp $psf)" + command_cfg_shapepipe "config_tile_Sx_exp_${psf}.ini" "Run shapepipe (tile detection, exp $psf)" $n_smp STOP=1 fi @@ -432,7 +410,7 @@ if [[ $do_job != 0 ]]; then ### PSF model letter: 'P' (psfex) or 'M' (mccd) letter=${psf:0:1} Letter=${letter^} - command_sp "shapepipe_run -c $SP_CONFIG/config_tile_${Letter}iViSmVi.ini" "Run shapepipe (tile PsfInterp=$Letter}: up to ngmix+galsim)" + command_cfg_shapepipe "config_tile_${Letter}iViSmVi.ini" "Run shapepipe (tile PsfInterp=$Letter}: up to ngmix+galsim)" $n_smp fi @@ -464,7 +442,7 @@ if [[ $do_job != 0 ]]; then ### Shapes, run $nsh_jobs parallel processes VERBOSE=0 for k in $(seq 1 $nsh_jobs); do - command_sp "shapepipe_run -c $SP_CONFIG_MOD/config_tile_Ng${k}u.ini" "Run shapepipe (tile: ngmix+galsim $k)" & + command_sp "shapepipe_run -c $SP_CONFIG_MOD/config_tile_Ng${k}u.ini" "Run shapepipe (tile: ngmix $k)" & done wait VERBOSE=1 diff --git a/scripts/sh/job_sp_canfar.bash b/scripts/sh/job_sp_canfar.bash new file mode 100755 index 000000000..3d31e245c --- /dev/null +++ b/scripts/sh/job_sp_canfar.bash @@ -0,0 +1,568 @@ +#!/bin/bash + +# Name: job_sp_canfar.bash +# Description: General script to process one or more tiles +# with all contributing exposures. +# This works as job submission script for +# the canfar batch system. +# called in interactive mode on a virtual +# machine. +# Author: Martin Kilbinger + + +# Command line arguments +## Default values +job=255 +config_dir=$HOME/shapepipe/example/cfis +psf='mccd' +retrieve='vos' +star_cat_for_mask='onthefly' +exclusive='' +results='cosmostat/kilbinger/results_v2' +n_smp=-1 +nsh_jobs=8 +debug_out=-1 + +pat="--- " + +## Help string +usage="Usage: $(basename "$0") [OPTIONS] [TILE_ID] +\n\nOptions:\n + -h\tthis message\n + -j, --job JOB\tRunning JOB, bit-coded\n + \t 1: retrieve images (online if method=vos)\n + \t 2: prepare images (offline)\n + \t 4: mask tiles (online if star_cat_for_mask=onthefly)\n + \t 8: mask exposures (online if star_cat_for_mask=onthefly)\n + \t 16: detection of galaxies on tiles (offline)\n + \t 32: processing of stars on exposures (offline)\n + \t 64: galaxy selection on tiles (offline)\n + \t 128: shapes and morphology (offline)\n + \t 256: paste catalogues (offline)\n + -c, --config_dir DIR\n + \t config file directory, default='$config_dir'\n + -p, --psf MODEL\n + \tPSF model, one in ['psfex'|'mccd'], default='$psf'\n + -r, --retrieve METHOD\n + \tmethod to retrieve images, allowed are 'vos', 'symlink', default='$retrieve'\n + -s, --star_cat_for_mask\n + \tcatalogue for masking bright stars, allowed are 'onthefly', 'save',\n + \tdefault is '${star_cat_for_mask}'\n + -e, --exclusive ID\n + \texclusive input filer number string ID (default: None)\n + -o, --output_dir\n + \toutput (upload) directory on vos:cfis, default='$results'\n + -n, --n_smp N_SMP\n + \tnumber of jobs (SMP mode only), default from original config files\n + --nsh_jobs NJOB\n + \tnumber of objects per parallel shape module call, \n + \tdefault: optimal number is computed\n + --debug_out PATH\n + \tdebug output file PATH, default not used\n + TILE_ID_i\n + \ttile ID(s), e.g. 283.247 214.242, only with '-j 1'\n +" + +## Help if no arguments +if [ -z $1 ]; then + echo -ne $usage + exit 1 +fi + +## Parse command line +while [ $# -gt 0 ]; do + case "$1" in + -h) + echo -ne $usage + exit 0 + ;; + -j|--job) + job="$2" + shift + ;; + -c|--config_dir) + config_dir="$2" + shift + ;; + -p|--psf) + psf="$2" + shift + ;; + -r|--retrieve) + retrieve="$2" + shift + ;; + -s|--star_cat_for_mask) + star_cat_for_mask="$2" + shift + ;; + -e|--exclusive) + exclusive="$2" + shift + ;; + -o|--output_dir) + results="$2" + shift + ;; + -n|--n_smp) + n_smp="$2" + shift + ;; + --nsh_jobs) + nsh_jobs="$2" + shift + ;; + --debug_out) + debug_out="$2" + shift + ;; + esac + shift +done + +## Check options +if [ "$psf" != "psfex" ] && [ "$psf" != "mccd" ]; then + echo "PSF (option -p) needs to be 'psfex' or 'mccd'" + exit 2 +fi + +if [ "$star_cat_for_mask" != "onthefly" ] && [ "$star_cat_for_mask" != "save" ]; then + echo "Star cat for mask (option -s) needs to be 'onthefly' or 'save'" + exit 4 +fi + +if [ "$retrieve" != "vos" ] && [ "$retrieve" != "symlink" ]; then + echo "method to retrieve images (option -r) needs to be 'vos' or 'symlink'" + exit 5 +fi + +if [ "$debug_out" != "-1" ]; then + echo $pat`date` >> $debug_out + echo "${pat}Starting $(basename "$0")" >> $debug_out +fi + +CONDA_PREFIX=/arc/home/kilbinger/.conda/envs/shapepipe +PATH=$PATH:$CONDA_PREFIX/bin + +# For tar archives. TODO: Should be unique to each job +export ID="test" + +## Paths + +## Path variables used in shapepipe config files + +# Run path and location of input image directories +export SP_RUN=`pwd` + +# Config file path +export SP_CONFIG=$SP_RUN/cfis +export SP_CONFIG_MOD=$SP_RUN/cfis_mod + +## Other variables + +# Output +OUTPUT=$SP_RUN/output + +# For tar archives +output_rel=`realpath --relative-to=. $OUTPUT` + +# Stop on error, default=1 +STOP=1 + +# Verbose mode (1: verbose, 0: quiet) +VERBOSE=1 + +# VCP options +export CERTFILE=$HOME/.ssl/cadcproxy.pem +export VCP="vcp --certfile=$CERTFILE" + + +## Functions + +# Print string, executes command, and prints return value. +function command () { + cmd=$1 + str=$2 + + RED='\033[0;31m' + GREEN='\033[0;32m' + NC='\033[0m' # No Color + # Color escape characters show up in log files + #RED='' + #GREEN='' + #NC='' + + + if [ "$debug_out" != "-1" ]; then + echo "${pat}pwd = `pwd`" >> $debug_out + echo "${pat}SP_RUN = $SP_RUN" >> $debug_out + echo "${pat}SP_CONFIG = $SP_CONFIG" >> $debug_out + fi + + if [ $# == 2 ]; then + if [ $VERBOSE == 1 ]; then + echo "$str: running '$cmd'" + fi + if [ "$debug_out" != "-1" ]; then + echo "${pat}Running $cmd" >> $debug_out + fi + + $cmd + + else + if [ $VERBOSE == 1 ]; then + echo "$str: running '$cmd $4 \"$5 $6\"'" + fi + if [ "$debug_out" != "-1" ]; then + echo "${pat}Running $cmd $4 \"$5 $6\"" >> $debug_out + fi + + $cmd $4 "$5 $6" + + fi + + res=$? + + if [ "$debug_out" != "-1" ]; then + echo "${pat}exit code = $res" >> $debug_out + fi + + if [ $VERBOSE == 1 ]; then + if [ $res == 0 ]; then + echo -e "${GREEN}success, return value = $res${NC}" + else + echo -e "${RED}error, return value = $res${NC}" + if [ $STOP == 1 ]; then + echo "${RED}exiting 'canfar_sp.bash', error in command '$cmd'${NC}" + exit $res + else + echo "${RED}continuing 'canfar_sp.bash', error in command '$cmd'${NC}" + fi + fi + fi +} + +# Run shapepipe command. If error occurs, upload sp log files before stopping script. +function command_sp() { + local cmd=$1 + local str=$2 + + command "$1" "$2" +} + +# Set up config file and call shapepipe_run +function command_cfg_shapepipe() { + local config_name=$1 + local str=$2 + local _n_smp=$3 + local _exclusive=$4 + + if [ "$exclusive" != "" ]; then + exclusive_flag="-e $_exclusive" + else + exclusive_flag="" + fi + + config_upd=$(set_config_n_smp $config_name $_n_smp) + #local cmd="/arc/home/kilbinger/.conda/envs/shapepipe/bin/shapepipe_run -c $config_upd $exclusive_flag" + local cmd="shapepipe_run -c $config_upd $exclusive_flag" + command_sp "$cmd" "$str" +} + +# Tar and upload files to vos +function upload() { + base=$1 + shift + ID=$1 + shift + verbose=$1 + shift + upl=("$@") + + echo "Counting upload files" + n_upl=(`ls -l ${upl[@]} | wc`) + if [ $n_upl == 0 ]; then + if [ $STOP == 1 ]; then + echo "Exiting script, no file found for '$base' tar ball" + exit 3 + fi + fi + tar czf ${base}_${ID}.tgz ${upl[@]} + command "$VCP ${base}_${ID}.tgz vos:cfis/$results" "Upload tar ball" +} + +# Upload log files +function upload_logs() { + id=$1 + verbose=$2 + + upl="$output_rel/*/*/logs $output_rel/*/logs" + upload "logs" "$id" "$verbose" "${upl[@]}" +} + +function set_config_n_smp() { + local config_name=$1 + local _n_smp=$2 + + local config_orig="$SP_CONFIG/$config_name" + + if [[ $_n_smp != -1 ]]; then + # Update SMP batch size + local config_upd="$SP_CONFIG_MOD/$config_name" + update_config $config_orig $config_upd "SMP_BATCH_SIZE" $_n_smp + else + # Keep original config file + local config_upd=$config_orig + fi + + # Set "return" value (stdout) + echo "$config_upd" +} + +# Update config file +function update_config() { + local config_orig=$1 + local config_upd=$2 + local key=$3 + local val_upd=$4 + + cat $config_orig \ + | perl -ane 's/'$key'\s+=.+/'$key' = '$val_upd'/; print' > $config_upd +} + +### Start ### + +echo "Start processing" + +# Create input and output directories +mkdir -p $SP_RUN +cd $SP_RUN +mkdir -p $OUTPUT +mkdir -p $SP_CONFIG_MOD + +# Processing + + +### Retrieve config files +if [[ $config_dir == *"vos:"* ]]; then + command_sp "$VCP $config_dir ." "Retrieve shapepipe config files" +else + if [[ ! -L cfis ]]; then + command_sp "ln -s $config_dir cfis" "Retrieve shapepipe config files" + fi +fi + + +## Retrieve config files and images (online if retrieve=vos) +## Retrieve and save star catalogues for masking (if star_cat_for_mask=save) +(( do_job = $job & 1 )) +if [[ $do_job != 0 ]]; then + + ### Retrieve files + command_cfg_shapepipe \ + "config_GitFeGie_$retrieve.ini" \ + "Retrieve images" \ + -1 \ + $exclusive + + ### Retrieve and save star catalogues for masking + if [ "$star_cat_for_mask" == "save" ]; then + #### For tiles + mkdir $SP_RUN/star_cat_tiles + command_sp \ + "create_star_cat $SP_RUN/output/run_sp_GitFeGie_*/get_images_runner_run_1/output $SP_RUN/star_cat_tiles" \ + "Save star cats for masking (tile)" + + #### For single-exposures + mkdir $SP_RUN/star_cat_exp + command_sp \ + "create_star_cat $SP_RUN/output/run_sp_GitFeGie_*/get_images_runner_run_2/output $SP_RUN/star_cat_exp exp" \ + "Save star cats for masking (exp)" + fi + +fi + +## Prepare images (offline) +(( do_job = $job & 2 )) +if [[ $do_job != 0 ]]; then + + ### Uncompress tile weights + command_cfg_shapepipe "config_tile_Uz.ini" "Run shapepipe (uncompress tile weights)" $n_smp $exclusive + + ### Split images into single-HDU files, merge headers for WCS info + command_cfg_shapepipe \ + "config_exp_SpMh.ini" \ + "Run shapepipe (split images, merge headers)" \ + $n_smp \ + $exclusive + +fi + +## Mask tiles: add star, halo, and Messier object masks (online if "star_cat_for_mask" is "onthefly") +(( do_job = $job & 4 )) +if [[ $do_job != 0 ]]; then + + ### Mask tiles + command_cfg_shapepipe \ + "config_tile_Ma_$star_cat_for_mask.ini" \ + "Run shapepipe (mask tiles)" \ + $n_smp \ + $exclusive + +fi + +## Mask exposures: add star, halo, and Messier object masks (online if "star_cat_for_mask" is "onthefly") +(( do_job = $job & 8 )) +if [[ $do_job != 0 ]]; then + + ### Mask exposures + command_cfg_shapepipe \ + "config_exp_Ma_$star_cat_for_mask.ini" \ + "Run shapepipe (mask exposures)" \ + $n_smp \ + $exclusive + +fi + + +## Remaining exposure processing (offline) +(( do_job = $job & 16 )) +if [[ $do_job != 0 ]]; then + + ### Object detection on tiles + command_cfg_shapepipe \ + "config_tile_Sx.ini" \ + "Run shapepipe (tile detection)" \ + $n_smp \ + $exclusive + +fi + +## Exposure processing (offline) +(( do_job = $job & 32 )) +if [[ $do_job != 0 ]]; then + + ### Star detection, selection, PSF model. setools can exit with an error for CCD with insufficient stars, + ### the script should continue + STOP=0 + command_cfg_shapepipe \ + "config_exp_${psf}.ini" \ + "Run shapepipe (exp $psf)" \ + $n_smp \ + $exclusive + STOP=1 + +fi + +## Process tiles up to shape measurement +(( do_job = $job & 64 )) +if [[ $do_job != 0 ]]; then + + ### PSF model letter: 'P' (psfex) or 'M' (mccd) + letter=${psf:0:1} + Letter=${letter^} + command_cfg_shapepipe \ + "config_tile_${Letter}iViSmVi_canfar.ini" \ + "Run shapepipe (tile PsfInterp=$Letter}: up to ngmix+galsim)" \ + $n_smp \ + $exclusive + +fi + +## Shape measurement (offline) +(( do_job = $job & 128 )) +if [[ $do_job != 0 ]]; then + + ### Prepare config files + n_min=0 + n_obj=`get_number_objects` + nsh_step=`echo "$(($n_obj/$nsh_jobs))"` + + n_max=$((nsh_step - 1)) + for k in $(seq 1 $nsh_jobs); do + cat $SP_CONFIG/config_tile_Ng_template.ini | \ + perl -ane \ + 's/(ID_OBJ_MIN =) X/$1 '$n_min'/; s/(ID_OBJ_MAX =) X/$1 '$n_max'/; s/NgXu/Ng'$k'u/; s/X_interp/'$psf'_interp/g; print' \ + > $SP_CONFIG_MOD/config_tile_Ng${k}u.ini + n_min=$((n_min + nsh_step)) + if [ "$k" == $((nsh_jobs - 1)) ]; then + n_max=-1 + else + n_max=$((n_min + nsh_step - 1)) + fi + done + + ### Shapes, run $nsh_jobs parallel processes + VERBOSE=0 + for k in $(seq 1 $nsh_jobs); do + + # if output dir for subrun exists but no output: re-run + ngmix_run=$OUTPUT/"run_sp_tile_ngmix_Ng${k}u/ngmix_runner" + if [ -e "$ngmix_run" ]; then + ngmix_out="$ngmix_run/output" + n_out=`ls -rlt $ngmix_out | wc -l` + if [ "$n_out" -lt 2 ]; then + command \ + "rm -rf $OUTPUT/run_sp_tile_ngmix_Ng${k}u" \ + "Re-running existing empty ngmix subrun $k" + command_sp \ + "shapepipe_run -c $SP_CONFIG_MOD/config_tile_Ng${k}u.ini" \ + "Run shapepipe (tile: ngmix $k)" & + else + echo "Skipping existing non-empty ngmix subrun $k" + fi + else + command_sp \ + "shapepipe_run -c $SP_CONFIG_MOD/config_tile_Ng${k}u.ini" \ + "Run shapepipe (tile: ngmix $k)" & + fi + done + wait + VERBOSE=1 + +fi + +## Create final catalogues (offline) +(( do_job = $job & 256 )) +if [[ $do_job != 0 ]]; then + + cat $SP_CONFIG/config_merge_sep_cats_template.ini | \ + perl -ane \ + 's/(N_SPLIT_MAX =) X/$1 '$nsh_jobs'/; print' \ + > $SP_CONFIG_MOD/config_merge_sep_cats.ini + + ### Merge separated shapes catalogues + command_sp \ + "shapepipe_run -c $SP_CONFIG_MOD/config_merge_sep_cats.ini" \ + "Run shapepipe (tile: merge sep cats)" \ + "$VERBOSE" \ + "$ID" +fi + +(( do_job = $job & 512 )) +if [[ $do_job != 0 ]]; then + + ### Merge all relevant information into final catalogue + command_cfg_shapepipe \ + "config_make_cat_$psf.ini" \ + "Run shapepipe (tile: create final cat $psf)" \ + $n_smp \ + $exclusive + +fi + +# MKDEBUG: Putting Mh at the end for now, could be integrated before 16. +(( do_job = $job & 1024 )) +if [[ $do_job != 0 ]]; then + + command_cfg_shapepipe \ + "config_exp_Mh.ini" \ + "Run shapepipe (merge exp headers)" \ + $n_smp \ + $exclusive + +fi + +if [ "$debug_out" != "-1" ]; then + echo "${pat}End $(basename "$0")" >> $debug_out +fi diff --git a/scripts/sh/missing_unique.sh b/scripts/sh/missing_unique.sh new file mode 100644 index 000000000..8820d26f5 --- /dev/null +++ b/scripts/sh/missing_unique.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash + +FILES=("summary/missing_job_128_ngmix_runner_*.txt") +temp="temp_temp.tmp" +temp2="temp_temp2.tmp" +out="missing_job_128_ngmix_runner_cut.txt" + +i=0 +for file in ${FILES[@]}; do + + echo $file $i + + if [ "$i" == "0" ]; then + cp $file $temp + else + comm -12 <(sort $file) <(sort $temp) > $temp2 + cp $temp2 $temp + fi + + wc $file $temp + + ((i=i+1)) + +done + +mv $temp $out +rm $temp2 diff --git a/scripts/sh/post_proc_sp.bash b/scripts/sh/post_proc_sp.bash index 72c620e68..930d5b79d 100755 --- a/scripts/sh/post_proc_sp.bash +++ b/scripts/sh/post_proc_sp.bash @@ -70,7 +70,7 @@ SP_CONFIG=$SP_BASE/example/cfis # PSF ## Collect all psfinterp results -prepare_star_cat -p $psf +combine_runs -p $psf -t psf ## Merge all psfinterp results and compute PSF residuals shapepipe_run -c $SP_CONFIG/config_MsPl_$psf.ini @@ -79,7 +79,7 @@ shapepipe_run -c $SP_CONFIG/config_MsPl_$psf.ini # Galaxies ## Prepare output directory with links to all 'final_cat' result files -prepare_tiles_for_final +combine_runs ## Merge final output files to single mother catalog input_final=output/run_sp_combined/make_catalog_runner/output diff --git a/scripts/sh/prepare_star_cat.bash b/scripts/sh/prepare_star_cat.bash deleted file mode 100755 index ff8cb167f..000000000 --- a/scripts/sh/prepare_star_cat.bash +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/bin/env bash - -# Name: prepare_star_cat.bash -# Description: Create directory and links to all PSF or star catalogue files -# from previous ShapePipe runs. -# Author: Martin Kilbinger - - -# Command line arguments - -## Default values -psf='mccd' - -## Help string -usage="Usage: $(basename "$0") [OPTIONS] -\n\nOptions:\n - -h\tthis message\n - -p, --psf MODEL\n - \tPSF model, one in ['psfex'|'mccd'|'setools'], default='$psf'\n -" - -## Parse command line -while [ $# -gt 0 ]; do - case "$1" in - -h) - echo -ne $usage - exit 0 - ;; - -p|--psf) - psf="$2" - shift - ;; - *) - echo -ne usage - exit 1 - ;; - esac - shift -done - - -## Path variables -if [ "$psf" == "psfex" ] || [ "$psf" == "mccd" ]; then - psfval_file_base="validation_psf" - dir_individual="psf_validation_ind" -else - psfval_file_base="mask/star_selection" - dir_individual="star_all_ind" -fi - -pwd=`pwd` - - -## Functions -function link_s () { - target=$1 - link_name=$2 - - if [ -L "$link_name" ]; then - let "n_skipped+=1" - else - ln -s $target $link_name - let "n_created+=1" - fi - - return $n -} - - -# Create output dirs -if [ ! -d "$dir_individual" ]; then - mkdir -p $dir_individual -fi - -if [ "$psf" == "psfex" ]; then - runner="psfex_interp_runner" -elif [ "$psf" == "mccd" ]; then - runner="mccd_fit_val_runner" -else - runner="setools_runner" -fi - -# Find all psf validation files and create links. -# Assumes untar_results.sh has been run before. -n_skipped=0 -n_created=0 -FILES=output/*/${runner}/output/${psfval_file_base}* -for val in ${FILES[@]}; do - base=`basename $val` - link_s "$pwd/$val" "$dir_individual/$base" -done -echo " Created $n_created links, skipped $n_skipped files" diff --git a/scripts/sh/prepare_tiles_for_final.bash b/scripts/sh/prepare_tiles_for_final.bash deleted file mode 100755 index c26f8e8c2..000000000 --- a/scripts/sh/prepare_tiles_for_final.bash +++ /dev/null @@ -1,127 +0,0 @@ -#!/usr/bin/env bash - -# Name: prepare_tiles_for_final.bash -# Description: Create shapepipe run directory with -# links to all `final_cat` fits files -# Author: Martin Kilbinger -# Date: 06/2020 -# Version: 0.1 - -# Command line arguments - -## Default values -cat='final' - -## Help string -usage="Usage: $(basename "$0") [OPTIONS] -\n\nOptions:\n - -h\tthis message\n - -c, --cat TYPE\n - \tCatalogue type, one in ['final'|'flag'|'image'], default='$cat'\n -" - -## Parse command line -while [ $# -gt 0 ]; do - case "$1" in - -h) - echo -ne $usage - exit 0 - ;; - -c|--cat) - cat="$2" - shift - ;; - *) - echo -ne $usage - exit 1 - ;; - esac - shift -done - - -## Functions -function link_s () { - target=$1 - link_name=$2 - - if [ -e "$link_name" ]; then - echo "link with name $link_name already exists, skipping..." - else - echo "create link $target <- $link_name" - ln -s $target $link_name - fi -} - -## Check options -if [ "$cat" != "final" ] && [ "$cat" != "flag" ] && [ "$cat" != "image" ]; then - echo "cat (option -c) needs to be 'final', 'flag', or 'image'" - exit 2 -fi - - -### Start ### - -pwd=`pwd` -out_base="output" - -if [ "$cat" == "final" ]; then - run_dir="run_sp_combined" - INPUT="$pwd/$out_base/run_sp_Mc_*" -elif [ "$cat" == "flag" ]; then - run_dir="run_sp_combined_flag" - INPUT="$pwd/$out_base/run_sp_tile_Ma_*" -else - run_dir="run_sp_combined_image" - INPUT="$pwd/$out_base/run_sp_Git_*" -fi - -log_path="$pwd/$out_base/log_run_sp.txt" -OUTPUT="$pwd/$out_base/$run_dir" -mkdir -p $OUTPUT - -# Directories and file patterns to create/link -if [ "$cat" == "final" ]; then - DIRS=( - "make_catalog_runner" - ) - PATTERNS=( - "final_cat-*" - ) -elif [ "$cat" == "flag" ]; then - DIRS=( - "mask_runner" - ) - PATTERNS=( - "pipeline_flag-*" - ) -else - DIRS=( - "get_images_runner" - ) - PATTERNS=( - "CFIS_image-*" - ) -fi - -# Create links -for n in "${!PATTERNS[@]}"; do - pattern=${PATTERNS[$n]} - dir=$OUTPUT/${DIRS[$n]}/output - echo $n $pattern $dir - mkdir -p $dir - FILES=(`find $INPUT -name "$pattern"`) - n_files=${#FILES[@]} - i=0 - for file in ${FILES[@]}; do - target=$file - link_name=$dir/`basename $file` - link_s $target $link_name - ((i=i+1)) - done - echo " $n_files target files, $i links created/skipped" -done - -# Update log file -modules=`echo ${DIRS[@]} | tr ' ' ,` -echo "./$out_base/$run_dir $modules" >> $log_path diff --git a/scripts/sh/stats_jobs_canfar.sh b/scripts/sh/stats_jobs_canfar.sh new file mode 100755 index 000000000..3d1ddb156 --- /dev/null +++ b/scripts/sh/stats_jobs_canfar.sh @@ -0,0 +1,107 @@ +#!/usr/bin/env bash + +# Name: stats_jobs_canfar.sh +# Author: Martin Kilbinger +# Description: Handles headless jobs on canfar + + +# Global variables + +## Temporary files +tmpfile_jobs="jobinfo.txt" +tmpfile_ids="ids.txt" +tmpfile_running="jobs_running.txt" + +## curl options +SSL=~/.ssl/cadcproxy.pem +SESSION=https://ws-uv.canfar.net/skaha/v0/session + + +# Command line arguments + +## Default values +mode="count" + +## Help string +usage="Usage: $(basename "$0") [OPTIONS] +\n\nOptions:\n + -h\tthis message\n + -m, --mode MODE\n + \tmode, allowed are 'count' (default), 'delete'\n +" + +## Parse command line +while [ $# -gt 0 ]; do + case "$1" in + -h) + echo -ne $usage + exit 0 + ;; + -m|--mode) + mode="$2" + shift + ;; + esac + shift +done + +## Check options +case $mode in + "count"|"delete") + # valid option + ;; + *) + echo "Invalid mode $mode" + exit 1 + ;; +esac + + +# Main program + +# Get all instances +#echo curl -E $SSL $SESSION +curl -E $SSL $SESSION &> /dev/null > $tmpfile_jobs +res=$? + +if [ "$res" == "0" ]; then + # Number of jobs + n_headless=`cat $tmpfile_ids | grep Running | wc -l` +else + # Failure: set to very high number + n_headless=10000 +fi + +# Get headless job IDs +#cat $tmpfile_jobs | grep headless -B 4 -A 12 | grep \"id | perl -F\" -ane 'print "$F[3]\n"' > $tmpfile_ids +cat $tmpfile_jobs | grep headless -B 4 -A 2 | grep Running -A 1 > $tmpfile_ids + + +# Get running job info +cat $tmpfile_ids | grep name | perl -F\- -ane 'chomp; $F[4] =~ s/[",]//g; print "$F[3].$F[4]"' > $tmpfile_running + + +if [ "$mode" == "count" ]; then + + echo $n_headless + +elif [ "$mode" == "delete" ]; then + + echo -n "Delete $n_headless jobs? [y|n] " + read answer + if [ "$answer" == "y" ]; then + cat $tmpfile_jobs | grep headless -B 34 -A 6 | grep Running -A 34 | grep id | grep -v user | perl -F\" -ane 'print "$F[3]\n"' > $tmpfile_ids + for ID in `cat $tmpfile_ids`; do + echo $ID + # Delete headless jobs + echo "curl -X DELETE -E $SSL $SESSION/$ID" + curl -X DELETE -E $SSL $SESSION/$ID + echo $? + done + fi + +fi + + +# Remove temporary files +#rm -f $tmpfile_jobs $tmpfile_ids diff --git a/setup.py b/setup.py index e5610581e..0d4c5c4c9 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ package_info = {} infopath = os.path.abspath( - os.path.join(os.path.dirname(__file__), 'shapepipe', 'info.py') + os.path.join(os.path.dirname(__file__), "shapepipe", "info.py") ) with open(infopath) as open_file: exec(open_file.read(), package_info) @@ -15,8 +15,8 @@ def find_scripts(): scripts = [] - scripts_dir = package_info['__scripts_dir__'] - valid_extensions = package_info['__scripts_ext__'] + scripts_dir = package_info["__scripts_dir__"] + valid_extensions = package_info["__scripts_ext__"] sub_dirs = ( os.path.join(scripts_dir, sub_dir) @@ -25,26 +25,29 @@ def find_scripts(): ) for sub_dir in sub_dirs: - scripts.extend([ - os.path.join(sub_dir, val) for val in os.listdir(sub_dir) - if os.path.isfile(os.path.join(sub_dir, val)) - and '__init__' not in val - and val.endswith(valid_extensions) - ]) + scripts.extend( + [ + os.path.join(sub_dir, val) + for val in os.listdir(sub_dir) + if os.path.isfile(os.path.join(sub_dir, val)) + and "__init__" not in val + and val.endswith(valid_extensions) + ] + ) return scripts setup( - name=package_info['__name__'], - author=package_info['__author__'], - author_email=package_info['__email__'], - version=package_info['__version__'], + name=package_info["__name__"], + author=package_info["__author__"], + author_email=package_info["__email__"], + version=package_info["__version__"], packages=find_packages(), scripts=find_scripts(), - setup_requires=package_info['__setups__'], - install_requires=package_info['__installs__'], - description='Galaxy shape measurement pipeline.', - long_description=package_info['__about__'], - tests_require=package_info['__tests__'], + setup_requires=package_info["__setups__"], + install_requires=package_info["__installs__"], + description="Galaxy shape measurement pipeline.", + long_description=package_info["__about__"], + tests_require=package_info["__tests__"], ) diff --git a/shapepipe/__init__.py b/shapepipe/__init__.py index 88d7a1dfd..1957a353f 100644 --- a/shapepipe/__init__.py +++ b/shapepipe/__init__.py @@ -6,7 +6,7 @@ """ -__all__ = ['modules', 'pipeline', 'utilities'] +__all__ = ["modules", "pipeline", "utilities"] from . import * from .info import __about__, __version__ diff --git a/shapepipe/info.py b/shapepipe/info.py index d230bcd7f..7ce7f1d77 100644 --- a/shapepipe/info.py +++ b/shapepipe/info.py @@ -16,28 +16,24 @@ # Package Info version_info = (1, 0, 1) -__version__ = '.'.join(str(c) for c in version_info) -__name__ = 'shapepipe' -__author__ = 'Samuel Farrens' -__email__ = 'samuel.farrens@cea.fr' +__version__ = ".".join(str(c) for c in version_info) +__name__ = "shapepipe" +__author__ = "Samuel Farrens" +__email__ = "samuel.farrens@cea.fr" __about__ = ( - 'ShapePipe is a shape measurement pipeline developed with the' - + 'CosmoStat lab at CEA Paris-Saclay.' + "ShapePipe is a shape measurement pipeline developed with the" + + "CosmoStat lab at CEA Paris-Saclay." ) -__setups__ = ['pytest-runner'] -__installs__ = [ - 'joblib>=0.13', - 'modopt>=1.2', - 'numpy>=1.14' -] +__setups__ = ["pytest-runner"] +__installs__ = ["joblib>=0.13", "modopt>=1.2", "numpy>=1.14"] __tests__ = [ - 'pytest', - 'pytest-cov', - 'pytest-pycodestyle', - 'pytest-pydocstyle', + "pytest", + "pytest-cov", + "pytest-pycodestyle", + "pytest-pydocstyle", ] -__scripts_dir__ = 'scripts' -__scripts_ext__ = ('.py', '.sh', '.bash') +__scripts_dir__ = "scripts" +__scripts_ext__ = (".py", ".sh", ".bash") def shapepipe_logo(colour=False): @@ -48,7 +44,7 @@ def shapepipe_logo(colour=False): str logo string """ - shape = r''' + shape = r""" _______ __ __ _______ _______ _______ _______ ___ _______ _______ | || | | || _ || || || || | | || | | _____|| |_| || |_| || _ || ___|| _ || | | _ || ___| @@ -56,12 +52,12 @@ def shapepipe_logo(colour=False): |_____ || || || ___|| ___|| ___|| | | ___|| ___| _____| || _ || _ || | | |___ | | | | | | | |___ |_______||__| |__||__| |__||___| |_______||___| |___| |___| |_______| - ''' + """ if not import_fail and colour: - shape = colored(shape, 'cyan', attrs=['bold']) + shape = colored(shape, "cyan", attrs=["bold"]) - logo = r''' + logo = r""" ------------------------------------------------------------------------------- {} @@ -82,7 +78,9 @@ def shapepipe_logo(colour=False): Version: {} ------------------------------------------------------------------------------- - '''.format(shape, __version__) + """.format( + shape, __version__ + ) return logo @@ -95,8 +93,8 @@ def line(): str a horizontal line """ - line = r''' + line = r""" ------------------------------------------------------------------------------- - ''' + """ return line diff --git a/shapepipe/modules/__init__.py b/shapepipe/modules/__init__.py index c440b44cf..5f3847899 100644 --- a/shapepipe/modules/__init__.py +++ b/shapepipe/modules/__init__.py @@ -11,8 +11,6 @@ # Get a list of all files and directories in the modules directory modules_dir = os.listdir(os.path.dirname(os.path.abspath(__file__))) # List all ShapePipe module packages -__all__ = [dir for dir in modules_dir if dir.endswith('_package')] +__all__ = [dir for dir in modules_dir if dir.endswith("_package")] # List all ShapePipe module runners -__module_list__ = [ - file for file in modules_dir if file.endswith('_runner.py') -] +__module_list__ = [file for file in modules_dir if file.endswith("_runner.py")] diff --git a/shapepipe/modules/execute_example_runner.py b/shapepipe/modules/execute_example_runner.py index d1555ea5d..2872d608c 100644 --- a/shapepipe/modules/execute_example_runner.py +++ b/shapepipe/modules/execute_example_runner.py @@ -11,12 +11,12 @@ @module_runner( - input_module='python_example_runner', - version='1.0', - file_pattern='pyex_output', - file_ext='.cat', - executes='head', - run_method='parallel', + input_module="python_example_runner", + version="1.0", + file_pattern="pyex_output", + file_ext=".cat", + executes="head", + run_method="parallel", ) def execute_example_runner( input_file_list, @@ -27,14 +27,14 @@ def execute_example_runner( w_log, ): """Define The Execute Example Runner.""" - command_line = f'head {input_file_list[0]}' + command_line = f"head {input_file_list[0]}" output_file_name = ( f'{run_dirs["output"]}/head_output{file_number_string}.txt' ) stdout, stderr = execute(command_line) - text_file = open(output_file_name, 'w') + text_file = open(output_file_name, "w") text_file.write(stdout) return stdout, stderr diff --git a/shapepipe/modules/find_exposures_package/__init__.py b/shapepipe/modules/find_exposures_package/__init__.py index 00653bf0b..6bb5d6344 100644 --- a/shapepipe/modules/find_exposures_package/__init__.py +++ b/shapepipe/modules/find_exposures_package/__init__.py @@ -32,4 +32,4 @@ Prefix of exposures """ -__all__ = ['find_exposures.py'] +__all__ = ["find_exposures.py"] diff --git a/shapepipe/modules/find_exposures_package/find_exposures.py b/shapepipe/modules/find_exposures_package/find_exposures.py index a3c8f7928..eab72801e 100644 --- a/shapepipe/modules/find_exposures_package/find_exposures.py +++ b/shapepipe/modules/find_exposures_package/find_exposures.py @@ -12,7 +12,7 @@ import astropy.io.fits as fits -class FindExposures(): +class FindExposures: """Find Exposures. This class finds exposures that are used for a given tile. @@ -49,7 +49,7 @@ def process(self): exp_list_uniq = self.get_exposure_list() # Write list to output ascii file - f_out = open(self._output_path, 'w') + f_out = open(self._output_path, "w") if len(exp_list_uniq) > 0: for exp in exp_list_uniq: print(exp, file=f_out) @@ -70,13 +70,13 @@ def get_exposure_list(self): try: # Get history from tiles FITS header hdu = fits.open(self._img_tile_path) - hist = hdu[0].header['HISTORY'] + hist = hdu[0].header["HISTORY"] except Exception: # Key word not found -> raise error self._w_log.info( - 'Error while reading tile image FITS file ' - + f'{self._img_tile_path}, continuing...' + "Error while reading tile image FITS file " + + f"{self._img_tile_path}, continuing..." ) exp_list = [] @@ -85,14 +85,14 @@ def get_exposure_list(self): # History entries have format as the following example: # "input image 2243881p.fits 6 extension(s)" for _hist in hist: - temp = _hist.split(' ') + temp = _hist.split(" ") - pattern = r'(.*)\.{1}.*' + pattern = r"(.*)\.{1}.*" pattern_match = re.search(pattern, temp[self._colnum]) if not pattern_match: raise IndexError( - f're match \'{pattern}\' failed for filename' - + f' \'{temp[self._colnum]}\'' + f"re match '{pattern}' failed for filename" + + f" '{temp[self._colnum]}'" ) exp_name = pattern_match.group(1) @@ -108,7 +108,7 @@ def get_exposure_list(self): # For log output n_exp_uniq = len(exp_list_uniq) n_duplicate = len(exp_list) - n_exp_uniq - self._w_log.info(f'Found {n_exp_uniq} exposures used in tile') - self._w_log.info(f'{n_duplicate} duplicates were removed') + self._w_log.info(f"Found {n_exp_uniq} exposures used in tile") + self._w_log.info(f"{n_duplicate} duplicates were removed") return exp_list_uniq diff --git a/shapepipe/modules/find_exposures_runner.py b/shapepipe/modules/find_exposures_runner.py index a7ea6b0be..a54d59dae 100644 --- a/shapepipe/modules/find_exposures_runner.py +++ b/shapepipe/modules/find_exposures_runner.py @@ -11,11 +11,11 @@ @module_runner( - version='1.1', - file_pattern=['image'], - file_ext='.fits', - depends=['numpy', 'astropy', 'sip_tpv'], - numbering_scheme='_0', + version="1.1", + file_pattern=["image"], + file_ext=".fits", + depends=["numpy", "astropy", "sip_tpv"], + numbering_scheme="_0", ) def find_exposures_runner( input_file_list, @@ -33,10 +33,10 @@ def find_exposures_runner( output_path = f'{run_dirs["output"]}/exp_numbers{file_number_string}.txt' # Give column number for exposure name in fits header - colnum = config.getint(module_config_sec, 'COLNUM') + colnum = config.getint(module_config_sec, "COLNUM") # Give the prefix of exposures - exp_prefix = config.get(module_config_sec, 'EXP_PREFIX') + exp_prefix = config.get(module_config_sec, "EXP_PREFIX") # Create find exposures class instance find_exp_inst = find_exposures.FindExposures( input_file_name, diff --git a/shapepipe/modules/get_images_package/__init__.py b/shapepipe/modules/get_images_package/__init__.py index 2c0b6b69c..d887b9f78 100644 --- a/shapepipe/modules/get_images_package/__init__.py +++ b/shapepipe/modules/get_images_package/__init__.py @@ -52,4 +52,4 @@ """ -__all__ = ['get_images.py'] +__all__ = ["get_images.py"] diff --git a/shapepipe/modules/get_images_package/get_images.py b/shapepipe/modules/get_images_package/get_images.py index d465d0719..631a876f2 100644 --- a/shapepipe/modules/get_images_package/get_images.py +++ b/shapepipe/modules/get_images_package/get_images.py @@ -58,12 +58,12 @@ def in2out_pattern(number): """ # replace dots ('.') with dashes ('-') to avoid confusion # with file extension delimiters - number_final = re.sub(r'\.', '-', number) + number_final = re.sub(r"\.", "-", number) # remove letters in number - number_final = re.sub('[a-zA-Z]', '', number_final) + number_final = re.sub("[a-zA-Z]", "", number_final) # make robust for more generalized file names - number_final = re.sub(r'_', '', number_final) + number_final = re.sub(r"_", "", number_final) return number_final @@ -149,12 +149,12 @@ def process(self, input_dir, output_dir): # List of unique input images flat_list = [item for sublist in all_image_numbers for item in sublist] - self._w_log.info(f'Number of total image IDs = {len(flat_list)}') + self._w_log.info(f"Number of total image IDs = {len(flat_list)}") # Get unique number list image_number_list = list(set(flat_list)) self._w_log.info( - f'Number of unique image IDs = {len(image_number_list)}' + f"Number of unique image IDs = {len(image_number_list)}" ) # Create array to make it compatible with input dir @@ -165,36 +165,31 @@ def process(self, input_dir, output_dir): # Check consistency of list lengths if any( - len(lst) != nitem for lst in [ + len(lst) != nitem + for lst in [ input_dir, self._input_file_pattern, self._input_file_ext, - self._output_file_pattern + self._output_file_pattern, ] ): raise ValueError( - f'Lists INPUT_PATH ({len(input_dir)}), ' - + f'INPUT_FILE_PATTERN ({len(self._input_file_pattern)}), ' - + f'INPUT_FILE_EXT ({len(self._input_file_ext)}), ' - + f'OUTPUT_FILE_PATTERN ({len(self._output_file_pattern)}) ' - + 'need to have equal length' + f"Lists INPUT_PATH ({len(input_dir)}), " + + f"INPUT_FILE_PATTERN ({len(self._input_file_pattern)}), " + + f"INPUT_FILE_EXT ({len(self._input_file_ext)}), " + + f"OUTPUT_FILE_PATTERN ({len(self._output_file_pattern)}) " + + "need to have equal length" ) # Assemble input and output file lists all_inputs = self.get_file_list( - image_number_list, - input_dir, - use_output_file_pattern=False + image_number_list, input_dir, use_output_file_pattern=False ) all_outputs_orig = self.get_file_list( - image_number_list, - output_dir, - use_output_file_pattern=False + image_number_list, output_dir, use_output_file_pattern=False ) all_outputs_renamed = self.get_file_list( - image_number_list, - output_dir, - use_output_file_pattern=True + image_number_list, output_dir, use_output_file_pattern=True ) # Retrieve files @@ -242,24 +237,22 @@ def get_file_list( # Keep initial dot in extension x = in_ext[1:] - x2 = re.sub(r'\.', '', x) + x2 = re.sub(r"\.", "", x) ext_final = in_ext[0] + x2 - fbase = ( - f'{self._output_file_pattern[idx]}{number_final}' - ) + fbase = f"{self._output_file_pattern[idx]}{number_final}" else: fbase = re.sub(self._input_numbering, number, in_pattern) ext_final = in_ext if ( use_output_file_pattern - and self._output_file_pattern[idx] == '*' + and self._output_file_pattern[idx] == "*" ): # retrieve all input files to output dir, do not append # extension fpath = in_path else: - fpath = f'{in_path}/{fbase}{ext_final}' + fpath = f"{in_path}/{fbase}{ext_final}" list_files_per_type.append(fpath) list_all_files.append(list_files_per_type) @@ -280,40 +273,38 @@ def retrieve(self, all_inputs, all_outputs_orig, all_outputs_renamed): """ for in_per_type, out_per_type_orig, out_per_type_renamed in zip( - all_inputs, - all_outputs_orig, - all_outputs_renamed + all_inputs, all_outputs_orig, all_outputs_renamed ): for idx in range(len(in_per_type)): if self._check_existing_dir: out_base = os.path.basename(out_per_type_orig[idx]) path = glob.glob( - f'{self._check_existing_dir}/**/{out_base}', + f"{self._check_existing_dir}/**/{out_base}", recursive=True, ) if path: if len(path) == self._n_expected: self._w_log.info( - f'{path[0]} found, skipping download' + f"{path[0]} found, skipping download" ) continue else: self._w_log.info( - f'{len(path)} instead of {self._n_expected} ' - + 'existing files found at' - + f' {self._check_existing_dir}' - + ', downloading images' + f"{len(path)} instead of {self._n_expected} " + + "existing files found at" + + f" {self._check_existing_dir}" + + ", downloading images" ) else: self._w_log.info( - 'No existing images found at' - + f' {self._check_existing_dir},' - + ' downloading images' + "No existing images found at" + + f" {self._check_existing_dir}," + + " downloading images" ) self.retrieve_one( in_per_type[idx], out_per_type_orig[idx], - out_per_type_renamed[idx] + out_per_type_renamed[idx], ) def retrieve_one(self, in_path, out_path_orig, out_path_renamed): @@ -329,17 +320,17 @@ def retrieve_one(self, in_path, out_path_orig, out_path_renamed): Output path """ - if self._retrieve_method == 'vos': + if self._retrieve_method == "vos": sys.argv = [] - sys.argv.append('vcp') + sys.argv.append("vcp") if self._retrieve_options: - for opt in self._retrieve_options.split(' '): + for opt in self._retrieve_options.split(" "): sys.argv.append(opt) sys.argv.append(in_path) sys.argv.append(out_path_orig) - log_cmd = ' '.join(sys.argv) - vcp = vosHandler('vcp') + log_cmd = " ".join(sys.argv) + vcp = vosHandler("vcp") self._w_log.info(log_cmd) # Download file from VOSpace @@ -348,15 +339,15 @@ def retrieve_one(self, in_path, out_path_orig, out_path_renamed): try: vcp() self._w_log.info( - 'Success of command vcp after ' - + f'{attempt}/{self._n_try} attempts' + "Success of command vcp after " + + f"{attempt}/{self._n_try} attempts" ) break except Exception: attempt += 1 self._w_log.info( - 'Error with command vcp, attempt ' - + f'{attempt}/{self._n_try}' + "Error with command vcp, attempt " + + f"{attempt}/{self._n_try}" ) sys.argv = None @@ -365,14 +356,14 @@ def retrieve_one(self, in_path, out_path_orig, out_path_renamed): # link name in ShapePipe numbering format os.symlink(out_path_orig, out_path_renamed) - elif self._retrieve_method == 'symlink': + elif self._retrieve_method == "symlink": src = in_path # Get all input file names if INPUT_FILE_PATTERN contains '*' all_src = glob.glob(src) if len(all_src) == 0: raise IndexError( - f'No input file found corresponding to \'{src}\'' + f"No input file found corresponding to '{src}'" ) dst = out_path_renamed @@ -380,7 +371,7 @@ def retrieve_one(self, in_path, out_path_orig, out_path_renamed): if os.path.isdir(dst): # OUTPUT_FILE_PATTERN is '*', so dst is not regular file # but directory. Append input file name - dst_name = f'{dst}/{os.path.basename(src)}' + dst_name = f"{dst}/{os.path.basename(src)}" else: # dst is regular file dst_name = dst diff --git a/shapepipe/modules/get_images_runner.py b/shapepipe/modules/get_images_runner.py index 2f5dbd1eb..fb25e0e8b 100644 --- a/shapepipe/modules/get_images_runner.py +++ b/shapepipe/modules/get_images_runner.py @@ -11,10 +11,10 @@ @module_runner( - version='1.1', - depends=['numpy'], - run_method='serial', - numbering_scheme='_0', + version="1.1", + depends=["numpy"], + run_method="serial", + numbering_scheme="_0", ) def get_images_runner( input_file_list, @@ -28,57 +28,48 @@ def get_images_runner( # Read config file section # Copy/download method - retrieve_method = config.get(module_config_sec, 'RETRIEVE') - retrieve_ok = ['vos', 'symlink'] + retrieve_method = config.get(module_config_sec, "RETRIEVE") + retrieve_ok = ["vos", "symlink"] if retrieve_method not in retrieve_ok: raise ValueError( - f'key RETRIEVE={retrieve_method} is invalid, ' - + f'must be in {retrieve_ok}' + f"key RETRIEVE={retrieve_method} is invalid, " + + f"must be in {retrieve_ok}" ) - if config.has_option(module_config_sec, 'RETRIEVE_OPTIONS'): + if config.has_option(module_config_sec, "RETRIEVE_OPTIONS"): retrieve_options = config.getexpanded( - module_config_sec, - 'RETRIEVE_OPTIONS' + module_config_sec, "RETRIEVE_OPTIONS" ) else: retrieve_options = None - if config.has_option(module_config_sec, 'N_TRY'): - n_try = config.getint(module_config_sec, 'N_TRY') + if config.has_option(module_config_sec, "N_TRY"): + n_try = config.getint(module_config_sec, "N_TRY") else: n_try = 3 # Paths - input_dir = config.getlist(module_config_sec, 'INPUT_PATH') - input_file_pattern = config.getlist( - module_config_sec, - 'INPUT_FILE_PATTERN' - ) - input_file_ext = config.getlist( - module_config_sec, - 'INPUT_FILE_EXT' - ) + input_dir = config.getlist(module_config_sec, "INPUT_PATH") + input_file_pattern = config.getlist(module_config_sec, "INPUT_FILE_PATTERN") + input_file_ext = config.getlist(module_config_sec, "INPUT_FILE_EXT") output_file_pattern = config.getlist( - module_config_sec, - 'OUTPUT_FILE_PATTERN' + module_config_sec, "OUTPUT_FILE_PATTERN" ) - input_numbering = config.get(module_config_sec, 'INPUT_NUMBERING') + input_numbering = config.get(module_config_sec, "INPUT_NUMBERING") - if config.has_option(module_config_sec, 'OUTPUT_PATH'): - output_dir = config.getexpanded(module_config_sec, 'OUTPUT_PATH') + if config.has_option(module_config_sec, "OUTPUT_PATH"): + output_dir = config.getexpanded(module_config_sec, "OUTPUT_PATH") else: - output_dir = run_dirs['output'] + output_dir = run_dirs["output"] # Flags to check for already retrieved files - if config.has_option(module_config_sec, 'CHECK_EXISTING_DIR'): + if config.has_option(module_config_sec, "CHECK_EXISTING_DIR"): check_existing_dir = config.getexpanded( - module_config_sec, - 'CHECK_EXISTING_DIR' + module_config_sec, "CHECK_EXISTING_DIR" ) - if config.has_option(module_config_sec, 'N_EXPECTED'): - n_expected = config.getint(module_config_sec, 'N_EXPECTED') + if config.has_option(module_config_sec, "N_EXPECTED"): + n_expected = config.getint(module_config_sec, "N_EXPECTED") else: n_expected = 1 else: diff --git a/shapepipe/modules/make_cat_package/__init__.py b/shapepipe/modules/make_cat_package/__init__.py index 53d802a9d..1bd1cee5b 100644 --- a/shapepipe/modules/make_cat_package/__init__.py +++ b/shapepipe/modules/make_cat_package/__init__.py @@ -52,4 +52,4 @@ """ -__all__ = ['make_cat'] +__all__ = ["make_cat"] diff --git a/shapepipe/modules/make_cat_package/make_cat.py b/shapepipe/modules/make_cat_package/make_cat.py index 4e30e3552..e9b246a74 100644 --- a/shapepipe/modules/make_cat_package/make_cat.py +++ b/shapepipe/modules/make_cat_package/make_cat.py @@ -37,9 +37,7 @@ def prepare_final_cat_file(output_path, file_number_string): Output FITS file """ - output_name = ( - f'{output_path}/final_cat{file_number_string}.fits' - ) + output_name = f"{output_path}/final_cat{file_number_string}.fits" return file_io.FITSCatalogue( output_name, @@ -91,19 +89,23 @@ def save_sextractor_data(final_cat_file, sexcat_path, remove_vignet=True): sexcat_file.open() data = np.copy(sexcat_file.get_data()) if remove_vignet: - data = remove_field_name(data, 'VIGNET') + data = remove_field_name(data, "VIGNET") - final_cat_file.save_as_fits(data, ext_name='RESULTS') + final_cat_file.save_as_fits(data, ext_name="RESULTS") cat_size = len(data) - tile_id = float('.'.join( - re.split('-', os.path.splitext(os.path.split(sexcat_path)[1])[0])[1:] - )) + tile_id = float( + ".".join( + re.split("-", os.path.splitext(os.path.split(sexcat_path)[1])[0])[ + 1: + ] + ) + ) tile_id_array = np.ones(cat_size) * tile_id final_cat_file.open() - final_cat_file.add_col('TILE_ID', tile_id_array) + final_cat_file.add_col("TILE_ID", tile_id_array) sexcat_file.close() @@ -142,21 +144,21 @@ def save_sm_data( sexcat_sm_file = file_io.FITSCatalogue(sexcat_sm_path, SEx_catalogue=True) sexcat_sm_file.open() - sm = np.copy(sexcat_sm_file.get_data()['SPREAD_MODEL']) - sm_err = np.copy(sexcat_sm_file.get_data()['SPREADERR_MODEL']) + sm = np.copy(sexcat_sm_file.get_data()["SPREAD_MODEL"]) + sm_err = np.copy(sexcat_sm_file.get_data()["SPREADERR_MODEL"]) sexcat_sm_file.close() - final_cat_file.add_col('SPREAD_MODEL', sm) - final_cat_file.add_col('SPREADERR_MODEL', sm_err) + final_cat_file.add_col("SPREAD_MODEL", sm) + final_cat_file.add_col("SPREADERR_MODEL", sm_err) if do_classif: - obj_flag = np.ones_like(sm, dtype='int16') * 2 + obj_flag = np.ones_like(sm, dtype="int16") * 2 classif = sm + 2.0 * sm_err obj_flag[np.where(np.abs(classif) < star_thresh)] = 0 obj_flag[np.where(classif > gal_thresh)] = 1 - final_cat_file.add_col('SPREAD_CLASS', obj_flag) + final_cat_file.add_col("SPREAD_CLASS", obj_flag) final_cat_file.close() @@ -179,7 +181,7 @@ def __init__(self, final_cat_file): def process( self, - mode='', + mode="", cat_path=None, moments=False, ): @@ -198,17 +200,17 @@ def process( self._output_dict = {} self.final_cat_file.open() - self._obj_id = np.copy(self.final_cat_file.get_data()['NUMBER']) + self._obj_id = np.copy(self.final_cat_file.get_data()["NUMBER"]) - if mode == 'ngmix': + if mode == "ngmix": self._save_ngmix_data(cat_path, moments) - elif mode == 'galsim': + elif mode == "galsim": self._save_galsim_shapes(cat_path) - elif mode == 'psf': + elif mode == "psf": self._save_psf_data(cat_path) else: raise ValueError( - f'Invalid process mode ({mode}) for ' + f"Invalid process mode ({mode}) for " + '``make_cat.Savecatalogue``. Options are "ngmix", ' + '"galsim" or "psf".' ) @@ -234,9 +236,9 @@ def _update_dict(self, key_string, value): self._output_dict = { **self._output_dict, **{ - f'{key_string}{key_end}': np.copy(value) + f"{key_string}{key_end}": np.copy(value) for key_end in self._key_ends - } + }, } def _add2dict(self, key, value, index=None): @@ -270,55 +272,55 @@ def _save_ngmix_data(self, ngmix_cat_path, moments=False): Path to NGMIX catalogue """ - self._key_ends = ['1M', '1P', '2M', '2P', 'NOSHEAR'] + self._key_ends = ["1M", "1P", "2M", "2P", "NOSHEAR"] ngmix_cat_file = file_io.FITSCatalogue(ngmix_cat_path) ngmix_cat_file.open() - ngmix_n_epoch = ngmix_cat_file.get_data()['n_epoch_model'] - ngmix_mom_fail = ngmix_cat_file.get_data()['moments_fail'] + ngmix_n_epoch = ngmix_cat_file.get_data()["n_epoch_model"] + ngmix_mom_fail = ngmix_cat_file.get_data()["moments_fail"] if moments: - m = 'm' + m = "m" else: - m = '' + m = "" - ngmix_mcal_flags = ngmix_cat_file.get_data()['mcal_flags'] - ngmix_id = ngmix_cat_file.get_data()['id'] + ngmix_mcal_flags = ngmix_cat_file.get_data()["mcal_flags"] + ngmix_id = ngmix_cat_file.get_data()["id"] - self._add2dict('NGMIX_N_EPOCH', np.zeros(len(self._obj_id))) - self._add2dict('NGMIX_MOM_FAIL', np.zeros(len(self._obj_id))) + self._add2dict("NGMIX_N_EPOCH", np.zeros(len(self._obj_id))) + self._add2dict("NGMIX_MOM_FAIL", np.zeros(len(self._obj_id))) - prefix = f'NGMIX{m}' + prefix = f"NGMIX{m}" for key_str in ( - f'{prefix}_T_', - f'{prefix}_Tpsf_', - f'{prefix}_SNR_', - f'{prefix}_FLUX_', - f'{prefix}_MAG_', - f'{prefix}_FLAGS_', - f'{prefix}_T_PSFo_', + f"{prefix}_T_", + f"{prefix}_Tpsf_", + f"{prefix}_SNR_", + f"{prefix}_FLUX_", + f"{prefix}_MAG_", + f"{prefix}_FLAGS_", + f"{prefix}_T_PSFo_", ): self._update_dict(key_str, np.zeros(len(self._obj_id))) - for key_str in (f'NGMIX{m}_FLUX_ERR_', f'NGMIX{m}_MAG_ERR_'): + for key_str in (f"NGMIX{m}_FLUX_ERR_", f"NGMIX{m}_MAG_ERR_"): self._update_dict(key_str, np.ones(len(self._obj_id)) * -1) for key_str in ( - f'NGMIX{m}_ELL_', - f'NGMIX{m}_ELL_ERR_', - f'NGMIX{m}_ELL_PSFo_' + f"NGMIX{m}_ELL_", + f"NGMIX{m}_ELL_ERR_", + f"NGMIX{m}_ELL_PSFo_", ): self._update_dict(key_str, np.ones((len(self._obj_id), 2)) * -10.0) self._update_dict( - f'NGMIX{m}_T_ERR_', + f"NGMIX{m}_T_ERR_", np.ones(len(self._obj_id)) * 1e30, ) - self._add2dict(f'NGMIX{m}_MCAL_FLAGS', np.zeros(len(self._obj_id))) + self._add2dict(f"NGMIX{m}_MCAL_FLAGS", np.zeros(len(self._obj_id))) for idx, _ in enumerate(self._obj_id): for key in self._key_ends: - x = self._output_dict[f'NGMIX{m}_ELL_{key}'][idx] - if np.all(x != np.array([-10., -10.])): + x = self._output_dict[f"NGMIX{m}_ELL_{key}"][idx] + if np.all(x != np.array([-10.0, -10.0])): print(x) for idx, id_tmp in enumerate(self._obj_id): @@ -329,61 +331,61 @@ def _save_ngmix_data(self, ngmix_cat_path, moments=False): ncf_data = ngmix_cat_file.get_data(key) - g = (ncf_data['g1'][ind[0]], ncf_data['g2'][ind[0]]) + g = (ncf_data["g1"][ind[0]], ncf_data["g2"][ind[0]]) g_err = ( - ncf_data['g1_err'][ind[0]], - ncf_data['g2_err'][ind[0]] + ncf_data["g1_err"][ind[0]], + ncf_data["g2_err"][ind[0]], ) - self._add2dict(f'NGMIX{m}_ELL_{key}', g, idx) - self._add2dict(f'NGMIX{m}_ELL_ERR_{key}', g_err, idx) + self._add2dict(f"NGMIX{m}_ELL_{key}", g, idx) + self._add2dict(f"NGMIX{m}_ELL_ERR_{key}", g_err, idx) - t = ncf_data['T'][ind[0]] - t_err = ncf_data['T_err'][ind[0]] - tpsf = ncf_data['Tpsf'][ind[0]] - self._add2dict(f'NGMIX{m}_T_{key}', t, idx) - self._add2dict(f'NGMIX{m}_T_ERR_{key}', t_err, idx) - self._add2dict(f'NGMIX{m}_Tpsf_{key}', tpsf, idx) + t = ncf_data["T"][ind[0]] + t_err = ncf_data["T_err"][ind[0]] + tpsf = ncf_data["Tpsf"][ind[0]] + self._add2dict(f"NGMIX{m}_T_{key}", t, idx) + self._add2dict(f"NGMIX{m}_T_ERR_{key}", t_err, idx) + self._add2dict(f"NGMIX{m}_Tpsf_{key}", tpsf, idx) - s2n = ncf_data['s2n'][ind[0]] - self._add2dict(f'NGMIX{m}_SNR_{key}', s2n, idx) + s2n = ncf_data["s2n"][ind[0]] + self._add2dict(f"NGMIX{m}_SNR_{key}", s2n, idx) - flux = ncf_data['flux'][ind[0]] - flux_err = ncf_data['flux_err'][ind[0]] - self._add2dict(f'NGMIX{m}_FLUX_{key}', flux, idx) - self._add2dict(f'NGMIX{m}_FLUX_ERR_{key}', flux_err, idx) + flux = ncf_data["flux"][ind[0]] + flux_err = ncf_data["flux_err"][ind[0]] + self._add2dict(f"NGMIX{m}_FLUX_{key}", flux, idx) + self._add2dict(f"NGMIX{m}_FLUX_ERR_{key}", flux_err, idx) - mag = ncf_data['mag'][ind[0]] - mag_err = ncf_data['mag_err'][ind[0]] - self._add2dict(f'NGMIX{m}_MAG_{key}', mag, idx) - self._add2dict(f'NGMIX{m}_MAG_ERR_{key}', mag_err, idx) + mag = ncf_data["mag"][ind[0]] + mag_err = ncf_data["mag_err"][ind[0]] + self._add2dict(f"NGMIX{m}_MAG_{key}", mag, idx) + self._add2dict(f"NGMIX{m}_MAG_ERR_{key}", mag_err, idx) - flags = ncf_data['flags'][ind[0]] - self._add2dict(f'NGMIX{m}_FLAGS_{key}', flags, idx) + flags = ncf_data["flags"][ind[0]] + self._add2dict(f"NGMIX{m}_FLAGS_{key}", flags, idx) g_psf = ( - ncf_data['g1_psfo_ngmix'][ind[0]], - ncf_data['g2_psfo_ngmix'][ind[0]] + ncf_data["g1_psfo_ngmix"][ind[0]], + ncf_data["g2_psfo_ngmix"][ind[0]], ) - self._add2dict(f'NGMIX{m}_ELL_PSFo_{key}', g_psf, idx) + self._add2dict(f"NGMIX{m}_ELL_PSFo_{key}", g_psf, idx) - t_psfo = ncf_data['T_psfo_ngmix'][ind[0]] - self._add2dict(f'NGMIX{m}_T_PSFo_{key}', t_psfo, idx) + t_psfo = ncf_data["T_psfo_ngmix"][ind[0]] + self._add2dict(f"NGMIX{m}_T_PSFo_{key}", t_psfo, idx) self._add2dict( - f'NGMIX{m}_MCAL_FLAGS', + f"NGMIX{m}_MCAL_FLAGS", ngmix_mcal_flags[ind[0]], idx, ) if not moments: self._add2dict( - f'NGMIX{m}_N_EPOCH', + f"NGMIX{m}_N_EPOCH", ngmix_n_epoch[ind[0]], idx, ) self._add2dict( - f'NGMIX{m}_MOM_FAIL', + f"NGMIX{m}_MOM_FAIL", ngmix_mom_fail[ind[0]], idx, ) @@ -406,27 +408,27 @@ def _save_galsim_shapes(self, galsim_cat_path): self._key_ends = galsim_cat_file.get_ext_name()[1:] - galsim_id = galsim_cat_file.get_data()['id'] + galsim_id = galsim_cat_file.get_data()["id"] for key_str in ( - 'GALSIM_GAL_SIGMA_', - 'GALSIM_PSF_SIGMA_', - 'GALSIM_FLUX_', - 'GALSIM_MAG_', + "GALSIM_GAL_SIGMA_", + "GALSIM_PSF_SIGMA_", + "GALSIM_FLUX_", + "GALSIM_MAG_", ): self._update_dict(key_str, np.zeros(len(self._obj_id))) - for key_str in ('GALSIM_FLUX_ERR_', 'GALSIM_MAG_ERR_', 'GALSIM_RES_'): + for key_str in ("GALSIM_FLUX_ERR_", "GALSIM_MAG_ERR_", "GALSIM_RES_"): self._update_dict(key_str, np.ones(len(self._obj_id)) * -1) for key_str in ( - 'GALSIM_GAL_ELL_', - 'GALSIM_GAL_ELL_ERR_', - 'GALSIM_GAL_ELL_UNCORR_', - 'GALSIM_PSF_ELL_' + "GALSIM_GAL_ELL_", + "GALSIM_GAL_ELL_ERR_", + "GALSIM_GAL_ELL_UNCORR_", + "GALSIM_PSF_ELL_", ): self._update_dict(key_str, np.ones((len(self._obj_id), 2)) * -10.0) self._update_dict( - 'GALSIM_FLAGS_', - np.ones(len(self._obj_id), dtype='int16'), + "GALSIM_FLAGS_", + np.ones(len(self._obj_id), dtype="int16"), ) for idx, id_tmp in enumerate(self._obj_id): @@ -437,69 +439,69 @@ def _save_galsim_shapes(self, galsim_cat_path): gcf_data = galsim_cat_file.get_data(key) - if key == 'ORIGINAL_PSF': + if key == "ORIGINAL_PSF": uncorr_g = ( - gcf_data['gal_uncorr_g1'][ind[0]], - gcf_data['gal_uncorr_g2'][ind[0]] + gcf_data["gal_uncorr_g1"][ind[0]], + gcf_data["gal_uncorr_g2"][ind[0]], ) - psf_sig = gcf_data['gal_sigma'][ind[0]] - self._add2dict(f'GALSIM_PSF_ELL_{key}', uncorr_g, idx) - self._add2dict(f'GALSIM_PSF_SIGMA_{key}', psf_sig, idx) + psf_sig = gcf_data["gal_sigma"][ind[0]] + self._add2dict(f"GALSIM_PSF_ELL_{key}", uncorr_g, idx) + self._add2dict(f"GALSIM_PSF_SIGMA_{key}", psf_sig, idx) else: g = ( - gcf_data['gal_g1'][ind[0]], - gcf_data['gal_g2'][ind[0]] + gcf_data["gal_g1"][ind[0]], + gcf_data["gal_g2"][ind[0]], ) g_err = ( - gcf_data['gal_g1_err'][ind[0]], - gcf_data['gal_g2_err'][ind[0]] + gcf_data["gal_g1_err"][ind[0]], + gcf_data["gal_g2_err"][ind[0]], ) - self._add2dict(f'GALSIM_GAL_ELL_{key}', g, idx) - self._add2dict(f'GALSIM_GAL_ELL_ERR_{key}', g_err, idx) + self._add2dict(f"GALSIM_GAL_ELL_{key}", g, idx) + self._add2dict(f"GALSIM_GAL_ELL_ERR_{key}", g_err, idx) uncorr_g = ( - gcf_data['gal_uncorr_g1'][ind[0]], - gcf_data['gal_uncorr_g2'][ind[0]], + gcf_data["gal_uncorr_g1"][ind[0]], + gcf_data["gal_uncorr_g2"][ind[0]], ) self._add2dict( - f'GALSIM_GAL_ELL_UNCORR_{key}', + f"GALSIM_GAL_ELL_UNCORR_{key}", uncorr_g, idx, ) - sigma = gcf_data['gal_sigma'][ind[0]] - self._add2dict(f'GALSIM_GAL_SIGMA_{key}', sigma, idx) + sigma = gcf_data["gal_sigma"][ind[0]] + self._add2dict(f"GALSIM_GAL_SIGMA_{key}", sigma, idx) psf_g = ( - gcf_data['psf_g1'][ind[0]], - gcf_data['psf_g2'][ind[0]] + gcf_data["psf_g1"][ind[0]], + gcf_data["psf_g2"][ind[0]], ) - psf_sigma = gcf_data['psf_sigma'][ind[0]] - self._add2dict(f'GALSIM_PSF_ELL_{key}', psf_g, idx) + psf_sigma = gcf_data["psf_sigma"][ind[0]] + self._add2dict(f"GALSIM_PSF_ELL_{key}", psf_g, idx) self._add2dict( - f'GALSIM_PSF_SIGMA_{key}', + f"GALSIM_PSF_SIGMA_{key}", psf_sigma, idx, ) - flux = gcf_data['gal_flux'][ind[0]] - flux_err = gcf_data['gal_flux_err'][ind[0]] - self._add2dict(f'GALSIM_FLUX_{key}', flux, idx) - self._add2dict(f'GALSIM_FLUX_ERR_{key}', flux_err, idx) + flux = gcf_data["gal_flux"][ind[0]] + flux_err = gcf_data["gal_flux_err"][ind[0]] + self._add2dict(f"GALSIM_FLUX_{key}", flux, idx) + self._add2dict(f"GALSIM_FLUX_ERR_{key}", flux_err, idx) - mag = gcf_data['gal_mag'][ind[0]] - mag_err = gcf_data['gal_mag_err'][ind[0]] - self._add2dict(f'GALSIM_MAG_{key}', mag, idx) - self._add2dict(f'GALSIM_MAG_ERR_{key}', mag_err, idx) + mag = gcf_data["gal_mag"][ind[0]] + mag_err = gcf_data["gal_mag_err"][ind[0]] + self._add2dict(f"GALSIM_MAG_{key}", mag, idx) + self._add2dict(f"GALSIM_MAG_ERR_{key}", mag_err, idx) - flags = gcf_data['gal_flag'][ind[0]] - self._add2dict(f'GALSIM_FLAGS_{key}', flags, idx) + flags = gcf_data["gal_flag"][ind[0]] + self._add2dict(f"GALSIM_FLAGS_{key}", flags, idx) - res = gcf_data['gal_resolution'][ind[0]] - self._add2dict(f'GALSIM_RES_{key}', res, idx) + res = gcf_data["gal_resolution"][ind[0]] + self._add2dict(f"GALSIM_RES_{key}", res, idx) galsim_cat_file.close() @@ -516,53 +518,51 @@ def _save_psf_data(self, galaxy_psf_path): """ galaxy_psf_cat = SqliteDict(galaxy_psf_path) - max_epoch = np.max(self.final_cat_file.get_data()['N_EPOCH']) + 1 + max_epoch = np.max(self.final_cat_file.get_data()["N_EPOCH"]) + 1 self._output_dict = { - f'PSF_ELL_{idx + 1}': np.ones((len(self._obj_id), 2)) * -10. + f"PSF_ELL_{idx + 1}": np.ones((len(self._obj_id), 2)) * -10.0 for idx in range(max_epoch) } self._output_dict = { **self._output_dict, **{ - f'PSF_FWHM_{idx + 1}': np.zeros(len(self._obj_id)) + f"PSF_FWHM_{idx + 1}": np.zeros(len(self._obj_id)) for idx in range(max_epoch) - } + }, } self._output_dict = { **self._output_dict, **{ - f'PSF_FLAG_{idx + 1}': np.ones( - len(self._obj_id), dtype='int16' - ) + f"PSF_FLAG_{idx + 1}": np.ones(len(self._obj_id), dtype="int16") for idx in range(max_epoch) - } + }, } for idx, id_tmp in enumerate(self._obj_id): - if galaxy_psf_cat[str(id_tmp)] == 'empty': + if galaxy_psf_cat[str(id_tmp)] == "empty": continue for epoch, key in enumerate(galaxy_psf_cat[str(id_tmp)].keys()): gpc_data = galaxy_psf_cat[str(id_tmp)][key] - if gpc_data['SHAPES']['FLAG_PSF_HSM'] != 0: + if gpc_data["SHAPES"]["FLAG_PSF_HSM"] != 0: continue e_psf = ( - gpc_data['SHAPES']['E1_PSF_HSM'], - gpc_data['SHAPES']['E2_PSF_HSM'] + gpc_data["SHAPES"]["E1_PSF_HSM"], + gpc_data["SHAPES"]["E2_PSF_HSM"], ) - self._add2dict(f'PSF_ELL_{epoch + 1}', e_psf, idx) + self._add2dict(f"PSF_ELL_{epoch + 1}", e_psf, idx) psf_fwhm = galaxy.sigma_to_fwhm( - gpc_data['SHAPES']['SIGMA_PSF_HSM'] + gpc_data["SHAPES"]["SIGMA_PSF_HSM"] ) - self._add2dict(f'PSF_FWHM_{epoch + 1}', psf_fwhm, idx) + self._add2dict(f"PSF_FWHM_{epoch + 1}", psf_fwhm, idx) - flag_psf = gpc_data['SHAPES']['FLAG_PSF_HSM'] - self._add2dict(f'PSF_FLAG_{epoch + 1}', flag_psf, idx) + flag_psf = gpc_data["SHAPES"]["FLAG_PSF_HSM"] + self._add2dict(f"PSF_FLAG_{epoch + 1}", flag_psf, idx) galaxy_psf_cat.close() diff --git a/shapepipe/modules/make_cat_runner.py b/shapepipe/modules/make_cat_runner.py index 8b6351e2e..f36209f42 100644 --- a/shapepipe/modules/make_cat_runner.py +++ b/shapepipe/modules/make_cat_runner.py @@ -11,21 +11,21 @@ @module_runner( - version='1.1', + version="1.1", input_module=[ - 'sextractor_runner', - 'spread_model_runner', - 'psfex_interp_runner', - 'ngmix_runner', + "sextractor_runner", + "spread_model_runner", + "psfex_interp_runner", + "ngmix_runner", ], file_pattern=[ - 'tile_sexcat', - 'sexcat_sm', - 'galaxy_psf', - 'ngmix', + "tile_sexcat", + "sexcat_sm", + "galaxy_psf", + "ngmix", ], - file_ext=['.fits', '.fits', '.sqlite', '.fits'], - depends=['numpy', 'sqlitedict'], + file_ext=[".fits", ".fits", ".sqlite", ".fits"], + depends=["numpy", "sqlitedict"], ) def make_cat_runner( input_file_list, @@ -49,11 +49,11 @@ def make_cat_runner( # Fetch classification options do_classif = config.getboolean( module_config_sec, - 'SM_DO_CLASSIFICATION', + "SM_DO_CLASSIFICATION", ) if do_classif: - star_thresh = config.getfloat(module_config_sec, 'SM_STAR_THRESH') - gal_thresh = config.getfloat(module_config_sec, 'SM_GAL_THRESH') + star_thresh = config.getfloat(module_config_sec, "SM_STAR_THRESH") + gal_thresh = config.getfloat(module_config_sec, "SM_GAL_THRESH") else: star_thresh = None gal_thresh = None @@ -61,32 +61,32 @@ def make_cat_runner( # Fetch shape measurement type shape_type_list = config.getlist( module_config_sec, - 'SHAPE_MEASUREMENT_TYPE', + "SHAPE_MEASUREMENT_TYPE", ) for shape_type in shape_type_list: - if shape_type.lower() not in ['ngmix', 'galsim']: + if shape_type.lower() not in ["ngmix", "galsim"]: raise ValueError( - 'SHAPE_MEASUREMENT_TYPE must be in [ngmix, galsim]' + "SHAPE_MEASUREMENT_TYPE must be in [ngmix, galsim]" ) # Fetch PSF data option - if config.has_option(module_config_sec, 'SAVE_PSF_DATA'): - save_psf = config.getboolean(module_config_sec, 'SAVE_PSF_DATA') + if config.has_option(module_config_sec, "SAVE_PSF_DATA"): + save_psf = config.getboolean(module_config_sec, "SAVE_PSF_DATA") else: save_psf = False # Set final output file final_cat_file = make_cat.prepare_final_cat_file( - run_dirs['output'], + run_dirs["output"], file_number_string, ) # Save SExtractor data - w_log.info('Save SExtractor data') + w_log.info("Save SExtractor data") make_cat.save_sextractor_data(final_cat_file, tile_sexcat_path) # Save spread-model data - w_log.info('Save spread-model data') + w_log.info("Save spread-model data") make_cat.save_sm_data( final_cat_file, sexcat_sm_path, @@ -97,15 +97,15 @@ def make_cat_runner( # Save shape data sc_inst = make_cat.SaveCatalogue(final_cat_file) - w_log.info('Save shape measurement data') + w_log.info("Save shape measurement data") for shape_type in shape_type_list: - w_log.info(f'Save {shape_type.lower()} data') + w_log.info(f"Save {shape_type.lower()} data") cat_path = ( - shape2_cat_path if shape_type == 'galsim' else shape1_cat_path + shape2_cat_path if shape_type == "galsim" else shape1_cat_path ) sc_inst.process(shape_type.lower(), cat_path) if save_psf: - sc_inst.process('psf', galaxy_psf_path) + sc_inst.process("psf", galaxy_psf_path) # No return objects return None, None diff --git a/shapepipe/modules/mask_package/__init__.py b/shapepipe/modules/mask_package/__init__.py index af2dc5c5c..bdfece65b 100644 --- a/shapepipe/modules/mask_package/__init__.py +++ b/shapepipe/modules/mask_package/__init__.py @@ -63,6 +63,9 @@ Prefix to be appended to output file name ``flag``; helps to distinguish the file patterns of newly created and external mask files +CHECK_EXISTING_DIR : str, optional + If given, search this directory for existing mask files; the + corresponding images will then not be processed Mask config file ================ @@ -179,4 +182,4 @@ """ -__all__ = ['mask'] +__all__ = ["mask"] diff --git a/shapepipe/modules/mask_package/mask.py b/shapepipe/modules/mask_package/mask.py index 69a1c3c97..dfd68e4e3 100644 --- a/shapepipe/modules/mask_package/mask.py +++ b/shapepipe/modules/mask_package/mask.py @@ -45,6 +45,8 @@ class Mask(object): Path to external flag file, default is ``None`` (not used) outname_base : str, optional Output file name base, default is ``flag`` + check_existing_dir : str, optional + If not ``None`` (default), search path for existing mask files star_cat_path : str, optional Path to external star catalogue, default is ``None`` (not used; instead the star catalogue is produced on the fly at run time) @@ -63,7 +65,8 @@ def __init__( output_dir, w_log, path_external_flag=None, - outname_base='flag', + outname_base="flag", + check_existing_dir=None, star_cat_path=None, hdu=0, ): @@ -75,10 +78,10 @@ def __init__( self._weight_fullpath = weight_path # Input image prefix - if (image_prefix.lower() != 'none') and (image_prefix != ''): - self._img_prefix = f'{image_prefix}_' + if (image_prefix.lower() != "none") and (image_prefix != ""): + self._img_prefix = f"{image_prefix}_" else: - self._img_prefix = '' + self._img_prefix = "" # File number identified self._img_number = image_num @@ -98,6 +101,9 @@ def __init__( # Output file base name self._outname_base = outname_base + # Search path for existing mask files + self._check_existing_dir = check_existing_dir + # Set external star catalogue path if given if star_cat_path is not None: self._star_cat_path = star_cat_path @@ -127,141 +133,136 @@ def _get_config(self): """ if self._config_filepath is None: - raise ValueError('No path to config file given') + raise ValueError("No path to config file given") if not os.path.exists(self._config_filepath): - raise IOError( - f'Config file "{self._config_filepath}" not found' - ) + raise IOError(f'Config file "{self._config_filepath}" not found') conf = CustomParser() conf.read(self._config_filepath) self._config = { - 'PATH': {}, - 'BORDER': {}, - 'HALO': {}, - 'SPIKE': {}, - 'MESSIER': {}, - 'NGC': {}, - 'MD': {}, + "PATH": {}, + "BORDER": {}, + "HALO": {}, + "SPIKE": {}, + "MESSIER": {}, + "NGC": {}, + "MD": {}, } - if conf.has_option('PROGRAM_PATH', 'WW_PATH'): - self._config['PATH']['WW'] = ( - conf.getexpanded('PROGRAM_PATH', 'WW_PATH') + if conf.has_option("PROGRAM_PATH", "WW_PATH"): + self._config["PATH"]["WW"] = conf.getexpanded( + "PROGRAM_PATH", "WW_PATH" ) else: - self._config['PATH']['WW'] = 'ww' - self._config['PATH']['WW_configfile'] = ( - conf.getexpanded('PROGRAM_PATH', 'WW_CONFIG_FILE') + self._config["PATH"]["WW"] = "ww" + self._config["PATH"]["WW_configfile"] = conf.getexpanded( + "PROGRAM_PATH", "WW_CONFIG_FILE" ) - if conf.has_option('PROGRAM_PATH', 'CDSCLIENT_PATH'): - self._config['PATH']['CDSclient'] = ( - conf.getexpanded('PROGRAM_PATH', 'CDSCLIENT_PATH') + if conf.has_option("PROGRAM_PATH", "CDSCLIENT_PATH"): + self._config["PATH"]["CDSclient"] = conf.getexpanded( + "PROGRAM_PATH", "CDSCLIENT_PATH" ) elif self._star_cat_path is not None: - self._config['PATH']['star_cat'] = self._star_cat_path + self._config["PATH"]["star_cat"] = self._star_cat_path else: raise ValueError( - 'Either [PROGRAM_PATH]:CDSCLIENT_PATH in the mask config file ' - + ' or a star catalogue as module input needs to be present' + "Either [PROGRAM_PATH]:CDSCLIENT_PATH in the mask config file " + + " or a star catalogue as module input needs to be present" ) - self._config['PATH']['temp_dir'] = self._get_temp_dir_path( - conf.getexpanded('OTHER', 'TEMP_DIRECTORY') + self._config["PATH"]["temp_dir"] = self._get_temp_dir_path( + conf.getexpanded("OTHER", "TEMP_DIRECTORY") ) - self._config['BORDER']['make'] = ( - conf.getboolean('BORDER_PARAMETERS', 'BORDER_MAKE') + self._config["BORDER"]["make"] = conf.getboolean( + "BORDER_PARAMETERS", "BORDER_MAKE" ) - if self._config['BORDER']['make']: - self._config['BORDER']['width'] = ( - conf.getint('BORDER_PARAMETERS', 'BORDER_WIDTH') + if self._config["BORDER"]["make"]: + self._config["BORDER"]["width"] = conf.getint( + "BORDER_PARAMETERS", "BORDER_WIDTH" ) - self._config['BORDER']['flag'] = ( - conf.get('BORDER_PARAMETERS', 'BORDER_FLAG_VALUE') + self._config["BORDER"]["flag"] = conf.get( + "BORDER_PARAMETERS", "BORDER_FLAG_VALUE" ) - for mask_shape in ['HALO', 'SPIKE']: + for mask_shape in ["HALO", "SPIKE"]: - self._config[mask_shape]['make'] = conf.getboolean( - f'{mask_shape}_PARAMETERS', - f'{mask_shape}_MAKE', + self._config[mask_shape]["make"] = conf.getboolean( + f"{mask_shape}_PARAMETERS", + f"{mask_shape}_MAKE", ) - self._config[mask_shape]['individual'] = ( - conf.getboolean('OTHER', 'KEEP_INDIVIDUAL_MASK') + self._config[mask_shape]["individual"] = conf.getboolean( + "OTHER", "KEEP_INDIVIDUAL_MASK" ) - if self._config[mask_shape]['make']: + if self._config[mask_shape]["make"]: - self._config[mask_shape]['maskmodel_path'] = conf.getexpanded( - f'{mask_shape}_PARAMETERS', - f'{mask_shape}_MASKMODEL_PATH', + self._config[mask_shape]["maskmodel_path"] = conf.getexpanded( + f"{mask_shape}_PARAMETERS", + f"{mask_shape}_MASKMODEL_PATH", ) - self._config[mask_shape]['mag_lim'] = conf.getfloat( - f'{mask_shape}_PARAMETERS', - f'{mask_shape}_MAG_LIM', + self._config[mask_shape]["mag_lim"] = conf.getfloat( + f"{mask_shape}_PARAMETERS", + f"{mask_shape}_MAG_LIM", ) - self._config[mask_shape]['scale_factor'] = conf.getfloat( - f'{mask_shape}_PARAMETERS', - f'{mask_shape}_SCALE_FACTOR', + self._config[mask_shape]["scale_factor"] = conf.getfloat( + f"{mask_shape}_PARAMETERS", + f"{mask_shape}_SCALE_FACTOR", ) - self._config[mask_shape]['mag_pivot'] = conf.getfloat( - f'{mask_shape}_PARAMETERS', - f'{mask_shape}_MAG_PIVOT', + self._config[mask_shape]["mag_pivot"] = conf.getfloat( + f"{mask_shape}_PARAMETERS", + f"{mask_shape}_MAG_PIVOT", ) - self._config[mask_shape]['flag'] = conf.getint( - f'{mask_shape}_PARAMETERS', - f'{mask_shape}_FLAG_VALUE', + self._config[mask_shape]["flag"] = conf.getint( + f"{mask_shape}_PARAMETERS", + f"{mask_shape}_FLAG_VALUE", ) - if conf.getboolean('OTHER', 'KEEP_REG_FILE'): + if conf.getboolean("OTHER", "KEEP_REG_FILE"): reg_file = conf.getexpanded( - f'{mask_shape}_PARAMETERS', - f'{mask_shape}_REG_FILE', + f"{mask_shape}_PARAMETERS", + f"{mask_shape}_REG_FILE", ) - self._config[mask_shape]['reg_file'] = ( + self._config[mask_shape]["reg_file"] = ( f'{self._config["PATH"]["temp_dir"]}/' + f'{re.split(".reg", reg_file)[0]}' - + f'{self._img_number}.reg' + + f"{self._img_number}.reg" ) else: - self._config[mask_shape]['reg_file'] = None + self._config[mask_shape]["reg_file"] = None - for mask_type in ['MESSIER', 'NGC']: + for mask_type in ["MESSIER", "NGC"]: - self._config[mask_type]['make'] = conf.getboolean( - f'{mask_type}_PARAMETERS', - f'{mask_type}_MAKE' + self._config[mask_type]["make"] = conf.getboolean( + f"{mask_type}_PARAMETERS", f"{mask_type}_MAKE" ) - if self._config[mask_type]['make']: - self._config[mask_type]['cat_path'] = conf.getexpanded( - f'{mask_type}_PARAMETERS', - f'{mask_type}_CAT_PATH', + if self._config[mask_type]["make"]: + self._config[mask_type]["cat_path"] = conf.getexpanded( + f"{mask_type}_PARAMETERS", + f"{mask_type}_CAT_PATH", ) - self._config[mask_type]['size_plus'] = conf.getfloat( - f'{mask_type}_PARAMETERS', - f'{mask_type}_SIZE_PLUS', + self._config[mask_type]["size_plus"] = conf.getfloat( + f"{mask_type}_PARAMETERS", + f"{mask_type}_SIZE_PLUS", ) - self._config[mask_type]['flag'] = conf.getint( - f'{mask_type}_PARAMETERS', - f'{mask_type}_FLAG_VALUE', + self._config[mask_type]["flag"] = conf.getint( + f"{mask_type}_PARAMETERS", + f"{mask_type}_FLAG_VALUE", ) - self._config['MD']['make'] = ( - conf.getboolean('MD_PARAMETERS', 'MD_MAKE') - ) + self._config["MD"]["make"] = conf.getboolean("MD_PARAMETERS", "MD_MAKE") - if self._config['MD']['make']: - self._config['MD']['thresh_flag'] = ( - conf.getfloat('MD_PARAMETERS', 'MD_THRESH_FLAG') + if self._config["MD"]["make"]: + self._config["MD"]["thresh_flag"] = conf.getfloat( + "MD_PARAMETERS", "MD_THRESH_FLAG" ) - self._config['MD']['thresh_remove'] = ( - conf.getfloat('MD_PARAMETERS', 'MD_THRESH_REMOVE') + self._config["MD"]["thresh_remove"] = conf.getfloat( + "MD_PARAMETERS", "MD_THRESH_REMOVE" ) - self._config['MD']['remove'] = ( - conf.getboolean('MD_PARAMETERS', 'MD_REMOVE') + self._config["MD"]["remove"] = conf.getboolean( + "MD_PARAMETERS", "MD_REMOVE" ) def _set_image_coordinates(self): @@ -286,9 +287,9 @@ def _set_image_coordinates(self): pix_center = [img_shape[1] / 2.0, img_shape[0] / 2.0] wcs_center = self._wcs.all_pix2world([pix_center], 1)[0] self._fieldcenter = {} - self._fieldcenter['pix'] = np.array(pix_center) - self._fieldcenter['wcs'] = ( - SkyCoord(ra=wcs_center[0], dec=wcs_center[1], unit='deg') + self._fieldcenter["pix"] = np.array(pix_center) + self._fieldcenter["wcs"] = SkyCoord( + ra=wcs_center[0], dec=wcs_center[1], unit="deg" ) # Get the four corners of the image @@ -307,69 +308,78 @@ def make_mask(self): Main function to create the mask. """ - if self._config['MD']['make']: + output_file_name = ( + f"{self._img_prefix}" + + f"{self._outname_base}{self._img_number}.fits" + ) + if os.path.exists(f"{self._check_existing_dir}//{output_file_name}"): + return None, None + + if self._config["MD"]["make"]: self.missing_data() - if self._config['HALO']['make'] or self._config['SPIKE']['make']: + if self._config["HALO"]["make"] or self._config["SPIKE"]["make"]: stars = self.find_stars( - np.array([ - self._fieldcenter['wcs'].ra.value, - self._fieldcenter['wcs'].dec.value - ]), + np.array( + [ + self._fieldcenter["wcs"].ra.value, + self._fieldcenter["wcs"].dec.value, + ] + ), radius=self._img_radius, ) if not self._err: - for _type in ('HALO', 'SPIKE'): - if self._config[_type]['make']: + for _type in ("HALO", "SPIKE"): + if self._config[_type]["make"]: self._create_mask( stars=stars, types=_type, - mag_limit=self._config[_type]['mag_lim'], - scale_factor=self._config[_type]['scale_factor'], - mag_pivot=self._config[_type]['mag_pivot'], + mag_limit=self._config[_type]["mag_lim"], + scale_factor=self._config[_type]["scale_factor"], + mag_pivot=self._config[_type]["mag_pivot"], ) if not self._err: mask_name = [] - if self._config['HALO']['make'] and self._config['SPIKE']['make']: - self._exec_WW(types='ALL') + if self._config["HALO"]["make"] and self._config["SPIKE"]["make"]: + self._exec_WW(types="ALL") mask_name.append( f'{self._config["PATH"]["temp_dir"]}halo_spike_flag' - + f'{self._img_number}.fits' + + f"{self._img_number}.fits" ) mask_name.append(None) else: - for _type in ('HALO', 'SPIKE'): - if self._config[_type]['make']: + for _type in ("HALO", "SPIKE"): + if self._config[_type]["make"]: self._exec_WW(types=_type) mask_name.append( f'{self._config["PATH"]["temp_dir"]}' - + f'{_type.lower()}_flag{self._img_number}.fits' + + f"{_type.lower()}_flag{self._img_number}.fits" ) else: mask_name.append(None) masks_internal = {} if not self._err: - if self._config['BORDER']['make']: - masks_internal['BORDER'] = self.mask_border( - width=self._config['BORDER']['width'] + if self._config["BORDER"]["make"]: + masks_internal["BORDER"] = self.mask_border( + width=self._config["BORDER"]["width"] ) if not self._err: - for _type in ('MESSIER', 'NGC'): - if self._config[_type]['make']: + for _type in ("MESSIER", "NGC"): + if self._config[_type]["make"]: masks_internal[_type] = self.mask_dso( - self._config[_type]['cat_path'], - size_plus=self._config[_type]['size_plus'], - flag_value=self._config[_type]['flag'], + self._config[_type]["cat_path"], + size_plus=self._config[_type]["size_plus"], + flag_value=self._config[_type]["flag"], obj_type=_type, ) if not self._err: try: - im_pass = self._config['MD']['im_remove'] + im_pass = self._config["MD"]["im_remove"] except Exception: im_pass = True @@ -385,19 +395,19 @@ def make_mask(self): path_external_flag=path_external_flag, ) - if not self._config['HALO']['individual']: + if not self._config["HALO"]["individual"]: if mask_name[0] is not None: - self._rm_fits1_stdout, self._rm_fits1_stderr = ( - execute(f'rm {mask_name[0]}') + self._rm_fits1_stdout, self._rm_fits1_stderr = execute( + f"rm {mask_name[0]}" ) if mask_name[1] is not None: - self._rm_fits2_stdout, self._rm_fits2_stderr = ( - execute(f'rm {mask_name[1]}') + self._rm_fits2_stdout, self._rm_fits2_stderr = execute( + f"rm {mask_name[1]}" ) output_file_name = ( - f'{self._output_dir}/{self._img_prefix}' - + f'{self._outname_base}{self._img_number}.fits' + f"{self._output_dir}/{self._img_prefix}" + + f"{self._outname_base}{self._img_number}.fits" ) self._mask_to_file( @@ -406,32 +416,30 @@ def make_mask(self): ) # Handle stdout / stderr - general_stdout = f'\nCDSClient\n{self._CDS_stdout}' - general_stderr = '' - if self._CDS_stderr != '': - general_stderr += f'\nCDSClient\n{self._CDS_stderr}' - if hasattr(self, '_WW_stdout') or hasattr(self, '_WW_stdout'): - general_stdout += f'\n\nWeightWatcher\n{self._WW_stdout}' - if self._WW_stderr != '': - general_stderr += f'\n\nWeightWatcher\n{self._WW_stderr}' - if hasattr(self, '_rm_reg_stderr') or hasattr(self, '_rm_reg_stdout'): - general_stdout += f'\n\nrm reg file\n{self._rm_reg_stdout}' - if self._rm_reg_stderr != '': - general_stderr += f'\n\nrm reg file\n{self._rm_reg_stderr}' - if ( - hasattr(self, '_rm_fits1_stderr') - or hasattr(self, '_rm_fits1_stdout') + general_stdout = f"\nCDSClient\n{self._CDS_stdout}" + general_stderr = "" + if self._CDS_stderr != "": + general_stderr += f"\nCDSClient\n{self._CDS_stderr}" + if hasattr(self, "_WW_stdout") or hasattr(self, "_WW_stdout"): + general_stdout += f"\n\nWeightWatcher\n{self._WW_stdout}" + if self._WW_stderr != "": + general_stderr += f"\n\nWeightWatcher\n{self._WW_stderr}" + if hasattr(self, "_rm_reg_stderr") or hasattr(self, "_rm_reg_stdout"): + general_stdout += f"\n\nrm reg file\n{self._rm_reg_stdout}" + if self._rm_reg_stderr != "": + general_stderr += f"\n\nrm reg file\n{self._rm_reg_stderr}" + if hasattr(self, "_rm_fits1_stderr") or hasattr( + self, "_rm_fits1_stdout" ): - general_stdout += f'\n\nrm fits1 file\n{self._rm_fits1_stdout}' - if self._rm_fits1_stderr != '': - general_stderr += f'\n\nrm fits1 file\n{self._rm_fits1_stderr}' - if ( - hasattr(self, '_rm_fits2_stderr') - or hasattr(self, '_rm_fits2_stdout') + general_stdout += f"\n\nrm fits1 file\n{self._rm_fits1_stdout}" + if self._rm_fits1_stderr != "": + general_stderr += f"\n\nrm fits1 file\n{self._rm_fits1_stderr}" + if hasattr(self, "_rm_fits2_stderr") or hasattr( + self, "_rm_fits2_stdout" ): - general_stdout += f'\n\nrm fits2 file\n{self._rm_fits2_stdout}' - if self._rm_fits2_stderr != '': - general_stderr += f'\n\nrm fits2 file\n{self._rm_fits2_stderr}' + general_stdout += f"\n\nrm fits2 file\n{self._rm_fits2_stdout}" + if self._rm_fits2_stderr != "": + general_stderr += f"\n\nrm fits2 file\n{self._rm_fits2_stderr}" return general_stdout, general_stderr @@ -459,35 +467,35 @@ def find_stars(self, position, radius): For invalid configuration options """ - if 'CDSclient' in self._config['PATH']: + if "CDSclient" in self._config["PATH"]: ra = position[0] dec = position[1] if dec > 0.0: - sign = '+' + sign = "+" else: - sign = '' + sign = "" cmd_line = ( f'{self._config["PATH"]["CDSclient"]} {ra} {sign}{dec} ' - + f'-r {radius} -n 1000000' + + f"-r {radius} -n 1000000" ) self._CDS_stdout, self._CDS_stderr = execute(cmd_line) - elif 'star_cat' in self._config['PATH']: - f = open(self._config['PATH']['star_cat'], 'r') + elif "star_cat" in self._config["PATH"]: + f = open(self._config["PATH"]["star_cat"], "r") self._CDS_stdout = f.read() - self._CDS_stderr = '' + self._CDS_stderr = "" f.close() else: raise ValueError( - 'Either [PROGRAM_PATH]:CDSCLIENT_PATH in the mask config file ' - + ' or a star catalogue as module input needs to be present' + "Either [PROGRAM_PATH]:CDSCLIENT_PATH in the mask config file " + + " or a star catalogue as module input needs to be present" ) - if self._CDS_stderr != '': + if self._CDS_stderr != "": self._err = True return None @@ -517,15 +525,15 @@ def mask_border(self, width=100, flag_value=4): """ if width is None: - raise ValueError('Width for border mask not provided') + raise ValueError("Width for border mask not provided") # Note that python image array is [y, x] flag = np.zeros( ( - int(self._fieldcenter['pix'][1] * 2), - int(self._fieldcenter['pix'][0] * 2) + int(self._fieldcenter["pix"][1] * 2), + int(self._fieldcenter["pix"][0] * 2), ), - dtype='uint16', + dtype="uint16", ) flag[0:width, :] = flag_value @@ -540,7 +548,7 @@ def mask_dso( cat_path, size_plus=0.1, flag_value=8, - obj_type='Messier', + obj_type="Messier", ): """Mask DSO. @@ -575,23 +583,23 @@ def mask_dso( """ if size_plus < 0: raise ValueError( - 'deep-sky mask size increase variable cannot be negative' + "deep-sky mask size increase variable cannot be negative" ) if cat_path is None: - raise ValueError('Path to deep-sky object catalogue not provided') + raise ValueError("Path to deep-sky object catalogue not provided") m_cat, header = fits.getdata(cat_path, header=True) - unit_ra = file_io.get_unit_from_fits_header(header, 'ra') - unit_dec = file_io.get_unit_from_fits_header(header, 'dec') + unit_ra = file_io.get_unit_from_fits_header(header, "ra") + unit_dec = file_io.get_unit_from_fits_header(header, "dec") m_sc = SkyCoord( - ra=m_cat['ra'] * unit_ra, - dec=m_cat['dec'] * unit_dec, + ra=m_cat["ra"] * unit_ra, + dec=m_cat["dec"] * unit_dec, ) - unit_size_X = file_io.get_unit_from_fits_header(header, 'size_X') - unit_size_Y = file_io.get_unit_from_fits_header(header, 'size_Y') + unit_size_X = file_io.get_unit_from_fits_header(header, "size_X") + unit_size_Y = file_io.get_unit_from_fits_header(header, "size_Y") # Loop through all deep-sky objects and check whether any corner is # closer than the object's radius @@ -602,8 +610,8 @@ def mask_dso( # DSO size # r = max(m_obj['size']) * units.arcmin r = max( - m_obj['size_X'] * unit_size_X, - m_obj['size_Y'] * unit_size_Y, + m_obj["size_X"] * unit_size_X, + m_obj["size_Y"] * unit_size_Y, ) r_deg = r.to(units.degree) size_max_deg.append(r_deg) @@ -614,8 +622,7 @@ def mask_dso( indices.append(idx) self._w_log.info( - f'Found {len(indices)} {obj_type} objects overlapping with' - ' image' + f"Found {len(indices)} {obj_type} objects overlapping with" " image" ) if len(indices) == 0: @@ -628,42 +635,44 @@ def mask_dso( for idx in indices: in_img = self._wcs.footprint_contains(m_sc[idx]) self._w_log.info( - '(obj_type, ra, dec, in_img) = ' - + f'({obj_type}, ' + "(obj_type, ra, dec, in_img) = " + + f"({obj_type}, " + f'{m_cat["ra"][idx]}, ' + f'{m_cat["dec"][idx]}, ' - + f'{in_img})' + + f"{in_img})" ) # Note: python image array is [y, x] flag = np.zeros( ( - int(self._fieldcenter['pix'][1] * 2), - int(self._fieldcenter['pix'][0] * 2) + int(self._fieldcenter["pix"][1] * 2), + int(self._fieldcenter["pix"][0] * 2), ), - dtype='uint16', + dtype="uint16", ) - nx = self._fieldcenter['pix'][0] * 2 - ny = self._fieldcenter['pix'][1] * 2 + nx = self._fieldcenter["pix"][0] * 2 + ny = self._fieldcenter["pix"][1] * 2 for idx in indices: - m_center = np.hstack(self._wcs.all_world2pix( - m_cat['ra'][idx], - m_cat['dec'][idx], - 0, - )) + m_center = np.hstack( + self._wcs.all_world2pix( + m_cat["ra"][idx], + m_cat["dec"][idx], + 0, + ) + ) r_pix = ( - size_max_deg[idx].to(units.deg).value * (1 + size_plus) + size_max_deg[idx].to(units.deg).value + * (1 + size_plus) / np.abs(self._wcs.pixel_scale_matrix[0][0]) ) # The following accounts for deep-sky centers outside of image, # without creating masks for coordinates out of range y_c, x_c = np.ogrid[0:ny, 0:nx] - mask_tmp = ( - (x_c - m_center[0]) ** 2 + (y_c - m_center[1]) ** 2 - <= r_pix ** 2 - ) + mask_tmp = (x_c - m_center[0]) ** 2 + ( + y_c - m_center[1] + ) ** 2 <= r_pix**2 flag[mask_tmp] = flag_value @@ -684,26 +693,26 @@ def missing_data(self): tot = float(im_shape[0] * im_shape[1]) # Compute number and ratio of missing data (zero-valued pixels) - missing = float(len(np.where(img.get_data() == 0.)[0])) + missing = float(len(np.where(img.get_data() == 0.0)[0])) self._ratio = missing / tot # Mark image as to be flagged if ratio larger than 'flag' threshold - if self._ratio >= self._config['MD']['thresh_flag']: - self._config['MD']['im_flagged'] = True + if self._ratio >= self._config["MD"]["thresh_flag"]: + self._config["MD"]["im_flagged"] = True else: - self._config['MD']['im_flagged'] = False + self._config["MD"]["im_flagged"] = False # Mark image as to be removed if flag is True and # ratio large than 'remove' threshold. # Reset all other mask 'make' flags to False (no other mask needs # to be created) - if self._config['MD']['remove']: - if self._ratio >= self._config['MD']['thresh_remove']: - self._config['MD']['im_remove'] = True - for idx in ['HALO', 'SPIKE', 'MESSIER', 'BORDER']: - self._config[idx]['make'] = False + if self._config["MD"]["remove"]: + if self._ratio >= self._config["MD"]["thresh_remove"]: + self._config["MD"]["im_remove"] = True + for idx in ["HALO", "SPIKE", "MESSIER", "BORDER"]: + self._config[idx]["make"] = False else: - self._config['MD']['im_remove'] = False + self._config["MD"]["im_remove"] = False img.close() @@ -734,7 +743,7 @@ def sphere_dist(self, position1, position2): type(position1) is not np.ndarray or type(position2) is not np.ndarray ): - raise ValueError('Object coordinates need to be a numpy.ndarray') + raise ValueError("Object coordinates need to be a numpy.ndarray") p1 = (np.pi / 180.0) * np.hstack( self._wcs.all_pix2world(position1[0], position1[1], 1) @@ -747,10 +756,12 @@ def sphere_dist(self, position1, position2): dLong = dTheta[0] dLat = dTheta[1] - dist = 2 * np.arcsin(np.sqrt( - np.sin(dLat / 2.0) ** 2.0 + np.cos(p1[1]) * np.cos(p2[1]) - * np.sin(dLong / 2.0) ** 2.0 - )) + dist = 2 * np.arcsin( + np.sqrt( + np.sin(dLat / 2.0) ** 2.0 + + np.cos(p1[1]) * np.cos(p2[1]) * np.sin(dLong / 2.0) ** 2.0 + ) + ) return dist * (180.0 / np.pi) * 3600.0 @@ -777,7 +788,7 @@ def _get_image_radius(self, center=None): """ if center is None: return ( - self.sphere_dist(self._fieldcenter['pix'], np.zeros(2)) / 60.0 + self.sphere_dist(self._fieldcenter["pix"], np.zeros(2)) / 60.0 ) else: @@ -785,7 +796,7 @@ def _get_image_radius(self, center=None): return self.sphere_dist(center, np.zeros(2)) / 60.0 else: raise TypeError( - 'Image center coordinates has to be a numpy.ndarray' + "Image center coordinates has to be a numpy.ndarray" ) def _make_star_cat(self, CDSclient_output): @@ -808,12 +819,12 @@ def _make_star_cat(self, CDSclient_output): stars = {} # get header - for key in CDSclient_output.splitlines()[3].split(' '): - if (key != '') and (key != ';'): + for key in CDSclient_output.splitlines()[3].split(" "): + if (key != "") and (key != ";"): # cleaning output - key = key.replace(' ', '') - for key_split in re.split(',|#|;', key): - if key_split != '': + key = key.replace(" ", "") + for key_split in re.split(",|#|;", key): + if key_split != "": key = key_split header.append(key) stars[key] = [] @@ -821,19 +832,19 @@ def _make_star_cat(self, CDSclient_output): # get data for elem in range(4, len(CDSclient_output.splitlines()) - 5): idx = 0 - for key in CDSclient_output.splitlines()[elem].split(' '): - if (key != '') and (key != ';'): + for key in CDSclient_output.splitlines()[elem].split(" "): + if (key != "") and (key != ";"): # cleaning output - key = key.replace(' ', '') - for key_split in re.split(',|#|;', key): - if key_split != '': + key = key.replace(" ", "") + for key_split in re.split(",|#|;", key): + if key_split != "": key = key_split # handle missing data try: key = float(key) stars[header[idx]].append(key) except Exception: - if key == '---': + if key == "---": stars[header[idx]].append(None) else: stars[header[idx]].append(key) @@ -844,7 +855,7 @@ def _make_star_cat(self, CDSclient_output): def _create_mask( self, stars, - types='HALO', + types="HALO", mag_limit=18.0, mag_pivot=13.8, scale_factor=0.3, @@ -875,34 +886,34 @@ def _create_mask( """ if stars is None: - raise ValueError('Star catalogue dictionary not provided') + raise ValueError("Star catalogue dictionary not provided") - if types not in ('HALO', 'SPIKE'): + if types not in ("HALO", "SPIKE"): raise ValueError('Mask types need to be in ["HALO", "SPIKE"]') - if self._config[types]['reg_file'] is None: + if self._config[types]["reg_file"] is None: reg = ( f'{self._config["PATH"]["temp_dir"]}{types.lower()}' - + f'{self._img_number}.reg' + + f"{self._img_number}.reg" ) else: - reg = self._config[types]['reg_file'] + reg = self._config[types]["reg_file"] mask_model = np.loadtxt( - self._config[types]['maskmodel_path'] + self._config[types]["maskmodel_path"] ).transpose() - mask_reg = open(reg, 'w') + mask_reg = open(reg, "w") stars_used = [[], [], []] star_zip = zip( - stars['RA(J2000)'], - stars['Dec(J2000)'], - stars['Fmag'], - stars['Jmag'], - stars['Vmag'], - stars['Nmag'], - stars['Clas'], + stars["RA(J2000)"], + stars["Dec(J2000)"], + stars["Fmag"], + stars["Jmag"], + stars["Vmag"], + stars["Nmag"], + stars["Clas"], ) for ra, dec, Fmag, Jmag, Vmag, Nmag, clas in star_zip: @@ -927,7 +938,9 @@ def _create_mask( mag /= idx if ( - ra is not None and dec is not None and mag is not None + ra is not None + and dec is not None + and mag is not None and clas is not None ): if (mag < mag_limit) and (clas == 0): @@ -938,22 +951,22 @@ def _create_mask( stars_used[2].append(scaling) for idx in range(len(stars_used[0])): - poly = 'polygon(' + poly = "polygon(" for x, y in zip(mask_model[0], mask_model[1]): angle = np.arctan2(y, x) - ll = stars_used[2][idx] * np.sqrt(x ** 2 + y ** 2) + ll = stars_used[2][idx] * np.sqrt(x**2 + y**2) xnew = ll * np.cos(angle) ynew = ll * np.sin(angle) poly = ( - f'{poly}{str(stars_used[0][idx] + xnew + 0.5)} ' - + f'{str(stars_used[1][idx] + ynew + 0.5)} ' + f"{poly}{str(stars_used[0][idx] + xnew + 0.5)} " + + f"{str(stars_used[1][idx] + ynew + 0.5)} " ) - poly = f'{poly})\n' + poly = f"{poly})\n" mask_reg.write(poly) mask_reg.close() - def _exec_WW(self, types='HALO'): + def _exec_WW(self, types="HALO"): """Execute WeightWatcher. Execute WeightWatcher to transform ``.reg`` to ``.fits`` flag map. @@ -970,18 +983,18 @@ def _exec_WW(self, types='HALO'): If catalogue file not found """ - if types in ('HALO', 'SPIKE'): + if types in ("HALO", "SPIKE"): default_reg = ( f'{self._config["PATH"]["temp_dir"]}{types.lower()}' - + f'{self._img_number}.reg' + + f"{self._img_number}.reg" ) default_out = ( f'{self._config["PATH"]["temp_dir"]}{types.lower()}_flag' - + f'{self._img_number}.fits' + + f"{self._img_number}.fits" ) - if self._config[types]['reg_file'] is None: + if self._config[types]["reg_file"] is None: reg = default_reg if not file_io.BaseCatalogue(reg)._file_exists(reg): @@ -990,20 +1003,18 @@ def _exec_WW(self, types='HALO'): cmd = ( f'{self._config["PATH"]["WW"]} ' + f'-c {self._config["PATH"]["WW_configfile"]} ' - + f'-WEIGHT_NAMES {self._weight_fullpath} ' - + f'-POLY_NAMES {reg} ' + + f"-WEIGHT_NAMES {self._weight_fullpath} " + + f"-POLY_NAMES {reg} " + f'-POLY_OUTFLAGS {self._config[types]["flag"]} ' + f'-FLAG_NAMES "" -OUTFLAG_NAME {default_out} ' + '-OUTWEIGHT_NAME ""' ) self._WW_stdout, self._WW_stderr = execute(cmd) - self._rm_reg_stdout, self._rm_reg_stderr = ( - execute(f'rm {reg}') - ) + self._rm_reg_stdout, self._rm_reg_stderr = execute(f"rm {reg}") else: - reg = self._config[types]['reg_file'] + reg = self._config[types]["reg_file"] if not file_io.BaseCatalogue(reg)._file_exists(reg): raise file_io.BaseCatalogue.CatalogFileNotFound(reg) @@ -1011,8 +1022,8 @@ def _exec_WW(self, types='HALO'): cmd = ( f'{self._config["PATH"]["WW"]} ' + f'-c {self._config["PATH"]["WW_configfile"]} ' - + f'-WEIGHT_NAMES {self._weight_fullpath} ' - + f'-POLY_NAMES {reg} ' + + f"-WEIGHT_NAMES {self._weight_fullpath} " + + f"-POLY_NAMES {reg} " + f'-POLY_OUTFLAGS {self._config[types]["flag"]} ' + f'-FLAG_NAMES "" -OUTFLAG_NAME {default_out} ' + '-OUTWEIGHT_NAME ""' @@ -1020,24 +1031,24 @@ def _exec_WW(self, types='HALO'): self._WW_stdout, self._WW_stderr = execute(cmd) - elif types == 'ALL': + elif types == "ALL": default_reg = [ ( f'{self._config["PATH"]["temp_dir"]}' - + f'halo{self._img_number}.reg' + + f"halo{self._img_number}.reg" ), ( f'{self._config["PATH"]["temp_dir"]}' - + f'spike{self._img_number}.reg' - ) + + f"spike{self._img_number}.reg" + ), ] default_out = ( f'{self._config["PATH"]["temp_dir"]}' - + f'halo_spike_flag{self._img_number}.fits' + + f"halo_spike_flag{self._img_number}.fits" ) - if self._config['HALO']['reg_file'] is None: + if self._config["HALO"]["reg_file"] is None: reg = default_reg for idx in range(2): @@ -1051,8 +1062,8 @@ def _exec_WW(self, types='HALO'): cmd = ( f'{self._config["PATH"]["WW"]} ' + f'-c {self._config["PATH"]["WW_configfile"]} ' - + f'-WEIGHT_NAMES {self._weight_fullpath} ' - + f'-POLY_NAMES {reg[0]},{reg[1]} ' + + f"-WEIGHT_NAMES {self._weight_fullpath} " + + f"-POLY_NAMES {reg[0]},{reg[1]} " + f'-POLY_OUTFLAGS {self._config["HALO"]["flag"]},' + f'{self._config["SPIKE"]["flag"]} ' + f'-FLAG_NAMES "" -OUTFLAG_NAME {default_out} ' @@ -1060,14 +1071,14 @@ def _exec_WW(self, types='HALO'): ) self._WW_stdout, self._WW_stderr = execute(cmd) - self._rm_reg_stdout, self._rm_reg_stderr = ( - execute(f'rm {reg[0]} {reg[1]}') + self._rm_reg_stdout, self._rm_reg_stderr = execute( + f"rm {reg[0]} {reg[1]}" ) else: reg = [ - self._config['HALO']['reg_file'], - self._config['SPIKE']['reg_file'] + self._config["HALO"]["reg_file"], + self._config["SPIKE"]["reg_file"], ] for idx in range(2): @@ -1081,8 +1092,8 @@ def _exec_WW(self, types='HALO'): cmd = ( f'{self._config["PATH"]["WW"]} ' + f'-c {self._config["PATH"]["WW_configfile"]} ' - + f'-WEIGHT_NAMES {self._weight_fullpath} ' - + f'-POLY_NAMES {reg[0]},{reg[1]} ' + + f"-WEIGHT_NAMES {self._weight_fullpath} " + + f"-POLY_NAMES {reg[0]},{reg[1]} " + f'-POLY_OUTFLAGS {self._config["HALO"]["flag"]},' + f'{self._config["SPIKE"]["flag"]} ' + f'-FLAG_NAMES "" -OUTFLAG_NAME {default_out} ' @@ -1094,7 +1105,7 @@ def _exec_WW(self, types='HALO'): else: ValueError("Types must be in ['HALO','SPIKE','ALL']") - if (self._WW_stderr != '') or (self._rm_reg_stderr != ''): + if (self._WW_stderr != "") or (self._rm_reg_stderr != ""): self._err = True def _build_final_mask( @@ -1136,13 +1147,10 @@ def _build_final_mask( """ final_mask = None - if ( - path_mask1 is None and path_mask2 is None - and not masks_internal - ): + if path_mask1 is None and path_mask2 is None and not masks_internal: raise ValueError( - 'No paths to mask files containing halos and/or spikes,' - + ' borders, or deep-sky objects provided' + "No paths to mask files containing halos and/or spikes," + + " borders, or deep-sky objects provided" ) if path_mask1 is not None: @@ -1168,8 +1176,8 @@ def _build_final_mask( final_mask = masks_internal[typ] else: raise TypeError( - f'internally created mask of type {typ} ' - + 'has to be numpy.ndarray' + f"internally created mask of type {typ} " + + "has to be numpy.ndarray" ) if path_external_flag is not None: @@ -1208,9 +1216,9 @@ def _mask_to_file(self, input_mask, output_fullpath): """ if input_mask is None: - raise ValueError('input mask file path not provided') + raise ValueError("input mask file path not provided") if output_fullpath is None: - raise ValueError('output mask file path not provided') + raise ValueError("output mask file path not provided") out = file_io.FITSCatalogue( output_fullpath, @@ -1219,16 +1227,16 @@ def _mask_to_file(self, input_mask, output_fullpath): ) out.save_as_fits(data=input_mask, image=True) - if self._config['MD']['make']: + if self._config["MD"]["make"]: out.open() out.add_header_card( - 'MRATIO', + "MRATIO", self._ratio, - 'ratio missing_pixels/all_pixels', + "ratio missing_pixels/all_pixels", ) out.add_header_card( - 'MFLAG', - self._config['MD']['im_flagged'], + "MFLAG", + self._config["MD"]["im_flagged"], f'threshold value {self._config["MD"]["thresh_flag"]:.3}', ) @@ -1266,14 +1274,14 @@ def _get_temp_dir_path(self, temp_dir_path): """ if temp_dir_path is None: - raise ValueError('Temporary directory path not provided') + raise ValueError("Temporary directory path not provided") - path = temp_dir_path.replace(' ', '') + path = temp_dir_path.replace(" ", "") - if path == 'OUTPUT': - path = f'{self._output_dir}/temp' + if path == "OUTPUT": + path = f"{self._output_dir}/temp" - path += '/' + path += "/" if not os.path.isdir(path): mkdir(path) diff --git a/shapepipe/modules/mask_runner.py b/shapepipe/modules/mask_runner.py index 3683076e4..0cbec20e2 100644 --- a/shapepipe/modules/mask_runner.py +++ b/shapepipe/modules/mask_runner.py @@ -11,12 +11,12 @@ @module_runner( - version='1.0', - file_pattern=['image', 'weight', 'flag'], - file_ext=['.fits', '.fits', '.fits'], - depends=['numpy', 'astropy'], - executes=['ww', 'findgsc2.2'], - numbering_scheme='_0', + version="1.0", + file_pattern=["image", "weight", "flag"], + file_ext=[".fits", ".fits", ".fits"], + depends=["numpy", "astropy"], + executes=["ww", "findgsc2.2"], + numbering_scheme="_0", ) def mask_runner( input_file_list, @@ -37,32 +37,31 @@ def mask_runner( # Set options for 3 inputs elif n_inputs == 3: - if config.getboolean(module_config_sec, 'USE_EXT_FLAG'): + if config.getboolean(module_config_sec, "USE_EXT_FLAG"): ext_flag_name = input_file_list[2] ext_star_cat = None - elif config.getboolean(module_config_sec, 'USE_EXT_STAR'): + elif config.getboolean(module_config_sec, "USE_EXT_STAR"): ext_flag_name = None ext_star_cat = input_file_list[2] else: raise ValueError( - f'Found {n_inputs} inputs but was expecting external flag or ' - + 'external star catalogue in the MASK_RUNNER section of the ' - + 'config file.' + f"Found {n_inputs} inputs but was expecting external flag or " + + "external star catalogue in the MASK_RUNNER section of the " + + "config file." ) # Set options for 4 inputs elif n_inputs == 4: - if ( - config.getboolean(module_config_sec, 'USE_EXT_FLAG') - and config.getboolean(module_config_sec, 'USE_EXT_STAR') - ): + if config.getboolean( + module_config_sec, "USE_EXT_FLAG" + ) and config.getboolean(module_config_sec, "USE_EXT_STAR"): ext_flag_name = input_file_list[2] ext_star_cat = input_file_list[3] else: raise ValueError( - f'Found {n_inputs} inputs but was expecting external flag and ' - + 'external star catalogue in the MASK_RUNNER section of the ' - + 'config file.' + f"Found {n_inputs} inputs but was expecting external flag and " + + "external star catalogue in the MASK_RUNNER section of the " + + "config file." ) # Raise error for invalid settings @@ -70,37 +69,46 @@ def mask_runner( raise ValueError( f'Found {n_inputs} inputs and these must be "image", "weight" and ' + '"ext_flags", "ext_star_cat" (optional). Check the MASK_RUNNER ' - + 'section of the config file to make sure you have the ' - + 'appropriate settings.' + + "section of the config file to make sure you have the " + + "appropriate settings." ) # Get path to mask configuration options - config_file = config.getexpanded(module_config_sec, 'MASK_CONFIG_PATH') + config_file = config.getexpanded(module_config_sec, "MASK_CONFIG_PATH") # Get mask HDU number - if config.has_option(module_config_sec, 'HDU'): - hdu = config.getint(module_config_sec, 'HDU') + if config.has_option(module_config_sec, "HDU"): + hdu = config.getint(module_config_sec, "HDU") else: hdu = 0 # Get mask mask file name prefix - if config.has_option(module_config_sec, 'PREFIX'): - prefix = config.get(module_config_sec, 'PREFIX') + if config.has_option(module_config_sec, "PREFIX"): + prefix = config.get(module_config_sec, "PREFIX") else: - prefix = '' + prefix = "" - outname_base = 'flag' + outname_base = "flag" + + # Path to check for already created mask files + if config.has_option(module_config_sec, "CHECK_EXISTING_DIR"): + check_existing_dir = config.getexpanded( + module_config_sec, "CHECK_EXISTING_DIR" + ) + else: + check_existing_dir = None # Create instance of Mask mask_inst = Mask( *input_file_list[:2], - image_prefix=prefix.replace(' ', ''), + image_prefix=prefix.replace(" ", ""), image_num=file_number_string, config_filepath=config_file, - output_dir=run_dirs['output'], + output_dir=run_dirs["output"], path_external_flag=ext_flag_name, outname_base=outname_base, star_cat_path=ext_star_cat, + check_existing_dir=check_existing_dir, hdu=hdu, w_log=w_log, ) diff --git a/shapepipe/modules/match_external_package/__init__.py b/shapepipe/modules/match_external_package/__init__.py index 950d84ca8..7fa68545c 100644 --- a/shapepipe/modules/match_external_package/__init__.py +++ b/shapepipe/modules/match_external_package/__init__.py @@ -46,4 +46,4 @@ """ -__all__ = ['match_external'] +__all__ = ["match_external"] diff --git a/shapepipe/modules/match_external_package/match_external.py b/shapepipe/modules/match_external_package/match_external.py index 520bbb318..218a231e7 100644 --- a/shapepipe/modules/match_external_package/match_external.py +++ b/shapepipe/modules/match_external_package/match_external.py @@ -175,14 +175,14 @@ def process(self): self._external_col_match[0], self._external_col_match[1], ) - external_coord = SkyCoord(ra=external_ra, dec=external_dec, unit='deg') + external_coord = SkyCoord(ra=external_ra, dec=external_dec, unit="deg") data, col_names, ext_names = get_data( self._input_file_list[0], self._hdu_no, ) ra, dec = get_ra_dec(data, self._col_match[0], self._col_match[1]) - coord = SkyCoord(ra=ra, dec=dec, unit='deg') + coord = SkyCoord(ra=ra, dec=dec, unit="deg") # Match objects in external cat to internal cat. indices=indices to # external object for each object in internal cat e.g. @@ -198,17 +198,20 @@ def process(self): if not any(indices_close): self._w_log.info( - f'No match for {self._input_file_list[0]} with distance < ' - + f'{self._tolerance} arcsec found, no output created.' + f"No match for {self._input_file_list[0]} with distance < " + + f"{self._tolerance} arcsec found, no output created." ) else: # Get indices in internal and external catalogues of pair-wise # matches - w = np.array([ - (idx, ide) for (idx, ide) in enumerate(indices) - if indices_close[idx] - ]) + w = np.array( + [ + (idx, ide) + for (idx, ide) in enumerate(indices) + if indices_close[idx] + ] + ) id_sub = w[:, 0] id_ext_sub = w[:, 1] id_all = np.arange(len(indices)) @@ -223,7 +226,7 @@ def process(self): id_ext = id_ext_sub self._w_log.info( - f'{len(id_sub)} objects matched out of {len(indices)}.' + f"{len(id_sub)} objects matched out of {len(indices)}." ) # Copy matched objects from internal catalogue to output data @@ -242,7 +245,7 @@ def process(self): # Output distance if desired if self._output_distance: # Output distance in arcsec - matched['distance'] = d2d[id_data].to('arcsec').value + matched["distance"] = d2d[id_data].to("arcsec").value # Write FITS file out_cat = file_io.FITSCatalogue( @@ -252,14 +255,13 @@ def process(self): ) out_cat.save_as_fits( data=matched, - ext_name='MATCHED', + ext_name="MATCHED", ) # Write all extensions if in multi-epoch mode - if self._mode == 'MULTI-EPOCH': + if self._mode == "MULTI-EPOCH": hdu_me_list = [ - idx for idx, name in enumerate(ext_names) - if 'EPOCH' in name + idx for idx, name in enumerate(ext_names) if "EPOCH" in name ] for hdu_me in hdu_me_list: data_me, col_names_me, dummy = get_data( diff --git a/shapepipe/modules/match_external_runner.py b/shapepipe/modules/match_external_runner.py index 9f1060c11..4df5ac0c2 100644 --- a/shapepipe/modules/match_external_runner.py +++ b/shapepipe/modules/match_external_runner.py @@ -11,12 +11,12 @@ @module_runner( - version='1.1', - input_module='sextractor_runner', - file_pattern='tile_sexcat', - file_ext='.fits', - depends=['numpy', 'astropy'], - run_method='parallel', + version="1.1", + input_module="sextractor_runner", + file_pattern="tile_sexcat", + file_ext=".fits", + depends=["numpy", "astropy"], + run_method="parallel", ) def match_external_runner( input_file_list, @@ -28,72 +28,71 @@ def match_external_runner( ): """Define The Match External Runner.""" # Get processing tolerance - tolerance = config.getfloat(module_config_sec, 'TOLERANCE') + tolerance = config.getfloat(module_config_sec, "TOLERANCE") # Internal data - col_match = config.getlist(module_config_sec, 'COL_MATCH') - if config.has_option(module_config_sec, 'HDU'): - hdu_no = config.getint(module_config_sec, 'HDU') + col_match = config.getlist(module_config_sec, "COL_MATCH") + if config.has_option(module_config_sec, "HDU"): + hdu_no = config.getint(module_config_sec, "HDU") else: hdu_no = 2 # Set run mode - mode = config.get(module_config_sec, 'MODE') - valid_modes = ('CLASSIC', 'MULTI-EPOCH') + mode = config.get(module_config_sec, "MODE") + valid_modes = ("CLASSIC", "MULTI-EPOCH") if mode not in valid_modes: raise ValueError( - f'mode \'{mode}\' is invalid, must be one of {valid_modes}.' + f"mode '{mode}' is invalid, must be one of {valid_modes}." ) # External data external_cat_path = config.getexpanded( module_config_sec, - 'EXTERNAL_CAT_PATH', + "EXTERNAL_CAT_PATH", ) external_col_match = config.getlist( module_config_sec, - 'EXTERNAL_COL_MATCH', + "EXTERNAL_COL_MATCH", ) # TODO: optional or 'none', 'all' # Also TODO: change column name if already present in internal cat - external_col_copy = config.getlist(module_config_sec, 'EXTERNAL_COL_COPY') + external_col_copy = config.getlist(module_config_sec, "EXTERNAL_COL_COPY") - if config.has_option(module_config_sec, 'EXTERNAL_HDU'): - external_hdu_no = config.getint(module_config_sec, 'EXTERNAL_HDU') + if config.has_option(module_config_sec, "EXTERNAL_HDU"): + external_hdu_no = config.getint(module_config_sec, "EXTERNAL_HDU") else: external_hdu_no = 1 # Output - if config.has_option(module_config_sec, 'PREFIX'): + if config.has_option(module_config_sec, "PREFIX"): prefix = config.get( module_config_sec, - 'PREFIX', + "PREFIX", ) else: - prefix = 'cat_matched' + prefix = "cat_matched" - if config.has_option(module_config_sec, 'MARK_NON_MATCHED'): + if config.has_option(module_config_sec, "MARK_NON_MATCHED"): mark_non_matched = config.getfloat( module_config_sec, - 'MARK_NON_MATCHED', + "MARK_NON_MATCHED", ) else: mark_non_matched = None - if config.has_option(module_config_sec, 'OUTPUT_DISTANCE'): + if config.has_option(module_config_sec, "OUTPUT_DISTANCE"): output_distance = config.getboolean( module_config_sec, - 'OUTPUT_DISTANCE', + "OUTPUT_DISTANCE", ) else: output_distance = False # Set output file path - file_ext = 'fits' + file_ext = "fits" output_path = ( - f'{run_dirs["output"]}/{prefix}{file_number_string}.' - + f'{file_ext}' + f'{run_dirs["output"]}/{prefix}{file_number_string}.' + f"{file_ext}" ) # Create instance of MatchCats diff --git a/shapepipe/modules/mccd_fit_runner.py b/shapepipe/modules/mccd_fit_runner.py index 512364338..58e367231 100644 --- a/shapepipe/modules/mccd_fit_runner.py +++ b/shapepipe/modules/mccd_fit_runner.py @@ -13,13 +13,13 @@ @module_runner( - version='1.1', - input_module=['mccd_preprocessing_runner'], - file_pattern=['train_star_selection'], - file_ext=['.fits'], - numbering_scheme='-0000000', - depends=['numpy', 'mccd', 'galsim'], - run_method='parallel', + version="1.1", + input_module=["mccd_preprocessing_runner"], + file_pattern=["train_star_selection"], + file_ext=[".fits"], + numbering_scheme="-0000000", + depends=["numpy", "mccd", "galsim"], + run_method="parallel", ) def mccd_fit_runner( input_file_list, @@ -31,9 +31,9 @@ def mccd_fit_runner( ): """Define The MCCD Fit Runner.""" # Recover the MCCD config file and its params - config_file_path = config.getexpanded(module_config_sec, 'CONFIG_PATH') - mccd_mode = config.get(module_config_sec, 'MODE') - verbose = config.getboolean(module_config_sec, 'VERBOSE') + config_file_path = config.getexpanded(module_config_sec, "CONFIG_PATH") + mccd_mode = config.get(module_config_sec, "MODE") + verbose = config.getboolean(module_config_sec, "VERBOSE") # Parse MCCD config file mccd_parser = mccd.auxiliary_fun.MCCDParamsParser(config_file_path) @@ -41,10 +41,10 @@ def mccd_fit_runner( # Prepare inputs to run the main fit function trainstar_path = input_file_list[0] - output_dir = run_dirs['output'] + '/' - saving_name = 'fitted_model' + output_dir = run_dirs["output"] + "/" + saving_name = "fitted_model" - if mccd_mode == 'FIT': + if mccd_mode == "FIT": aux_mccd.mccd_fit_pipeline( trainstar_path=trainstar_path, file_number_string=file_number_string, diff --git a/shapepipe/modules/mccd_fit_val_runner.py b/shapepipe/modules/mccd_fit_val_runner.py index cb959e31c..26623c2a7 100644 --- a/shapepipe/modules/mccd_fit_val_runner.py +++ b/shapepipe/modules/mccd_fit_val_runner.py @@ -13,13 +13,13 @@ @module_runner( - version='1.1', - input_module=['mccd_preprocessing_runner'], - file_pattern=['train_star_selection', 'test_star_selection'], - file_ext=['.fits', '.fits'], - numbering_scheme='-0000000', - depends=['numpy', 'mccd', 'galsim'], - run_method='parallel', + version="1.1", + input_module=["mccd_preprocessing_runner"], + file_pattern=["train_star_selection", "test_star_selection"], + file_ext=[".fits", ".fits"], + numbering_scheme="-0000000", + depends=["numpy", "mccd", "galsim"], + run_method="parallel", ) def mccd_fit_val_runner( input_file_list, @@ -31,24 +31,24 @@ def mccd_fit_val_runner( ): """Define The MCCD Fit Validation Runner.""" # Recover the MCCD config file and its params - config_file_path = config.getexpanded(module_config_sec, 'CONFIG_PATH') - mccd_mode = config.get(module_config_sec, 'MODE') - verbose = config.getboolean(module_config_sec, 'VERBOSE') + config_file_path = config.getexpanded(module_config_sec, "CONFIG_PATH") + mccd_mode = config.get(module_config_sec, "MODE") + verbose = config.getboolean(module_config_sec, "VERBOSE") # Parse MCCD config file mccd_parser = mccd.auxiliary_fun.MCCDParamsParser(config_file_path) mccd_parser.parse_document() # Prepare inputs to run the main fit function - output_dir = run_dirs['output'] + '/' - fit_saving_name = 'fitted_model' - val_saving_name = 'validation_psf' + output_dir = run_dirs["output"] + "/" + fit_saving_name = "fitted_model" + val_saving_name = "validation_psf" # Extract the training star catalog trainstar_path = input_file_list[0] # Validation stars are in the second position of the list teststar_path = input_file_list[1] - if mccd_mode == 'FIT_VALIDATION': + if mccd_mode == "FIT_VALIDATION": aux_mccd.mccd_fit_pipeline( trainstar_path=trainstar_path, @@ -61,8 +61,9 @@ def mccd_fit_val_runner( ) # Fitted model is found in the output directory - mccd_model_path = output_dir + fit_saving_name + file_number_string \ - + '.npy' + mccd_model_path = ( + output_dir + fit_saving_name + file_number_string + ".npy" + ) aux_mccd.mccd_validation_pipeline( teststar_path=teststar_path, diff --git a/shapepipe/modules/mccd_interp_runner.py b/shapepipe/modules/mccd_interp_runner.py index 4856e562f..1428e44d6 100644 --- a/shapepipe/modules/mccd_interp_runner.py +++ b/shapepipe/modules/mccd_interp_runner.py @@ -10,19 +10,20 @@ from shapepipe.pipeline.run_log import get_last_dir -from shapepipe.modules.mccd_package import \ - mccd_interpolation_script as mccd_interp +from shapepipe.modules.mccd_package import ( + mccd_interpolation_script as mccd_interp, +) from shapepipe.modules.mccd_package import shapepipe_auxiliary_mccd as aux_mccd from shapepipe.modules.module_decorator import module_runner @module_runner( - version='1.0', - input_module=['setools_runner'], - file_pattern=['galaxy_selection'], - file_ext=['.npy'], - depends=['numpy', 'astropy', 'galsim', 'sqlitedict', 'mccd'], - run_method='parallel', + version="1.0", + input_module=["setools_runner"], + file_pattern=["galaxy_selection"], + file_ext=[".npy"], + depends=["numpy", "astropy", "galsim", "sqlitedict", "mccd"], + run_method="parallel", ) def mccd_interp_runner( input_file_list, @@ -33,37 +34,32 @@ def mccd_interp_runner( w_log, ): """Define The MCCD Interpolation Runner.""" - mode = config.getexpanded(module_config_sec, 'MODE') - pos_params = config.getlist(module_config_sec, 'POSITION_PARAMS') - get_shapes = config.getboolean(module_config_sec, 'GET_SHAPES') - mccd_model_extension = '.npy' - output_dir = run_dirs['output'] - - if mode == 'CLASSIC': - module = config.getexpanded( - module_config_sec, - 'PSF_MODEL_DIR' - ) - psf_model_dir = get_last_dir(run_dirs['run_log'], module) - psf_model_pattern = config.get( - module_config_sec, - 'PSF_MODEL_PATTERN' - ) - psf_separator = config.get( - module_config_sec, - 'PSF_MODEL_SEPARATOR' - ) + mode = config.getexpanded(module_config_sec, "MODE") + pos_params = config.getlist(module_config_sec, "POSITION_PARAMS") + get_shapes = config.getboolean(module_config_sec, "GET_SHAPES") + mccd_model_extension = ".npy" + output_dir = run_dirs["output"] + + if mode == "CLASSIC": + module = config.getexpanded(module_config_sec, "PSF_MODEL_DIR") + psf_model_dir = get_last_dir(run_dirs["run_log"], module) + psf_model_pattern = config.get(module_config_sec, "PSF_MODEL_PATTERN") + psf_separator = config.get(module_config_sec, "PSF_MODEL_SEPARATOR") galcat_path = input_file_list[0] # verify that the MCCD model exists ccd_id = file_number_string.split(psf_separator)[-1] exposure_id = file_number_string.split(psf_separator)[-2] - psf_model_path = psf_model_dir + psf_model_pattern + psf_separator +\ - exposure_id + mccd_model_extension + psf_model_path = ( + psf_model_dir + + psf_model_pattern + + psf_separator + + exposure_id + + mccd_model_extension + ) - saving_path = output_dir + '/galaxy_psf' + file_number_string +\ - '.fits' + saving_path = output_dir + "/galaxy_psf" + file_number_string + ".fits" if not os.path.exists(psf_model_path): error_msg = "The corresponding PSF model was not not found." @@ -74,7 +70,7 @@ def mccd_interp_runner( return None, None - w_log.info('Interpolating catalogue %s..' % file_number_string) + w_log.info("Interpolating catalogue %s.." % file_number_string) output_msg = aux_mccd.mccd_interpolation_pipeline( mccd_model_path=psf_model_path, galcat_path=galcat_path, @@ -90,20 +86,11 @@ def mccd_interp_runner( + f" id: {file_number_string}." ) - elif mode == 'MULTI-EPOCH': - module = config.getexpanded( - module_config_sec, - 'PSF_MODEL_DIR' - ) - psf_model_dir = get_last_dir(run_dirs['run_log'], module) - psf_model_pattern = config.get( - module_config_sec, - 'PSF_MODEL_PATTERN' - ) - f_wcs_path = config.getexpanded( - module_config_sec, - 'ME_LOG_WCS' - ) + elif mode == "MULTI-EPOCH": + module = config.getexpanded(module_config_sec, "PSF_MODEL_DIR") + psf_model_dir = get_last_dir(run_dirs["run_log"], module) + psf_model_pattern = config.get(module_config_sec, "PSF_MODEL_PATTERN") + f_wcs_path = config.getexpanded(module_config_sec, "ME_LOG_WCS") galcat_path = input_file_list[0] @@ -119,7 +106,7 @@ def mccd_interp_runner( inst.process_me(psf_model_dir, psf_model_pattern, f_wcs_path) - elif mode == 'VALIDATION': + elif mode == "VALIDATION": ValueError( "MODE has to be in MULTI-EPOCH or CLASSIC. For validation" + " use MCCD validation runner." diff --git a/shapepipe/modules/mccd_package/__init__.py b/shapepipe/modules/mccd_package/__init__.py index dc6416c43..115cc0f86 100644 --- a/shapepipe/modules/mccd_package/__init__.py +++ b/shapepipe/modules/mccd_package/__init__.py @@ -190,7 +190,7 @@ """ __all__ = [ - 'shapepipe_auxiliary_mccd', - 'mccd_interpolation_script', - 'mccd_plot_utilities', + "shapepipe_auxiliary_mccd", + "mccd_interpolation_script", + "mccd_plot_utilities", ] diff --git a/shapepipe/modules/mccd_package/mccd_interpolation_script.py b/shapepipe/modules/mccd_package/mccd_interpolation_script.py index 40e644e8b..6030fa657 100644 --- a/shapepipe/modules/mccd_package/mccd_interpolation_script.py +++ b/shapepipe/modules/mccd_package/mccd_interpolation_script.py @@ -23,9 +23,9 @@ import_fail = False -NOT_ENOUGH_STARS = 'Fail_stars' -BAD_CHI2 = 'Fail_chi2' -FILE_NOT_FOUND = 'File_not_found' +NOT_ENOUGH_STARS = "Fail_stars" +BAD_CHI2 = "Fail_chi2" +FILE_NOT_FOUND = "File_not_found" def interp_MCCD(mccd_model_path, positions, ccd): @@ -62,10 +62,12 @@ def interp_MCCD(mccd_model_path, positions, ccd): # Positions to global coordinates loc2glob = mccd.mccd_utils.Loc2Glob() - glob_pos = np.array([ - loc2glob.loc2glob_img_coord(_ccd, _pos[0], _pos[1]) - for _ccd, _pos in zip(ccd_list, positions) - ]) + glob_pos = np.array( + [ + loc2glob.loc2glob_img_coord(_ccd, _pos[0], _pos[1]) + for _ccd, _pos in zip(ccd_list, positions) + ] + ) # Interpolate the model PSFs = mccd_instance.interpolate_psf_pipeline(glob_pos, ccd) @@ -116,16 +118,16 @@ def __init__( img_number, w_log, pos_params=None, - get_shapes=True + get_shapes=True, ): # Path to PSFEx output file self._dotpsf_path = dotpsf_path # Path to catalogue containing galaxy positions self._galcat_path = galcat_path # Path to output file to be written - self._output_path = output_path + '/galaxy_psf' + self._output_path = output_path + "/galaxy_psf" # Path to output file to be written for validation - self._output_path_validation = output_path + '/validation_psf' + self._output_path_validation = output_path + "/validation_psf" # if required, compute and save shapes self._compute_shape = get_shapes @@ -142,8 +144,8 @@ def __init__( if pos_params: if not len(pos_params) == 2: raise ValueError( - f'{len(pos_params)} position parameters were passed on;' - + f' there should be exactly two.' + f"{len(pos_params)} position parameters were passed on;" + + f" there should be exactly two." ) self._pos_params = pos_params else: @@ -162,8 +164,8 @@ def _get_position_parameters(self): dotpsf = file_io.FITSCatalogue(self._dotpsf_path) dotpsf.open() self._pos_params = [ - dotpsf.get_header()['POLNAME1'], - dotpsf.get_header()['POLNAME2'] + dotpsf.get_header()["POLNAME1"], + dotpsf.get_header()["POLNAME2"], ] dotpsf.close() @@ -180,20 +182,23 @@ def _get_galaxy_positions(self): galcat.open() try: self.gal_pos = np.array( - [[x, y] for x, y in zip( - galcat.get_data()[self._pos_params[0]], - galcat.get_data()[self._pos_params[1]] - )] + [ + [x, y] + for x, y in zip( + galcat.get_data()[self._pos_params[0]], + galcat.get_data()[self._pos_params[1]], + ) + ] ) except KeyError as detail: # extract erroneous position parameter from original exception err_pos_param = detail.args[0][4:-15] pos_param_err = ( - f'Required position parameter {err_pos_param}' - + 'was not found in galaxy catalog. Leave ' - + 'pos_params (or EXTRA_CODE_OPTION) blank to ' - + 'read them from .psf file.' + f"Required position parameter {err_pos_param}" + + "was not found in galaxy catalog. Leave " + + "pos_params (or EXTRA_CODE_OPTION) blank to " + + "read them from .psf file." ) raise KeyError(pos_param_err) galcat.close() @@ -205,22 +210,24 @@ def _get_psfshapes(self): """ if import_fail: - raise ImportError('Galsim is required to get shapes information') + raise ImportError("Galsim is required to get shapes information") psf_moms = [ hsm.FindAdaptiveMom(Image(psf), strict=False) for psf in self.interp_PSFs ] - self.psf_shapes = np.array([ + self.psf_shapes = np.array( [ - moms.observed_shape.g1, - moms.observed_shape.g2, - moms.moments_sigma, - int(bool(moms.error_message)) + [ + moms.observed_shape.g1, + moms.observed_shape.g2, + moms.moments_sigma, + int(bool(moms.error_message)), + ] + for moms in psf_moms ] - for moms in psf_moms - ]) + ) def _write_output(self): """Write Output. @@ -229,21 +236,21 @@ def _write_output(self): """ output = file_io.FITSCatalogue( - self._output_path + self._img_number + '.fits', + self._output_path + self._img_number + ".fits", open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite, - SEx_catalogue=True + SEx_catalogue=True, ) if self._compute_shape: data = { - 'VIGNET': self.interp_PSFs, - 'E1_PSF_HSM': self.psf_shapes[:, 0], - 'E2_PSF_HSM': self.psf_shapes[:, 1], - 'SIGMA_PSF_HSM': self.psf_shapes[:, 2], - 'FLAG_PSF_HSM': self.psf_shapes[:, 3].astype(int) + "VIGNET": self.interp_PSFs, + "E1_PSF_HSM": self.psf_shapes[:, 0], + "E2_PSF_HSM": self.psf_shapes[:, 1], + "SIGMA_PSF_HSM": self.psf_shapes[:, 2], + "FLAG_PSF_HSM": self.psf_shapes[:, 3].astype(int), } else: - data = {'VIGNET': self.interp_PSFs} + data = {"VIGNET": self.interp_PSFs} output.save_as_fits(data, sex_cat_path=self._galcat_path) def _get_starshapes(self, star_vign): @@ -258,27 +265,27 @@ def _get_starshapes(self, star_vign): """ if import_fail: - raise ImportError('Galsim is required to get shapes information') + raise ImportError("Galsim is required to get shapes information") masks = np.zeros_like(star_vign) masks[np.where(star_vign == -1e30)] = 1 - star_moms = [hsm.FindAdaptiveMom( - Image(star), - badpix=Image(mask), - strict=False) + star_moms = [ + hsm.FindAdaptiveMom(Image(star), badpix=Image(mask), strict=False) for star, mask in zip(star_vign, masks) ] - self.star_shapes = np.array([ + self.star_shapes = np.array( [ - moms.observed_shape.g1, - moms.observed_shape.g2, - moms.moments_sigma, - int(bool(moms.error_message)) + [ + moms.observed_shape.g1, + moms.observed_shape.g2, + moms.moments_sigma, + int(bool(moms.error_message)), + ] + for moms in star_moms ] - for moms in star_moms - ]) + ) def _get_psfexcatdict(self, psfex_cat_path): """Get PSFEx Catalogue Dictionary. @@ -300,13 +307,16 @@ def _get_psfexcatdict(self, psfex_cat_path): psfex_cat.open() psfex_cat_dict = {} - psfex_cat_dict['SOURCE_NUMBER'] = np.copy( - psfex_cat.get_data()['SOURCE_NUMBER']) - psfex_cat_dict['DELTAX_IMAGE'] = np.copy( - psfex_cat.get_data()['DELTAX_IMAGE']) - psfex_cat_dict['DELTAY_IMAGE'] = np.copy( - psfex_cat.get_data()['DELTAY_IMAGE']) - psfex_cat_dict['CHI2_PSF'] = np.copy(psfex_cat.get_data()['CHI2_PSF']) + psfex_cat_dict["SOURCE_NUMBER"] = np.copy( + psfex_cat.get_data()["SOURCE_NUMBER"] + ) + psfex_cat_dict["DELTAX_IMAGE"] = np.copy( + psfex_cat.get_data()["DELTAX_IMAGE"] + ) + psfex_cat_dict["DELTAY_IMAGE"] = np.copy( + psfex_cat.get_data()["DELTAY_IMAGE"] + ) + psfex_cat_dict["CHI2_PSF"] = np.copy(psfex_cat.get_data()["CHI2_PSF"]) return psfex_cat_dict @@ -324,28 +334,29 @@ def _write_output_validation(self, star_dict, psfex_cat_dict): """ output = file_io.FITSCatalogue( - self._output_path_validation + self._img_number + '.fits', + self._output_path_validation + self._img_number + ".fits", open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite, - SEx_catalogue=True) + SEx_catalogue=True, + ) data = { - 'E1_PSF_HSM': self.psf_shapes[:, 0], - 'E2_PSF_HSM': self.psf_shapes[:, 1], - 'SIGMA_PSF_HSM': self.psf_shapes[:, 2], - 'FLAG_PSF_HSM': self.psf_shapes[:, 3].astype(int), - 'E1_STAR_HSM': self.star_shapes[:, 0], - 'E2_STAR_HSM': self.star_shapes[:, 1], - 'SIGMA_STAR_HSM': self.star_shapes[:, 2], - 'FLAG_STAR_HSM': self.star_shapes[:, 3].astype(int) + "E1_PSF_HSM": self.psf_shapes[:, 0], + "E2_PSF_HSM": self.psf_shapes[:, 1], + "SIGMA_PSF_HSM": self.psf_shapes[:, 2], + "FLAG_PSF_HSM": self.psf_shapes[:, 3].astype(int), + "E1_STAR_HSM": self.star_shapes[:, 0], + "E2_STAR_HSM": self.star_shapes[:, 1], + "SIGMA_STAR_HSM": self.star_shapes[:, 2], + "FLAG_STAR_HSM": self.star_shapes[:, 3].astype(int), } data = {**data, **star_dict} - data['ACCEPTED'] = np.ones_like(data['NUMBER'], dtype='int16') - star_used = psfex_cat_dict.pop('SOURCE_NUMBER') + data["ACCEPTED"] = np.ones_like(data["NUMBER"], dtype="int16") + star_used = psfex_cat_dict.pop("SOURCE_NUMBER") - for i in range(len(data['NUMBER'])): + for i in range(len(data["NUMBER"])): if i + 1 not in star_used: - data['ACCEPTED'][i] = 0 + data["ACCEPTED"][i] = 0 output.save_as_fits(data, sex_cat_path=self._galcat_path) @@ -395,22 +406,23 @@ def _interpolate_me(self): all_id = np.copy(cat.get_data()['NUMBER']) key_ne = 'N_EPOCH' - if key_ne not in cat.get_data(): + if key_ne not in cat.get_data().dtype.names: raise KeyError( - f'Key {key_ne} not found in input galaxy catalogue, needed for' - + ' PSF interpolation to multi-epoch data; run previous module' - + ' (SExtractor) in multi-epoch mode' + f"Key {key_ne} not found in input galaxy catalogue, needed for" + + " PSF interpolation to multi-epoch data; run previous module" + + " (SExtractor) in multi-epoch mode" ) n_epoch = np.copy(cat.get_data()[key_ne]) list_ext_name = cat.get_ext_name() - hdu_ind = [i for i in range(len(list_ext_name)) if - 'EPOCH' in list_ext_name[i]] + hdu_ind = [ + i for i in range(len(list_ext_name)) if "EPOCH" in list_ext_name[i] + ] final_list = [] for hdu_index in hdu_ind: - exp_name = cat.get_data(hdu_index)['EXP_NAME'][0] - ccd_list = list(set(cat.get_data(hdu_index)['CCD_N'])) + exp_name = cat.get_data(hdu_index)["EXP_NAME"][0] + ccd_list = list(set(cat.get_data(hdu_index)["CCD_N"])) array_psf = None array_id = None array_shape = None @@ -421,53 +433,54 @@ def _interpolate_me(self): # dot_psf_path = self._dot_psf_dir + '/' +\ # self._dot_psf_pattern + '-' + exp_name + '-' + str(ccd) +\ # '.psf' - mccd_model_path = self._dot_psf_dir + '/' +\ - self._dot_psf_pattern + '-' + exp_name + '.npy' + mccd_model_path = ( + self._dot_psf_dir + + "/" + + self._dot_psf_pattern + + "-" + + exp_name + + ".npy" + ) - ind_obj = np.where(cat.get_data(hdu_index)['CCD_N'] == ccd)[0] + ind_obj = np.where(cat.get_data(hdu_index)["CCD_N"] == ccd)[0] obj_id = all_id[ind_obj] gal_pos = np.array( - self._f_wcs_file[exp_name][ccd]['WCS'].all_world2pix( + self._f_wcs_file[exp_name][ccd]["WCS"].all_world2pix( self.gal_pos[:, 0][ind_obj], self.gal_pos[:, 1][ind_obj], - 0 + 0, ) ).T self.interp_PSFs = interp_MCCD(mccd_model_path, gal_pos, ccd) - # self.interp_PSFs = interpsfex( - # dot_psf_path, gal_pos, self._star_thresh, self._chi2_thresh) - if ( - isinstance(self.interp_PSFs, str) - and (self.interp_PSFs == NOT_ENOUGH_STARS) + if isinstance(self.interp_PSFs, str) and ( + self.interp_PSFs == NOT_ENOUGH_STARS ): self._w_log.info( - f'Not enough stars find in the ccd {ccd} of the' - + f' exposure {exp_name}. Object inside this ' - + f'ccd will lose an epoch.' + f"Not enough stars find in the ccd {ccd} of the" + + f" exposure {exp_name}. Object inside this " + + f"ccd will lose an epoch." ) continue - if ( - isinstance(self.interp_PSFs, str) - and (self.interp_PSFs == BAD_CHI2) + if isinstance(self.interp_PSFs, str) and ( + self.interp_PSFs == BAD_CHI2 ): self._w_log.info( - f'Bad chi2 for the psf model in the ccd {ccd} of the' - + f' exposure {exp_name}. Object inside this ccd' - + f' will lose an epoch.' + f"Bad chi2 for the psf model in the ccd {ccd} of the" + + f" exposure {exp_name}. Object inside this ccd" + + f" will lose an epoch." ) continue - if ( - isinstance(self.interp_PSFs, str) - and (self.interp_PSFs == FILE_NOT_FOUND) + if isinstance(self.interp_PSFs, str) and ( + self.interp_PSFs == FILE_NOT_FOUND ): self._w_log.info( - f'Psf model file {self._dotpsf_path} not found.' - + f' Object inside this ccd will lose an epoch.' + f"Psf model file {self._dotpsf_path} not found." + + f" Object inside this ccd will lose an epoch." ) continue @@ -475,7 +488,8 @@ def _interpolate_me(self): array_psf = np.copy(self.interp_PSFs) else: array_psf = np.concatenate( - (array_psf, np.copy(self.interp_PSFs))) + (array_psf, np.copy(self.interp_PSFs)) + ) if array_id is None: array_id = np.copy(obj_id) @@ -488,20 +502,24 @@ def _interpolate_me(self): array_shape = np.copy(self.psf_shapes) else: array_shape = np.concatenate( - (array_shape, np.copy(self.psf_shapes))) + (array_shape, np.copy(self.psf_shapes)) + ) else: array_shape = None exp_name_tmp = np.array( - [exp_name + '-' + str(ccd) for i in range(len(obj_id))]) + [exp_name + "-" + str(ccd) for i in range(len(obj_id))] + ) if array_exp_name is None: array_exp_name = exp_name_tmp else: array_exp_name = np.concatenate( - (array_exp_name, exp_name_tmp)) + (array_exp_name, exp_name_tmp) + ) final_list.append( - [array_id, array_psf, array_shape, array_exp_name]) + [array_id, array_psf, array_shape, array_exp_name] + ) self._f_wcs_file.close() cat.close() @@ -515,22 +533,28 @@ def _interpolate_me(self): if len(where_res) != 0: output_dict[id_tmp][final_list[j][3][where_res[0]]] = {} output_dict[id_tmp][final_list[j][3][where_res[0]]][ - 'VIGNET'] = final_list[j][1][where_res[0]] + "VIGNET" + ] = final_list[j][1][where_res[0]] if self._compute_shape: shape_dict = {} - shape_dict['E1_PSF_HSM'] = \ - final_list[j][2][where_res[0]][0] - shape_dict['E2_PSF_HSM'] = \ - final_list[j][2][where_res[0]][1] - shape_dict['SIGMA_PSF_HSM'] = \ - final_list[j][2][where_res[0]][2] - shape_dict['FLAG_PSF_HSM'] = \ - final_list[j][2][where_res[0]][3] + shape_dict["E1_PSF_HSM"] = final_list[j][2][ + where_res[0] + ][0] + shape_dict["E2_PSF_HSM"] = final_list[j][2][ + where_res[0] + ][1] + shape_dict["SIGMA_PSF_HSM"] = final_list[j][2][ + where_res[0] + ][2] + shape_dict["FLAG_PSF_HSM"] = final_list[j][2][ + where_res[0] + ][3] output_dict[id_tmp][final_list[j][3][where_res[0]]][ - 'SHAPES'] = shape_dict + "SHAPES" + ] = shape_dict counter += 1 if counter == 0: - output_dict[id_tmp] = 'empty' + output_dict[id_tmp] = "empty" return output_dict @@ -548,7 +572,8 @@ def _write_output_me(self, output_dict): # np.save(self._output_path+self._img_number, output_dict) output_file = SqliteDict( - self._output_path + self._img_number + '.sqlite') + self._output_path + self._img_number + ".sqlite" + ) for i in output_dict.keys(): output_file[str(i)] = output_dict[i] output_file.commit() diff --git a/shapepipe/modules/mccd_package/mccd_plot_utilities.py b/shapepipe/modules/mccd_package/mccd_plot_utilities.py index 1d3eb9f14..c7a65b5bd 100644 --- a/shapepipe/modules/mccd_package/mccd_plot_utilities.py +++ b/shapepipe/modules/mccd_package/mccd_plot_utilities.py @@ -5,7 +5,7 @@ It can also plot the rho statistics provided that the required packages are installed. -:Author: Tobias Liaudat +:Authors: Tobias Liaudat, Martin Kilbinger """ @@ -21,11 +21,13 @@ from astropy.io import fits from stile.sys_tests import BaseCorrelationFunctionSysTest +from shear_psf_leakage.rho_tau_stat import RhoStat + # Define the backend for matplotlib -mpl.use('agg') +mpl.use("agg") # MegaCam -> plt.subplot correspondance, as given by: -''' 'COMMENT Unique detector IDs for MegaCam', +""" 'COMMENT Unique detector IDs for MegaCam', 'COMMENT (North on top, East to the left)', 'COMMENT --------------------------', 'COMMENT ba ba ba ba ba ba ba ba ba', @@ -40,7 +42,7 @@ 'COMMENT 27 28 29 30 31 32 33 34 35', 'COMMENT ab ab ab ab ab ab ab ab ab', 'COMMENT __________________________' -''' +""" def megacam_pos(index): @@ -136,12 +138,7 @@ def megacam_flip_2(xbins, ybins, ccd_nb, nb_pixel): def mean_shapes_plot( - ccd_maps, - filename, - title='', - colorbar_ampl=1.0, - wind=None, - cmap='bwr' + ccd_maps, filename, title="", colorbar_ampl=1.0, wind=None, cmap="bwr" ): r"""Mean Shapes Plot. @@ -166,8 +163,10 @@ def mean_shapes_plot( """ # colorbar amplitude if wind is None: - vmax = max( - np.nanmax(ccd_maps), np.abs(np.nanmin(ccd_maps))) * colorbar_ampl + vmax = ( + max(np.nanmax(ccd_maps), np.abs(np.nanmin(ccd_maps))) + * colorbar_ampl + ) vmin = -vmax * colorbar_ampl else: vmin, vmax = wind[0] * colorbar_ampl, wind[1] * colorbar_ampl @@ -176,24 +175,20 @@ def mean_shapes_plot( fig, axes = plt.subplots(nrows=4, ncols=11, figsize=(18, 12), dpi=400) # remove corner axes (above and below ears) for j in [0, 10, -1, -11]: - axes.flat[j].axis('off') + axes.flat[j].axis("off") for ccd_nb, ccd_map in enumerate(ccd_maps): ax = axes.flat[megacam_pos(ccd_nb)] im = ax.imshow( - ccd_map.T, - cmap=cmap, - interpolation='Nearest', - vmin=vmin, - vmax=vmax + ccd_map.T, cmap=cmap, interpolation="Nearest", vmin=vmin, vmax=vmax ) ax.set_xticks([]) ax.set_yticks([]) - ax.set_title(f'rmse={np.sqrt(np.nanmean(ccd_map ** 2)):.3e}', size=8) + ax.set_title(f"rmse={np.sqrt(np.nanmean(ccd_map ** 2)):.3e}", size=8) plt.suptitle(title, size=20) # TODO: fix title fig.subplots_adjust(right=0.8) cbar_ax = fig.add_axes([0.85, 0.15, 0.05, 0.7]) fig.colorbar(im, cax=cbar_ax) - plt.savefig(f'{filename}.png') + plt.savefig(f"{filename}.png") plt.close() @@ -206,7 +201,7 @@ def plot_meanshapes( remove_outliers=False, plot_meanshapes=True, plot_histograms=True, - psf_model_type='mccd', + psf_model_type="mccd", max_e=None, max_de=None, min_r2=None, @@ -260,38 +255,43 @@ def plot_meanshapes( starcat = fits.open(starcat_path, memmap=False) auto_colorbar = False - colorbar_ampl = 1. + colorbar_ampl = 1.0 loc2glob = mccd_utils.Loc2Glob() # MegaCam: each CCD is 2048x4612 - grid = np.linspace(0, loc2glob.x_npix, nb_pixel[0] + 1), \ - np.linspace(0, loc2glob.y_npix, nb_pixel[1] + 1) + grid = np.linspace(0, loc2glob.x_npix, nb_pixel[0] + 1), np.linspace( + 0, loc2glob.y_npix, nb_pixel[1] + 1 + ) # Flag mask - star_flags = starcat[hdu_no].data['FLAG_STAR_HSM'] - psf_flags = starcat[hdu_no].data['FLAG_PSF_HSM'] + star_flags = starcat[hdu_no].data["FLAG_STAR_HSM"] + psf_flags = starcat[hdu_no].data["FLAG_PSF_HSM"] flagmask = np.abs(star_flags - 1) * np.abs(psf_flags - 1) # convert sigma to R^2's - all_star_shapes = np.array([ - starcat[hdu_no].data['E1_STAR_HSM'], - starcat[hdu_no].data['E2_STAR_HSM'], - 2. * starcat[hdu_no].data['SIGMA_STAR_HSM'] ** 2 - ]) - all_psf_shapes = np.array([ - starcat[hdu_no].data['E1_PSF_HSM'], - starcat[hdu_no].data['E2_PSF_HSM'], - 2. * starcat[hdu_no].data['SIGMA_PSF_HSM'] ** 2 - ]) - all_CCDs = starcat[hdu_no].data['CCD_NB'] - all_X = starcat[hdu_no].data['X'] - all_Y = starcat[hdu_no].data['Y'] + all_star_shapes = np.array( + [ + starcat[hdu_no].data["E1_STAR_HSM"], + starcat[hdu_no].data["E2_STAR_HSM"], + 2.0 * starcat[hdu_no].data["SIGMA_STAR_HSM"] ** 2, + ] + ) + all_psf_shapes = np.array( + [ + starcat[hdu_no].data["E1_PSF_HSM"], + starcat[hdu_no].data["E2_PSF_HSM"], + 2.0 * starcat[hdu_no].data["SIGMA_PSF_HSM"] ** 2, + ] + ) + all_CCDs = starcat[hdu_no].data["CCD_NB"] + all_X = starcat[hdu_no].data["X"] + all_Y = starcat[hdu_no].data["Y"] # Remove stars/PSFs where the measured size is zero # Sometimes the HSM shape measurement gives objects with measured # size equals to zero without an error Flag. - bad_stars = (abs(all_star_shapes[2, :]) < 0.1) - bad_psfs = (abs(all_psf_shapes[2, :]) < 0.1) + bad_stars = abs(all_star_shapes[2, :]) < 0.1 + bad_psfs = abs(all_psf_shapes[2, :]) < 0.1 size_mask = np.abs(bad_stars) * np.abs(bad_psfs) # Remove outlier stars/PSFs all_star_shapes = all_star_shapes[:, ~size_mask] @@ -304,8 +304,8 @@ def plot_meanshapes( # Remove stars/PSFs where the measured size is zero # Sometimes the HSM shape measurement gives objects with measured # size equals to zero without an error Flag. - bad_stars = (abs(all_star_shapes[2, :]) < 0.1) - bad_psfs = (abs(all_psf_shapes[2, :]) < 0.1) + bad_stars = abs(all_star_shapes[2, :]) < 0.1 + bad_psfs = abs(all_psf_shapes[2, :]) < 0.1 size_mask = np.abs(bad_stars) * np.abs(bad_psfs) # Remove outlier stars/PSFs all_star_shapes = all_star_shapes[:, ~size_mask] @@ -316,14 +316,13 @@ def plot_meanshapes( flagmask = flagmask[~size_mask] if remove_outliers: - shape_std_max = 5. + shape_std_max = 5.0 # Outlier rejection based on the size - R2_thresh = ( - shape_std_max * np.std(all_star_shapes[2, :]) - + np.mean(all_star_shapes[2, :]) + R2_thresh = shape_std_max * np.std(all_star_shapes[2, :]) + np.mean( + all_star_shapes[2, :] ) - bad_stars = (abs(all_star_shapes[2, :]) > R2_thresh) - w_log.info(f'Nb of outlier stars: {np.sum(bad_stars):d}') + bad_stars = abs(all_star_shapes[2, :]) > R2_thresh + w_log.info(f"Nb of outlier stars: {np.sum(bad_stars):d}") # Remove outlier PSFs all_star_shapes = all_star_shapes[:, ~bad_stars] all_psf_shapes = all_psf_shapes[:, ~bad_stars] @@ -351,17 +350,17 @@ def plot_meanshapes( for ccd_nb, ccd_map in enumerate(ccd_maps): # handle different input catalogue types - if psf_model_type == 'mccd': + if psf_model_type == "mccd": - ccd_mask = ( - ((all_CCDs.astype(int) == ccd_nb) * flagmask).astype(bool) + ccd_mask = ((all_CCDs.astype(int) == ccd_nb) * flagmask).astype( + bool ) # Calculate shift to go from global coordinates to local # coordinates x_shift, y_shift = loc2glob.shift_coord(ccd_nb) - elif psf_model_type == 'psfex': + elif psf_model_type == "psfex": ccd_mask = ((all_CCDs == str(ccd_nb)) * flagmask).astype(bool) @@ -370,14 +369,14 @@ def plot_meanshapes( else: - raise ValueError(f'Invalid psf model type {psf_model_type}') + raise ValueError(f"Invalid psf model type {psf_model_type}") star_shapes = all_star_shapes[:, ccd_mask] psf_shapes = all_psf_shapes[:, ccd_mask] xs_loc, ys_loc = all_X[ccd_mask] - x_shift, all_Y[ccd_mask] - y_shift - if psf_model_type == 'mccd': + if psf_model_type == "mccd": # swap axes to match CCD orientation and origin convention ys_loc = loc2glob.y_npix - ys_loc + 1 @@ -385,7 +384,7 @@ def plot_meanshapes( xbins = np.digitize(xs_loc, grid[0]) ybins = np.digitize(ys_loc, grid[1]) - if psf_model_type == 'psfex': + if psf_model_type == "psfex": xbins, ybins = megacam_flip(xbins, ybins, ccd_nb, nb_pixel) for xb in range(nb_pixel[0]): @@ -407,38 +406,32 @@ def plot_meanshapes( else: vmax = max( np.nanmax(ccd_maps[:, :, 0]), - np.abs(np.nanmin(ccd_maps[:, :, 0])) + np.abs(np.nanmin(ccd_maps[:, :, 0])), ) vmin = -vmax wind = [vmin, vmax] title = ( - f'e_1 (stars), std={np.nanstd(ccd_maps[:, 0, 0]):.5e}\n' - + f'vmax={np.nanmax(abs(ccd_maps[:, 0, 0])):.4e}' + f"e_1 (stars), std={np.nanstd(ccd_maps[:, 0, 0]):.5e}\n" + + f"vmax={np.nanmax(abs(ccd_maps[:, 0, 0])):.4e}" ) mean_shapes_plot( - ccd_maps[:, 0, 0], - output_path + 'e1s', - title, - wind=wind + ccd_maps[:, 0, 0], output_path + "e1s", title, wind=wind ) title = ( - f'e_1 (model), std={np.nanstd(ccd_maps[:, 1, 0]):.5e}\n' - + f'vmax={np.nanmax(abs(ccd_maps[:, 1, 0])):.4e}' + f"e_1 (model), std={np.nanstd(ccd_maps[:, 1, 0]):.5e}\n" + + f"vmax={np.nanmax(abs(ccd_maps[:, 1, 0])):.4e}" ) mean_shapes_plot( - ccd_maps[:, 1, 0], - output_path + 'e1m', - title, - wind=wind + ccd_maps[:, 1, 0], output_path + "e1m", title, wind=wind ) if auto_colorbar: wind = None e1_res = ccd_maps[:, 0, 0] - ccd_maps[:, 1, 0] e1_res = e1_res[~np.isnan(e1_res)] - rmse_e1 = np.sqrt(np.mean(e1_res ** 2)) - w_log.info(f'Bins: e1 residual RMSE: {rmse_e1:.6f}\n') + rmse_e1 = np.sqrt(np.mean(e1_res**2)) + w_log.info(f"Bins: e1 residual RMSE: {rmse_e1:.6f}\n") if max_de: vmax = max_de else: @@ -446,15 +439,15 @@ def plot_meanshapes( vmin = -vmax wind = [vmin, vmax] title = ( - f'e_1 res, rmse={rmse_e1:.5e}\nvmax={vmax:.4e} , ' - + f'std={np.nanstd(ccd_maps[:, 0, 0] - ccd_maps[:, 1, 0]):.5e}' + f"e_1 res, rmse={rmse_e1:.5e}\nvmax={vmax:.4e} , " + + f"std={np.nanstd(ccd_maps[:, 0, 0] - ccd_maps[:, 1, 0]):.5e}" ) mean_shapes_plot( ccd_maps[:, 0, 0] - ccd_maps[:, 1, 0], - output_path + 'e1res', + output_path + "e1res", title, wind=wind, - colorbar_ampl=colorbar_ampl + colorbar_ampl=colorbar_ampl, ) # e_2 @@ -463,39 +456,33 @@ def plot_meanshapes( else: vmax = max( np.nanmax(ccd_maps[:, :, 1]), - np.abs(np.nanmin(ccd_maps[:, :, 1])) + np.abs(np.nanmin(ccd_maps[:, :, 1])), ) vmin = -vmax wind = [vmin, vmax] title = ( - f'e_2 (stars), std={np.nanstd(ccd_maps[:, 0, 1]):.5e}\n' - + f'vmax={np.nanmax(abs(ccd_maps[:, 0, 1])):.4e}' + f"e_2 (stars), std={np.nanstd(ccd_maps[:, 0, 1]):.5e}\n" + + f"vmax={np.nanmax(abs(ccd_maps[:, 0, 1])):.4e}" ) mean_shapes_plot( - ccd_maps[:, 0, 1], - output_path + 'e2s', - title, - wind=wind + ccd_maps[:, 0, 1], output_path + "e2s", title, wind=wind ) title = ( - f'e_2 (model), std={np.nanstd(ccd_maps[:, 1, 1]):.5e}\n' - + f'vmax={np.nanmax(abs(ccd_maps[:, 1, 1])):.4e}' + f"e_2 (model), std={np.nanstd(ccd_maps[:, 1, 1]):.5e}\n" + + f"vmax={np.nanmax(abs(ccd_maps[:, 1, 1])):.4e}" ) mean_shapes_plot( - ccd_maps[:, 1, 1], - output_path + 'e2m', - title, - wind=wind + ccd_maps[:, 1, 1], output_path + "e2m", title, wind=wind ) if auto_colorbar: wind = None - colorbar_ampl = 1. + colorbar_ampl = 1.0 e2_res = ccd_maps[:, 0, 1] - ccd_maps[:, 1, 1] e2_res = e2_res[~np.isnan(e2_res)] - rmse_e2 = np.sqrt(np.mean(e2_res ** 2)) - w_log.info(f'Bins: e2 residual RMSE: {rmse_e2:.6f}\n') + rmse_e2 = np.sqrt(np.mean(e2_res**2)) + w_log.info(f"Bins: e2 residual RMSE: {rmse_e2:.6f}\n") if max_de: vmax = max_de else: @@ -503,15 +490,15 @@ def plot_meanshapes( vmin = -vmax wind = [vmin, vmax] title = ( - f'e_2 res, rmse={rmse_e2:.5e}\nvmax={vmax:.4e} , ' - + f'std={np.nanstd(ccd_maps[:, 0, 1] - ccd_maps[:, 1, 1]):.5e}' + f"e_2 res, rmse={rmse_e2:.5e}\nvmax={vmax:.4e} , " + + f"std={np.nanstd(ccd_maps[:, 0, 1] - ccd_maps[:, 1, 1]):.5e}" ) mean_shapes_plot( ccd_maps[:, 0, 1] - ccd_maps[:, 1, 1], - output_path + 'e2res', + output_path + "e2res", title, wind=wind, - colorbar_ampl=colorbar_ampl + colorbar_ampl=colorbar_ampl, ) # R^2 @@ -526,47 +513,48 @@ def plot_meanshapes( wind = [vmin, vmax] colorbar_ampl = 1 title = ( - f'R_2 (stars), std={np.nanstd(ccd_maps[:, 0, 2]):.5e}\n' - + f'vmax={np.nanmax(abs(ccd_maps[:, 0, 2])):.4e}' + f"R_2 (stars), std={np.nanstd(ccd_maps[:, 0, 2]):.5e}\n" + + f"vmax={np.nanmax(abs(ccd_maps[:, 0, 2])):.4e}" ) mean_shapes_plot( ccd_maps[:, 0, 2], - output_path + 'R2s', + output_path + "R2s", title, wind=wind, - cmap='Reds' + cmap="Reds", ) title = ( - f'R_2 (model), std={np.nanstd(ccd_maps[:, 1, 2]):.5e}\n' - + f'vmax={np.nanmax(abs(ccd_maps[:, 1, 2])):.4e}' + f"R_2 (model), std={np.nanstd(ccd_maps[:, 1, 2]):.5e}\n" + + f"vmax={np.nanmax(abs(ccd_maps[:, 1, 2])):.4e}" ) mean_shapes_plot( ccd_maps[:, 1, 2], - output_path + 'R2m', + output_path + "R2m", title, wind=wind, - cmap='Reds' + cmap="Reds", ) if auto_colorbar: wind = [ 0, - np.nanmax(np.abs( - (ccd_maps[:, 0, 2] - ccd_maps[:, 1, 2]) / ccd_maps[:, 0, 2] - )) + np.nanmax( + np.abs( + (ccd_maps[:, 0, 2] - ccd_maps[:, 1, 2]) + / ccd_maps[:, 0, 2] + ) + ), ] - colorbar_ampl = 1. + colorbar_ampl = 1.0 R2_res = (ccd_maps[:, 0, 2] - ccd_maps[:, 1, 2]) / ccd_maps[:, 0, 2] R2_res = R2_res[~np.isnan(R2_res)] - rmse_r2 = np.sqrt(np.mean(R2_res ** 2)) + rmse_r2 = np.sqrt(np.mean(R2_res**2)) w_log.info(f"Bins: R2 residual RMSE: {rmse_r2:.6f}\n") if max_dr2: vmax = max_dr2 else: vmax = np.nanmax( - abs( - (ccd_maps[:, 0, 2] - ccd_maps[:, 1, 2]) / ccd_maps[:, 0, 2] - ) + abs((ccd_maps[:, 0, 2] - ccd_maps[:, 1, 2]) / ccd_maps[:, 0, 2]) ) wind = [0, vmax] std_title = np.nanstd( @@ -580,26 +568,23 @@ def plot_meanshapes( title = "Outliers removed\n" + title mean_shapes_plot( - np.abs( - (ccd_maps[:, 0, 2] - ccd_maps[:, 1, 2]) - / ccd_maps[:, 0, 2] - ), - output_path + 'R2res', + np.abs((ccd_maps[:, 0, 2] - ccd_maps[:, 1, 2]) / ccd_maps[:, 0, 2]), + output_path + "R2res", title, wind=wind, colorbar_ampl=colorbar_ampl, - cmap='Reds' + cmap="Reds", ) # nstars wind = (0, np.max(ccd_maps[:, 0, 3])) - title = f'Number of stars\nTotal={np.nansum(ccd_maps[:, 0, 3]):.0f}' + title = f"Number of stars\nTotal={np.nansum(ccd_maps[:, 0, 3]):.0f}" mean_shapes_plot( ccd_maps[:, 0, 3], - f'{output_path}nstar', + f"{output_path}nstar", title, wind=wind, - cmap='magma' + cmap="magma", ) # Histograms @@ -610,19 +595,19 @@ def plot_meanshapes( all_star_shapes[0, :], bins=hist_bins, range=[-0.2, 0.2], - label='stars', - alpha=0.5 + label="stars", + alpha=0.5, ) plt.hist( all_psf_shapes[0, :], bins=hist_bins, range=[-0.2, 0.2], - label='PSFs', - alpha=0.5 + label="PSFs", + alpha=0.5, ) - plt.legend(loc='best', fontsize=16) - plt.title('e1', fontsize=24) - plt.savefig(f'{output_path}e1_hist.png') + plt.legend(loc="best", fontsize=16) + plt.title("e1", fontsize=24) + plt.savefig(f"{output_path}e1_hist.png") plt.close() plt.figure(figsize=(12, 6), dpi=300) @@ -631,12 +616,12 @@ def plot_meanshapes( data_hist, bins=hist_bins, range=[np.min(data_hist), np.max(data_hist)], - label='err(star - psf)', - alpha=0.5 + label="err(star - psf)", + alpha=0.5, ) - plt.legend(loc='best', fontsize=16) - plt.title('e1 err', fontsize=24) - plt.savefig(output_path + 'err_e1_hist.png') + plt.legend(loc="best", fontsize=16) + plt.title("e1 err", fontsize=24) + plt.savefig(output_path + "err_e1_hist.png") plt.close() plt.figure(figsize=(12, 6), dpi=300) @@ -644,19 +629,19 @@ def plot_meanshapes( all_star_shapes[1, :], bins=hist_bins, range=[-0.2, 0.2], - label='stars', - alpha=0.5 + label="stars", + alpha=0.5, ) plt.hist( all_psf_shapes[1, :], bins=hist_bins, range=[-0.2, 0.2], - label='PSFs', - alpha=0.5 + label="PSFs", + alpha=0.5, ) - plt.legend(loc='best', fontsize=16) - plt.title('e2', fontsize=24) - plt.savefig(output_path + 'e2_hist.png') + plt.legend(loc="best", fontsize=16) + plt.title("e2", fontsize=24) + plt.savefig(output_path + "e2_hist.png") plt.close() plt.figure(figsize=(12, 6), dpi=300) @@ -665,12 +650,12 @@ def plot_meanshapes( data_hist, bins=hist_bins, range=[np.min(data_hist), np.max(data_hist)], - label='err(star - psf)', - alpha=0.5 + label="err(star - psf)", + alpha=0.5, ) - plt.legend(loc='best', fontsize=16) - plt.title('e2 err', fontsize=24) - plt.savefig(output_path + 'err_e2_hist.png') + plt.legend(loc="best", fontsize=16) + plt.title("e2 err", fontsize=24) + plt.savefig(output_path + "err_e2_hist.png") plt.close() plt.figure(figsize=(12, 6), dpi=300) @@ -680,36 +665,35 @@ def plot_meanshapes( all_star_shapes[2, :], bins=hist_bins, range=wind, - label='stars', - alpha=0.5 + label="stars", + alpha=0.5, ) plt.hist( all_psf_shapes[2, :], bins=hist_bins, range=wind, - label='PSFs', - alpha=0.5 + label="PSFs", + alpha=0.5, ) - plt.legend(loc='best', fontsize=16) - plt.title('R2', fontsize=24) - plt.savefig(output_path + 'R2_hist.png') + plt.legend(loc="best", fontsize=16) + plt.title("R2", fontsize=24) + plt.savefig(output_path + "R2_hist.png") plt.close() plt.figure(figsize=(12, 6), dpi=300) data_hist = ( - (all_star_shapes[2, :] - all_psf_shapes[2, :]) - / all_star_shapes[2, :] - ) + all_star_shapes[2, :] - all_psf_shapes[2, :] + ) / all_star_shapes[2, :] plt.hist( data_hist, bins=hist_bins, range=[np.min(data_hist), np.max(data_hist)], - label='err(star - psf)/star', - alpha=0.5 + label="err(star - psf)/star", + alpha=0.5, ) - plt.legend(loc='best', fontsize=16) - plt.title('R2 err', fontsize=24) - plt.savefig(output_path + 'err_R2_hist.png') + plt.legend(loc="best", fontsize=16) + plt.title("R2 err", fontsize=24) + plt.savefig(output_path + "err_R2_hist.png") plt.close() starcat.close() @@ -720,15 +704,15 @@ def neg_dash( x_in, y_in, yerr_in, - plot_name='', + plot_name="", vertical_lines=True, - xlabel='', - ylabel='', - rho_nb='', + xlabel="", + ylabel="", + rho_nb="", ylim=None, semilogx=False, semilogy=False, - **kwargs + **kwargs, ): r"""Neg Dash. @@ -770,14 +754,19 @@ def neg_dash( # catch and separate errorbar-specific keywords from Lines2D ones safekwargs = dict(kwargs) errbkwargs = dict() - if 'linestyle' in kwargs.keys(): + if "linestyle" in kwargs.keys(): print( - 'Warning: linestyle was provided but that would kind of defeat' - + 'the purpose, so I will just ignore it. Sorry.' + "Warning: linestyle was provided but that would kind of defeat" + + "the purpose, so I will just ignore it. Sorry." ) - del safekwargs['linestyle'] + del safekwargs["linestyle"] for errorbar_kword in [ - 'fmt', 'ecolor', 'elinewidth', 'capsize', 'barsabove', 'errorevery' + "fmt", + "ecolor", + "elinewidth", + "capsize", + "barsabove", + "errorevery", ]: if errorbar_kword in kwargs.keys(): # posfmt = '-'+kwargs['fmt'] @@ -795,7 +784,7 @@ def neg_dash( x[:first_change], y[:first_change], yerr=yerr[:first_change], - linestyle='-', + linestyle="-", **errbkwargs, ) if vertical_lines: @@ -803,14 +792,14 @@ def neg_dash( x[first_change - 1], 0, y[first_change - 1], - linestyle='-', + linestyle="-", **safekwargs, ) plt.vlines( x[first_change], 0, np.abs(y[first_change]), - linestyle='--', + linestyle="--", **safekwargs, ) else: @@ -818,7 +807,7 @@ def neg_dash( x[:first_change], np.abs(y[:first_change]), yerr=yerr[:first_change], - linestyle='--', + linestyle="--", **errbkwargs, ) if vertical_lines: @@ -826,14 +815,14 @@ def neg_dash( x[first_change - 1], 0, np.abs(y[first_change - 1]), - linestyle='--', + linestyle="--", **safekwargs, ) plt.vlines( x[first_change], 0, y[first_change], - linestyle='-', + linestyle="-", **safekwargs, ) x = x[first_change:] @@ -843,18 +832,19 @@ def neg_dash( first_change = np.argmax(current_sign * y < 0) # one last time when `first_change'==0 ie no more changes: if rho_nb: - lab = fr'$\rho_{rho_nb}(\theta)$' + lab = rf"$\rho_{rho_nb}(\theta)$" else: - lab = '' + lab = "" if current_sign > 0: - plt.errorbar(x, y, yerr=yerr, linestyle='-', label=lab, **errbkwargs) + plt.errorbar(x, y, yerr=yerr, linestyle="-", label=lab, **errbkwargs) else: - plt.errorbar(x, np.abs(y), yerr=yerr, linestyle='--', label=lab, - **errbkwargs) + plt.errorbar( + x, np.abs(y), yerr=yerr, linestyle="--", label=lab, **errbkwargs + ) if semilogx: - plt.xscale('log') + plt.xscale("log") if semilogy: - plt.yscale('log') + plt.yscale("log") if ylim is not None: plt.ylim(ylim) plt.xlabel(xlabel) @@ -872,11 +862,7 @@ class new_BaseCorrelationFunctionSysTest(BaseCorrelationFunctionSysTest): """ def make_catalogue( - self, - data, - config=None, - use_as_k=None, - use_chip_coords=False + self, data, config=None, use_as_k=None, use_chip_coords=False ): """Make Catalogue. @@ -911,43 +897,45 @@ def make_catalogue( catalog_kwargs = {} fields = data.dtype.names - if 'ra' in fields and 'dec' in fields: + if "ra" in fields and "dec" in fields: if not use_chip_coords: - catalog_kwargs['ra'] = data['ra'] - catalog_kwargs['dec'] = data['dec'] - elif 'x' in fields and 'y' in fields: - catalog_kwargs['x'] = data['x'] - catalog_kwargs['y'] = data['y'] + catalog_kwargs["ra"] = data["ra"] + catalog_kwargs["dec"] = data["dec"] + elif "x" in fields and "y" in fields: + catalog_kwargs["x"] = data["x"] + catalog_kwargs["y"] = data["y"] else: raise ValueError( "Chip coordinates requested, but 'x' and 'y' fields" - "not found in data") - elif 'x' in fields and 'y' in fields: - catalog_kwargs['x'] = data['x'] - catalog_kwargs['y'] = data['y'] + "not found in data" + ) + elif "x" in fields and "y" in fields: + catalog_kwargs["x"] = data["x"] + catalog_kwargs["y"] = data["y"] else: raise ValueError( "Data must contain (ra,dec) or (x,y) in order to do" - "correlation function tests.") - if 'g1' in fields and 'g2' in fields: - catalog_kwargs['g1'] = data['g1'] - catalog_kwargs['g2'] = data['g2'] - if 'w' in fields: - catalog_kwargs['w'] = data['w'] + "correlation function tests." + ) + if "g1" in fields and "g2" in fields: + catalog_kwargs["g1"] = data["g1"] + catalog_kwargs["g2"] = data["g2"] + if "w" in fields: + catalog_kwargs["w"] = data["w"] if use_as_k: if use_as_k in fields: - catalog_kwargs['k'] = data[use_as_k] - elif 'k' in fields: - catalog_kwargs['k'] = data['k'] + catalog_kwargs["k"] = data[use_as_k] + elif "k" in fields: + catalog_kwargs["k"] = data["k"] # Quirk of length-1 formatted arrays: the fields will be floats, not # arrays, which would break the Catalog init. try: len(data) except Exception: - if not hasattr(data, 'len') and isinstance(data, np.ndarray): + if not hasattr(data, "len") and isinstance(data, np.ndarray): for key in catalog_kwargs: catalog_kwargs[key] = np.array([catalog_kwargs[key]]) - catalog_kwargs['config'] = config + catalog_kwargs["config"] = config return treecorr.Catalog(**catalog_kwargs) @@ -959,19 +947,13 @@ class Rho1SysTest(new_BaseCorrelationFunctionSysTest): """ - short_name = 'rho1' - long_name = 'Rho1 statistics (Auto-correlation of star-PSF shapes)' - objects_list = ['star PSF'] - required_quantities = [('ra', 'dec', 'g1', 'g2', 'psf_g1', 'psf_g2', 'w')] + short_name = "rho1" + long_name = "Rho1 statistics (Auto-correlation of star-PSF shapes)" + objects_list = ["star PSF"] + required_quantities = [("ra", "dec", "g1", "g2", "psf_g1", "psf_g2", "w")] def __call__( - self, - data, - data2=None, - random=None, - random2=None, - config=None, - **kwargs + self, data, data2=None, random=None, random2=None, config=None, **kwargs ): """Call Method. @@ -996,28 +978,28 @@ def __call__( """ new_data = data.copy() - new_data['g1'] = new_data['g1'] - new_data['psf_g1'] - new_data['g2'] = new_data['g2'] - new_data['psf_g2'] + new_data["g1"] = new_data["g1"] - new_data["psf_g1"] + new_data["g2"] = new_data["g2"] - new_data["psf_g2"] if data2 is not None: new_data2 = data2.copy() - new_data2['g1'] = new_data2['g1'] - new_data2['psf_g1'] - new_data2['g2'] = new_data2['g2'] - new_data2['psf_g2'] + new_data2["g1"] = new_data2["g1"] - new_data2["psf_g1"] + new_data2["g2"] = new_data2["g2"] - new_data2["psf_g2"] else: new_data2 = data2 if random is not None: new_random = random.copy() - new_random['g1'] = new_random['g1'] - new_random['psf_g1'] - new_random['g2'] = new_random['g2'] - new_random['psf_g2'] + new_random["g1"] = new_random["g1"] - new_random["psf_g1"] + new_random["g2"] = new_random["g2"] - new_random["psf_g2"] else: new_random = random if random2 is not None: new_random2 = random2.copy() - new_random2['g1'] = new_random2['g1'] - new_random2['psf_g1'] - new_random2['g2'] = new_random2['g2'] - new_random2['psf_g2'] + new_random2["g1"] = new_random2["g1"] - new_random2["psf_g1"] + new_random2["g2"] = new_random2["g2"] - new_random2["psf_g2"] else: new_random2 = random2 return self.getCF( - 'gg', + "gg", new_data, new_data2, new_random, @@ -1035,19 +1017,13 @@ class DESRho2SysTest(new_BaseCorrelationFunctionSysTest): """ - short_name = 'rho2des' - long_name = 'Rho2 statistics (as defined in DES shape catalogue papers)' - objects_list = ['star PSF'] - required_quantities = [('ra', 'dec', 'g1', 'g2', 'psf_g1', 'psf_g2', 'w')] + short_name = "rho2des" + long_name = "Rho2 statistics (as defined in DES shape catalogue papers)" + objects_list = ["star PSF"] + required_quantities = [("ra", "dec", "g1", "g2", "psf_g1", "psf_g2", "w")] def __call__( - self, - data, - data2=None, - random=None, - random2=None, - config=None, - **kwargs + self, data, data2=None, random=None, random2=None, config=None, **kwargs ): """Call Method. @@ -1072,31 +1048,31 @@ def __call__( """ new_data = np.rec.fromarrays( - [data['ra'], data['dec'], data['g1'], data['g2'], data['w']], - names=['ra', 'dec', 'g1', 'g2', 'w'], + [data["ra"], data["dec"], data["g1"], data["g2"], data["w"]], + names=["ra", "dec", "g1", "g2", "w"], ) if data2 is None: data2 = data new_data2 = np.rec.fromarrays( [ - data2['ra'], - data2['dec'], - data2['g1'] - data2['psf_g1'], - data2['g2'] - data2['psf_g2'], - data2['w'] + data2["ra"], + data2["dec"], + data2["g1"] - data2["psf_g1"], + data2["g2"] - data2["psf_g2"], + data2["w"], ], - names=['ra', 'dec', 'g1', 'g2', 'w'], + names=["ra", "dec", "g1", "g2", "w"], ) if random is not None: new_random = np.rec.fromarrays( [ - random['ra'], - random['dec'], - random['g1'], - random['g2'], - random['w'] + random["ra"], + random["dec"], + random["g1"], + random["g2"], + random["w"], ], - names=['ra', 'dec', 'g1', 'g2', 'w'], + names=["ra", "dec", "g1", "g2", "w"], ) else: @@ -1106,24 +1082,24 @@ def __call__( if random2 is not None: new_random2 = np.rec.fromarrays( [ - data2['ra'], - data2['dec'], - data2['g1'] - data2['psf_g1'], - data2['g2'] - data2['psf_g2'], - data2['w'] + data2["ra"], + data2["dec"], + data2["g1"] - data2["psf_g1"], + data2["g2"] - data2["psf_g2"], + data2["w"], ], - names=['ra', 'dec', 'g1', 'g2', 'w'], + names=["ra", "dec", "g1", "g2", "w"], ) else: new_random2 = random2 return self.getCF( - 'gg', + "gg", new_data, new_data2, new_random, new_random2, config=config, - **kwargs + **kwargs, ) @@ -1134,24 +1110,16 @@ class DESRho3SysTest(new_BaseCorrelationFunctionSysTest): """ - short_name = 'rho3' + short_name = "rho3" long_name = ( - 'Rho3 statistics (Auto-correlation of star shapes weighted by ' - + 'the residual size)' + "Rho3 statistics (Auto-correlation of star shapes weighted by " + + "the residual size)" ) - objects_list = ['star PSF'] - required_quantities = [ - ('ra', 'dec', 'sigma', 'g1', 'g2', 'psf_sigma', 'w') - ] + objects_list = ["star PSF"] + required_quantities = [("ra", "dec", "sigma", "g1", "g2", "psf_sigma", "w")] def __call__( - self, - data, - data2=None, - random=None, - random2=None, - config=None, - **kwargs + self, data, data2=None, random=None, random2=None, config=None, **kwargs ): """Call Method. @@ -1176,24 +1144,33 @@ def __call__( """ new_data = np.rec.fromarrays( - [data['ra'], data['dec'], - data['g1'] * (data['sigma'] - data[ - 'psf_sigma']) / data['sigma'], - data['g2'] * (data['sigma'] - data[ - 'psf_sigma']) / data['sigma'], - data['w']], - names=['ra', 'dec', 'g1', 'g2', 'w'] + [ + data["ra"], + data["dec"], + data["g1"] + * (data["sigma"] - data["psf_sigma"]) + / data["sigma"], + data["g2"] + * (data["sigma"] - data["psf_sigma"]) + / data["sigma"], + data["w"], + ], + names=["ra", "dec", "g1", "g2", "w"], ) if data2 is not None: new_data2 = np.rec.fromarrays( [ - data2['ra'], data2['dec'], - data2['g1'] * (data2['sigma'] - data2['psf_sigma']) - / data2['sigma'], - data2['g2'] * (data2['sigma'] - data2['psf_sigma']) - / data2['sigma'], - data2['w']], - names=['ra', 'dec', 'g1', 'g2', 'w'] + data2["ra"], + data2["dec"], + data2["g1"] + * (data2["sigma"] - data2["psf_sigma"]) + / data2["sigma"], + data2["g2"] + * (data2["sigma"] - data2["psf_sigma"]) + / data2["sigma"], + data2["w"], + ], + names=["ra", "dec", "g1", "g2", "w"], ) else: @@ -1201,14 +1178,17 @@ def __call__( if random is not None: new_random = np.rec.fromarrays( [ - random['ra'], random['dec'], - random['g1'] * (random['sigma'] - random['psf_sigma']) - / random['sigma'], - random['g2'] * (random['sigma'] - random['psf_sigma']) - / random['sigma'], - random['w'] + random["ra"], + random["dec"], + random["g1"] + * (random["sigma"] - random["psf_sigma"]) + / random["sigma"], + random["g2"] + * (random["sigma"] - random["psf_sigma"]) + / random["sigma"], + random["w"], ], - names=['ra', 'dec', 'g1', 'g2', 'w'] + names=["ra", "dec", "g1", "g2", "w"], ) else: new_random = random @@ -1216,27 +1196,30 @@ def __call__( if random2 is not None: new_random2 = np.rec.fromarrays( [ - random2['ra'], random2['dec'], - random2['g1'] * (random2['sigma'] - random2['psf_sigma']) - / random2['sigma'], - random2['g2'] * (random2['sigma'] - random2['psf_sigma']) - / random2['sigma'], - random2['w'] + random2["ra"], + random2["dec"], + random2["g1"] + * (random2["sigma"] - random2["psf_sigma"]) + / random2["sigma"], + random2["g2"] + * (random2["sigma"] - random2["psf_sigma"]) + / random2["sigma"], + random2["w"], ], - names=['ra', 'dec', 'g1', 'g2', 'w'] + names=["ra", "dec", "g1", "g2", "w"], ) else: new_random2 = random2 return self.getCF( - 'gg', + "gg", new_data, new_data2, new_random, new_random2, config=config, - **kwargs + **kwargs, ) @@ -1247,24 +1230,18 @@ class DESRho4SysTest(new_BaseCorrelationFunctionSysTest): """ - short_name = 'rho4' + short_name = "rho4" long_name = ( - 'Rho4 statistics (Correlation of residual star shapes weighted ' - + 'by residual size)' + "Rho4 statistics (Correlation of residual star shapes weighted " + + "by residual size)" ) - objects_list = ['star PSF'] - required_quantities = [( - 'ra', 'dec', 'g1', 'g2', 'sigma', 'psf_g1', 'psf_g2', 'psf_sigma', 'w' - )] + objects_list = ["star PSF"] + required_quantities = [ + ("ra", "dec", "g1", "g2", "sigma", "psf_g1", "psf_g2", "psf_sigma", "w") + ] def __call__( - self, - data, - data2=None, - random=None, - random2=None, - config=None, - **kwargs + self, data, data2=None, random=None, random2=None, config=None, **kwargs ): """Call Method. @@ -1290,38 +1267,40 @@ def __call__( """ new_data = np.rec.fromarrays( [ - data['ra'], - data['dec'], - data['g1'] - data['psf_g1'], - data['g2'] - data['psf_g2'], - data['w'] + data["ra"], + data["dec"], + data["g1"] - data["psf_g1"], + data["g2"] - data["psf_g2"], + data["w"], ], - names=['ra', 'dec', 'g1', 'g2', 'w'], + names=["ra", "dec", "g1", "g2", "w"], ) if data2 is None: data2 = data new_data2 = np.rec.fromarrays( [ - data2['ra'], - data2['dec'], - data2['g1'] * (data2['sigma'] - data2['psf_sigma']) - / data2['sigma'], - data2['g2'] * (data2['sigma'] - data2['psf_sigma']) - / data2['sigma'], - data2['w'] + data2["ra"], + data2["dec"], + data2["g1"] + * (data2["sigma"] - data2["psf_sigma"]) + / data2["sigma"], + data2["g2"] + * (data2["sigma"] - data2["psf_sigma"]) + / data2["sigma"], + data2["w"], ], - names=['ra', 'dec', 'g1', 'g2', 'w'], + names=["ra", "dec", "g1", "g2", "w"], ) if random is not None: new_random = np.rec.fromarrays( [ - random['ra'], - random['dec'], - random['g1'] - random['psf_g1'], - random['g2'] - random['psf_g2'], - random['w'] + random["ra"], + random["dec"], + random["g1"] - random["psf_g1"], + random["g2"] - random["psf_g2"], + random["w"], ], - names=['ra', 'dec', 'g1', 'g2', 'w'], + names=["ra", "dec", "g1", "g2", "w"], ) else: new_random = random @@ -1330,25 +1309,28 @@ def __call__( if random2 is not None: new_random2 = np.rec.fromarrays( [ - random2['ra'], random2['dec'], - random2['g1'] * (random2['sigma'] - random2['psf_sigma']) - / random2['sigma'], - random2['g2'] * (random2['sigma'] - random2['psf_sigma']) - / random2['sigma'], - random2['w'] + random2["ra"], + random2["dec"], + random2["g1"] + * (random2["sigma"] - random2["psf_sigma"]) + / random2["sigma"], + random2["g2"] + * (random2["sigma"] - random2["psf_sigma"]) + / random2["sigma"], + random2["w"], ], - names=['ra', 'dec', 'g1', 'g2', 'w'] + names=["ra", "dec", "g1", "g2", "w"], ) else: new_random2 = random2 return self.getCF( - 'gg', + "gg", new_data, new_data2, new_random, new_random2, config=config, - **kwargs + **kwargs, ) @@ -1359,24 +1341,16 @@ class DESRho5SysTest(new_BaseCorrelationFunctionSysTest): """ - short_name = 'rho5' + short_name = "rho5" long_name = ( - 'Rho5 statistics (Correlation of star and PSF shapes weighted by ' - 'residual size)' + "Rho5 statistics (Correlation of star and PSF shapes weighted by " + "residual size)" ) - objects_list = ['star PSF'] - required_quantities = [ - ('ra', 'dec', 'sigma', 'g1', 'g2', 'psf_sigma', 'w') - ] + objects_list = ["star PSF"] + required_quantities = [("ra", "dec", "sigma", "g1", "g2", "psf_sigma", "w")] def __call__( - self, - data, - data2=None, - random=None, - random2=None, - config=None, - **kwargs + self, data, data2=None, random=None, random2=None, config=None, **kwargs ): """Call Method. @@ -1402,34 +1376,36 @@ def __call__( """ new_data = np.rec.fromarrays( - [data['ra'], data['dec'], data['g1'], data['g2'], data['w']], - names=['ra', 'dec', 'g1', 'g2', 'w'], + [data["ra"], data["dec"], data["g1"], data["g2"], data["w"]], + names=["ra", "dec", "g1", "g2", "w"], ) if data2 is None: data2 = data new_data2 = np.rec.fromarrays( [ - data2['ra'], - data2['dec'], - data2['g1'] * (data2['sigma'] - data2['psf_sigma']) - / data2['sigma'], - data2['g2'] * (data2['sigma'] - data2['psf_sigma']) - / data2['sigma'], - data2['w'] + data2["ra"], + data2["dec"], + data2["g1"] + * (data2["sigma"] - data2["psf_sigma"]) + / data2["sigma"], + data2["g2"] + * (data2["sigma"] - data2["psf_sigma"]) + / data2["sigma"], + data2["w"], ], - names=['ra', 'dec', 'g1', 'g2', 'w'], + names=["ra", "dec", "g1", "g2", "w"], ) if random is not None: new_random = np.rec.fromarrays( [ - random['ra'], - random['dec'], - random['g1'], - random['g2'], - random['w'] + random["ra"], + random["dec"], + random["g1"], + random["g2"], + random["w"], ], - names=['ra', 'dec', 'g1', 'g2', 'w'], + names=["ra", "dec", "g1", "g2", "w"], ) else: new_random = random @@ -1438,38 +1414,64 @@ def __call__( if random2 is not None: new_random2 = np.rec.fromarrays( [ - random2['ra'], - random2['dec'], - random2['g1'] * (random2['sigma'] - random2['psf_sigma']) - / random2['sigma'], - random2['g2'] * (random2['sigma'] - random2['psf_sigma']) - / random2['sigma'], - random2['w'] + random2["ra"], + random2["dec"], + random2["g1"] + * (random2["sigma"] - random2["psf_sigma"]) + / random2["sigma"], + random2["g2"] + * (random2["sigma"] - random2["psf_sigma"]) + / random2["sigma"], + random2["w"], ], - names=['ra', 'dec', 'g1', 'g2', 'w'], + names=["ra", "dec", "g1", "g2", "w"], ) else: new_random2 = random2 return self.getCF( - 'gg', + "gg", new_data, new_data2, new_random, new_random2, config=config, - **kwargs + **kwargs, ) +def get_params_rho(): + + params = {} + + params["patch_number"] = 50 + + params["ra_col"] = "RA" + params["dec_col"] = "DEC" + params["e1_PSF_col"] = "E1_PSF_HSM" + params["e2_PSF_col"] = "E2_PSF_HSM" + params["e1_star_col"] = "E1_STAR_HSM" + params["e2_star_col"] = "E2_STAR_HSM" + params["PSF_size"] = "SIGMA_PSF_HSM" + params["star_size"] = "SIGMA_STAR_HSM" + params["PSF_flag"] = "FLAG_PSF_HSM" + params["star_flag"] = "FLAG_STAR_HSM" + params["ra_units"] = "deg" + params["dec_units"] = "deg" + + params["w_col"] = None + + return params + + def rho_stats( starcat_path, output_path, - rho_def='HSC', + rho_def="HSC", hdu_no=2, ylim_l=None, ylim_r=None, - print_fun=lambda x: print(x) + print_fun=lambda x: print(x), ): """Rho Statistics. @@ -1491,58 +1493,57 @@ def rho_stats( Output message function; default is ``print`` """ - # Read starcat - starcat = fits.open(starcat_path, memmap=False) - - rho_stats_fun = None - - # Convert HSM flags to 0/1 weights - star_flags = starcat[hdu_no].data['FLAG_STAR_HSM'] - psf_flags = starcat[hdu_no].data['FLAG_PSF_HSM'] - w = np.abs(star_flags - 1) * np.abs(psf_flags - 1) - - # Convert to Stile-compatible and change sigmas to R^2 (up to constant) - stilecat = np.rec.fromarrays( - [ - w, - starcat[hdu_no].data['RA'], - starcat[hdu_no].data['DEC'], - starcat[hdu_no].data['E1_STAR_HSM'], - starcat[hdu_no].data['E2_STAR_HSM'], - starcat[hdu_no].data['SIGMA_STAR_HSM'] ** 2, - starcat[hdu_no].data['E1_PSF_HSM'], - starcat[hdu_no].data['E2_PSF_HSM'], - starcat[hdu_no].data['SIGMA_PSF_HSM'] ** 2 - ], - names=[ - 'w', - 'ra', - 'dec', - 'g1', - 'g2', - 'sigma', - 'psf_g1', - 'psf_g2', - 'psf_sigma' - ], - ) + if rho_def != "UNIONS": + # Read starcat + starcat = fits.open(starcat_path, memmap=False) + rho_stats_fun = None + # Convert HSM flags to 0/1 weights + star_flags = starcat[hdu_no].data["FLAG_STAR_HSM"] + psf_flags = starcat[hdu_no].data["FLAG_PSF_HSM"] + w = np.abs(star_flags - 1) * np.abs(psf_flags - 1) + + # Convert to Stile-compatible and change sigmas to R^2 (up to constant) + stilecat = np.rec.fromarrays( + [ + w, + starcat[hdu_no].data["RA"], + starcat[hdu_no].data["DEC"], + starcat[hdu_no].data["E1_STAR_HSM"], + starcat[hdu_no].data["E2_STAR_HSM"], + starcat[hdu_no].data["SIGMA_STAR_HSM"] ** 2, + starcat[hdu_no].data["E1_PSF_HSM"], + starcat[hdu_no].data["E2_PSF_HSM"], + starcat[hdu_no].data["SIGMA_PSF_HSM"] ** 2, + ], + names=[ + "w", + "ra", + "dec", + "g1", + "g2", + "sigma", + "psf_g1", + "psf_g2", + "psf_sigma", + ], + ) # TreeCorr config: TreeCorrConfig = { - 'ra_units': 'degrees', - 'dec_units': 'degrees', - 'max_sep': 3e2, - 'min_sep': 5e-1, - 'sep_units': 'arcmin', - 'nbins': 32 + "ra_units": "degrees", + "dec_units": "degrees", + "max_sep": 3e2, + "min_sep": 5e-1, + "sep_units": "arcmin", + "nbins": 32, } # Ininitialize all 5 rho stats - if rho_def == 'HSC': + if rho_def == "HSC": rho_stats_fun = [ - stile.CorrelationFunctionSysTest(f'Rho{j}') for j in range(1, 6) + stile.CorrelationFunctionSysTest(f"Rho{j}") for j in range(1, 6) ] - elif rho_def == 'DES': + elif rho_def == "DES": rho_stats_fun = [ Rho1SysTest(), DESRho2SysTest(), @@ -1550,36 +1551,79 @@ def rho_stats( DESRho4SysTest(), DESRho5SysTest(), ] + elif rho_def == "UNIONS": + rho_stat_handler = RhoStat( + output=output_path, + treecorr_config=TreeCorrConfig, + verbose=False, + ) + + # Set parameters + params = get_params_rho() + rho_stat_handler.catalogs.set_params(params, output_path) + + # Build catalogues + mask = True + square_size = True + ver = "id" + out_base = f"rho_stats_{ver}.fits" + # TODO: deal with flags + rho_stat_handler.build_cat_to_compute_rho( + starcat_path, + catalog_id=ver, + square_size=square_size, + mask=mask, + hdu=hdu_no, + ) + + # Compute and save rho stats + def only_p(corrs): + return np.array([corr.xip for corr in corrs]).flatten() + + rho_stat_handler.compute_rho_stats( + ver, out_base, save_cov=True, func=only_p, var_method="bootstrap" + ) + + rho_stat_handler.plot_rho_stats( + [out_base], + ["b"], + [ver], + abs=False, + savefig="rho_stats.png", + legend="outside", + ) + + if rho_def == "UNIONS": + return for rho in rho_stats_fun: print_fun(rho.required_quantities) # Compute them! - print_fun(' > Computing rho statistics...') + print_fun(" > Computing rho statistics...") start = time.time() rho_results = [ - rho_stat(stilecat, config=TreeCorrConfig) - for rho_stat in rho_stats_fun + rho_stat(stilecat, config=TreeCorrConfig) for rho_stat in rho_stats_fun ] - print_fun(f' > Done in {time.time() - start}s.') - np.save(output_path + 'rho_stat_results.npy', np.array(rho_results)) + print_fun(f" > Done in {time.time() - start}s.") + np.save(output_path + "rho_stat_results.npy", np.array(rho_results)) # Plots ylims = [ylim_l, ylim_r, ylim_l, ylim_l, ylim_r] - colors = ['blue', 'red', 'green', 'orange', 'cyan'] - markers = ['o', 'd', 'v', '^', 's'] + colors = ["blue", "red", "green", "orange", "cyan"] + markers = ["o", "d", "v", "^", "s"] - xlabel = r'$\theta$ [arcmin]' - ylabel = r'$\rho$-statistics' + xlabel = r"$\theta$ [arcmin]" + ylabel = r"$\rho$-statistics" capsize = 3 alpha = 0.7 for j, rhores in enumerate(rho_results): neg_dash( - rhores['meanr'], - rhores['xip'], - rhores['sigma_xip'], - f'{output_path}/rho_{j+1}.png', + rhores["meanr"], + rhores["xip"], + rhores["sigma_xip"], + f"{output_path}/rho_{j+1}.png", semilogx=True, semilogy=True, color=colors[j], @@ -1588,15 +1632,15 @@ def rho_stats( alpha=alpha, ylim=ylims[j], xlabel=xlabel, - ylabel=ylabel + ylabel=ylabel, ) for j, rhores in enumerate(rho_results): if j in [0, 2, 3]: neg_dash( - rhores['meanr'], - rhores['xip'], - rhores['sigma_xip'], + rhores["meanr"], + rhores["xip"], + rhores["sigma_xip"], semilogx=True, semilogy=True, rho_nb=j + 1, @@ -1606,18 +1650,18 @@ def rho_stats( alpha=alpha, ylim=ylims[j], xlabel=xlabel, - ylabel=ylabel + ylabel=ylabel, ) plt.legend() - plt.savefig(f'{output_path}/lefthand_rhos.pdf') + plt.savefig(f"{output_path}/lefthand_rhos.pdf") plt.close() for j, rhores in enumerate(rho_results): if j in [1, 4]: neg_dash( - rhores['meanr'], - rhores['xip'], - rhores['sigma_xip'], + rhores["meanr"], + rhores["xip"], + rhores["sigma_xip"], semilogx=True, semilogy=True, rho_nb=j + 1, @@ -1627,10 +1671,10 @@ def rho_stats( alpha=alpha, ylim=ylims[j], xlabel=xlabel, - ylabel=ylabel + ylabel=ylabel, ) plt.legend() - plt.savefig(f'{output_path}/righthand_rhos.pdf') + plt.savefig(f"{output_path}/righthand_rhos.pdf") plt.close() starcat.close() diff --git a/shapepipe/modules/mccd_package/shapepipe_auxiliary_mccd.py b/shapepipe/modules/mccd_package/shapepipe_auxiliary_mccd.py index 1877719fa..44b7cf55b 100644 --- a/shapepipe/modules/mccd_package/shapepipe_auxiliary_mccd.py +++ b/shapepipe/modules/mccd_package/shapepipe_auxiliary_mccd.py @@ -17,7 +17,7 @@ from shapepipe.pipeline import file_io -NOT_ENOUGH_STARS = 'Not enough stars to train the model.' +NOT_ENOUGH_STARS = "Not enough stars to train the model." def mccd_preprocessing_pipeline( @@ -25,14 +25,14 @@ def mccd_preprocessing_pipeline( output_path, input_file_position=0, min_n_stars=20, - separator='-', + separator="-", CCD_id_filter_list=None, - outlier_std_max=100., + outlier_std_max=100.0, save_masks=True, - save_name='train_star_selection', - save_extension='.fits', + save_name="train_star_selection", + save_extension=".fits", verbose=True, - print_fun=None + print_fun=None, ): r"""Preprocess Input Catalogue. @@ -86,38 +86,55 @@ def mccd_preprocessing_pipeline( if verbose: if print_fun is None: + def print_fun(x): print(x) + else: + def print_fun(x): pass - print_fun('Processing dataset..') + print_fun("Processing dataset..") mccd_inputs = mccd.mccd_utils.MccdInputs(separator=separator) catalog_ids = mccd_inputs.proprocess_pipeline_data( - input_file_list, - element_position=input_file_position + input_file_list, element_position=input_file_position ) # Loop over the catalogs for it in range(catalog_ids.shape[0]): # For each observation position catalog_id = catalog_ids[it] - star_list, pos_list, mask_list, ccd_list, SNR_list, RA_list, \ - DEC_list = mccd_inputs.get_inputs(catalog_id) - - star_list, pos_list, mask_list, ccd_list, SNR_list, RA_list, \ - DEC_list, _ = mccd_inputs.outlier_rejection( - star_list, - pos_list, - mask_list, - ccd_list, - SNR_list, - RA_list, - DEC_list, - shape_std_max=outlier_std_max, - print_fun=print_fun - ) + ( + star_list, + pos_list, + mask_list, + ccd_list, + SNR_list, + RA_list, + DEC_list, + ) = mccd_inputs.get_inputs(catalog_id) + + ( + star_list, + pos_list, + mask_list, + ccd_list, + SNR_list, + RA_list, + DEC_list, + _, + ) = mccd_inputs.outlier_rejection( + star_list, + pos_list, + mask_list, + ccd_list, + SNR_list, + RA_list, + DEC_list, + shape_std_max=outlier_std_max, + print_fun=print_fun, + ) mccd_star_list = [] mccd_pos_list = [] @@ -163,13 +180,15 @@ def print_fun(x): # Concatenate, as fits can't handle list of numpy arrays and # turn into reg format mccd_stars = mccd.utils.reg_format( - np.concatenate(mccd_star_list, axis=2)) + np.concatenate(mccd_star_list, axis=2) + ) mccd_poss = np.concatenate(mccd_pos_list, axis=0) mccd_ccds = np.concatenate(mccd_ccd_list, axis=0) if save_masks is True: mccd_masks = mccd.utils.reg_format( - np.concatenate(mccd_mask_list, axis=2)) + np.concatenate(mccd_mask_list, axis=2) + ) else: # Send an array of False (None cannot be used in .fits) mccd_masks = np.zeros((mccd_poss.shape[0]), dtype=bool) @@ -191,20 +210,25 @@ def print_fun(x): # Save the fits file train_dic = { - 'VIGNET_LIST': mccd_stars, - 'GLOB_POSITION_IMG_LIST': mccd_poss, - 'MASK_LIST': mccd_masks, - 'CCD_ID_LIST': mccd_ccds, - 'SNR_WIN_LIST': mccd_SNRs, - 'RA_LIST': mccd_RAs, - 'DEC_LIST': mccd_DECs + "VIGNET_LIST": mccd_stars, + "GLOB_POSITION_IMG_LIST": mccd_poss, + "MASK_LIST": mccd_masks, + "CCD_ID_LIST": mccd_ccds, + "SNR_WIN_LIST": mccd_SNRs, + "RA_LIST": mccd_RAs, + "DEC_LIST": mccd_DECs, } - saving_path = output_path + save_name + separator \ - + catalog_id + save_extension + saving_path = ( + output_path + + save_name + + separator + + catalog_id + + save_extension + ) mccd.mccd_utils.save_to_fits(train_dic, saving_path) - print_fun('Finished the training dataset processing.') + print_fun("Finished the training dataset processing.") print_fun(f"Total stars processed = {mccd_star_nb:d}") return mccd_inputs @@ -216,8 +240,8 @@ def mccd_fit_pipeline( mccd_parser, output_dir, verbose, - saving_name='fitted_model', - w_log=None + saving_name="fitted_model", + w_log=None, ): r"""Fit MCCD Model. @@ -244,20 +268,20 @@ def mccd_fit_pipeline( # Extract the MCCD parameters from the parser mccd_inst_kw = mccd_parser.get_instance_kw() mccd_fit_kw = mccd_parser.get_fit_kw() - use_SNR_weight = mccd_parser.get_extra_kw('use_SNR_weight') + use_SNR_weight = mccd_parser.get_extra_kw("use_SNR_weight") # Print the model configuration so that it is saved in log files - w_log.info('MCCD configuration parameters:') - w_log.info('[INPUTS]') - inputs_dict_str = pprint.pformat({'use_SNR_weight': use_SNR_weight}) + w_log.info("MCCD configuration parameters:") + w_log.info("[INPUTS]") + inputs_dict_str = pprint.pformat({"use_SNR_weight": use_SNR_weight}) w_log.info(inputs_dict_str) - w_log.info('[INSTANCE]') + w_log.info("[INSTANCE]") inst_dict_str = pprint.pformat(mccd_inst_kw) w_log.info(inst_dict_str) - w_log.info('[FIT]') + w_log.info("[FIT]") fit_dict_str = pprint.pformat(mccd_fit_kw) w_log.info(fit_dict_str) - w_log.info('End of MCCD configuration parameters.') + w_log.info("End of MCCD configuration parameters.") # Open fits file starcat = fits.open(trainstar_path, memmap=False) @@ -271,7 +295,7 @@ def mccd_fit_pipeline( sex_thresh=-1e5, use_SNR_weight=use_SNR_weight, verbose=verbose, - saving_name=saving_name + saving_name=saving_name, ) starcat.close() @@ -284,7 +308,7 @@ def mccd_validation_pipeline( output_dir, file_number_string, w_log, - val_saving_name + val_saving_name, ): r"""Validate MCCD Pipeline. @@ -311,7 +335,7 @@ def mccd_validation_pipeline( w_log.info(f"Validating catalogue {file_number_string}..") # Get MCCD parameters - save_extension = '.fits' + save_extension = ".fits" mccd_val_kw = mccd_parser.get_val_kw() testcat = fits.open(teststar_path, memmap=False) @@ -322,13 +346,14 @@ def mccd_validation_pipeline( mccd_model_path=mccd_model_path, testcat=testcat[1], **mccd_val_kw, - sex_thresh=-1e5 + sex_thresh=-1e5, ) testcat.close() - val_saving_path = output_dir + val_saving_name + \ - file_number_string + save_extension + val_saving_path = ( + output_dir + val_saving_name + file_number_string + save_extension + ) # Save validation dictionary to fits file mccd.mccd_utils.save_to_fits(val_dict, val_saving_path) @@ -343,12 +368,7 @@ def mccd_validation_pipeline( def mccd_interpolation_pipeline( - mccd_model_path, - galcat_path, - pos_params, - ccd_id, - saving_path, - get_shapes + mccd_model_path, galcat_path, pos_params, ccd_id, saving_path, get_shapes ): r"""Interpolate the MCCD Model. @@ -395,22 +415,24 @@ def mccd_interpolation_pipeline( for psf in interp_PSFs ] - PSF_shapes = np.array([ + PSF_shapes = np.array( [ - moms.observed_shape.g1, - moms.observed_shape.g2, - moms.moments_sigma, - int(bool(moms.error_message)) + [ + moms.observed_shape.g1, + moms.observed_shape.g2, + moms.moments_sigma, + int(bool(moms.error_message)), + ] + for moms in PSF_moms ] - for moms in PSF_moms - ]) + ) shapepipe_write_output( saving_path=saving_path, example_fits_path=galcat_path, get_shapes=get_shapes, interp_PSFs=interp_PSFs, - PSF_shapes=PSF_shapes + PSF_shapes=PSF_shapes, ) return None @@ -419,11 +441,7 @@ def mccd_interpolation_pipeline( def shapepipe_write_output( - saving_path, - example_fits_path, - get_shapes, - interp_PSFs, - PSF_shapes=None + saving_path, example_fits_path, get_shapes, interp_PSFs, PSF_shapes=None ): r"""Write ShapePipe Output. @@ -447,18 +465,18 @@ def shapepipe_write_output( output = file_io.FITSCatalogue( saving_path, open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite, - SEx_catalogue=True + SEx_catalogue=True, ) if get_shapes: data = { - 'VIGNET': interp_PSFs, - 'E1_PSF_HSM': PSF_shapes[:, 0], - 'E2_PSF_HSM': PSF_shapes[:, 1], - 'SIGMA_PSF_HSM': PSF_shapes[:, 2], - 'FLAG_PSF_HSM': PSF_shapes[:, 3].astype(int) + "VIGNET": interp_PSFs, + "E1_PSF_HSM": PSF_shapes[:, 0], + "E2_PSF_HSM": PSF_shapes[:, 1], + "SIGMA_PSF_HSM": PSF_shapes[:, 2], + "FLAG_PSF_HSM": PSF_shapes[:, 3].astype(int), } else: - data = {'VIGNET': interp_PSFs} + data = {"VIGNET": interp_PSFs} output.save_as_fits(data, sex_cat_path=example_fits_path) diff --git a/shapepipe/modules/mccd_plots_runner.py b/shapepipe/modules/mccd_plots_runner.py index 1c80505b7..9c23537d3 100644 --- a/shapepipe/modules/mccd_plots_runner.py +++ b/shapepipe/modules/mccd_plots_runner.py @@ -19,6 +19,7 @@ import stile import stile.stile_utils from stile.sys_tests import BaseCorrelationFunctionSysTest + has_stile = True except ImportError: @@ -27,6 +28,7 @@ try: import treecorr from treecorr.corr2 import corr2_valid_params + has_treecorr = True except ImportError: @@ -37,7 +39,7 @@ import matplotlib.pyplot as plt # Define the backend for matplotlib - mpl.use('agg') + mpl.use("agg") has_mpl = True except ImportError: @@ -45,13 +47,13 @@ @module_runner( - version='1.1', - input_module=['merge_starcat_runner'], - file_pattern=['full_starcat'], - file_ext=['.fits'], - numbering_scheme='-0000000', - depends=['numpy', 'mccd', 'astropy', 'matplotlib', 'stile', 'treecorr'], - run_method='serial', + version="1.1", + input_module=["merge_starcat_runner"], + file_pattern=["full_starcat"], + file_ext=[".fits"], + numbering_scheme="-0000000", + depends=["numpy", "mccd", "astropy", "matplotlib", "stile", "treecorr"], + run_method="serial", ) def mccd_plots_runner( input_file_list, @@ -63,63 +65,63 @@ def mccd_plots_runner( ): """Define The MCCD Plots Runner.""" # Input parameters - if config.has_option(module_config_sec, 'HDU'): - hdu_no = config.getint(module_config_sec, 'HDU') + if config.has_option(module_config_sec, "HDU"): + hdu_no = config.getint(module_config_sec, "HDU") else: hdu_no = 2 # Get parameters for meanshapes plots - psf_model_type = config.get(module_config_sec, 'PSF') + psf_model_type = config.get(module_config_sec, "PSF") - if config.has_option(module_config_sec, 'MAX_E'): + if config.has_option(module_config_sec, "MAX_E"): max_e = config.getfloat(module_config_sec, "MAX_E") else: max_e = None - if config.has_option(module_config_sec, 'MAX_DE'): + if config.has_option(module_config_sec, "MAX_DE"): max_de = config.getfloat(module_config_sec, "MAX_DE") else: max_de = None - if config.has_option(module_config_sec, 'MIN_R2'): + if config.has_option(module_config_sec, "MIN_R2"): min_r2 = config.getfloat(module_config_sec, "MIN_R2") else: min_r2 = None - if config.has_option(module_config_sec, 'MAX_R2'): + if config.has_option(module_config_sec, "MAX_R2"): max_r2 = config.getfloat(module_config_sec, "MAX_R2") else: max_r2 = None - if config.has_option(module_config_sec, 'MAX_DR2'): + if config.has_option(module_config_sec, "MAX_DR2"): max_dr2 = config.getfloat(module_config_sec, "MAX_DR2") else: max_dr2 = None - x_nb_bins = config.getint(module_config_sec, 'X_GRID') - y_nb_bins = config.getint(module_config_sec, 'Y_GRID') - remove_outliers = config.getboolean(module_config_sec, 'REMOVE_OUTLIERS') - plot_meanshapes = config.getboolean(module_config_sec, 'PLOT_MEANSHAPES') - plot_histograms = config.getboolean(module_config_sec, 'PLOT_HISTOGRAMS') + x_nb_bins = config.getint(module_config_sec, "X_GRID") + y_nb_bins = config.getint(module_config_sec, "Y_GRID") + remove_outliers = config.getboolean(module_config_sec, "REMOVE_OUTLIERS") + plot_meanshapes = config.getboolean(module_config_sec, "PLOT_MEANSHAPES") + plot_histograms = config.getboolean(module_config_sec, "PLOT_HISTOGRAMS") # Get parameters for rho stats plots - plot_rho_stats = config.getboolean(module_config_sec, 'PLOT_RHO_STATS') - rho_stat_plot_style = config.get(module_config_sec, 'RHO_STATS_STYLE') + plot_rho_stats = config.getboolean(module_config_sec, "PLOT_RHO_STATS") + rho_stat_plot_style = config.get(module_config_sec, "RHO_STATS_STYLE") - if config.has_option(module_config_sec, 'RHO_STATS_YLIM_L'): - str_list = config.getlist(module_config_sec, 'RHO_STATS_YLIM_L') + if config.has_option(module_config_sec, "RHO_STATS_YLIM_L"): + str_list = config.getlist(module_config_sec, "RHO_STATS_YLIM_L") ylim_l = [float(s) for s in str_list] else: ylim_l = None - if config.has_option(module_config_sec, 'RHO_STATS_YLIM_R'): - str_list = config.getlist(module_config_sec, 'RHO_STATS_YLIM_R') + if config.has_option(module_config_sec, "RHO_STATS_YLIM_R"): + str_list = config.getlist(module_config_sec, "RHO_STATS_YLIM_R") ylim_r = [float(s) for s in str_list] else: ylim_r = None nb_pixel = x_nb_bins, y_nb_bins starcat_path = input_file_list[0][0] - output_path = run_dirs['output'] + '/' + output_path = run_dirs["output"] + "/" if plot_meanshapes or plot_histograms: if has_mpl: @@ -141,10 +143,10 @@ def mccd_plots_runner( ) else: msg = ( - '[!] In order to plot the Meanshapes the package ' - + '_matplotlib_ has to be correctly imported. This was not' - + ' the case, so the task is aborted. For the next time make' - + ' sure the package is installed.' + "[!] In order to plot the Meanshapes the package " + + "_matplotlib_ has to be correctly imported. This was not" + + " the case, so the task is aborted. For the next time make" + + " sure the package is installed." ) warnings.warn(msg) w_log.info(msg) @@ -152,18 +154,16 @@ def mccd_plots_runner( if plot_rho_stats: if has_stile is False or has_treecorr is False: msg = ( - '[!] In order to calculate the Rho stats the packages ' - + '_stile_ and _treecorr_ have to be correctly imported.' - + ' This was not the case, so the rho stat calculation is' - + 'aborted. For the next time make sure both of the' - + 'packages are installed.' + "[!] To calculate the rho stats the packages " + + "stile and treecorr are required. However, " + + f" treecorr: {has_treecorr}, stile: {has_stile}." ) warnings.warn(msg) w_log.info(msg) - elif rho_stat_plot_style != 'HSC' and rho_stat_plot_style != 'DES': + elif rho_stat_plot_style not in ("HSC", "DES", "UNIONS"): msg = ( - 'The rho stat definition should be HSC or DES. An unknown' - + ' definition was used. Rho stat calculation aborted.' + f"Invalid flag RHO_STAT_STYLE={rho_stat_plot_style}, allowed" + + " are 'HSC', 'DES', 'UNIONS'." ) warnings.warn(msg) w_log.info(msg) diff --git a/shapepipe/modules/mccd_preprocessing_runner.py b/shapepipe/modules/mccd_preprocessing_runner.py index 7a5ac53cb..f15287cf5 100644 --- a/shapepipe/modules/mccd_preprocessing_runner.py +++ b/shapepipe/modules/mccd_preprocessing_runner.py @@ -6,6 +6,7 @@ :Author: Tobias Liaudat """ + import mccd from shapepipe.modules.mccd_package import shapepipe_auxiliary_mccd as aux_mccd @@ -13,12 +14,12 @@ @module_runner( - version='1.1', - input_module=['setools_runner'], - file_pattern=['star_split_ratio_80', 'star_split_ratio_20'], - file_ext=['.fits', '.fits'], - depends=['numpy', 'mccd', 'galsim', 'astropy'], - run_method='serial', + version="1.1", + input_module=["setools_runner"], + file_pattern=["star_split_ratio_80", "star_split_ratio_20"], + file_ext=[".fits", ".fits"], + depends=["numpy", "mccd", "galsim", "astropy"], + run_method="serial", ) def mccd_preprocessing_runner( input_file_list, @@ -30,9 +31,9 @@ def mccd_preprocessing_runner( ): """Define The MCCD Pre-processing Runner.""" # Recover the MCCD config file and its params - config_file_path = config.getexpanded(module_config_sec, 'CONFIG_PATH') - mccd_mode = config.get(module_config_sec, 'MODE') - verbose = config.getboolean(module_config_sec, 'VERBOSE') + config_file_path = config.getexpanded(module_config_sec, "CONFIG_PATH") + mccd_mode = config.get(module_config_sec, "MODE") + verbose = config.getboolean(module_config_sec, "VERBOSE") # Parse MCCD config file mccd_parser = mccd.auxiliary_fun.MCCDParamsParser(config_file_path) @@ -40,28 +41,28 @@ def mccd_preprocessing_runner( input_dict = mccd_parser.get_inputs_kw() # Extract useful parameters - separator = input_dict['separator'] - min_n_stars = input_dict['min_n_stars'] - outlier_std_max = input_dict['outlier_std_max'] + separator = input_dict["separator"] + min_n_stars = input_dict["min_n_stars"] + outlier_std_max = input_dict["outlier_std_max"] - if mccd_mode == 'FIT': + if mccd_mode == "FIT": input_file_pos_list = [0] - save_name_list = ['train_star_selection'] + save_name_list = ["train_star_selection"] min_n_stars_list = [min_n_stars] - elif mccd_mode == 'FIT_VALIDATION': + elif mccd_mode == "FIT_VALIDATION": if len(input_file_list[0]) == 1: input_file_pos_list = [0] - save_name_list = ['train_star_selection'] + save_name_list = ["train_star_selection"] min_n_stars_list = [min_n_stars] else: input_file_pos_list = [0, 1] - save_name_list = ['train_star_selection', 'test_star_selection'] + save_name_list = ["train_star_selection", "test_star_selection"] min_n_stars_list = [min_n_stars, 1] - elif mccd_mode == 'VALIDATION': + elif mccd_mode == "VALIDATION": input_file_pos_list = [0] - save_name_list = ['test_star_selection'] + save_name_list = ["test_star_selection"] min_n_stars_list = [1] else: @@ -72,7 +73,7 @@ def mccd_preprocessing_runner( # Use the outfile from the pipeline and ignore the output directory from # the MCCD config file # Output paths for both newly generates datasets - output_mccd_path = run_dirs['output'] + '/' + output_mccd_path = run_dirs["output"] + "/" [ aux_mccd.mccd_preprocessing_pipeline( @@ -85,12 +86,13 @@ def mccd_preprocessing_runner( outlier_std_max=outlier_std_max, save_masks=False, save_name=_save_name, - save_extension='.fits', + save_extension=".fits", verbose=verbose, print_fun=w_log.info, ) - for _input_pos, _save_name, _min_stars in - zip(input_file_pos_list, save_name_list, min_n_stars_list) + for _input_pos, _save_name, _min_stars in zip( + input_file_pos_list, save_name_list, min_n_stars_list + ) ] # No return objects diff --git a/shapepipe/modules/mccd_val_runner.py b/shapepipe/modules/mccd_val_runner.py index 73f1bcd07..dc0811fc1 100644 --- a/shapepipe/modules/mccd_val_runner.py +++ b/shapepipe/modules/mccd_val_runner.py @@ -13,13 +13,13 @@ @module_runner( - version='1.1', - input_module=['mccd_preprocessing_runner'], - file_pattern=['fitted_model', 'test_star_selection'], - file_ext=['.npy', '.fits'], - numbering_scheme='-0000000', - depends=['numpy', 'mccd', 'galsim'], - run_method='parallel', + version="1.1", + input_module=["mccd_preprocessing_runner"], + file_pattern=["fitted_model", "test_star_selection"], + file_ext=[".npy", ".fits"], + numbering_scheme="-0000000", + depends=["numpy", "mccd", "galsim"], + run_method="parallel", ) def mccd_val_runner( input_file_list, @@ -31,24 +31,24 @@ def mccd_val_runner( ): """Define The MCCD Validation Runner.""" # Recover the MCCD config file and its params - config_file_path = config.getexpanded(module_config_sec, 'CONFIG_PATH') - mccd_mode = config.get(module_config_sec, 'MODE') - verbose = config.getboolean(module_config_sec, 'VERBOSE') + config_file_path = config.getexpanded(module_config_sec, "CONFIG_PATH") + mccd_mode = config.get(module_config_sec, "MODE") + verbose = config.getboolean(module_config_sec, "VERBOSE") # Parse MCCD config file mccd_parser = mccd.auxiliary_fun.MCCDParamsParser(config_file_path) mccd_parser.parse_document() # Prepare inputs to run the main fit function - output_dir = run_dirs['output'] + '/' - val_saving_name = 'validation_psf' + output_dir = run_dirs["output"] + "/" + val_saving_name = "validation_psf" # Extract the MCCD model path mccd_model_path = input_file_list[0] # Validation stars are in the second position of the list teststar_path = input_file_list[1] - if mccd_mode == 'VALIDATION': + if mccd_mode == "VALIDATION": aux_mccd.mccd_validation_pipeline( teststar_path=teststar_path, @@ -62,7 +62,7 @@ def mccd_val_runner( else: raise ValueError( - 'The mccd_val_runner should only be called when the MODE is ' + "The mccd_val_runner should only be called when the MODE is " + '"VALIDATION".' ) diff --git a/shapepipe/modules/merge_headers_package/__init__.py b/shapepipe/modules/merge_headers_package/__init__.py index 48a972c14..ed8416790 100644 --- a/shapepipe/modules/merge_headers_package/__init__.py +++ b/shapepipe/modules/merge_headers_package/__init__.py @@ -25,4 +25,4 @@ """ -__all__ = ['merge_headers'] +__all__ = ["merge_headers"] diff --git a/shapepipe/modules/merge_headers_package/merge_headers.py b/shapepipe/modules/merge_headers_package/merge_headers.py index 95d3e9acc..5c0a2213e 100644 --- a/shapepipe/modules/merge_headers_package/merge_headers.py +++ b/shapepipe/modules/merge_headers_package/merge_headers.py @@ -36,14 +36,14 @@ def merge_headers(input_file_list, output_dir): """ if not isinstance(output_dir, str): raise TypeError( - 'Output directory for merge headers must be a string ' - + f'not {type(output_dir)}.' + "Output directory for merge headers must be a string " + + f"not {type(output_dir)}." ) # Open SqliteDict file - final_file = SqliteDict(f'{output_dir}/log_exp_headers.sqlite') + final_file = SqliteDict(f"{output_dir}/log_exp_headers.sqlite") # Set matching pattern - pattern = 'headers-' + pattern = "headers-" for file_path in input_file_list: # Extract file path diff --git a/shapepipe/modules/merge_headers_runner.py b/shapepipe/modules/merge_headers_runner.py index 9e692bba7..bfedc8a89 100644 --- a/shapepipe/modules/merge_headers_runner.py +++ b/shapepipe/modules/merge_headers_runner.py @@ -11,12 +11,12 @@ @module_runner( - input_module='split_exp_runner', - version='1.1', - file_pattern=['headers'], - file_ext=['.npy'], - depends=['numpy', 'sqlitedict'], - run_method='serial', + input_module="split_exp_runner", + version="1.1", + file_pattern=["headers"], + file_ext=[".npy"], + depends=["numpy", "sqlitedict"], + run_method="serial", ) def merge_headers_runner( input_file_list, @@ -28,15 +28,17 @@ def merge_headers_runner( ): """Define The Merge Headers Runner.""" # Set output directory - output_dir = run_dirs['output'] - if config.has_option(module_config_sec, 'OUTPUT_PATH'): - output_dir = config.getexpanded(module_config_sec, 'OUTPUT_PATH') + output_dir = run_dirs["output"] + if config.has_option(module_config_sec, "OUTPUT_PATH"): + output_dir = config.getexpanded(module_config_sec, "OUTPUT_PATH") # Log output directory - w_log.info(f'output_dir = {output_dir}') + w_log.info(f"output_dir = {output_dir}") # Merge header files merge_headers(input_file_list, output_dir) + w_log.info(f"Merged {len(input_file_list)} input file headers") + # No return objects return None, None diff --git a/shapepipe/modules/merge_sep_cats_package/__init__.py b/shapepipe/modules/merge_sep_cats_package/__init__.py index d99553bf4..333e3d24c 100644 --- a/shapepipe/modules/merge_sep_cats_package/__init__.py +++ b/shapepipe/modules/merge_sep_cats_package/__init__.py @@ -34,4 +34,4 @@ """ -__all__ = ['merge_sep_cats.py'] +__all__ = ["merge_sep_cats.py"] diff --git a/shapepipe/modules/merge_sep_cats_package/merge_sep_cats.py b/shapepipe/modules/merge_sep_cats_package/merge_sep_cats.py index 85f7e194f..be7477c81 100644 --- a/shapepipe/modules/merge_sep_cats_package/merge_sep_cats.py +++ b/shapepipe/modules/merge_sep_cats_package/merge_sep_cats.py @@ -51,7 +51,7 @@ def __init__( output_dir, n_split_max, warning, - w_log + w_log, ): self._input_file_list = input_file_list @@ -79,21 +79,47 @@ def process(self): input_path_n = [] input_path_n.append(input_file) for n in range(2, self._n_split_max + 1): - res = re.sub('1', str(n), input_file, 1) + res = re.sub("1", str(n), input_file, 1) input_path_n.append(res) # Open first catalogue, read number of extensions and columns cat0 = file_io.FITSCatalogue(input_file, SEx_catalogue=True) cat0.open() list_ext_name = cat0.get_ext_name() + + # Inupt ngmix files sometimes have not all sheared versions + # (HDUs 1 - 5 = 1M, 1P, 2M, 2P, NOSHEAR) due to IO errors + if len(list_ext_name) < 6: + raise IndexError( + f"Input ngmix catalogue {input_file} has only" + + f" {len(list_ext_name)} HDUs, required are 6" + ) + list_col_name = cat0.get_col_names() + + # Some older input ngmix catalogues have multiple of 5 HDUs + # if reprocessed and not deleted but appended. + # The following log message should be replaced by raising + # and error in future + if len(list_ext_name) > 6: + wmsg = f"Cropping input HDUs from {len(list_ext_name)} to 5" + self._w_log.info(wmsg) + list_ext_name = list_ext_name[:6] cat0.close() + # Check that exactly 6 (1 primary + secondary HDUs) exist + if len(list_ext_name) != 6: + msg = f"Number of HDUs is {len(list_ext_name)}, expected 6" + #raise ValueError(msg) + print(f"warning: {msg}; setting to 6") + list_ext_name = list_ext_name[:6] + list_col_name = list_col_name[:6] + # Create empty dictionary # data dimension = n_extension x n_column x n_obj data = {} for hdu_ind, ext_name in enumerate(list_ext_name): - if ext_name == 'PRIMARY': + if ext_name == "PRIMARY": continue data[ext_name] = {} for col_name in list_col_name: @@ -106,38 +132,47 @@ def process(self): cat = file_io.FITSCatalogue(cat_path, SEx_catalogue=True) cat.open() + list_ext_name_n = cat.get_ext_name() + if len(list_ext_name_n) < 6: + raise IndexError( + f"Input ngmix catalogue {cat_path} has only" + + f" {len(list_ext_name_n)} HDUs, required are 6" + ) for hdu_ind, ext_name in enumerate(list_ext_name): - if ext_name == 'PRIMARY': + if ext_name == "PRIMARY": continue + if not ext_name in data: + raise IndexError( + f"Extension {ext_name} not found in file " + + f"{cat_path}" + ) for col_name in list_col_name: + # print("MKDEBUG ", cat_path, ext_name, col_name) data[ext_name][col_name] += list( cat.get_data(hdu_ind)[col_name] ) cat.close() else: - msg = f'Input catalogue \'{cat_path}\' not found' + msg = f"Input catalogue '{cat_path}' not found" warnings.warn(msg) - wmsg = f'Warning: {msg}' + wmsg = f"Warning: {msg}" self._w_log.info(wmsg) print(wmsg) # Save combined catalogue output_name = ( - f'{self._output_dir}/{self._file_pattern[idx]}' - + f'{self._file_number_string}{self._file_ext[idx]}' + f"{self._output_dir}/{self._file_pattern[idx]}" + + f"{self._file_number_string}{self._file_ext[idx]}" ) output = file_io.FITSCatalogue( - output_name, - open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite + output_name, open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite ) for hdu_ind, ext_name in enumerate(list_ext_name): - if ext_name == 'PRIMARY': + if ext_name == "PRIMARY": continue output.save_as_fits( - data[ext_name], - names=list_col_name, - ext_name=ext_name + data[ext_name], names=list_col_name, ext_name=ext_name ) return None, None diff --git a/shapepipe/modules/merge_sep_cats_runner.py b/shapepipe/modules/merge_sep_cats_runner.py index 5cae71a2a..927c79b76 100644 --- a/shapepipe/modules/merge_sep_cats_runner.py +++ b/shapepipe/modules/merge_sep_cats_runner.py @@ -12,11 +12,12 @@ @module_runner( - version='1.1', - input_module='ngmix_runner', - file_pattern=['ngmix'], - file_ext=['.fits'], - depends=['numpy']) + version="1.1", + input_module="ngmix_runner", + file_pattern=["ngmix"], + file_ext=[".fits"], + depends=["numpy"], +) def merge_sep_cats_runner( input_file_list, run_dirs, @@ -27,15 +28,15 @@ def merge_sep_cats_runner( ): """Define The Merge SEP Catalogues Runner.""" # Get config entries - n_split_max = config.getint(module_config_sec, 'N_SPLIT_MAX') + n_split_max = config.getint(module_config_sec, "N_SPLIT_MAX") - file_pattern = config.getlist(module_config_sec, 'FILE_PATTERN') - file_ext = config.getlist(module_config_sec, 'FILE_EXT') + file_pattern = config.getlist(module_config_sec, "FILE_PATTERN") + file_ext = config.getlist(module_config_sec, "FILE_EXT") - if config.has_option(module_config_sec, 'WARNING'): - warning = config.get(module_config_sec, 'WARNING') + if config.has_option(module_config_sec, "WARNING"): + warning = config.get(module_config_sec, "WARNING") else: - warning = 'error' + warning = "error" # Create merge sep cat class instance merge_sep_inst = MergeSep( @@ -43,7 +44,7 @@ def merge_sep_cats_runner( file_number_string, file_pattern, file_ext, - run_dirs['output'], + run_dirs["output"], n_split_max, warning, w_log, diff --git a/shapepipe/modules/merge_starcat_package/__init__.py b/shapepipe/modules/merge_starcat_package/__init__.py index c75a9c863..f407ac72c 100644 --- a/shapepipe/modules/merge_starcat_package/__init__.py +++ b/shapepipe/modules/merge_starcat_package/__init__.py @@ -21,8 +21,11 @@ =================================== PSF_MODEL : str - PSF model used; options are ``psfex`` or ``mccd`` + PSF model used; options are ``psfex`` or ``mccd``, ``setools'' +HDU : int, optional + HDU number of input catalogue table, default is ``1`` for ``mccd`` + and ``2`` for ``psfex`` and ``setools`` """ -__all__ = ['merge_starcat'] +__all__ = ["merge_starcat"] diff --git a/shapepipe/modules/merge_starcat_package/merge_starcat.py b/shapepipe/modules/merge_starcat_package/merge_starcat.py index 924c46aab..67c258f96 100644 --- a/shapepipe/modules/merge_starcat_package/merge_starcat.py +++ b/shapepipe/modules/merge_starcat_package/merge_starcat.py @@ -45,7 +45,7 @@ def __init__( w_log, stamp_size=51, rad=10, - hdu_table=1 + hdu_table=1, ): self._input_file_list = input_file_list @@ -136,9 +136,7 @@ def mean_calc(values, sizes): Mean """ - mean = ( - np.nansum(np.array(values)) / np.nansum(np.array(sizes)) - ) + mean = np.nansum(np.array(values)) / np.nansum(np.array(sizes)) return mean @@ -186,7 +184,7 @@ def stats_calculator(val_ref, val_model): """ residual = val_ref - val_model - rmse = np.sqrt(np.mean(residual ** 2)) + rmse = np.sqrt(np.mean(residual**2)) mean = np.mean(residual) std_dev = np.std(residual) @@ -227,22 +225,26 @@ def process(self): idx = np.arange(0, shap[0]) jdx = np.arange(0, shap[1]) - inside_circle = np.sqrt( - (idx[np.newaxis, :] - cent[0]) ** 2 - + (jdx[:, np.newaxis] - cent[1]) ** 2 - ) <= self._rad + inside_circle = ( + np.sqrt( + (idx[np.newaxis, :] - cent[0]) ** 2 + + (jdx[:, np.newaxis] - cent[1]) ** 2 + ) + <= self._rad + ) my_mask[inside_circle] = True for name in self._input_file_list: - starcat_j = fits.open(name[0], memmap=False) - try: - stars = np.copy(starcat_j[self._hdu_table].data['VIGNET_LIST']) + starcat_j = fits.open(name[0], memmap=False, ignore_missing_simple=True) except ValueError: - print(f'Error for file {name[0]}, check FITS file integrity') - raise + print(f"Error for file {name[0]}, check FITS file integrity") + #raise + continue + + stars = np.copy(starcat_j[self._hdu_table].data["VIGNET_LIST"]) stars[stars < -1e6] = 0 - psfs = np.copy(starcat_j[self._hdu_table].data['PSF_VIGNET_LIST']) + psfs = np.copy(starcat_j[self._hdu_table].data["PSF_VIGNET_LIST"]) # Pixel mse calculation pix_val = np.sum((stars - psfs) ** 2) @@ -250,7 +252,7 @@ def process(self): masked_diffs = np.array( [(_star - _psf)[my_mask] for _star, _psf in zip(stars, psfs)] ) - masked_pix_val = np.sum(masked_diffs ** 2) + masked_pix_val = np.sum(masked_diffs**2) masked_pix_sum = np.sum(masked_diffs) # Star noise variance (using masked stars) @@ -268,12 +270,11 @@ def process(self): # if pix_val < 1e20: # Normalised pixel mse calculation - stars_norm_vals = np.sqrt(np.sum(stars ** 2, axis=(1, 2))) - psfs_norm_vals = np.sqrt(np.sum(psfs ** 2, axis=(1, 2))) + stars_norm_vals = np.sqrt(np.sum(stars**2, axis=(1, 2))) + psfs_norm_vals = np.sqrt(np.sum(psfs**2, axis=(1, 2))) # Select non zero stars & psfs non_zero_elems = np.logical_and( - (psfs_norm_vals != 0), - (stars_norm_vals != 0) + (psfs_norm_vals != 0), (stars_norm_vals != 0) ) # Calculate the filtered mse calculation pix_filt_val = np.sum( @@ -286,7 +287,8 @@ def process(self): ( stars[non_zero_elems] / stars_norm_vals - psfs[non_zero_elems] / psfs_norm_vals - ) ** 2 + ) + ** 2 ) # Calculate sizes filt_size = stars[non_zero_elems].size @@ -313,56 +315,60 @@ def process(self): # positions x += list( - starcat_j[self._hdu_table].data['GLOB_POSITION_IMG_LIST'][:, 0] + starcat_j[self._hdu_table].data["GLOB_POSITION_IMG_LIST"][:, 0] ) y += list( - starcat_j[self._hdu_table].data['GLOB_POSITION_IMG_LIST'][:, 1] + starcat_j[self._hdu_table].data["GLOB_POSITION_IMG_LIST"][:, 1] ) # RA and DEC positions try: - ra += list(starcat_j[self._hdu_table].data['RA_LIST'][:]) - dec += list(starcat_j[self._hdu_table].data['DEC_LIST'][:]) + ra += list(starcat_j[self._hdu_table].data["RA_LIST"][:]) + dec += list(starcat_j[self._hdu_table].data["DEC_LIST"][:]) except Exception: - ra += list(np.zeros( - starcat_j[self._hdu_table].data[ - 'GLOB_POSITION_IMG_LIST' - ][:, 0].shape, - dtype=int, - )) - dec += list(np.zeros( - starcat_j[self._hdu_table].data[ - 'GLOB_POSITION_IMG_LIST' - ][:, 0].shape, - dtype=int, - )) + ra += list( + np.zeros( + starcat_j[self._hdu_table] + .data["GLOB_POSITION_IMG_LIST"][:, 0] + .shape, + dtype=int, + ) + ) + dec += list( + np.zeros( + starcat_j[self._hdu_table] + .data["GLOB_POSITION_IMG_LIST"][:, 0] + .shape, + dtype=int, + ) + ) # shapes (convert sigmas to R^2) g1_psf += list( - starcat_j[self._hdu_table].data['PSF_MOM_LIST'][:, 0] + starcat_j[self._hdu_table].data["PSF_MOM_LIST"][:, 0] ) g2_psf += list( - starcat_j[self._hdu_table].data['PSF_MOM_LIST'][:, 1] + starcat_j[self._hdu_table].data["PSF_MOM_LIST"][:, 1] ) size_psf += list( - starcat_j[self._hdu_table].data['PSF_MOM_LIST'][:, 2] ** 2 + starcat_j[self._hdu_table].data["PSF_MOM_LIST"][:, 2] ** 2 ) - g1 += list(starcat_j[self._hdu_table].data['STAR_MOM_LIST'][:, 0]) - g2 += list(starcat_j[self._hdu_table].data['STAR_MOM_LIST'][:, 1]) + g1 += list(starcat_j[self._hdu_table].data["STAR_MOM_LIST"][:, 0]) + g2 += list(starcat_j[self._hdu_table].data["STAR_MOM_LIST"][:, 1]) size += list( - starcat_j[self._hdu_table].data['STAR_MOM_LIST'][:, 2] ** 2 + starcat_j[self._hdu_table].data["STAR_MOM_LIST"][:, 2] ** 2 ) # flags flag_psf += list( - starcat_j[self._hdu_table].data['PSF_MOM_LIST'][:, 3] + starcat_j[self._hdu_table].data["PSF_MOM_LIST"][:, 3] ) flag_star += list( - starcat_j[self._hdu_table].data['STAR_MOM_LIST'][:, 3] + starcat_j[self._hdu_table].data["STAR_MOM_LIST"][:, 3] ) # ccd id list - ccd_nb += list(starcat_j[self._hdu_table].data['CCD_ID_LIST']) + ccd_nb += list(starcat_j[self._hdu_table].data["CCD_ID_LIST"]) starcat_j.close() @@ -372,43 +378,43 @@ def process(self): # Regular pixel RMSE tot_pixel_rmse = MSC.rmse_calc(pixel_mse, size_mse) self._w_log.info( - f'MCCD_merge_starcat: Regular Total pixel RMSE =' - + f' {tot_pixel_rmse:.5e}\n' + f"MCCD_merge_starcat: Regular Total pixel RMSE =" + + f" {tot_pixel_rmse:.5e}\n" ) # Regular Total pixel mean tot_pixel_mean = MSC.mean_calc(pixel_sum, size_mse) self._w_log.info( - f'MCCD_merge_starcat: Regular Total pixel mean =' - + f' {tot_pixel_mean:.5e}\n' + f"MCCD_merge_starcat: Regular Total pixel mean =" + + f" {tot_pixel_mean:.5e}\n" ) # Regular Total MASKED pixel RMSE tot_masked_pixel_rmse = MSC.rmse_calc(masked_pixel_mse, masked_size) self._w_log.info( - f'MCCD_merge_starcat: Regular Total MASKED pixel RMSE =' - + f' {tot_masked_pixel_rmse:.5e}\n' + f"MCCD_merge_starcat: Regular Total MASKED pixel RMSE =" + + f" {tot_masked_pixel_rmse:.5e}\n" ) # Regular Total MASKED pixel mean tot_masked_pixel_mean = MSC.mean_calc(masked_pixel_sum, masked_size) self._w_log.info( - f'MCCD_merge_starcat: Regular Total MASKED pixel mean =' - + f' {tot_masked_pixel_mean:.5e}\n' + f"MCCD_merge_starcat: Regular Total MASKED pixel mean =" + + f" {tot_masked_pixel_mean:.5e}\n" ) # Normalized pixel RMSE tot_pix_norm_rmse = MSC.rmse_calc(pix_norm_mse, size_norm_mse) self._w_log.info( - 'MCCD_merge_starcat: Normalized Total pixel RMSE =' - + f' {tot_pix_norm_rmse:.5e}\n' + "MCCD_merge_starcat: Normalized Total pixel RMSE =" + + f" {tot_pix_norm_rmse:.5e}\n" ) # Normalized filtered pixel RMSE tot_pix_filt_rmse = MSC.rmse_calc(pix_filt_mse, size_filt_mse) self._w_log.info( - 'MCCD_merge_starcat: Filtered Total pixel RMSE =' - + f' {tot_pix_filt_rmse:.5e}\n' + "MCCD_merge_starcat: Filtered Total pixel RMSE =" + + f" {tot_pix_filt_rmse:.5e}\n" ) concat_model_var = np.concatenate(np.array(model_var)) @@ -419,9 +425,9 @@ def process(self): std_model_var = MSC.std_calc(concat_model_var) rmse_model_var = MSC.rmse_calc_2(concat_model_var, model_var_size) self._w_log.info( - f'MCCD-RCA variance:\nMean Variance= {mean_model_var:.5e}\n' - + f'Std Variance= {std_model_var:.5e}\n' - + f'RMSE Variance= {rmse_model_var:.5e}\n' + f"MCCD-RCA variance:\nMean Variance= {mean_model_var:.5e}\n" + + f"Std Variance= {std_model_var:.5e}\n" + + f"RMSE Variance= {rmse_model_var:.5e}\n" ) # Star Noise Variance @@ -429,14 +435,14 @@ def process(self): std_star_var = MSC.std_calc(concat_star_noise_var) rmse_star_var = MSC.rmse_calc_2(concat_star_noise_var, star_noise_size) self._w_log.info( - f'Masked stars variance:\nMean Variance= {mean_star_var:.5e}\n' - + f'Std Variance= {std_star_var:.5e}\n' - + f'RMSE Variance= {rmse_star_var:.5e}\n' + f"Masked stars variance:\nMean Variance= {mean_star_var:.5e}\n" + + f"Std Variance= {std_star_var:.5e}\n" + + f"RMSE Variance= {rmse_star_var:.5e}\n" ) # Mask and transform to numpy arrays - flagmask = ( - np.abs(np.array(flag_star) - 1) * np.abs(np.array(flag_psf) - 1) + flagmask = np.abs(np.array(flag_star) - 1) * np.abs( + np.array(flag_psf) - 1 ) psf_e1 = np.array(g1_psf)[flagmask.astype(bool)] psf_e2 = np.array(g2_psf)[flagmask.astype(bool)] @@ -447,47 +453,47 @@ def process(self): rmse, mean, std_dev = MSC.stats_calculator(star_e1, psf_e1) self._w_log.info( - f'Moment residual e1:\nMean= {mean:.5e}\nStd Dev= {std_dev:.5e}\n' - + f'RMSE= {rmse:.5e}\n' + f"Moment residual e1:\nMean= {mean:.5e}\nStd Dev= {std_dev:.5e}\n" + + f"RMSE= {rmse:.5e}\n" ) rmse, mean, std_dev = MSC.stats_calculator(star_e2, psf_e2) self._w_log.info( - f'Moment residual e2:\nMean= {mean:.5e}\nStd Dev= {std_dev:.5e}\n' - + f'RMSE= {rmse:.5e}\n' + f"Moment residual e2:\nMean= {mean:.5e}\nStd Dev= {std_dev:.5e}\n" + + f"RMSE= {rmse:.5e}\n" ) rmse, mean, std_dev = MSC.stats_calculator(star_r2, psf_r2) self._w_log.info( - f'Moment residual R2:\nMean= {mean:.5e}\nStd Dev= {std_dev:.5e}\n' - + f'RMSE= {rmse:.5e}\n' + f"Moment residual R2:\nMean= {mean:.5e}\nStd Dev= {std_dev:.5e}\n" + + f"RMSE= {rmse:.5e}\n" ) - self._w_log.info(f'MCCD: Number of stars: {star_e1.shape[0]:d}') + self._w_log.info(f"MCCD: Number of stars: {star_e1.shape[0]:d}") # Prepare output FITS catalogue output = file_io.FITSCatalogue( - f'{self._output_dir}/full_starcat-0000000.fits', + f"{self._output_dir}/full_starcat-0000000.fits", open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite, - SEx_catalogue=True + SEx_catalogue=True, ) # Collect columns # convert back to sigma for consistency data = { - 'X': x, - 'Y': y, - 'RA': ra, - 'DEC': dec, - 'E1_PSF_HSM': g1_psf, - 'E2_PSF_HSM': g2_psf, - 'SIGMA_PSF_HSM': np.sqrt(size_psf), - 'E1_STAR_HSM': g1, - 'E2_STAR_HSM': g2, - 'SIGMA_STAR_HSM': np.sqrt(size), - 'FLAG_PSF_HSM': flag_psf, - 'FLAG_STAR_HSM': flag_star, - 'CCD_NB': ccd_nb + "X": x, + "Y": y, + "RA": ra, + "DEC": dec, + "E1_PSF_HSM": g1_psf, + "E2_PSF_HSM": g2_psf, + "SIGMA_PSF_HSM": np.sqrt(size_psf), + "E1_STAR_HSM": g1, + "E2_STAR_HSM": g2, + "SIGMA_STAR_HSM": np.sqrt(size), + "FLAG_PSF_HSM": flag_psf, + "FLAG_STAR_HSM": flag_star, + "CCD_NB": ccd_nb, } # Write file @@ -533,76 +539,96 @@ def process(self): ccd_nb = [] self._w_log.info( - f'Merging {len(self._input_file_list)} star catalogues' + f"Merging {len(self._input_file_list)} star catalogues" ) for name in self._input_file_list: - starcat_j = fits.open(name[0], memmap=False) + try: + starcat_j = fits.open(name[0], memmap=False, ignore_missing_simple=True) + except OSError as e: + print(f"Error while opening file '{name[0]}'") + #raise + continue data_j = starcat_j[self._hdu_table].data # positions - x += list(data_j['X']) - y += list(data_j['Y']) - ra += list(data_j['RA']) - dec += list(data_j['DEC']) + x += list(data_j["X"]) + y += list(data_j["Y"]) + ra += list(data_j["RA"]) + dec += list(data_j["DEC"]) # shapes (convert sigmas to R^2) - g1_psf += list(data_j['E1_PSF_HSM']) - g2_psf += list(data_j['E2_PSF_HSM']) - size_psf += list(data_j['SIGMA_PSF_HSM']**2) - g1 += list(data_j['E1_STAR_HSM']) - g2 += list(data_j['E2_STAR_HSM']) - size += list(data_j['SIGMA_STAR_HSM']**2) + g1_psf += list(data_j["E1_PSF_HSM"]) + g2_psf += list(data_j["E2_PSF_HSM"]) + size_psf += list(data_j["SIGMA_PSF_HSM"] ** 2) + g1 += list(data_j["E1_STAR_HSM"]) + g2 += list(data_j["E2_STAR_HSM"]) + size += list(data_j["SIGMA_STAR_HSM"] ** 2) # flags - flag_psf += list(data_j['FLAG_PSF_HSM']) - flag_star += list(data_j['FLAG_STAR_HSM']) + flag_psf += list(data_j["FLAG_PSF_HSM"]) + flag_star += list(data_j["FLAG_STAR_HSM"]) # misc - mag += list(data_j['MAG']) - snr += list(data_j['SNR']) - psfex_acc += list(data_j['ACCEPTED']) + + # MKDEBUG: The following columns do not exist (yet) + # for psf converted (pix2wcs) files. + try: + mag += list(data_j["MAG"]) + except: + mag += list(np.zeros_like(data_j["X"])) + try: + snr += list(data_j["SNR"]) + except: + snr += list(np.zeros_like(data_j["X"])) + try: + psfex_acc += list(data_j["ACCEPTED"]) + except: + psfex_acc += list(np.zeros_like(data_j["X"])) # CCD number - ccd_nb += [ - re.split(r"\-([0-9]*)\-([0-9]+)\.", name[0])[-2] - ] * len(data_j['RA']) + ccd_nb += [re.split(r"\-([0-9]*)\-([0-9]+)\.", name[0])[-2]] * len( + data_j["RA"] + ) # Prepare output FITS catalogue + # MKDEBUG: SEx_cat=True -> False output = file_io.FITSCatalogue( - f'{self._output_dir}/full_starcat-0000000.fits', + f"{self._output_dir}/full_starcat-0000000.fits", open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite, - SEx_catalogue=True + SEx_catalogue=False, ) # Collect columns # convert back to sigma for consistency data = { - 'X': x, - 'Y': y, - 'RA': ra, - 'DEC': dec, - 'E1_PSF_HSM': g1_psf, - 'E2_PSF_HSM': g2_psf, - 'SIGMA_PSF_HSM': np.sqrt(size_psf), - 'E1_STAR_HSM': g1, - 'E2_STAR_HSM': g2, - 'SIGMA_STAR_HSM': np.sqrt(size), - 'FLAG_PSF_HSM': flag_psf, - 'FLAG_STAR_HSM': flag_star, - 'MAG': mag, - 'SNR': snr, - 'ACCEPTED': psfex_acc, - 'CCD_NB': ccd_nb + "X": x, + "Y": y, + "RA": ra, + "DEC": dec, + "E1_PSF_HSM": g1_psf, + "E2_PSF_HSM": g2_psf, + "SIGMA_PSF_HSM": np.sqrt(size_psf), + "E1_STAR_HSM": g1, + "E2_STAR_HSM": g2, + "SIGMA_STAR_HSM": np.sqrt(size), + "FLAG_PSF_HSM": flag_psf, + "FLAG_STAR_HSM": flag_star, + "MAG": mag, + "SNR": snr, + "ACCEPTED": psfex_acc, + "CCD_NB": ccd_nb, } # Write file + # MKDEBUG for psf conv (pix2WCS) files do not write as SExtractorCat; + # we do not want to copy the first input data content to HDU #1. output.save_as_fits( data, overwrite=True, - sex_cat_path=self._input_file_list[0][0], ) + # sex_cat_path=self._input_file_list[0][0], class MergeStarCatSetools(object): @@ -653,9 +679,9 @@ def get_moments(cls, data): """ # SExtractor output. First and second moments are normalised. # Second moments are centred. - q11 = 'X2WIN_IMAGE' - q22 = 'Y2WIN_IMAGE' - q12 = 'XYWIN_IMAGE' + q11 = "X2WIN_IMAGE" + q22 = "Y2WIN_IMAGE" + q12 = "XYWIN_IMAGE" # Second moments m11 = data[q12] @@ -687,13 +713,13 @@ def get_ellipticity(cls, m11, m20, m02, typ): ellipticity components """ - if typ == 'epsilon': + if typ == "epsilon": # Determinant = (Q_11 Q_22 - Q_12^2)^(1/2) det = np.sqrt(m20 * m02 - m11 * m11) - elif typ == 'chi': + elif typ == "chi": det = 0 else: - raise ValueError(f'Invalid ellipticity type {type}') + raise ValueError(f"Invalid ellipticity type {type}") # Denominator = Q_11 + Q_22 [ + 2 * det] den = m20 + m02 + 2 * det @@ -701,7 +727,7 @@ def get_ellipticity(cls, m11, m20, m02, typ): # Ellipticity = (Q_11 - Q_22 + 2 i Q_12) / den ell = (m20 - m02 + 1j * 2 * m11) / den - if type == 'chi': + if type == "chi": # chi estimates 2*g, so to get g we have to divide by 2 ell = ell / 2 @@ -720,7 +746,7 @@ def process(self): ccd_nb = [] self._w_log.info( - f'Merging {len(self._input_file_list)} star catalogues' + f"Merging {len(self._input_file_list)} star catalogues" ) for name in self._input_file_list: @@ -729,54 +755,54 @@ def process(self): data_j = starcat_j[self._hdu_table].data # positions - x += list(data_j['XWIN_IMAGE']) - y += list(data_j['YWIN_IMAGE']) - ra += list(data_j['XWIN_WORLD']) - dec += list(data_j['YWIN_WORLD']) + x += list(data_j["XWIN_IMAGE"]) + y += list(data_j["YWIN_IMAGE"]) + ra += list(data_j["XWIN_WORLD"]) + dec += list(data_j["YWIN_WORLD"]) m11, m20, m02 = self.get_moments(data_j) - eps1, eps2 = self.get_ellipticity(m11, m20, m02, 'epsilon') - chi1, chi2 = self.get_ellipticity(m11, m20, m02, 'chi') + eps1, eps2 = self.get_ellipticity(m11, m20, m02, "epsilon") + chi1, chi2 = self.get_ellipticity(m11, m20, m02, "chi") - size += list(data_j['FLUX_RADIUS']) + size += list(data_j["FLUX_RADIUS"]) # flags - flags += list(data_j['FLAGS_WIN']) - flags_ext += list(data_j['IMAFLAGS_ISO']) + flags += list(data_j["FLAGS_WIN"]) + flags_ext += list(data_j["IMAFLAGS_ISO"]) # misc - mag += list(data_j['MAG_WIN']) - snr += list(data_j['SNR_WIN']) + mag += list(data_j["MAG_WIN"]) + snr += list(data_j["SNR_WIN"]) # CCD number - ccd_nb += [ - re.split(r"\-([0-9]*)\-([0-9]+)\.", name[0])[-2] - ] * len(data_j['XWIN_IMAGE']) + ccd_nb += [re.split(r"\-([0-9]*)\-([0-9]+)\.", name[0])[-2]] * len( + data_j["XWIN_IMAGE"] + ) # Prepare output FITS catalogue output = file_io.FITSCatalogue( - f'{self._output_dir}/full_starcat-0000000.fits', + f"{self._output_dir}/full_starcat-0000000.fits", open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite, - SEx_catalogue=True + SEx_catalogue=True, ) # Collect columns # convert back to sigma for consistency data = { - 'X': x, - 'Y': y, - 'RA': ra, - 'DEC': dec, - 'EPS1': eps1, - 'EPS2': eps2, - 'CHI1': chi1, - 'CHI2': chi2, - 'SIZE': size, - 'FLAGS': flags, - 'FLAGS_EXT': flags_ext, - 'MAG': mag, - 'SNR': snr, - 'CCD_NB': ccd_nb, + "X": x, + "Y": y, + "RA": ra, + "DEC": dec, + "EPS1": eps1, + "EPS2": eps2, + "CHI1": chi1, + "CHI2": chi2, + "SIZE": size, + "FLAGS": flags, + "FLAGS_EXT": flags_ext, + "MAG": mag, + "SNR": snr, + "CCD_NB": ccd_nb, } # Write file diff --git a/shapepipe/modules/merge_starcat_runner.py b/shapepipe/modules/merge_starcat_runner.py index 5d0b43f6d..5213809a6 100644 --- a/shapepipe/modules/merge_starcat_runner.py +++ b/shapepipe/modules/merge_starcat_runner.py @@ -11,13 +11,13 @@ @module_runner( - version='1.1', - input_module=['mccd_fit_val_runner'], - file_pattern=['validation_psf'], - file_ext=['.fits'], - numbering_scheme='-0000000', - depends=['numpy', 'astropy'], - run_method='serial', + version="1.1", + input_module=["mccd_fit_val_runner"], + file_pattern=["validation_psf"], + file_ext=[".fits"], + numbering_scheme="-0000000", + depends=["numpy", "astropy"], + run_method="serial", ) def merge_starcat_runner( input_file_list, @@ -29,27 +29,33 @@ def merge_starcat_runner( ): """Define The Merge Star Catalogues Runner.""" # Read config file options - psf_model = config.get(module_config_sec, 'PSF_MODEL') - allowed_psf_models = ('psfex', 'mccd', 'setools') + psf_model = config.get(module_config_sec, "PSF_MODEL") + allowed_psf_models = ("psfex", "mccd", "setools") if psf_model not in allowed_psf_models: raise ValueError( - f'Invalid config entry PSF_MODEL={psf_model} found, ' - + f'needs to be one of {allowed_psf_models}' + f"Invalid config entry PSF_MODEL={psf_model} found, " + + f"needs to be one of {allowed_psf_models}" ) + # Get input catalogue HDU number + if config.has_option(module_config_sec, "HDU"): + hdu = config.getint(module_config_sec, "HDU") + else: + hdu = 1 + # Set output directory - output_dir = run_dirs['output'] + output_dir = run_dirs["output"] # Set merge class to use - if psf_model == 'mccd': + if psf_model == "mccd": MSC = merge_starcat.MergeStarCatMCCD - elif psf_model == 'psfex': + elif psf_model == "psfex": MSC = merge_starcat.MergeStarCatPSFEX - elif psf_model == 'setools': + elif psf_model == "setools": MSC = merge_starcat.MergeStarCatSetools # Create instance of merge class - merge_inst = MSC(input_file_list, output_dir, w_log) + merge_inst = MSC(input_file_list, output_dir, w_log, hdu_table=hdu) # Run processing merge_inst.process() diff --git a/shapepipe/modules/module_decorator.py b/shapepipe/modules/module_decorator.py index 17911b49d..1ad480465 100644 --- a/shapepipe/modules/module_decorator.py +++ b/shapepipe/modules/module_decorator.py @@ -8,14 +8,14 @@ def module_runner( - version='0.0', + version="0.0", input_module=None, - file_pattern='', - file_ext='', + file_pattern="", + file_ext="", depends=[], executes=[], numbering_scheme=None, - run_method='parallel', + run_method="parallel", ): """Wrap Module Runners. @@ -63,41 +63,39 @@ def module_runner( """ if not isinstance(version, str): - raise TypeError('Module version must be a string.') + raise TypeError("Module version must be a string.") if isinstance(input_module, str): input_module = [input_module] elif not isinstance(input_module, (list, type(None))): - raise TypeError('Input module must be a list or a string.') + raise TypeError("Input module must be a list or a string.") if isinstance(file_pattern, str): file_pattern = [file_pattern] elif not isinstance(file_pattern, list): - raise TypeError('File pattern must be a string or a list of strings.') + raise TypeError("File pattern must be a string or a list of strings.") if isinstance(file_ext, str): file_ext = [file_ext] elif not isinstance(file_ext, list): - raise TypeError( - 'File extension must be a string or a list of strings.' - ) + raise TypeError("File extension must be a string or a list of strings.") if isinstance(depends, str): depends = [depends] elif not isinstance(depends, list): - raise TypeError('Dependencies must be a string or a list of strings.') + raise TypeError("Dependencies must be a string or a list of strings.") if isinstance(executes, str): executes = [executes] elif not isinstance(executes, list): - raise TypeError('Executables must be a string or a list of strings.') + raise TypeError("Executables must be a string or a list of strings.") if not isinstance(numbering_scheme, (str, type(None))): raise TypeError( - f'Numbering scheme must be a string, found \'{numbering_scheme}\'.' + f"Numbering scheme must be a string, found '{numbering_scheme}'." ) - if run_method not in {'parallel', 'serial'}: + if run_method not in {"parallel", "serial"}: raise ValueError('Run method must be a "parallel" or "serial".') if (len(file_ext) == 1) and (len(file_pattern) > 1): @@ -105,9 +103,9 @@ def module_runner( if len(file_ext) != len(file_pattern): raise ValueError( - f'The number of file_ext values ({len(file_ext)}) does not match ' - + f'the number of file_pattern values ({len(file_pattern)}) in ' - + 'the module decorator.' + f"The number of file_ext values ({len(file_ext)}) does not match " + + f"the number of file_pattern values ({len(file_pattern)}) in " + + "the module decorator." ) def decorator(func): diff --git a/shapepipe/modules/module_runners.py b/shapepipe/modules/module_runners.py index 74a48ce50..eddee6eb0 100644 --- a/shapepipe/modules/module_runners.py +++ b/shapepipe/modules/module_runners.py @@ -25,17 +25,19 @@ def get_module_runners(modules): Dictionary of module runners """ - package = 'shapepipe.modules' + package = "shapepipe.modules" - module_runners = dict([ - ( - module, - getattr( - import_module(f'.{module}', package=package), + module_runners = dict( + [ + ( module, + getattr( + import_module(f".{module}", package=package), + module, + ), ) - ) - for module in modules - ]) + for module in modules + ] + ) return module_runners diff --git a/shapepipe/modules/ngmix_package/__init__.py b/shapepipe/modules/ngmix_package/__init__.py index e74d71f76..909631097 100644 --- a/shapepipe/modules/ngmix_package/__init__.py +++ b/shapepipe/modules/ngmix_package/__init__.py @@ -41,4 +41,4 @@ """ -__all__ = ['ngmix'] +__all__ = ["ngmix"] diff --git a/shapepipe/modules/ngmix_package/ngmix.py b/shapepipe/modules/ngmix_package/ngmix.py index 7cb614a42..9a731d66e 100644 --- a/shapepipe/modules/ngmix_package/ngmix.py +++ b/shapepipe/modules/ngmix_package/ngmix.py @@ -66,13 +66,13 @@ def __init__( f_wcs_path, w_log, id_obj_min=-1, - id_obj_max=-1 + id_obj_max=-1, ): if len(input_file_list) != 6: raise IndexError( - f'Input file list has length {len(input_file_list)},' - + ' required is 6' + f"Input file list has length {len(input_file_list)}," + + " required is 6" ) self._tile_cat_path = input_file_list[0] @@ -95,9 +95,9 @@ def __init__( self._w_log = w_log # Initiatlise random generator - seed = int(''.join(re.findall(r'\d+', self._file_number_string))) + seed = int("".join(re.findall(r"\d+", self._file_number_string))) np.random.seed(seed) - self._w_log.info(f'Random generator initialisation seed = {seed}') + self._w_log.info(f"Random generator initialisation seed = {seed}") @classmethod def MegaCamFlip(self, vign, ccd_nb): @@ -153,21 +153,18 @@ def get_prior(self): # Size prior. Instead of flat, two-sided error function (TwoSidedErf) # could be used Tminval = -10.0 # arcsec squared - Tmaxval = 1.e6 + Tmaxval = 1.0e6 T_prior = ngmix.priors.FlatPrior(Tminval, Tmaxval) # Flux prior. Bounds need to make sense for # images in question - Fminval = -1.e4 - Fmaxval = 1.e9 + Fminval = -1.0e4 + Fmaxval = 1.0e9 F_prior = ngmix.priors.FlatPrior(Fminval, Fmaxval) # Joint prior, combine all individual priors prior = ngmix.joint_prior.PriorSimpleSep( - cen_prior, - g_prior, - T_prior, - F_prior + cen_prior, g_prior, T_prior, F_prior ) return prior @@ -193,112 +190,107 @@ def compile_results(self, results): If SNR key not found """ - names = ['1m', '1p', '2m', '2p', 'noshear'] + names = ["1m", "1p", "2m", "2p", "noshear"] names2 = [ - 'id', - 'n_epoch_model', - 'moments_fail', - 'ntry_fit', - 'g1_psfo_ngmix', - 'g2_psfo_ngmix', - 'T_psfo_ngmix', - 'g1_err_psfo_ngmix', - 'g2_err_psfo_ngmix', - 'T_err_psfo_ngmix', - 'g1', - 'g1_err', - 'g2', - 'g2_err', - 'T', - 'T_err', - 'Tpsf', - 'g1_psf', - 'g2_psf', - 'flux', - 'flux_err', - 's2n', - 'mag', - 'mag_err', - 'flags', - 'mcal_flags' + "id", + "n_epoch_model", + "moments_fail", + "ntry_fit", + "g1_psfo_ngmix", + "g2_psfo_ngmix", + "T_psfo_ngmix", + "g1_err_psfo_ngmix", + "g2_err_psfo_ngmix", + "T_err_psfo_ngmix", + "g1", + "g1_err", + "g2", + "g2_err", + "T", + "T_err", + "Tpsf", + "g1_psf", + "g2_psf", + "flux", + "flux_err", + "s2n", + "mag", + "mag_err", + "flags", + "mcal_flags", ] output_dict = {k: {kk: [] for kk in names2} for k in names} for idx in range(len(results)): for name in names: mag = ( - -2.5 * np.log10(results[idx][name]['flux']) + -2.5 * np.log10(results[idx][name]["flux"]) + self._zero_point ) mag_err = np.abs( - -2.5 * results[idx][name]['flux_err'] - / (results[idx][name]['flux'] * np.log(10)) + -2.5 + * results[idx][name]["flux_err"] + / (results[idx][name]["flux"] * np.log(10)) ) - output_dict[name]['id'].append(results[idx]['obj_id']) - output_dict[name]['n_epoch_model'].append( - results[idx]['n_epoch_model'] + output_dict[name]["id"].append(results[idx]["obj_id"]) + output_dict[name]["n_epoch_model"].append( + results[idx]["n_epoch_model"] ) - output_dict[name]['moments_fail'].append( - results[idx]['moments_fail'] + output_dict[name]["moments_fail"].append( + results[idx]["moments_fail"] ) - output_dict[name]['ntry_fit'].append( - results[idx][name]['ntry'] + output_dict[name]["ntry_fit"].append(results[idx][name]["ntry"]) + output_dict[name]["g1_psfo_ngmix"].append( + results[idx]["g_PSFo"][0] ) - output_dict[name]['g1_psfo_ngmix'].append( - results[idx]['g_PSFo'][0] + output_dict[name]["g2_psfo_ngmix"].append( + results[idx]["g_PSFo"][1] ) - output_dict[name]['g2_psfo_ngmix'].append( - results[idx]['g_PSFo'][1] + output_dict[name]["g1_err_psfo_ngmix"].append( + results[idx]["g_err_PSFo"][0] ) - output_dict[name]['g1_err_psfo_ngmix'].append( - results[idx]['g_err_PSFo'][0] + output_dict[name]["g2_err_psfo_ngmix"].append( + results[idx]["g_err_PSFo"][1] ) - output_dict[name]['g2_err_psfo_ngmix'].append( - results[idx]['g_err_PSFo'][1] + output_dict[name]["T_psfo_ngmix"].append(results[idx]["T_PSFo"]) + output_dict[name]["T_err_psfo_ngmix"].append( + results[idx]["T_err_PSFo"] ) - output_dict[name]['T_psfo_ngmix'].append( - results[idx]['T_PSFo'] + output_dict[name]["g1"].append(results[idx][name]["g"][0]) + output_dict[name]["g1_err"].append( + results[idx][name]["pars_err"][2] ) - output_dict[name]['T_err_psfo_ngmix'].append( - results[idx]['T_err_PSFo'] + output_dict[name]["g2"].append(results[idx][name]["g"][1]) + output_dict[name]["g2_err"].append( + results[idx][name]["pars_err"][3] ) - output_dict[name]['g1'].append(results[idx][name]['g'][0]) - output_dict[name]['g1_err'].append( - results[idx][name]['pars_err'][2] + output_dict[name]["T"].append(results[idx][name]["T"]) + output_dict[name]["T_err"].append(results[idx][name]["T_err"]) + output_dict[name]["Tpsf"].append(results[idx][name]["Tpsf"]) + output_dict[name]["g1_psf"].append( + results[idx][name]["gpsf"][0] ) - output_dict[name]['g2'].append(results[idx][name]['g'][1]) - output_dict[name]['g2_err'].append( - results[idx][name]['pars_err'][3] + output_dict[name]["g2_psf"].append( + results[idx][name]["gpsf"][1] ) - output_dict[name]['T'].append(results[idx][name]['T']) - output_dict[name]['T_err'].append(results[idx][name]['T_err']) - output_dict[name]['Tpsf'].append(results[idx][name]['Tpsf']) - output_dict[name]['g1_psf'].append( - results[idx][name]['gpsf'][0] + output_dict[name]["flux"].append(results[idx][name]["flux"]) + output_dict[name]["flux_err"].append( + results[idx][name]["flux_err"] ) - output_dict[name]['g2_psf'].append( - results[idx][name]['gpsf'][1] - ) - output_dict[name]['flux'].append(results[idx][name]['flux']) - output_dict[name]['flux_err'].append( - results[idx][name]['flux_err'] - ) - output_dict[name]['mag'].append(mag) - output_dict[name]['mag_err'].append(mag_err) - - if 's2n' in results[idx][name]: - output_dict[name]['s2n'].append(results[idx][name]['s2n']) - elif 's2n_r' in results[idx][name]: - output_dict[name]['s2n'].append( - results[idx][name]['s2n_r'] - ) + output_dict[name]["mag"].append(mag) + output_dict[name]["mag_err"].append(mag_err) + + if "s2n" in results[idx][name]: + output_dict[name]["s2n"].append(results[idx][name]["s2n"]) + elif "s2n_r" in results[idx][name]: + output_dict[name]["s2n"].append(results[idx][name]["s2n_r"]) else: - raise KeyError('No SNR key (s2n, s2n_r) found in results') + raise KeyError("No SNR key (s2n, s2n_r) found in results") - output_dict[name]['flags'].append(results[idx][name]['flags']) - output_dict[name]['mcal_flags'].append( - results[idx]['mcal_flags'] + output_dict[name]["flags"].append(results[idx][name]["flags"]) + output_dict[name]["mcal_flags"].append( + results[idx]["mcal_flags"] ) return output_dict @@ -314,18 +306,31 @@ def save_results(self, output_dict): Dictionary containing the results """ - output_name = ( - f'{self._output_dir}/ngmix{self._file_number_string}.fits' - ) + output_name = f"{self._output_dir}/ngmix{self._file_number_string}.fits" f = file_io.FITSCatalogue( - output_name, - open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite + output_name, open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite ) + n_hdu = len(output_dict.keys()) + if n_hdu != 5: + raise IndexError( + f"FITS output file data has {n_hdu} HDUs," + + " expected are 5" + ) for key in output_dict.keys(): f.save_as_fits(output_dict[key], ext_name=key.upper()) + + @classmethod + def check_key(self, expccd_name_tmp, vign_cat, vignet_path): + if expccd_name_tmp not in vign_cat: + raise KeyError( + f"Key '{expccd_name_tmp}' (exposure CCD ID from PSF postage stamp list)" + + " not found in postage stamp database" + + f" file '{vignet_path}'" + ) + def process(self): """Process. @@ -342,10 +347,10 @@ def process(self): SEx_catalogue=True, ) tile_cat.open() - obj_id = np.copy(tile_cat.get_data()['NUMBER']) - tile_vign = np.copy(tile_cat.get_data()['VIGNET']) - tile_ra = np.copy(tile_cat.get_data()['XWIN_WORLD']) - tile_dec = np.copy(tile_cat.get_data()['YWIN_WORLD']) + obj_id = np.copy(tile_cat.get_data()["NUMBER"]) + tile_vign = np.copy(tile_cat.get_data()["VIGNET"]) + tile_ra = np.copy(tile_cat.get_data()["XWIN_WORLD"]) + tile_dec = np.copy(tile_cat.get_data()["YWIN_WORLD"]) tile_cat.close() f_wcs_file = SqliteDict(self._f_wcs_path) @@ -362,6 +367,7 @@ def process(self): id_first = -1 id_last = -1 + self._w_log.info(f"Processing objects # {self._id_obj_min} ... {self._id_obj_max}") for i_tile, id_tmp in enumerate(obj_id): if self._id_obj_min > 0 and id_tmp < self._id_obj_min: @@ -372,8 +378,7 @@ def process(self): if id_first == -1: id_first = id_tmp id_last = id_tmp - - count = count + 1 + str_id_tmp = str(id_tmp) gal_vign = [] psf_vign = [] @@ -381,70 +386,94 @@ def process(self): weight_vign = [] flag_vign = [] jacob_list = [] - if ( - (psf_vign_cat[str(id_tmp)] == 'empty') - or (gal_vign_cat[str(id_tmp)] == 'empty') - ): + if psf_vign_cat[str_id_tmp] == "empty": + self._w_log.info(f"Skipping object {id_tmp}: empty PSF vignet") continue + + self.check_key(str_id_tmp, gal_vign_cat, self._gal_vignet_path) + self.check_key(str_id_tmp, bkg_vign_cat, self._bkg_vignet_path) + self.check_key(str_id_tmp, flag_vign_cat, self._flag_vignet_path) + self.check_key(str_id_tmp, weight_vign_cat, self._weight_vignet_path) + if gal_vign_cat[str_id_tmp] == "empty": + self._w_log.info( + f"Skipping object {id_tmp}: empty galaxy vignet" + ) + continue + psf_expccd_name = list(psf_vign_cat[str(id_tmp)].keys()) for expccd_name_tmp in psf_expccd_name: - exp_name, ccd_n = re.split('-', expccd_name_tmp) - gal_vign_tmp = ( - gal_vign_cat[str(id_tmp)][expccd_name_tmp]['VIGNET'] - ) + self.check_key(expccd_name_tmp, gal_vign_cat[str_id_tmp], self._gal_vignet_path) + self.check_key(expccd_name_tmp, bkg_vign_cat[str_id_tmp], self._bkg_vignet_path) + self.check_key(expccd_name_tmp, flag_vign_cat[str_id_tmp], self._flag_vignet_path) + self.check_key(expccd_name_tmp, weight_vign_cat[str_id_tmp], self._weight_vignet_path) + + exp_name, ccd_n = re.split("-", expccd_name_tmp) + + gal_vign_tmp = gal_vign_cat[str_id_tmp][expccd_name_tmp][ + "VIGNET" + ] if len(np.where(gal_vign_tmp.ravel() == 0)[0]) != 0: + self._w_log.info( + f"Skipping exp {expccd_name_tmp} for object {id_tmp}: zero-length galaxy vignet" + ) continue - bkg_vign_tmp = ( - bkg_vign_cat[str(id_tmp)][expccd_name_tmp]['VIGNET'] - ) + bkg_vign_tmp = bkg_vign_cat[str_id_tmp][expccd_name_tmp][ + "VIGNET" + ] gal_vign_sub_bkg = gal_vign_tmp - bkg_vign_tmp - tile_vign_tmp = ( - Ngmix.MegaCamFlip(np.copy(tile_vign[i_tile]), int(ccd_n)) + tile_vign_tmp = Ngmix.MegaCamFlip( + np.copy(tile_vign[i_tile]), int(ccd_n) ) - flag_vign_tmp = ( - flag_vign_cat[str(id_tmp)][expccd_name_tmp]['VIGNET'] - ) + flag_vign_tmp = flag_vign_cat[str_id_tmp][expccd_name_tmp][ + "VIGNET" + ] flag_vign_tmp[np.where(tile_vign_tmp == -1e30)] = 2**10 v_flag_tmp = flag_vign_tmp.ravel() if len(np.where(v_flag_tmp != 0)[0]) / (51 * 51) > 1 / 3.0: + self._w_log.info( + f"Skipping exp {expccd_name_tmp} for object {id_tmp}: mask > 1/3" + ) continue - weight_vign_tmp = ( - weight_vign_cat[str(id_tmp)][expccd_name_tmp]['VIGNET'] - ) + weight_vign_tmp = weight_vign_cat[str_id_tmp][expccd_name_tmp][ + "VIGNET" + ] jacob_tmp = get_jacob( - f_wcs_file[exp_name][int(ccd_n)]['WCS'], + f_wcs_file[exp_name][int(ccd_n)]["WCS"], tile_ra[i_tile], - tile_dec[i_tile] + tile_dec[i_tile], ) header_tmp = fits.Header.fromstring( - f_wcs_file[exp_name][int(ccd_n)]['header'] + f_wcs_file[exp_name][int(ccd_n)]["header"] ) - Fscale = header_tmp['FSCALE'] + Fscale = header_tmp["FSCALE"] gal_vign_scaled = gal_vign_sub_bkg * Fscale - weight_vign_scaled = weight_vign_tmp * 1 / Fscale ** 2 + weight_vign_scaled = weight_vign_tmp * 1 / Fscale**2 gal_vign.append(gal_vign_scaled) psf_vign.append( - psf_vign_cat[str(id_tmp)][expccd_name_tmp]['VIGNET'] + psf_vign_cat[str_id_tmp][expccd_name_tmp]["VIGNET"] ) sigma_psf.append( - psf_vign_cat[ - str(id_tmp) - ][expccd_name_tmp]['SHAPES']['SIGMA_PSF_HSM'] + psf_vign_cat[str_id_tmp][expccd_name_tmp]["SHAPES"][ + "SIGMA_PSF_HSM" + ] ) weight_vign.append(weight_vign_scaled) flag_vign.append(flag_vign_tmp) jacob_list.append(jacob_tmp) if len(gal_vign) == 0: + self._w_log.info( + f"Skipping object {id_tmp}: no exposure vignets added" + ) continue try: res = do_ngmix_metacal( @@ -455,21 +484,23 @@ def process(self): flag_vign, jacob_list, prior, - self._pixel_scale + self._pixel_scale, ) except Exception as ee: self._w_log.info( - f'ngmix failed for object ID={id_tmp}.\nMessage: {ee}' + f"ngmix failed for object ID={id_tmp}.\nMessage: {ee}" ) continue - res['obj_id'] = id_tmp - res['n_epoch_model'] = len(gal_vign) + count = count + 1 + + res["obj_id"] = id_tmp + res["n_epoch_model"] = len(gal_vign) final_res.append(res) self._w_log.info( - f'ngmix loop over objects finished, processed {count} ' - + f'objects, id first/last={id_first}/{id_last}' + f"ngmix loop over objects finished, measured {count} " + + f"objects, id first/last={id_first}/{id_last}" ) f_wcs_file.close() @@ -489,11 +520,11 @@ def process(self): def get_guess( img, pixel_scale, - guess_flux_unit='img', - guess_size_type='T', - guess_size_unit='sky', + guess_flux_unit="img", + guess_size_type="T", + guess_size_unit="sky", guess_centroid=True, - guess_centroid_unit='sky' + guess_centroid_unit="sky", ): r"""Get Guess. @@ -543,61 +574,56 @@ def get_guess( error_msg = hsm_shape.error_message - if error_msg != '': + if error_msg != "": raise galsim.hsm.GalSimHSMError( - f'Error in adaptive moments :\n{error_msg}' + f"Error in adaptive moments :\n{error_msg}" ) - if guess_flux_unit == 'img': + if guess_flux_unit == "img": guess_flux = hsm_shape.moments_amp - elif guess_flux_unit == 'sky': - guess_flux = hsm_shape.moments_amp / pixel_scale ** 2 + elif guess_flux_unit == "sky": + guess_flux = hsm_shape.moments_amp / pixel_scale**2 else: raise ValueError( - f'invalid guess_flux_unit \'{guess_flux_unit}\',' - + ' must be one of \'img\', \'sky\'' + f"invalid guess_flux_unit '{guess_flux_unit}'," + + " must be one of 'img', 'sky'" ) - if guess_size_unit == 'img': - size_unit = 1. - elif guess_size_unit == 'sky': + if guess_size_unit == "img": + size_unit = 1.0 + elif guess_size_unit == "sky": size_unit = pixel_scale else: raise ValueError( - 'invalid guess_size_unit \'{guess_size_unit}\',' - + 'must be one of \'img\', \'sky\'' + "invalid guess_size_unit '{guess_size_unit}'," + + "must be one of 'img', 'sky'" ) - if guess_size_type == 'sigma': + if guess_size_type == "sigma": guess_size = hsm_shape.moments_sigma * size_unit - elif guess_size_type == 'T': + elif guess_size_type == "T": guess_size = 2 * (hsm_shape.moments_sigma * size_unit) ** 2 - if guess_centroid_unit == 'img': + if guess_centroid_unit == "img": centroid_unit = 1 - elif guess_centroid_unit == 'sky': + elif guess_centroid_unit == "sky": centroid_unit = pixel_scale else: raise ValueError( - f'invalid guess_centroid_unit \'{guess_centroid_unit}\',' - + ' must be one of \'img\', \'sky\'' + f"invalid guess_centroid_unit '{guess_centroid_unit}'," + + " must be one of 'img', 'sky'" ) if guess_centroid: guess_centroid = ( - (hsm_shape.moments_centroid - galsim_img.center) * centroid_unit - ) + hsm_shape.moments_centroid - galsim_img.center + ) * centroid_unit else: guess_centroid = galsim_img.center * centroid_unit - guess = np.array([ - guess_centroid.x, - guess_centroid.y, - 0., - 0., - guess_size, - guess_flux - ]) + guess = np.array( + [guess_centroid.x, guess_centroid.y, 0.0, 0.0, guess_size, guess_flux] + ) return guess @@ -637,8 +663,8 @@ def make_galsimfit(obs, model, guess0, prior=None, ntry=5): fres = {} for it in range(ntry): guess[0:5] += urand(low=-limit, high=limit) - guess[5:] *= (1 + urand(low=-limit, high=limit)) - fres['flags'] = 1 + guess[5:] *= 1 + urand(low=-limit, high=limit) + fres["flags"] = 1 try: fitter = ngmix.galsimfit.GalsimSimple( obs, @@ -650,15 +676,15 @@ def make_galsimfit(obs, model, guess0, prior=None, ntry=5): except Exception: continue - if fres['flags'] == 0: + if fres["flags"] == 0: break - if fres['flags'] != 0: + if fres["flags"] != 0: raise ngmix.gexceptions.BootGalFailure( - 'Failed to fit galaxy image with galsimfit' + "Failed to fit galaxy image with galsimfit" ) - fres['ntry'] = it + 1 + fres["ntry"] = it + 1 return fres @@ -730,9 +756,7 @@ def get_noise(gal, weight, guess, pixel_scale, thresh=1.2): gauss_win = galsim.Gaussian(sigma=np.sqrt(guess[4] / 2), flux=guess[5]) gauss_win = gauss_win.shear(g1=guess[2], g2=guess[3]) gauss_win = gauss_win.drawImage( - nx=img_shape[0], - ny=img_shape[1], - scale=pixel_scale + nx=img_shape[0], ny=img_shape[1], scale=pixel_scale ).array m_weight = weight[gauss_win < thresh * sig_tmp] != 0 @@ -743,14 +767,7 @@ def get_noise(gal, weight, guess, pixel_scale, thresh=1.2): def do_ngmix_metacal( - gals, - psfs, - psfs_sigma, - weights, - flags, - jacob_list, - prior, - pixel_scale + gals, psfs, psfs_sigma, weights, flags, jacob_list, prior, pixel_scale ): """Do Ngmix Metacal. @@ -791,10 +808,10 @@ def do_ngmix_metacal( gal_obs_list = ObsList() T_guess_psf = [] psf_res_gT = { - 'g_PSFo': np.array([0., 0.]), - 'g_err_PSFo': np.array([0., 0.]), - 'T_PSFo': 0., - 'T_err_PSFo': 0. + "g_PSFo": np.array([0.0, 0.0]), + "g_err_PSFo": np.array([0.0, 0.0]), + "T_PSFo": 0.0, + "T_err_PSFo": 0.0, } gal_guess = [] gal_guess_flag = True @@ -804,7 +821,7 @@ def do_ngmix_metacal( psf_jacob = ngmix.Jacobian( row=(psfs[0].shape[0] - 1) / 2, col=(psfs[0].shape[1] - 1) / 2, - wcs=jacob_list[n_e] + wcs=jacob_list[n_e], ) psf_obs = Observation(psfs[n_e], jacobian=psf_jacob) @@ -812,31 +829,29 @@ def do_ngmix_metacal( psf_T = psfs_sigma[n_e] * 1.17741 * pixel_scale weight_map = np.copy(weights[n_e]) - weight_map[np.where(flags[n_e] != 0)] = 0. + weight_map[np.where(flags[n_e] != 0)] = 0.0 weight_map[weight_map != 0] = 1 - psf_guess = np.array([0., 0., 0., 0., psf_T, 1.]) + psf_guess = np.array([0.0, 0.0, 0.0, 0.0, psf_T, 1.0]) try: - psf_res = make_galsimfit(psf_obs, 'gauss', psf_guess) + psf_res = make_galsimfit(psf_obs, "gauss", psf_guess) except Exception: continue # Gal guess try: gal_guess_tmp = get_guess( - gals[n_e], - pixel_scale, - guess_size_type='sigma' + gals[n_e], pixel_scale, guess_size_type="sigma" ) except Exception: gal_guess_flag = False - gal_guess_tmp = np.array([0., 0., 0., 0., 1, 100]) + gal_guess_tmp = np.array([0.0, 0.0, 0.0, 0.0, 1, 100]) # Recenter jacobian if necessary gal_jacob = ngmix.Jacobian( row=(gals[0].shape[0] - 1) / 2 + gal_guess_tmp[0], col=(gals[0].shape[1] - 1) / 2 + gal_guess_tmp[1], - wcs=jacob_list[n_e] + wcs=jacob_list[n_e], ) # Noise handling @@ -854,20 +869,19 @@ def do_ngmix_metacal( noise_img_gal = np.random.randn(*gals[n_e].shape) * sig_noise gal_masked = np.copy(gals[n_e]) - if (len(np.where(weight_map == 0)[0]) != 0): + if len(np.where(weight_map == 0)[0]) != 0: gal_masked[weight_map == 0] = noise_img_gal[weight_map == 0] - weight_map *= 1 / sig_noise ** 2 + weight_map *= 1 / sig_noise**2 # Original PSF fit w_tmp = np.sum(weight_map) - psf_res_gT['g_PSFo'] += psf_res['g'] * w_tmp - psf_res_gT['g_err_PSFo'] += np.array([ - psf_res['pars_err'][2], - psf_res['pars_err'][3] - ]) * w_tmp - psf_res_gT['T_PSFo'] += psf_res['T'] * w_tmp - psf_res_gT['T_err_PSFo'] += psf_res['T_err'] * w_tmp + psf_res_gT["g_PSFo"] += psf_res["g"] * w_tmp + psf_res_gT["g_err_PSFo"] += ( + np.array([psf_res["pars_err"][2], psf_res["pars_err"][3]]) * w_tmp + ) + psf_res_gT["T_PSFo"] += psf_res["T"] * w_tmp + psf_res_gT["T_err_PSFo"] += psf_res["T_err"] * w_tmp wsum += w_tmp gal_obs = Observation( @@ -875,7 +889,7 @@ def do_ngmix_metacal( weight=weight_map, jacobian=gal_jacob, psf=psf_obs, - noise=noise_img + noise=noise_img, ) if gal_guess_flag: @@ -887,7 +901,7 @@ def do_ngmix_metacal( gal_guess_flag = True if wsum == 0: - raise ZeroDivisionError('Sum of weights = 0, division by zero') + raise ZeroDivisionError("Sum of weights = 0, division by zero") # Normalize PSF fit output for key in psf_res_gT.keys(): @@ -897,22 +911,22 @@ def do_ngmix_metacal( fail_get_guess = False if len(gal_guess) == 0: fail_get_guess = True - gal_pars = [0., 0., 0., 0., 1, 100] + gal_pars = [0.0, 0.0, 0.0, 0.0, 1, 100] else: gal_pars = np.mean(gal_guess, 0) - psf_model = 'gauss' - gal_model = 'gauss' + psf_model = "gauss" + gal_model = "gauss" # metacal specific parameters metacal_pars = { - 'types': ['noshear', '1p', '1m', '2p', '2m'], - 'step': 0.01, - 'psf': 'gauss', - 'fixnoise': True, - 'cheatnoise': False, - 'symmetrize_psf': False, - 'use_noise_image': True + "types": ["noshear", "1p", "1m", "2p", "2m"], + "step": 0.01, + "psf": "gauss", + "fixnoise": True, + "cheatnoise": False, + "symmetrize_psf": False, + "use_noise_image": True, } Tguess = np.mean(T_guess_psf) @@ -921,25 +935,22 @@ def do_ngmix_metacal( ntry = 2 obs_dict_mcal = ngmix.metacal.get_all_metacal(gal_obs_list, **metacal_pars) - res = {'mcal_flags': 0} + res = {"mcal_flags": 0} ntry = 5 for key in sorted(obs_dict_mcal): fres = make_galsimfit( - obs_dict_mcal[key], - gal_model, - gal_pars, - prior=prior + obs_dict_mcal[key], gal_model, gal_pars, prior=prior ) - res['mcal_flags'] |= fres['flags'] + res["mcal_flags"] |= fres["flags"] tres = {} for name in fres.keys(): tres[name] = fres[name] - tres['flags'] = fres['flags'] + tres["flags"] = fres["flags"] wsum = 0 Tpsf_sum = 0 @@ -947,29 +958,29 @@ def do_ngmix_metacal( npsf = 0 for obs in obs_dict_mcal[key]: - if hasattr(obs, 'psf_nopix'): + if hasattr(obs, "psf_nopix"): try: psf_res = make_galsimfit( obs.psf_nopix, psf_model, - np.array([0., 0., 0., 0., Tguess, 1.]), - ntry=ntry + np.array([0.0, 0.0, 0.0, 0.0, Tguess, 1.0]), + ntry=ntry, ) except Exception: continue - g1, g2 = psf_res['g'] - T = psf_res['T'] + g1, g2 = psf_res["g"] + T = psf_res["T"] else: try: psf_res = make_galsimfit( obs.psf, psf_model, - np.array([0., 0., 0., 0., Tguess, 1.]), + np.array([0.0, 0.0, 0.0, 0.0, Tguess, 1.0]), ) except Exception: continue - g1, g2 = psf_res['g'] - T = psf_res['T'] + g1, g2 = psf_res["g"] + T = psf_res["T"] # TODO we sometimes use other weights twsum = obs.weight.sum() @@ -980,8 +991,8 @@ def do_ngmix_metacal( Tpsf_sum += T * twsum npsf += 1 - tres['gpsf'] = gpsf_sum / wsum - tres['Tpsf'] = Tpsf_sum / wsum + tres["gpsf"] = gpsf_sum / wsum + tres["Tpsf"] = Tpsf_sum / wsum res[key] = tres @@ -989,6 +1000,6 @@ def do_ngmix_metacal( metacal_res = res metacal_res.update(psf_res_gT) - metacal_res['moments_fail'] = fail_get_guess + metacal_res["moments_fail"] = fail_get_guess return metacal_res diff --git a/shapepipe/modules/ngmix_runner.py b/shapepipe/modules/ngmix_runner.py index 432008793..9c2c5ca08 100644 --- a/shapepipe/modules/ngmix_runner.py +++ b/shapepipe/modules/ngmix_runner.py @@ -11,22 +11,22 @@ @module_runner( - version='0.0.1', + version="0.0.1", input_module=[ - 'sextractor_runner', - 'psfex_interp_runner', - 'vignetmaker_runner' + "sextractor_runner", + "psfex_interp_runner", + "vignetmaker_runner", ], file_pattern=[ - 'tile_sexcat', - 'image', - 'exp_background', - 'galaxy_psf', - 'weight', - 'flag' + "tile_sexcat", + "image", + "exp_background", + "galaxy_psf", + "weight", + "flag", ], - file_ext=['.fits', '.sqlite', '.sqlite', '.sqlite', '.sqlite', '.sqlite'], - depends=['numpy', 'ngmix', 'galsim', 'sqlitedict', 'astropy'], + file_ext=[".fits", ".sqlite", ".sqlite", ".sqlite", ".sqlite", ".sqlite"], + depends=["numpy", "ngmix", "galsim", "sqlitedict", "astropy"], ) def ngmix_runner( input_file_list, @@ -40,22 +40,22 @@ def ngmix_runner( # Read config file entries # Photometric zero point - zero_point = config.getfloat(module_config_sec, 'MAG_ZP') + zero_point = config.getfloat(module_config_sec, "MAG_ZP") # Pixel scale - pixel_scale = config.getfloat(module_config_sec, 'PIXEL_SCALE') + pixel_scale = config.getfloat(module_config_sec, "PIXEL_SCALE") # Path to merged single-exposure single-HDU headers - f_wcs_path = config.getexpanded(module_config_sec, 'LOG_WCS') + f_wcs_path = config.getexpanded(module_config_sec, "LOG_WCS") # First and last galaxy ID to process - id_obj_min = config.getint(module_config_sec, 'ID_OBJ_MIN') - id_obj_max = config.getint(module_config_sec, 'ID_OBJ_MAX') + id_obj_min = config.getint(module_config_sec, "ID_OBJ_MIN") + id_obj_max = config.getint(module_config_sec, "ID_OBJ_MAX") # Initialise class instance ngmix_inst = Ngmix( input_file_list, - run_dirs['output'], + run_dirs["output"], file_number_string, zero_point, pixel_scale, @@ -66,7 +66,9 @@ def ngmix_runner( ) # Process ngmix shape measurement and metacalibration + w_log.info("ngmix processing start") ngmix_inst.process() + w_log.info("ngmix end") # No return objects return None, None diff --git a/shapepipe/modules/pastecat_package/__init__.py b/shapepipe/modules/pastecat_package/__init__.py index 62838d8e4..b5bcfdcc0 100644 --- a/shapepipe/modules/pastecat_package/__init__.py +++ b/shapepipe/modules/pastecat_package/__init__.py @@ -32,4 +32,4 @@ """ -__all__ = ['pastecat'] +__all__ = ["pastecat"] diff --git a/shapepipe/modules/pastecat_package/pastecat.py b/shapepipe/modules/pastecat_package/pastecat.py index c1a4b07c6..35941018a 100644 --- a/shapepipe/modules/pastecat_package/pastecat.py +++ b/shapepipe/modules/pastecat_package/pastecat.py @@ -49,7 +49,7 @@ def __init__( w_log, ext_name=None, check_col_name=None, - hdu_no=None + hdu_no=None, ): self._input_file_list = input_file_list @@ -71,12 +71,12 @@ def process(self): # Create output catalogue pasted_cat = file_io.FITSCatalogue( self._output_path, - open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite + open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite, ) for idx, input_file in enumerate(self._input_file_list): - self._w_log.info(f'Pasting catalogue \'{input_file}\'') + self._w_log.info(f"Pasting catalogue '{input_file}'") # Read input data cat = file_io.FITSCatalogue(input_file) @@ -90,18 +90,18 @@ def process(self): if idx > 0: if self._check_col_name not in col_names: raise KeyError( - f'CHECK_COL_NAME key \'{self._check_col_name}\'' - + 'not found in input catalogue' + f"CHECK_COL_NAME key '{self._check_col_name}'" + + "not found in input catalogue" ) if not ( data[self._check_col_name] == data_prev[self._check_col_name] ).all(): raise Exception( - f'Column check using key' - + '\'{self._check_col_name}\'' - + 'failed for input catalogues ' - + f'#{idx - 1} and #{idx}' + f"Column check using key" + + "'{self._check_col_name}'" + + "failed for input catalogues " + + f"#{idx - 1} and #{idx}" ) data_prev = data diff --git a/shapepipe/modules/pastecat_runner.py b/shapepipe/modules/pastecat_runner.py index 247a44f46..4f659bffa 100644 --- a/shapepipe/modules/pastecat_runner.py +++ b/shapepipe/modules/pastecat_runner.py @@ -11,12 +11,12 @@ @module_runner( - version='1.1', - input_module='sextractor_runner', - file_pattern='tile_sexcat', - file_ext='.fits', - depends=['numpy', 'astropy'], - run_method='parallel', + version="1.1", + input_module="sextractor_runner", + file_pattern="tile_sexcat", + file_ext=".fits", + depends=["numpy", "astropy"], + run_method="parallel", ) def paste_cat_runner( input_file_list, @@ -28,48 +28,44 @@ def paste_cat_runner( ): """Define The Paste Catalogue Runner.""" # Get config options - if config.has_option(module_config_sec, 'CHECK_COL_NAME'): - check_col_name = config.get(module_config_sec, 'CHECK_COL_NAME') + if config.has_option(module_config_sec, "CHECK_COL_NAME"): + check_col_name = config.get(module_config_sec, "CHECK_COL_NAME") else: check_col_name = None - if config.has_option(module_config_sec, 'HDU'): - tmp = config.getlist(module_config_sec, 'HDU') + if config.has_option(module_config_sec, "HDU"): + tmp = config.getlist(module_config_sec, "HDU") hdu_no = [int(idx) for idx in tmp] if len(hdu_no) != len(input_file_list): raise IndexError( - 'Different lengths for input file list ' - + f'({len(input_file_list)}) and HDU ({len(hdu_no)}).' + "Different lengths for input file list " + + f"({len(input_file_list)}) and HDU ({len(hdu_no)})." ) else: hdu_no = None - if config.has_option(module_config_sec, 'PREFIX'): - prefix = config.get( - module_config_sec, - 'PREFIX' - ) + if config.has_option(module_config_sec, "PREFIX"): + prefix = config.get(module_config_sec, "PREFIX") else: - prefix = 'cat_pasted' + prefix = "cat_pasted" - if config.has_option(module_config_sec, 'EXT_NAME'): - ext_name_list = config.getlist(module_config_sec, 'EXT_NAME') + if config.has_option(module_config_sec, "EXT_NAME"): + ext_name_list = config.getlist(module_config_sec, "EXT_NAME") if len(ext_name_list) != len(input_file_list): raise ValueError( - f'Input file list length ({len(input_file_list)}) ' - + f'and EXT_NAME list ({len(ext_name_list)})' - + 'need to be equal.' + f"Input file list length ({len(input_file_list)}) " + + f"and EXT_NAME list ({len(ext_name_list)})" + + "need to be equal." ) else: ext_name_list = None # Set file extension - file_ext = 'fits' + file_ext = "fits" # Set output path output_path = ( - f'{run_dirs["output"]}/{prefix}' - + f'{file_number_string}.{file_ext}' + f'{run_dirs["output"]}/{prefix}' + f"{file_number_string}.{file_ext}" ) # Create rand cat class instance @@ -79,7 +75,7 @@ def paste_cat_runner( w_log, ext_name=ext_name_list, check_col_name=check_col_name, - hdu_no=hdu_no + hdu_no=hdu_no, ) # Run processing diff --git a/shapepipe/modules/psfex_interp_package/__init__.py b/shapepipe/modules/psfex_interp_package/__init__.py index afda4d2e2..1c3b51ca4 100644 --- a/shapepipe/modules/psfex_interp_package/__init__.py +++ b/shapepipe/modules/psfex_interp_package/__init__.py @@ -43,4 +43,4 @@ """ -__all__ = ['psfex_interp'] +__all__ = ["psfex_interp"] diff --git a/shapepipe/modules/psfex_interp_package/psfex_interp.py b/shapepipe/modules/psfex_interp_package/psfex_interp.py index 3ac1b25ea..dc18a0339 100644 --- a/shapepipe/modules/psfex_interp_package/psfex_interp.py +++ b/shapepipe/modules/psfex_interp_package/psfex_interp.py @@ -2,7 +2,7 @@ This module computes the PSFs from a PSFEx model at several galaxy positions. -:Authors: Morgan Schmitz and Axel Guinot +:Authors: Morgan Schmitz, Axel Guinot, Martin Kilbinger """ @@ -24,86 +24,9 @@ import_fail = False -NOT_ENOUGH_STARS = 'Fail_stars' -BAD_CHI2 = 'Fail_chi2' -FILE_NOT_FOUND = 'File_not_found' - - -def interpsfex(dotpsfpath, pos, thresh_star, thresh_chi2): - """Interpolate PSFEx. - - Use PSFEx generated model to perform spatial PSF interpolation. - - Parameters - ---------- - dotpsfpath : str - Path to ``.psf`` file (PSFEx output) - pos : numpy.ndarray - Positions where the PSF model should be evaluated - thresh_star : int - Threshold of stars under which the PSF is not interpolated - thresh_chi2 : int - Threshold for chi squared - - Returns - ------- - numpy.ndarray - Array of PSFs, each row is the PSF image at the corresponding position - requested - - """ - if not os.path.exists(dotpsfpath): - return FILE_NOT_FOUND - - # read PSF model and extract basis and polynomial degree and scale position - PSF_model = fits.open(dotpsfpath)[1] - - # Check number of stars used to compute the PSF - if PSF_model.header['ACCEPTED'] < thresh_star: - return NOT_ENOUGH_STARS - if PSF_model.header['CHI2'] > thresh_chi2: - return BAD_CHI2 - - PSF_basis = np.array(PSF_model.data)[0][0] - try: - deg = PSF_model.header['POLDEG1'] - except KeyError: - # constant PSF model - return PSF_basis[0, :, :] - - # scale coordinates - x_interp, x_scale = ( - PSF_model.header['POLZERO1'], - PSF_model.header['POLSCAL1'] - ) - y_interp, y_scale = ( - PSF_model.header['POLZERO2'], - PSF_model.header['POLSCAL2'] - - ) - xs, ys = (pos[:, 0] - x_interp) / x_scale, (pos[:, 1] - y_interp) / y_scale - - # compute polynomial coefficients - coeffs = np.array([[x ** idx for idx in range(deg + 1)] for x in xs]) - cross_coeffs = np.array([ - np.concatenate([ - [(x ** idx_j) * (y ** idx_i) for idx_j in range(deg - idx_i + 1)] - for idx_i in range(1, deg + 1) - ]) - for x, y in zip(xs, ys) - ]) - coeffs = np.hstack((coeffs, cross_coeffs)) - - # compute interpolated PSF - PSFs = np.array([ - np.sum( - [coeff * atom for coeff, atom in zip(coeffs_posi, PSF_basis)], - axis=0, - ) - for coeffs_posi in coeffs - ]) - - return PSFs +NOT_ENOUGH_STARS = "Fail_stars" +BAD_CHI2 = "Fail_chi2" +FILE_NOT_FOUND = "File_not_found" class PSFExInterpolator(object): @@ -115,7 +38,7 @@ class PSFExInterpolator(object): Parameters ---------- dotpsf_path : str - Path to PSFEx output file + Path to PSFEx output file; can be `None` in multi-epoch mode galcat_path : str Path to SExtractor-like galaxy catalogue output_path : str @@ -151,22 +74,22 @@ def __init__( ): # Path to PSFEx output file - if ( - isinstance(dotpsf_path, type(None)) - or os.path.isfile(dotpsf_path) + self._dotpsf_path = dotpsf_path + if not isinstance(dotpsf_path, type(None)) and not os.path.isfile( + dotpsf_path ): - self._dotpsf_path = dotpsf_path - else: - raise ValueError(f'Cound not find file {dotpsf_path}.') + raise ValueError(f"Cound not find file {dotpsf_path}.") + # Path to catalogue containing galaxy positions if os.path.isfile(galcat_path): self._galcat_path = galcat_path else: - raise ValueError(f'Cound not find file {galcat_path}.') + raise ValueError(f"Cound not find file {galcat_path}.") + # Path to output file to be written - self._output_path = output_path + '/galaxy_psf' + self._output_path = output_path + "/galaxy_psf" # Path to output file to be written for validation - self._output_path_validation = output_path + '/validation_psf' + self._output_path_validation = output_path + "/validation_psf" # if required, compute and save shapes self._compute_shape = get_shapes # Number of stars under which we don't interpolate the PSF @@ -182,8 +105,8 @@ def __init__( if pos_params: if not len(pos_params) == 2: raise ValueError( - f'{len(pos_params)} position parameters were passed on; ' - + 'there should be exactly two.' + f"{len(pos_params)} position parameters were passed on; " + + "there should be exactly two." ) self._pos_params = pos_params else: @@ -210,21 +133,18 @@ def process(self): and self.interp_PSFs == NOT_ENOUGH_STARS ): self._w_log.info( - 'Not enough stars to interpolate the psf in the file ' - + f'{self._dotpsf_path}.' + "Not enough stars to interpolate the psf in the file " + + f"{self._dotpsf_path}." ) - elif ( - isinstance(self.interp_PSFs, str) - and self.interp_PSFs == BAD_CHI2 - ): + elif isinstance(self.interp_PSFs, str) and self.interp_PSFs == BAD_CHI2: self._w_log.info( - f'Bad chi2 for the psf model in the file {self._dotpsf_path}.' + f"Bad chi2 for the psf model in the file {self._dotpsf_path}." ) elif ( isinstance(self.interp_PSFs, str) and self.interp_PSFs == FILE_NOT_FOUND ): - self._w_log.info(f'Psf model file {self._dotpsf_path} not found.') + self._w_log.info(f"Psf model file {self._dotpsf_path} not found.") else: if self._compute_shape: self._get_psfshapes() @@ -240,8 +160,8 @@ def _get_position_parameters(self): dotpsf = file_io.FITSCatalogue(self._dotpsf_path) dotpsf.open() self._pos_params = [ - dotpsf.get_header()['POLNAME1'], - dotpsf.get_header()['POLNAME2'] + dotpsf.get_header()["POLNAME1"], + dotpsf.get_header()["POLNAME2"], ] dotpsf.close() @@ -258,28 +178,125 @@ def _get_galaxy_positions(self): galcat.open() try: - self.gal_pos = np.array([ - [x, y] for x, y in zip( - galcat.get_data()[self._pos_params[0]], - galcat.get_data()[self._pos_params[1]] - ) - ]) + self.gal_pos = np.array( + [ + [x, y] + for x, y in zip( + galcat.get_data()[self._pos_params[0]], + galcat.get_data()[self._pos_params[1]], + ) + ] + ) self._w_log.info( - f'Read {self.gal_pos.shape[0]} positions from galaxy catalog' + f"Read {self.gal_pos.shape[0]} positions from galaxy catalog" ) except KeyError as detail: # extract erroneous position parameter from original exception err_pos_param = detail.args[0][4:-15] pos_param_err = ( - f'Required position parameter {err_pos_param}' - + 'was not found in galaxy catalog. Leave ' - + 'pos_params (or EXTRA_CODE_OPTION) blank to ' - + 'read them from .psf file.' + f"Required position parameter {err_pos_param}" + + "was not found in galaxy catalog. Leave " + + "pos_params (or EXTRA_CODE_OPTION) blank to " + + "read them from .psf file." ) raise KeyError(pos_param_err) galcat.close() + def interpsfex(self, dotpsfpath, pos): + """Interpolate PSFEx. + + Use PSFEx generated model to perform spatial PSF interpolation. + + Parameters + ---------- + dotpsfpath : str + Path to ``.psf`` file (PSFEx output) + pos : numpy.ndarray + Positions where the PSF model should be evaluated + + Returns + ------- + numpy.ndarray + Array of PSFs, each row is the PSF image at the corresponding position + requested + + """ + if not os.path.exists(dotpsfpath): + return FILE_NOT_FOUND + + # read PSF model and extract basis and polynomial degree and scale position + try: + PSF_model = fits.open(dotpsfpath)[1] + except OSError as err: + msg = f"Psf model file {dotpsfpath} empty or corrupt." + self._w_log.info(msg) + self._w_log.info(f"Error: {err=}, {type(err)=}") + raise + + # Check number of stars used to compute the PSF + thresh_star = self._star_thresh + thresh_chi2 = self._chi2_thresh + + if PSF_model.header["ACCEPTED"] < thresh_star: + return NOT_ENOUGH_STARS + if PSF_model.header["CHI2"] > thresh_chi2: + return BAD_CHI2 + + PSF_basis = np.array(PSF_model.data)[0][0] + try: + deg = PSF_model.header["POLDEG1"] + except KeyError: + # constant PSF model + return PSF_basis[0, :, :] + + # scale coordinates + x_interp, x_scale = ( + PSF_model.header["POLZERO1"], + PSF_model.header["POLSCAL1"], + ) + y_interp, y_scale = ( + PSF_model.header["POLZERO2"], + PSF_model.header["POLSCAL2"], + ) + xs, ys = (pos[:, 0] - x_interp) / x_scale, ( + pos[:, 1] - y_interp + ) / y_scale + + # compute polynomial coefficients + coeffs = np.array([[x**idx for idx in range(deg + 1)] for x in xs]) + cross_coeffs = np.array( + [ + np.concatenate( + [ + [ + (x**idx_j) * (y**idx_i) + for idx_j in range(deg - idx_i + 1) + ] + for idx_i in range(1, deg + 1) + ] + ) + for x, y in zip(xs, ys) + ] + ) + coeffs = np.hstack((coeffs, cross_coeffs)) + + # compute interpolated PSF + PSFs = np.array( + [ + np.sum( + [ + coeff * atom + for coeff, atom in zip(coeffs_posi, PSF_basis) + ], + axis=0, + ) + for coeffs_posi in coeffs + ] + ) + + return PSFs + def _interpolate(self): """Interpolate. @@ -287,11 +304,9 @@ def _interpolate(self): positions. """ - self.interp_PSFs = interpsfex( + self.interp_PSFs = self.interpsfex( self._dotpsf_path, self.gal_pos, - self._star_thresh, - self._chi2_thresh, ) def _get_psfshapes(self): @@ -301,22 +316,24 @@ def _get_psfshapes(self): """ if import_fail: - raise ImportError('Galsim is required to get shapes information') + raise ImportError("Galsim is required to get shapes information") psf_moms = [ hsm.FindAdaptiveMom(Image(psf), strict=False) for psf in self.interp_PSFs ] - self.psf_shapes = np.array([ + self.psf_shapes = np.array( [ - moms.observed_shape.g1, - moms.observed_shape.g2, - moms.moments_sigma, - int(bool(moms.error_message)) + [ + moms.observed_shape.g1, + moms.observed_shape.g2, + moms.moments_sigma, + int(bool(moms.error_message)), + ] + for moms in psf_moms ] - for moms in psf_moms - ]) + ) def _write_output(self): """Write Output. @@ -325,21 +342,21 @@ def _write_output(self): """ output = file_io.FITSCatalogue( - self._output_path + self._img_number + '.fits', + self._output_path + self._img_number + ".fits", open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite, SEx_catalogue=True, ) if self._compute_shape: data = { - 'VIGNET': self.interp_PSFs, - 'E1_PSF_HSM': self.psf_shapes[:, 0], - 'E2_PSF_HSM': self.psf_shapes[:, 1], - 'SIGMA_PSF_HSM': self.psf_shapes[:, 2], - 'FLAG_PSF_HSM': self.psf_shapes[:, 3].astype(int) + "VIGNET": self.interp_PSFs, + "E1_PSF_HSM": self.psf_shapes[:, 0], + "E2_PSF_HSM": self.psf_shapes[:, 1], + "SIGMA_PSF_HSM": self.psf_shapes[:, 2], + "FLAG_PSF_HSM": self.psf_shapes[:, 3].astype(int), } else: - data = {'VIGNET': self.interp_PSFs} + data = {"VIGNET": self.interp_PSFs} output.save_as_fits(data, sex_cat_path=self._galcat_path) def process_validation(self, psfex_cat_path): @@ -354,7 +371,7 @@ def process_validation(self, psfex_cat_path): """ if not os.path.isfile(psfex_cat_path): - raise ValueError(f'Cound not find file {psfex_cat_path}.') + raise ValueError(f"Cound not find file {psfex_cat_path}.") if self.gal_pos is None: self._get_galaxy_positions() @@ -367,21 +384,18 @@ def process_validation(self, psfex_cat_path): and self.interp_PSFs == NOT_ENOUGH_STARS ): self._w_log.info( - 'Not enough stars to interpolate the psf in the file ' - + f'{self._dotpsf_path}.' + "Not enough stars to interpolate the psf in the file " + + f"{self._dotpsf_path}." ) - elif ( - isinstance(self.interp_PSFs, str) - and self.interp_PSFs == BAD_CHI2 - ): + elif isinstance(self.interp_PSFs, str) and self.interp_PSFs == BAD_CHI2: self._w_log.info( - f'Bad chi2 for the psf model in the file {self._dotpsf_path}.' + f"Bad chi2 for the psf model in the file {self._dotpsf_path}." ) elif ( isinstance(self.interp_PSFs, str) and self.interp_PSFs == FILE_NOT_FOUND ): - self._w_log.info(f'Psf model file {self._dotpsf_path} not found.') + self._w_log.info(f"Psf model file {self._dotpsf_path} not found.") else: star_cat = file_io.FITSCatalogue( self._galcat_path, @@ -389,14 +403,14 @@ def process_validation(self, psfex_cat_path): ) star_cat.open() star_dict = {} - star_vign = np.copy(star_cat.get_data()['VIGNET']) - star_dict['NUMBER'] = np.copy(star_cat.get_data()['NUMBER']) - star_dict['X'] = np.copy(star_cat.get_data()['XWIN_IMAGE']) - star_dict['Y'] = np.copy(star_cat.get_data()['YWIN_IMAGE']) - star_dict['RA'] = np.copy(star_cat.get_data()['XWIN_WORLD']) - star_dict['DEC'] = np.copy(star_cat.get_data()['YWIN_WORLD']) - star_dict['MAG'] = np.copy(star_cat.get_data()['MAG_AUTO']) - star_dict['SNR'] = np.copy(star_cat.get_data()['SNR_WIN']) + star_vign = np.copy(star_cat.get_data()["VIGNET"]) + star_dict["NUMBER"] = np.copy(star_cat.get_data()["NUMBER"]) + star_dict["X"] = np.copy(star_cat.get_data()["XWIN_IMAGE"]) + star_dict["Y"] = np.copy(star_cat.get_data()["YWIN_IMAGE"]) + star_dict["RA"] = np.copy(star_cat.get_data()["XWIN_WORLD"]) + star_dict["DEC"] = np.copy(star_cat.get_data()["YWIN_WORLD"]) + star_dict["MAG"] = np.copy(star_cat.get_data()["MAG_AUTO"]) + star_dict["SNR"] = np.copy(star_cat.get_data()["SNR_WIN"]) star_cat.close() self._get_psfshapes() @@ -417,7 +431,7 @@ def _get_starshapes(self, star_vign): """ if import_fail: - raise ImportError('Galsim is required to get shapes information') + raise ImportError("Galsim is required to get shapes information") masks = np.zeros_like(star_vign) masks[np.where(star_vign == -1e30)] = 1 @@ -427,15 +441,17 @@ def _get_starshapes(self, star_vign): for star, mask in zip(star_vign, masks) ] - self.star_shapes = np.array([ + self.star_shapes = np.array( [ - moms.observed_shape.g1, - moms.observed_shape.g2, - moms.moments_sigma, - int(bool(moms.error_message)) + [ + moms.observed_shape.g1, + moms.observed_shape.g2, + moms.moments_sigma, + int(bool(moms.error_message)), + ] + for moms in star_moms ] - for moms in star_moms - ]) + ) def _get_psfexcatdict(self, psfex_cat_path): """Get PSFEx Catalogue Dictionary. @@ -457,18 +473,16 @@ def _get_psfexcatdict(self, psfex_cat_path): psfex_cat.open() psfex_cat_dict = {} - psfex_cat_dict['SOURCE_NUMBER'] = np.copy( - psfex_cat.get_data()['SOURCE_NUMBER'] - ) - psfex_cat_dict['DELTAX_IMAGE'] = np.copy( - psfex_cat.get_data()['DELTAX_IMAGE'] + psfex_cat_dict["SOURCE_NUMBER"] = np.copy( + psfex_cat.get_data()["SOURCE_NUMBER"] ) - psfex_cat_dict['DELTAY_IMAGE'] = np.copy( - psfex_cat.get_data()['DELTAY_IMAGE'] + psfex_cat_dict["DELTAX_IMAGE"] = np.copy( + psfex_cat.get_data()["DELTAX_IMAGE"] ) - psfex_cat_dict['CHI2_PSF'] = np.copy( - psfex_cat.get_data()['CHI2_PSF'] + psfex_cat_dict["DELTAY_IMAGE"] = np.copy( + psfex_cat.get_data()["DELTAY_IMAGE"] ) + psfex_cat_dict["CHI2_PSF"] = np.copy(psfex_cat.get_data()["CHI2_PSF"]) return psfex_cat_dict @@ -486,58 +500,58 @@ def _write_output_validation(self, star_dict, psfex_cat_dict): """ output = file_io.FITSCatalogue( - self._output_path_validation + self._img_number + '.fits', + self._output_path_validation + self._img_number + ".fits", open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite, SEx_catalogue=True, ) data = { - 'E1_PSF_HSM': self.psf_shapes[:, 0], - 'E2_PSF_HSM': self.psf_shapes[:, 1], - 'SIGMA_PSF_HSM': self.psf_shapes[:, 2], - 'FLAG_PSF_HSM': self.psf_shapes[:, 3].astype(int), - 'E1_STAR_HSM': self.star_shapes[:, 0], - 'E2_STAR_HSM': self.star_shapes[:, 1], - 'SIGMA_STAR_HSM': self.star_shapes[:, 2], - 'FLAG_STAR_HSM': self.star_shapes[:, 3].astype(int) + "E1_PSF_HSM": self.psf_shapes[:, 0], + "E2_PSF_HSM": self.psf_shapes[:, 1], + "SIGMA_PSF_HSM": self.psf_shapes[:, 2], + "FLAG_PSF_HSM": self.psf_shapes[:, 3].astype(int), + "E1_STAR_HSM": self.star_shapes[:, 0], + "E2_STAR_HSM": self.star_shapes[:, 1], + "SIGMA_STAR_HSM": self.star_shapes[:, 2], + "FLAG_STAR_HSM": self.star_shapes[:, 3].astype(int), } data = {**data, **star_dict} - data['ACCEPTED'] = np.ones_like(data['NUMBER'], dtype='int16') - star_used = psfex_cat_dict.pop('SOURCE_NUMBER') + data["ACCEPTED"] = np.ones_like(data["NUMBER"], dtype="int16") + star_used = psfex_cat_dict.pop("SOURCE_NUMBER") - for idx in range(len(data['NUMBER'])): + for idx in range(len(data["NUMBER"])): if idx + 1 not in star_used: - data['ACCEPTED'][idx] = 0 + data["ACCEPTED"][idx] = 0 output.save_as_fits(data, sex_cat_path=self._galcat_path) - def process_me(self, dot_psf_dir, dot_psf_pattern, f_wcs_path): + def process_me(self, dot_psf_dirs, dot_psf_pattern, f_wcs_path): """Process Multi-Epoch. - Process the multi-epoch. + Process multi-epoc PSF interpolation. Parameters ---------- - dot_psf_dir : str - Path to the directory containing the ``.psf`` files + dot_psf_dirs : list + Paths to the directory containing the ``.psf`` files dot_psf_pattern : str Common pattern of the ``.psf`` files f_wcs_path : str Path to the log file containing the WCS for each CCDs """ - if os.path.exists(dot_psf_dir): - self._dot_psf_dir = dot_psf_dir - else: - raise ValueError(f'Cound not find directory {dot_psf_dir}.') + if not any(os.path.exists(dot_psf_dir) for dot_psf_dir in dot_psf_dirs): + raise ValueError("Cound not find any dot psf directory.") + + self._dot_psf_dirs = dot_psf_dirs self._dot_psf_pattern = dot_psf_pattern if os.path.isfile(f_wcs_path): self._f_wcs_file = SqliteDict(f_wcs_path) else: - raise ValueError(f'Cound not find file {f_wcs_path}.') + raise ValueError(f"Cound not find file {f_wcs_path}.") if self.gal_pos is None: self._get_galaxy_positions() @@ -566,26 +580,28 @@ def _interpolate_me(self): cat = file_io.FITSCatalogue(self._galcat_path, SEx_catalogue=True) cat.open() - all_id = np.copy(cat.get_data()['NUMBER']) - key_ne = 'N_EPOCH' - if key_ne not in cat.get_data(): + all_id = np.copy(cat.get_data()["NUMBER"]) + key_ne = "N_EPOCH" + if key_ne not in cat.get_data().dtype.names: raise KeyError( - f'Key {key_ne} not found in input galaxy catalogue, needed for' - + ' PSF interpolation to multi-epoch data; run previous module' - + ' (SExtractor) in multi-epoch mode' + f"Key {key_ne} not found in input galaxy catalogue" + + f" {self._galcat_path}, needed for" + + " PSF interpolation to multi-epoch data; run previous module" + + " (SExtractor) in multi-epoch mode" ) - n_epoch = np.copy(cat.get_data()[key_me]) + n_epoch = np.copy(cat.get_data()[key_ne]) list_ext_name = cat.get_ext_name() hdu_ind = [ - idx for idx in range(len(list_ext_name)) - if 'EPOCH' in list_ext_name[idx] + idx + for idx in range(len(list_ext_name)) + if "EPOCH" in list_ext_name[idx] ] final_list = [] for hdu_index in hdu_ind: - exp_name = cat.get_data(hdu_index)['EXP_NAME'][0] - ccd_list = list(set(cat.get_data(hdu_index)['CCD_N'])) + exp_name = cat.get_data(hdu_index)["EXP_NAME"][0] + ccd_list = list(set(cat.get_data(hdu_index)["CCD_N"])) array_psf = None array_id = None array_shape = None @@ -593,25 +609,35 @@ def _interpolate_me(self): for ccd in ccd_list: if ccd == -1: continue - dot_psf_path = ( - f'{self._dot_psf_dir}/{self._dot_psf_pattern}-{exp_name}' - + f'-{ccd}.psf' - ) - ind_obj = np.where(cat.get_data(hdu_index)['CCD_N'] == ccd)[0] + found = False + for dot_psf_dir in self._dot_psf_dirs: + dot_psf_path = ( + f"{dot_psf_dir}/{self._dot_psf_pattern}-{exp_name}" + + f"-{ccd}.psf" + ) + if os.path.exists(dot_psf_path): + found = True + break + if not found: + self._w_log.info( + f"No .psf file found for exposure {exp_name} and" + + f" ccd {ccd}" + ) + continue + + ind_obj = np.where(cat.get_data(hdu_index)["CCD_N"] == ccd)[0] obj_id = all_id[ind_obj] gal_pos = np.array( - self._f_wcs_file[exp_name][ccd]['WCS'].all_world2pix( + self._f_wcs_file[exp_name][ccd]["WCS"].all_world2pix( self.gal_pos[:, 0][ind_obj], self.gal_pos[:, 1][ind_obj], 0, ) ).T - self.interp_PSFs = interpsfex( + self.interp_PSFs = self.interpsfex( dot_psf_path, gal_pos, - self._star_thresh, - self._chi2_thresh, ) if ( @@ -619,9 +645,9 @@ def _interpolate_me(self): and self.interp_PSFs == NOT_ENOUGH_STARS ): self._w_log.info( - f'Not enough stars find in the ccd {ccd} of the ' - + f'exposure {exp_name}. Object inside this ccd will ' - + 'lose an epoch.' + f"Not enough stars found on ccd {ccd} of " + + f"exposure {exp_name}. Object inside this ccd will " + + "lose an epoch." ) continue if ( @@ -629,9 +655,9 @@ def _interpolate_me(self): and self.interp_PSFs == BAD_CHI2 ): self._w_log.info( - f'Bad chi2 for the psf model in the ccd {ccd} of the ' - + f'exposure {exp_name}. Object inside this ccd will ' - + 'lose an epoch.' + f"Bad chi2 for the psf model in the ccd {ccd} of the " + + f"exposure {exp_name}. Object inside this ccd will " + + "lose an epoch." ) continue if ( @@ -639,8 +665,8 @@ def _interpolate_me(self): and self.interp_PSFs == FILE_NOT_FOUND ): self._w_log.info( - f'Psf model file {self._dotpsf_path} not found. ' - + 'Object inside this ccd will lose an epoch.' + f"Psf model file {dot_psf_path} not found. " + + "Object inside this ccd will lose an epoch." ) continue @@ -661,16 +687,18 @@ def _interpolate_me(self): if array_shape is None: array_shape = np.copy(self.psf_shapes) else: - array_shape = np.concatenate(( - array_shape, - np.copy(self.psf_shapes), - )) + array_shape = np.concatenate( + ( + array_shape, + np.copy(self.psf_shapes), + ) + ) else: array_shape = None - exp_name_tmp = np.array([ - exp_name + '-' + str(ccd) for _ in range(len(obj_id)) - ]) + exp_name_tmp = np.array( + [exp_name + "-" + str(ccd) for _ in range(len(obj_id))] + ) if array_exp_name is None: array_exp_name = exp_name_tmp else: @@ -678,12 +706,9 @@ def _interpolate_me(self): (array_exp_name, exp_name_tmp) ) - final_list.append([ - array_id, - array_psf, - array_shape, - array_exp_name - ]) + final_list.append( + [array_id, array_psf, array_shape, array_exp_name] + ) self._f_wcs_file.close() cat.close() @@ -695,34 +720,34 @@ def _interpolate_me(self): counter = 0 for j in range(len(final_list)): where_res = np.where(final_list[j][0] == id_tmp)[0] - if (len(where_res) != 0): + if len(where_res) != 0: output_dict[id_tmp][final_list[j][3][where_res[0]]] = {} - output_dict[id_tmp][ - final_list[j][3][where_res[0]] - ]['VIGNET'] = final_list[j][1][where_res[0]] + output_dict[id_tmp][final_list[j][3][where_res[0]]][ + "VIGNET" + ] = final_list[j][1][where_res[0]] if self._compute_shape: shape_dict = {} - shape_dict['E1_PSF_HSM'] = ( - final_list[j][2][where_res[0]][0] - ) - shape_dict['E2_PSF_HSM'] = ( - final_list[j][2][where_res[0]][1] - ) - shape_dict['SIGMA_PSF_HSM'] = ( - final_list[j][2][where_res[0]][2] - ) - shape_dict['FLAG_PSF_HSM'] = ( - final_list[j][2][where_res[0]][3] - ) - output_dict[id_tmp][ - final_list[j][3][where_res[0]] - ]['SHAPES'] = shape_dict + shape_dict["E1_PSF_HSM"] = final_list[j][2][ + where_res[0] + ][0] + shape_dict["E2_PSF_HSM"] = final_list[j][2][ + where_res[0] + ][1] + shape_dict["SIGMA_PSF_HSM"] = final_list[j][2][ + where_res[0] + ][2] + shape_dict["FLAG_PSF_HSM"] = final_list[j][2][ + where_res[0] + ][3] + output_dict[id_tmp][final_list[j][3][where_res[0]]][ + "SHAPES" + ] = shape_dict counter += 1 if counter == 0: - output_dict[id_tmp] = 'empty' + output_dict[id_tmp] = "empty" n_empty += 1 - self._w_log.info(f'{n_empty}/{len(all_id)} PSFs are empty') + self._w_log.info(f"{n_empty}/{len(all_id)} PSFs are empty") return output_dict @@ -738,7 +763,7 @@ def _write_output_me(self, output_dict): """ output_file = SqliteDict( - self._output_path + self._img_number + '.sqlite' + self._output_path + self._img_number + ".sqlite" ) for idx in output_dict.keys(): output_file[str(idx)] = output_dict[idx] diff --git a/shapepipe/modules/psfex_interp_runner.py b/shapepipe/modules/psfex_interp_runner.py index f18b543fb..55d8d73c1 100644 --- a/shapepipe/modules/psfex_interp_runner.py +++ b/shapepipe/modules/psfex_interp_runner.py @@ -2,22 +2,22 @@ Module runner for ``psfex_interp``. -:Author: Axel Guinot +:Author: Axel Guinot, Martin Kilbinger """ from shapepipe.modules.module_decorator import module_runner from shapepipe.modules.psfex_interp_package import psfex_interp -from shapepipe.pipeline.run_log import get_last_dir +from shapepipe.pipeline.run_log import get_last_dir, get_all_dirs @module_runner( - version='1.1', - input_module=['psfex_runner', 'setools_runner'], - file_pattern=['star_selection', 'galaxy_selection'], - file_ext=['.psf', '.fits'], - depends=['numpy', 'astropy', 'galsim', 'sqlitedict'], + version="1.1", + input_module=["psfex_runner", "setools_runner"], + file_pattern=["star_selection", "galaxy_selection"], + file_ext=[".psf", ".fits"], + depends=["numpy", "astropy", "galsim", "sqlitedict"], ) def psfex_interp_runner( input_file_list, @@ -29,15 +29,15 @@ def psfex_interp_runner( ): """Define The PSFEx Interpolation Runner.""" # Fetch interpolation run mode - mode = config.get(module_config_sec, 'MODE') + mode = config.get(module_config_sec, "MODE") # Fetch parameter values - pos_params = config.getlist(module_config_sec, 'POSITION_PARAMS') - get_shapes = config.getboolean(module_config_sec, 'GET_SHAPES') - star_thresh = config.getint(module_config_sec, 'STAR_THRESH') - chi2_thresh = config.getint(module_config_sec, 'CHI2_THRESH') + pos_params = config.getlist(module_config_sec, "POSITION_PARAMS") + get_shapes = config.getboolean(module_config_sec, "GET_SHAPES") + star_thresh = config.getint(module_config_sec, "STAR_THRESH") + chi2_thresh = config.getint(module_config_sec, "CHI2_THRESH") # Run in CLASSIC mode - if mode == 'CLASSIC': + if mode == "CLASSIC": # Set input paths psfcat_path, galcat_path = input_file_list @@ -46,7 +46,7 @@ def psfex_interp_runner( pi_inst = psfex_interp.PSFExInterpolator( psfcat_path, galcat_path, - run_dirs['output'], + run_dirs["output"], file_number_string, w_log, pos_params, @@ -59,19 +59,29 @@ def psfex_interp_runner( pi_inst.process() # Run in MULTI-EPOCH mode - elif mode == 'MULTI-EPOCH': + elif mode == "MULTI-EPOCH": # Fetch multi-epoch parameters module = config.getexpanded( module_config_sec, - 'ME_DOT_PSF_DIR', + "ME_DOT_PSF_DIR", ) - dot_psf_dir = get_last_dir(run_dirs['run_log'], module) + module_name = module.split(":")[-1] + if "last" in module: + dot_psf_dirs = [get_last_dir(run_dirs["run_log"], module_name)] + elif "all" in module: + dot_psf_dirs = get_all_dirs(run_dirs["run_log"], module_name) + else: + raise ValueError( + "Expected qualifier 'last:' or 'all' before module" + + f" '{module}' in config entry 'ME_DOT_PSF_DIR'" + ) + dot_psf_pattern = config.get( module_config_sec, - 'ME_DOT_PSF_PATTERN', + "ME_DOT_PSF_PATTERN", ) - f_wcs_path = config.getexpanded(module_config_sec, 'ME_LOG_WCS') + f_wcs_path = config.getexpanded(module_config_sec, "ME_LOG_WCS") # Set input paths galcat_path = input_file_list[0] @@ -80,7 +90,7 @@ def psfex_interp_runner( psfex_interp_inst = psfex_interp.PSFExInterpolator( None, galcat_path, - run_dirs['output'], + run_dirs["output"], file_number_string, w_log, pos_params, @@ -90,10 +100,10 @@ def psfex_interp_runner( ) # Process inputs multi-epoch - psfex_interp_inst.process_me(dot_psf_dir, dot_psf_pattern, f_wcs_path) + psfex_interp_inst.process_me(dot_psf_dirs, dot_psf_pattern, f_wcs_path) # Run in VALIDATION mode - elif mode == 'VALIDATION': + elif mode == "VALIDATION": # Set input paths psfcat_path, galcat_path, psfex_cat_path = input_file_list @@ -102,7 +112,7 @@ def psfex_interp_runner( psfex_interp_inst = psfex_interp.PSFExInterpolator( psfcat_path, galcat_path, - run_dirs['output'], + run_dirs["output"], file_number_string, w_log, pos_params, @@ -116,7 +126,7 @@ def psfex_interp_runner( else: # Raise error for invalid run mode - ValueError('MODE has to be in : [CLASSIC, MULTI-EPOCH, VALIDATION]') + ValueError("MODE has to be in : [CLASSIC, MULTI-EPOCH, VALIDATION]") # No return objects return None, None diff --git a/shapepipe/modules/psfex_package/__init__.py b/shapepipe/modules/psfex_package/__init__.py index 81cdd2e69..63e7590d0 100644 --- a/shapepipe/modules/psfex_package/__init__.py +++ b/shapepipe/modules/psfex_package/__init__.py @@ -35,4 +35,4 @@ """ -__all__ = ['psfex_script'] +__all__ = ["psfex_script"] diff --git a/shapepipe/modules/psfex_package/psfex_script.py b/shapepipe/modules/psfex_package/psfex_script.py index 7e8866426..bde7b4a5d 100644 --- a/shapepipe/modules/psfex_package/psfex_script.py +++ b/shapepipe/modules/psfex_package/psfex_script.py @@ -39,7 +39,7 @@ def __init__( psfex_config_file, output_dir, outcatalog_name, - check_image_list + check_image_list, ): self.psfex_executable_path = psfex_executable_path self.input_file_path = input_file_path @@ -61,19 +61,16 @@ def generate_command(self): """ # Prepare command line command_line = ( - f'{self.psfex_executable_path} ' - + f'{self.input_file_path} ' - + f'-c {self.psfex_config_file} ' - + f'-PSF_DIR {self.output_dir} ' - + f'-OUTCAT_NAME {self.outcatalog_name}' + f"{self.psfex_executable_path} " + + f"{self.input_file_path} " + + f"-c {self.psfex_config_file} " + + f"-PSF_DIR {self.output_dir} " + + f"-OUTCAT_NAME {self.outcatalog_name}" ) - if ( - (len(self.check_image_list) == 1) - & (self.check_image_list[0] == '') - ): - check_type_list = ['NONE'] - check_name_list = ['none'] + if (len(self.check_image_list) == 1) & (self.check_image_list[0] == ""): + check_type_list = ["NONE"] + check_name_list = ["none"] else: # Get pattern for filenaming from file in list input_file_name = os.path.split(input_file_path)[-1] @@ -85,10 +82,10 @@ def generate_command(self): for check_image in self.check_image_list: check_type_list.append(check_image.upper()) check_name_list.append( - f'{output_dir}' - + f'/{suffix}' - + f'{check_image.lower()}' - + f'{file_number_string}.fits' + f"{output_dir}" + + f"/{suffix}" + + f"{check_image.lower()}" + + f"{file_number_string}.fits" ) # Add checks to command line @@ -120,11 +117,11 @@ def parse_errors(stderr, stdout): Updated standard output and error """ - check_error = re.findall('error', stdout.lower()) - check_error2 = re.findall('all done', stdout.lower()) + check_error = re.findall("error", stdout.lower()) + check_error2 = re.findall("all done", stdout.lower()) if check_error == []: - stderr2 = '' + stderr2 = "" else: stderr2 = stdout diff --git a/shapepipe/modules/psfex_runner.py b/shapepipe/modules/psfex_runner.py index 0398c46c8..d9c515e58 100644 --- a/shapepipe/modules/psfex_runner.py +++ b/shapepipe/modules/psfex_runner.py @@ -12,45 +12,41 @@ @module_runner( - input_module='setools_runner', - version='1.0', - file_pattern=['star_selection'], - file_ext=['.fits'], - executes='psfex', + input_module="setools_runner", + version="1.0", + file_pattern=["star_selection"], + file_ext=[".fits"], + executes="psfex", ) def psfex_runner( - input_file_list, - run_dirs, - file_number_string, - config, - module_config_sec, - w_log, + input_file_list, + run_dirs, + file_number_string, + config, + module_config_sec, + w_log, ): """Define The PSFEx Runner.""" # Extract psfex run configurations - if config.has_option(module_config_sec, 'EXEC_PATH'): + if config.has_option(module_config_sec, "EXEC_PATH"): psfex_executable_path = config.getexpanded( - module_config_sec, - 'EXEC_PATH' + module_config_sec, "EXEC_PATH" ) else: - psfex_executable_path = 'psfex' - output_dir = run_dirs['output'] + psfex_executable_path = "psfex" + output_dir = run_dirs["output"] - outcatalog_name = f'{output_dir}/psfex_cat{file_number_string}.cat' + outcatalog_name = f"{output_dir}/psfex_cat{file_number_string}.cat" - psfex_config_file = config.getexpanded( - module_config_sec, - 'DOT_PSFEX_FILE' - ) + psfex_config_file = config.getexpanded(module_config_sec, "DOT_PSFEX_FILE") input_file_path = input_file_list[0] # Check image options - if config.has_option(module_config_sec, 'CHECKIMAGE'): - check_image_list = config.getlist(module_config_sec, 'CHECKIMAGE') + if config.has_option(module_config_sec, "CHECKIMAGE"): + check_image_list = config.getlist(module_config_sec, "CHECKIMAGE") else: - check_image_list = [''] + check_image_list = [""] # Create psfex caller class instance psfex_inst = PSFExCaller( @@ -64,7 +60,7 @@ def psfex_runner( # Generate psfex command line command_line = psfex_inst.generate_command() - w_log.info(f'Running command \'{command_line}\'') + w_log.info(f"Running command '{command_line}'") # Execute command line stderr, stdout = execute(command_line) diff --git a/shapepipe/modules/python_example_package/__init__.py b/shapepipe/modules/python_example_package/__init__.py index ecc47860d..41bce721e 100644 --- a/shapepipe/modules/python_example_package/__init__.py +++ b/shapepipe/modules/python_example_package/__init__.py @@ -27,4 +27,4 @@ """ -__all__ = ['python_example'] +__all__ = ["python_example"] diff --git a/shapepipe/modules/python_example_package/python_example.py b/shapepipe/modules/python_example_package/python_example.py index d9ea2a22c..5bbe9a968 100644 --- a/shapepipe/modules/python_example_package/python_example.py +++ b/shapepipe/modules/python_example_package/python_example.py @@ -60,7 +60,7 @@ def _read_file(self, file_name): """ with open(file_name) as data_file: - content = data_file.read().replace('\n', '') + content = data_file.read().replace("\n", "") return content @@ -81,7 +81,7 @@ def read_files(self, file_name1, file_name2): content1 = self._read_file(file_name1) content2 = self._read_file(file_name2) - self.content = f'{content1} and {content2}' + self.content = f"{content1} and {content2}" def write_file(self, file_name, message): """Write File. @@ -98,6 +98,6 @@ def write_file(self, file_name, message): """ new_content = message + str(self.content) - text_file = open(file_name, 'w') + text_file = open(file_name, "w") text_file.write(new_content) text_file.close() diff --git a/shapepipe/modules/python_example_runner.py b/shapepipe/modules/python_example_runner.py index d468c10e0..f5016f08a 100644 --- a/shapepipe/modules/python_example_runner.py +++ b/shapepipe/modules/python_example_runner.py @@ -11,25 +11,25 @@ @module_runner( - version='1.1', - file_pattern=['numbers', 'letters'], - file_ext='.txt', + version="1.1", + file_pattern=["numbers", "letters"], + file_ext=".txt", depends=[ - 'numpy', - 'astropy', - 'galsim', - 'joblib', - 'mccd', - 'ngmix', - 'pandas', - 'pysap', - 'scipy', - 'sf_tools', - 'sip_tpv', - 'sqlitedict', - 'treecorr', + "numpy", + "astropy", + "galsim", + "joblib", + "mccd", + "ngmix", + "pandas", + "pysap", + "scipy", + "sf_tools", + "sip_tpv", + "sqlitedict", + "treecorr", ], - run_method='parallel', + run_method="parallel", ) def python_example_runner( input_file_list, @@ -46,7 +46,7 @@ def python_example_runner( ) # Retrieve log message from config file - message = config.get(module_config_sec, 'MESSAGE') + message = config.get(module_config_sec, "MESSAGE") # Create an instance of the Python example class py_ex_inst = python_example.PythonExample(0) diff --git a/shapepipe/modules/random_cat_package/__init__.py b/shapepipe/modules/random_cat_package/__init__.py index b3a1cf21e..32c6f64b2 100644 --- a/shapepipe/modules/random_cat_package/__init__.py +++ b/shapepipe/modules/random_cat_package/__init__.py @@ -34,4 +34,4 @@ """ -__all__ = ['random_cat.py'] +__all__ = ["random_cat.py"] diff --git a/shapepipe/modules/random_cat_package/random_cat.py b/shapepipe/modules/random_cat_package/random_cat.py index 3bdb6ba6d..feb69ff90 100644 --- a/shapepipe/modules/random_cat_package/random_cat.py +++ b/shapepipe/modules/random_cat_package/random_cat.py @@ -22,7 +22,7 @@ from shapepipe.utilities import cfis -class RandomCat(): +class RandomCat: """Random Catalogue. This class creates a random catalogue given a mask FITS file. @@ -90,24 +90,24 @@ def save_as_healpix(self, mask, header): return # Tranform config entry from str to int - nside = int(self._healpix_options['NSIDE']) + nside = int(self._healpix_options["NSIDE"]) mask_1d, footprint = reproject_to_healpix( (mask, header), - 'galactic', + "galactic", nside=nside, ) t = Table() - t['flux'] = mask_1d - t.meta['ORDERING'] = 'RING' - t.meta['COORDSYS'] = 'G' - t.meta['NSIDE'] = nside - t.meta['INDXSCHM'] = 'IMPLICIT' + t["flux"] = mask_1d + t.meta["ORDERING"] = "RING" + t.meta["COORDSYS"] = "G" + t.meta["NSIDE"] = nside + t.meta["INDXSCHM"] = "IMPLICIT" output_path = ( f'{self._output_dir}/{self._healpix_options["FILE_BASE"]}-' - + f'{self._file_number_string}.fits' + + f"{self._file_number_string}.fits" ) t.write(output_path) @@ -174,14 +174,14 @@ def process(self): # Check that a reasonably large number of pixels is not masked if n_unmasked < n_obj: raise ValueError( - f'Number of un-masked pixels {n_unmasked} is smaller ' - + f'than number of random objects requested {n_obj}' + f"Number of un-masked pixels {n_unmasked} is smaller " + + f"than number of random objects requested {n_obj}" ) else: n_obj = 0 - self._w_log.info(f'Creating {n_obj} random objects') + self._w_log.info(f"Creating {n_obj} random objects") # Draw points until n are in mask n_found = 0 @@ -213,35 +213,28 @@ def process(self): # Tile ID output_path = ( - f'{self._output_dir}/{self._output_file_pattern}-' - + f'{self._file_number_string}.fits' + f"{self._output_dir}/{self._output_file_pattern}-" + + f"{self._file_number_string}.fits" ) file_name = os.path.split(output_path)[1] file_base = os.path.splitext(file_name)[0] - tile_ID_str = re.split('-', file_base)[1:] - tile_id = float('.'.join(tile_ID_str)) + tile_ID_str = re.split("-", file_base)[1:] + tile_id = float(".".join(tile_ID_str)) tile_id_array = np.ones(n_obj) * tile_id # Write to output - cat_out = [ - ra_rand, - dec_rand, - x_rand, - y_rand, - tile_id_array - ] - column_names = ['RA', 'DEC', 'x', 'y', 'TILE_ID'] + cat_out = [ra_rand, dec_rand, x_rand, y_rand, tile_id_array] + column_names = ["RA", "DEC", "x", "y", "TILE_ID"] # TODO: Add units to header output = file_io.FITSCatalogue( - output_path, - open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite + output_path, open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite ) output.save_as_fits(cat_out, names=column_names) # Write area information to log file - self._w_log.info(f'Total area = {area_deg2:.4f} deg^2') - self._w_log.info(f'Unmasked area = {area_deg2_eff:.4f} deg^2') + self._w_log.info(f"Total area = {area_deg2:.4f} deg^2") + self._w_log.info(f"Unmasked area = {area_deg2_eff:.4f} deg^2") self._w_log.info( - f'Ratio masked to total pixels = {n_unmasked / n_pix:.3f}' + f"Ratio masked to total pixels = {n_unmasked / n_pix:.3f}" ) diff --git a/shapepipe/modules/random_cat_runner.py b/shapepipe/modules/random_cat_runner.py index 5595a53ad..665792fec 100644 --- a/shapepipe/modules/random_cat_runner.py +++ b/shapepipe/modules/random_cat_runner.py @@ -11,11 +11,11 @@ @module_runner( - version='1.1', - file_pattern=['image', 'pipeline_flag'], - file_ext=['.fits', 'fits'], - depends=['astropy'], - numbering_scheme='_0', + version="1.1", + file_pattern=["image", "pipeline_flag"], + file_ext=[".fits", "fits"], + depends=["astropy"], + numbering_scheme="_0", ) def random_cat_runner( input_file_list, @@ -31,42 +31,39 @@ def random_cat_runner( input_mask_name = input_file_list[1] # Set output file name - if config.has_option(module_config_sec, 'OUTPUT_FILE_PATTERN'): + if config.has_option(module_config_sec, "OUTPUT_FILE_PATTERN"): output_file_pattern = config.get( - module_config_sec, - 'OUTPUT_FILE_PATTERN' + module_config_sec, "OUTPUT_FILE_PATTERN" ) else: - output_file_pattern = 'random_cat' + output_file_pattern = "random_cat" # Get number of random objects requested on output - n_rand = config.getfloat(module_config_sec, 'N_RANDOM') + n_rand = config.getfloat(module_config_sec, "N_RANDOM") # Flag whether n_rand is total (DENSITY=False, default) # or per square degree (DENSITY=True) - if config.has_option(module_config_sec, 'DENSITY'): - density = config.getboolean(module_config_sec, 'DENSITY') + if config.has_option(module_config_sec, "DENSITY"): + density = config.getboolean(module_config_sec, "DENSITY") else: density = False # Get healpix output options save_mask_as_healpix = config.getboolean( - module_config_sec, - 'SAVE_MASK_AS_HEALPIX' + module_config_sec, "SAVE_MASK_AS_HEALPIX" ) if save_mask_as_healpix: healpix_options = {} - for option_trunc in ['FILE_BASE', 'NSIDE']: - option = f'HEALPIX_OUT_{option_trunc}' + for option_trunc in ["FILE_BASE", "NSIDE"]: + option = f"HEALPIX_OUT_{option_trunc}" healpix_options[option_trunc] = config.get( - module_config_sec, - option + module_config_sec, option ) # Create rand cat class instance rand_cat_inst = RandomCat( input_image_name, input_mask_name, - run_dirs['output'], + run_dirs["output"], file_number_string, output_file_pattern, n_rand, diff --git a/shapepipe/modules/serial_example_runner.py b/shapepipe/modules/serial_example_runner.py index 3baced6ee..61cfc3edf 100644 --- a/shapepipe/modules/serial_example_runner.py +++ b/shapepipe/modules/serial_example_runner.py @@ -19,13 +19,13 @@ def __init__(self): def _read_file(self, file_name): """Read File.""" with open(file_name) as data_file: - content = data_file.read().replace('\n', '') + content = data_file.read().replace("\n", "") return content def read_files(self, input_file_list): """Read Files.""" - self.content = '' + self.content = "" for file_list in input_file_list: for file_name in file_list: @@ -33,18 +33,18 @@ def read_files(self, input_file_list): def write_file(self, file_name): """Write Files.""" - text_file = open(file_name, 'w') + text_file = open(file_name, "w") text_file.write(self.content) text_file.close() @module_runner( - version='1.1', - input_module='python_example_runner', - file_pattern=['numbers', 'letters', 'pyex_output'], - file_ext=['.txt', '.txt', '.cat'], - depends='numpy', - run_method='serial', + version="1.1", + input_module="python_example_runner", + file_pattern=["numbers", "letters", "pyex_output"], + file_ext=[".txt", ".txt", ".cat"], + depends="numpy", + run_method="serial", ) def serial_example_runner( input_file_list, diff --git a/shapepipe/modules/setools_package/__init__.py b/shapepipe/modules/setools_package/__init__.py index 0414a9db7..502df0ae8 100644 --- a/shapepipe/modules/setools_package/__init__.py +++ b/shapepipe/modules/setools_package/__init__.py @@ -203,4 +203,4 @@ """ -__all__ = ['setools'] +__all__ = ["setools"] diff --git a/shapepipe/modules/setools_package/setools.py b/shapepipe/modules/setools_package/setools.py index 78feae3d1..c430b52b1 100644 --- a/shapepipe/modules/setools_package/setools.py +++ b/shapepipe/modules/setools_package/setools.py @@ -12,6 +12,9 @@ import re import string +import matplotlib +matplotlib.use('Agg') + import matplotlib.pylab as plt import numpy as np @@ -58,7 +61,10 @@ def __init__( SEx_catalogue=True, ) cat_file.open() - self._data = cat_file.get_data() + try: + self._data = cat_file.get_data() + except: + raise IOError(f"Could not load catalogue data from {cat}") cat_file.close() else: @@ -85,39 +91,39 @@ def process(self, w_log): if self._is_file: file_number = self._file_number_string else: - file_number = '' + file_number = "" self.read() # Processing: Create mask = filter input if len(self._mask) != 0: - direc = f'{self._output_dir}/mask' + direc = f"{self._output_dir}/mask" mkdir(direc) self._make_mask() for key in self.mask.keys(): - if 'NO_SAVE' in self._mask[key]: + if "NO_SAVE" in self._mask[key]: continue - file_name = f'{direc}/{key}{file_number}.fits' + file_name = f"{direc}/{key}{file_number}.fits" self.save_mask(self.mask[key], file_name) if len(self._plot) != 0: - direc = f'{self._output_dir}/plot' + direc = f"{self._output_dir}/plot" mkdir(direc) self._make_plot() for key in self.plot.keys(): - output_path = f'{direc}/{key}{file_number}' + output_path = f"{direc}/{key}{file_number}" SEPlot(self.plot[key], self._data, output_path, self.mask) if len(self._new_cat) != 0: - direc = f'{self._output_dir}/new_cat' + direc = f"{self._output_dir}/new_cat" mkdir(direc) self._make_new_cat() for key in self.new_cat.keys(): - file_name = f'{direc}/{key}{file_number}' + file_name = f"{direc}/{key}{file_number}" self.save_new_cat(self.new_cat[key], file_name) if len(self._rand_split) != 0: - direc = f'{self._output_dir}/rand_split' + direc = f"{self._output_dir}/rand_split" mkdir(direc) self._make_rand_split() @@ -131,12 +137,13 @@ def process(self, w_log): empty_found = True if empty_found: w_log.info( - 'At least one random-split catalogue is empty, no ' - + 'random sub-samples written for sample_type=' - + f'{sample_type}') + "At least one random-split catalogue is empty, no " + + "random sub-samples written for sample_type=" + + f"{sample_type}" + ) continue - output_dir = f'{direc}/{sample_type}_' + output_dir = f"{direc}/{sample_type}_" self.save_rand_split( self.rand_split[sample_type], output_dir, @@ -144,11 +151,11 @@ def process(self, w_log): ) if len(self._stat) != 0: - direc = f'{self._output_dir}/stat' + direc = f"{self._output_dir}/stat" mkdir(direc) self._make_stat() for key in self.stat.keys(): - output_path = f'{direc}/{key}{file_number}.txt' + output_path = f"{direc}/{key}{file_number}.txt" self.save_stat(self.stat[key], output_path) def read(self): @@ -177,7 +184,7 @@ def read(self): while True: line_tmp = self._config_file.readline() - if line_tmp == '': + if line_tmp == "": break line_tmp = self._clean_line(line_tmp) @@ -189,49 +196,49 @@ def read(self): # [SECTION_TYPE:OBJECT_NAME], e.g. # [MASK:star_selection] - if (in_section != 0) & (re.split(r'\[', line_tmp)[0] == ''): + if (in_section != 0) & (re.split(r"\[", line_tmp)[0] == ""): in_section = 0 if not in_section: - if (re.split(r'\[', line_tmp)[0] != ''): - raise RuntimeError('No section found') + if re.split(r"\[", line_tmp)[0] != "": + raise RuntimeError("No section found") - sec = re.split(r'\[|\]', line_tmp)[1] - if re.split(':', sec)[0] == 'MASK': + sec = re.split(r"\[|\]", line_tmp)[1] + if re.split(":", sec)[0] == "MASK": in_section = 1 try: - mask_name = re.split(':', sec)[1] + mask_name = re.split(":", sec)[1] except Exception: - mask_name = f'mask_{len(self._mask) + 1}' + mask_name = f"mask_{len(self._mask) + 1}" self._mask_key.append(mask_name) self._mask[mask_name] = [] - elif re.split(':', sec)[0] == 'PLOT': + elif re.split(":", sec)[0] == "PLOT": in_section = 2 try: - plot_name = re.split(':', sec)[1] + plot_name = re.split(":", sec)[1] except Exception: - plot_name = f'plot_{len(self._plot) + 1}' + plot_name = f"plot_{len(self._plot) + 1}" self._plot[plot_name] = [] - elif re.split(':', sec)[0] == 'STAT': + elif re.split(":", sec)[0] == "STAT": in_section = 3 try: - stat_name = re.split(':', sec)[1] + stat_name = re.split(":", sec)[1] except Exception: - stat_name = f'stat_{len(self._stat) + 1}' + stat_name = f"stat_{len(self._stat) + 1}" self._stat[stat_name] = [] - elif re.split(':', sec)[0] == 'NEW_CAT': + elif re.split(":", sec)[0] == "NEW_CAT": in_section = 4 try: - new_cat_name = re.split(':', sec)[1] + new_cat_name = re.split(":", sec)[1] except Exception: - new_cat_name = f'new_cat_{len(self._new_cat) + 1}' + new_cat_name = f"new_cat_{len(self._new_cat) + 1}" self._new_cat[new_cat_name] = [] - elif re.split(':', sec)[0] == 'RAND_SPLIT': + elif re.split(":", sec)[0] == "RAND_SPLIT": in_section = 5 try: - rand_split_name = re.split(':', sec)[1] + rand_split_name = re.split(":", sec)[1] except Exception: rand_split_name = ( - f'rand_split_{len(self._rand_split) + 1}' + f"rand_split_{len(self._rand_split) + 1}" ) self._rand_split[rand_split_name] = [] else: @@ -271,23 +278,23 @@ def _clean_line(self, line): """ s = re.split('"', line) if len(s) == 3: - line_tmp = s[0].replace(' ', '') + s[1] + s[2].replace(' ', '') + line_tmp = s[0].replace(" ", "") + s[1] + s[2].replace(" ", "") else: - line_tmp = line.replace(' ', '') + line_tmp = line.replace(" ", "") - if re.split('#', line_tmp)[0] == '': + if re.split("#", line_tmp)[0] == "": return None - line_tmp = line_tmp.replace('\n', '') - line_tmp = line_tmp.replace('\t', '') - line_tmp = re.split('#', line_tmp)[0] + line_tmp = line_tmp.replace("\n", "") + line_tmp = line_tmp.replace("\t", "") + line_tmp = re.split("#", line_tmp)[0] - if line_tmp != '': + if line_tmp != "": return line_tmp else: return None - def save_mask(self, mask, output_path, ext_name='LDAC_OBJECTS'): + def save_mask(self, mask, output_path, ext_name="LDAC_OBJECTS"): """Save Mask. This function will apply a mask to the data and save them into a new @@ -312,12 +319,12 @@ def save_mask(self, mask, output_path, ext_name='LDAC_OBJECTS'): """ if mask is None: - raise ValueError('mask not provided') + raise ValueError("mask not provided") if len(mask) == 0: pass if output_path is None: - raise ValueError('output path not provided') + raise ValueError("output path not provided") mask_file = file_io.FITSCatalogue( output_path, @@ -330,7 +337,7 @@ def save_mask(self, mask, output_path, ext_name='LDAC_OBJECTS'): sex_cat_path=self._cat_filepath, ) - def save_new_cat(self, new_cat, output_path, ext_name='LDAC_OBJECTS'): + def save_new_cat(self, new_cat, output_path, ext_name="LDAC_OBJECTS"): """Save New Catalogue. This function creates a new catalogue with a specific format @@ -354,19 +361,19 @@ def save_new_cat(self, new_cat, output_path, ext_name='LDAC_OBJECTS'): """ try: - output_format = new_cat.pop('OUTPUT_FORMAT') + output_format = new_cat.pop("OUTPUT_FORMAT") except Exception: - raise ValueError('OUTPUT_FORMAT not provided') + raise ValueError("OUTPUT_FORMAT not provided") - if output_format == 'fits': + if output_format == "fits": new_file = file_io.FITSCatalogue( - output_path + '.fits', + output_path + ".fits", open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite, ) new_file.save_as_fits(data=new_cat, ext_name=ext_name) - elif output_format == 'SEx_cat': + elif output_format == "SEx_cat": new_file = file_io.FITSCatalogue( - output_path + '.fits', + output_path + ".fits", open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite, SEx_catalogue=(self._cat_filepath is not None), ) @@ -375,23 +382,23 @@ def save_new_cat(self, new_cat, output_path, ext_name='LDAC_OBJECTS'): ext_name=ext_name, sex_cat_path=self._cat_filepath, ) - elif (output_format == 'txt') | (output_format == 'ascii'): - new_file = open(output_path + '.txt', 'w') - new_file.write('# HEADER\n') - new_file.write('# ') + elif (output_format == "txt") | (output_format == "ascii"): + new_file = open(output_path + ".txt", "w") + new_file.write("# HEADER\n") + new_file.write("# ") n_max = -1 for key in new_cat.keys(): if len(new_cat[key]) > n_max: n_max = len(new_cat[key]) - new_file.write(f'{key}\t') - new_file.write('\n') + new_file.write(f"{key}\t") + new_file.write("\n") for idx in range(n_max): for key in new_cat.keys(): try: - new_file.write(f'{new_cat[key][idx]}\t') + new_file.write(f"{new_cat[key][idx]}\t") except Exception: - new_file.write('\t') - new_file.write('\n') + new_file.write("\t") + new_file.write("\n") new_file.close() else: raise ValueError("Format should be in ['fits', 'SEx_cat', 'txt']") @@ -401,7 +408,7 @@ def save_rand_split( rand_split, output_path, file_number, - ext_name='LDAC_OBJECTS', + ext_name="LDAC_OBJECTS", ): """Save Random Split Catalogues. @@ -429,18 +436,18 @@ def save_rand_split( """ if rand_split is None: - raise ValueError('rand_split not provided') + raise ValueError("rand_split not provided") if output_path is None: - raise ValueError('output path not provided') + raise ValueError("output path not provided") if file_number is None: - raise ValueError('file_number path not provided') + raise ValueError("file_number path not provided") - mask = rand_split.pop('mask') + mask = rand_split.pop("mask") data = self._data[mask] for idx in rand_split.keys(): rand_split_file = file_io.FITSCatalogue( - f'{output_path}{idx}{file_number}.fits', + f"{output_path}{idx}{file_number}.fits", open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite, SEx_catalogue=(self._cat_filepath is not None), ) @@ -471,15 +478,15 @@ def save_stat(self, stat, output_path): """ if stat is None: - raise ValueError('stat not provided') + raise ValueError("stat not provided") if output_path is None: - raise ValueError('output path not provided') + raise ValueError("output path not provided") - file = open(output_path, 'w') - file.write('# Statistics\n') + file = open(output_path, "w") + file.write("# Statistics\n") for key in stat.keys(): - file.write(f'{key} = {str(stat[key])}\n') + file.write(f"{key} = {str(stat[key])}\n") file.close() @@ -504,8 +511,8 @@ def _make_mask(self): global_mask = np.ones(self._cat_size, dtype=bool) global_ind = np.where(global_mask)[0] for idx in self._mask[key]: - s = re.split('{|}', idx) - if s[0] == '': + s = re.split("{|}", idx) + if s[0] == "": try: global_mask &= self.mask[s[1]] global_ind = np.where(global_mask)[0] @@ -515,7 +522,7 @@ def _make_mask(self): mask_tmp = None for idx in self._mask[key]: - if idx == 'NO_SAVE': + if idx == "NO_SAVE": continue tmp = StrInterpreter( idx, @@ -553,23 +560,23 @@ def _make_plot(self): for key in self._plot.keys(): self.plot[key] = {} for idx in self._plot[key]: - s = re.split('=', idx) + s = re.split("=", idx) if len(s) != 2: raise ValueError( - 'Plot option keyword/value not in correct format ' - + f'(key=val): {idx}' + "Plot option keyword/value not in correct format " + + f"(key=val): {idx}" ) - ss = re.split('_', s[0]) + ss = re.split("_", s[0]) if len(ss) == 1: - self.plot[key][ss[0]] = {'0': s[1]} + self.plot[key][ss[0]] = {"0": s[1]} elif len(ss) == 2: if ss[0] not in self.plot[key].keys(): self.plot[key][ss[0]] = {} self.plot[key][ss[0]][ss[1]] = s[1] else: raise ValueError( - 'Plot keyword not in correct format (key or key_i)' - + f': {idx}' + "Plot keyword not in correct format (key or key_i)" + + f": {idx}" ) def _make_new_cat(self): @@ -591,9 +598,9 @@ def _make_new_cat(self): for key in self._new_cat.keys(): self.new_cat[key] = {} for idx in self._new_cat[key]: - s = re.split('=', j) + s = re.split("=", j) if len(s) == 2: - if s[0] == 'OUTPUT_FORMAT': + if s[0] == "OUTPUT_FORMAT": self.new_cat[key][s[0]] = s[1] else: self.new_cat[key][s[0]] = StrInterpreter( @@ -603,7 +610,7 @@ def _make_new_cat(self): mask_dict=self.mask, ).result else: - raise ValueError(f'Not a valid format : {idx}') + raise ValueError(f"Not a valid format : {idx}") def _make_rand_split(self): """Make Random Split. @@ -629,25 +636,25 @@ def _make_rand_split(self): for key in self._rand_split.keys(): self.rand_split[key] = {} for idx in self._rand_split[key]: - s = re.split('=', idx) + s = re.split("=", idx) if len(s) != 2: raise ValueError( - f'Not a valid format : {self._rand_split[key][0]}' + f"Not a valid format : {self._rand_split[key][0]}" ) - if s[0] == 'RATIO': + if s[0] == "RATIO": try: ratio = float(s[1]) except Exception: - raise ValueError('RATIO is not a number') + raise ValueError("RATIO is not a number") if ratio >= 1: - ratio /= 100. - elif s[0] == 'MASK': - ss = re.split(',', s[1]) + ratio /= 100.0 + elif s[0] == "MASK": + ss = re.split(",", s[1]) for k in ss: try: mask &= self.mask[k] except Exception: - raise ValueError(f'mask {k} does not exist') + raise ValueError(f"mask {k} does not exist") cat_size = len(np.where(mask)[0]) n_keep = int(np.ceil(cat_size * ratio)) @@ -658,9 +665,9 @@ def _make_rand_split(self): mask_ratio.append(mask_left.pop(idx)) mask_ratio = np.array(mask_ratio) mask_left = np.array(mask_left) - self.rand_split[key]['mask'] = mask - self.rand_split[key][f'ratio_{int(ratio * 100)}'] = mask_ratio - self.rand_split[key][f'ratio_{100 - int(ratio * 100)}'] = mask_left + self.rand_split[key]["mask"] = mask + self.rand_split[key][f"ratio_{int(ratio * 100)}"] = mask_ratio + self.rand_split[key][f"ratio_{100 - int(ratio * 100)}"] = mask_left def _make_stat(self): """Make Statistics. @@ -680,9 +687,9 @@ def _make_stat(self): for key in self._stat.keys(): self.stat[key] = {} for idx in self._stat[key]: - s = re.split('=', idx) + s = re.split("=", idx) if len(s) != 2: - raise ValueError(f'Not a valid format : {idx}') + raise ValueError(f"Not a valid format : {idx}") self.stat[key][s[0]] = StrInterpreter( s[1], self._data, @@ -729,33 +736,33 @@ class SEPlot(object): def __init__(self, plot_dict, catalogue, output_path, mask_dict=None): if plot_dict is None: - raise ValueError('plot_dict not provided') + raise ValueError("plot_dict not provided") if catalogue is None: - raise ValueError('catalogue not provided') + raise ValueError("catalogue not provided") if output_path is None: - raise ValueError('output_path not provided') + raise ValueError("output_path not provided") self._plot = plot_dict self._output_path = output_path self._cat = catalogue self._mask_dict = mask_dict - if 'TYPE' not in self._plot.keys(): - raise ValueError('Plot type not specified') + if "TYPE" not in self._plot.keys(): + raise ValueError("Plot type not specified") - if self._plot['TYPE']['0'] in ['plot', 'PLOT']: - self._check_key_for_plot(['X', 'Y']) + if self._plot["TYPE"]["0"] in ["plot", "PLOT"]: + self._check_key_for_plot(["X", "Y"]) self._make_plot() - elif self._plot['TYPE']['0'] in ['scatter', 'SCATTER']: - self._check_key_for_plot(['X', 'Y']) + elif self._plot["TYPE"]["0"] in ["scatter", "SCATTER"]: + self._check_key_for_plot(["X", "Y"]) self._make_scatter() - elif self._plot['TYPE']['0'] in [ - 'histogram', - 'hist', - 'HISTOGRAM', - 'HIST' + elif self._plot["TYPE"]["0"] in [ + "histogram", + "hist", + "HISTOGRAM", + "HIST", ]: - self._check_key_for_plot(['Y']) + self._check_key_for_plot(["Y"]) self._make_hist() else: raise ValueError(f'Type : {self._plot["TYPE"]["0"]} not available') @@ -779,7 +786,7 @@ def _check_key_for_plot(self, key_list): for key in key_list: if key not in self._plot.keys(): raise ValueError( - f'Key \'{key}\' not provided for plot of type ' + f"Key '{key}' not provided for plot of type " + f'\'{self._plot["TYPE"]["0"]}\'' ) @@ -802,9 +809,9 @@ def _make_plot(self): """ self._fig = plt.figure() - if 'TITLE' in self._plot.keys(): - title = self._plot['TITLE']['0'] - s = re.split('@', title) + if "TITLE" in self._plot.keys(): + title = self._plot["TITLE"]["0"] + s = re.split("@", title) if len(s) >= 3: title = s[0] ii = 1 @@ -812,23 +819,25 @@ def _make_plot(self): if ii % 2 == 0: title += idx else: - title += str(StrInterpreter( - idx, - self._cat, - make_compare=False, - mask_dict=self._mask_dict, - ).result) + title += str( + StrInterpreter( + idx, + self._cat, + make_compare=False, + mask_dict=self._mask_dict, + ).result + ) ii += 1 else: - title = '' + title = "" self._fig.suptitle(title) - for key in self._plot['Y'].keys(): - if 'LABEL' in self._plot.keys(): + for key in self._plot["Y"].keys(): + if "LABEL" in self._plot.keys(): try: - label = self._plot['LABEL'][key] - s = re.split('@', label) + label = self._plot["LABEL"][key] + s = re.split("@", label) if len(s) >= 3: label = s[0] jj = 1 @@ -836,68 +845,70 @@ def _make_plot(self): if jj % 2 == 0: label += j else: - label += str(StrInterpreter( - j, - self._cat, - make_compare=False, - mask_dict=self._mask_dict, - ).result) + label += str( + StrInterpreter( + j, + self._cat, + make_compare=False, + mask_dict=self._mask_dict, + ).result + ) jj += 1 except Exception: label = None else: label = None - if 'COLOR' in self._plot.keys(): + if "COLOR" in self._plot.keys(): try: - color = self._plot['COLOR'][key] + color = self._plot["COLOR"][key] except Exception: color = None else: color = None - if 'MARKER' in self._plot.keys(): + if "MARKER" in self._plot.keys(): try: - marker = self._plot['MARKER'][key] + marker = self._plot["MARKER"][key] except Exception: - marker = '+' + marker = "+" else: - marker = '+' - if 'MARKERSIZE' in self._plot.keys(): + marker = "+" + if "MARKERSIZE" in self._plot.keys(): try: - markersize = self._plot['MARKERSIZE'][key] + markersize = self._plot["MARKERSIZE"][key] except Exception: markersize = 1 else: markersize = 1 - if 'LINE' in self._plot.keys(): + if "LINE" in self._plot.keys(): try: - line = self._plot['LINE'][key] + line = self._plot["LINE"][key] except Exception: - line = '' + line = "" else: - line = '' - if 'ALPHA' in self._plot.keys(): + line = "" + if "ALPHA" in self._plot.keys(): try: - alpha = self._plot['ALPHA'][key] + alpha = self._plot["ALPHA"][key] except Exception: alpha = None else: alpha = None try: - x = self._plot['X'][key] + x = self._plot["X"][key] except Exception: - if len(self._plot['X']) == 1: - x = self._plot['X'][self._plot['X'].keys()[0]] + if len(self._plot["X"]) == 1: + x = self._plot["X"][self._plot["X"].keys()[0]] else: raise ValueError( - 'You need to specify X for each Y provided if they ' - + 'dont have the same' + "You need to specify X for each Y provided if they " + + "dont have the same" ) plt.plot( StrInterpreter(x, self._cat, mask_dict=self._mask_dict).result, StrInterpreter( - self._plot['Y'][key], + self._plot["Y"][key], self._cat, mask_dict=self._mask_dict, ).result, @@ -911,33 +922,33 @@ def _make_plot(self): ) # Set ploy limits for x and y - for (lim, set_lim) in zip(['XLIM', 'YLIM'], [plt.xlim, plt.ylim]): + for lim, set_lim in zip(["XLIM", "YLIM"], [plt.xlim, plt.ylim]): if lim in self._plot.keys(): try: - val = re.split(',', self._plot[lim]['0']) + val = re.split(",", self._plot[lim]["0"]) except Exception: raise ValueError( - f'Plot {lim} keyword/value not in correct format ' + f"Plot {lim} keyword/value not in correct format " + f'({lim}=lower,upper): {self._plot[lim]["0"]}' ) set_lim(float(val[0]), float(val[1])) - if 'LABEL' in self._plot.keys(): + if "LABEL" in self._plot.keys(): plt.legend() - if 'XLABEL' in self._plot.keys(): - plt.xlabel(self._plot['XLABEL']['0']) - if 'YLABEL' in self._plot.keys(): - plt.ylabel(self._plot['YLABEL']['0']) + if "XLABEL" in self._plot.keys(): + plt.xlabel(self._plot["XLABEL"]["0"]) + if "YLABEL" in self._plot.keys(): + plt.ylabel(self._plot["YLABEL"]["0"]) - if 'FORMAT' in self._plot.keys(): - out_format = self._plot['FORMAT']['0'] + if "FORMAT" in self._plot.keys(): + out_format = self._plot["FORMAT"]["0"] else: out_format = "PNG" self._fig.savefig( - f'{self._output_path}.{out_format.lower()}', + f"{self._output_path}.{out_format.lower()}", format=out_format, ) plt.close() @@ -961,9 +972,9 @@ def _make_scatter(self): """ self._fig = plt.figure() - if 'TITLE' in self._plot.keys(): - title = self._plot['TITLE']['0'] - s = re.split('@', title) + if "TITLE" in self._plot.keys(): + title = self._plot["TITLE"]["0"] + s = re.split("@", title) if len(s) >= 3: title = s[0] counter = 1 @@ -971,23 +982,25 @@ def _make_scatter(self): if counter % 2 == 0: title += idx else: - title += str(StrInterpreter( - idx, - self._cat, - make_compare=False, - mask_dict=self._mask_dict, - ).result) + title += str( + StrInterpreter( + idx, + self._cat, + make_compare=False, + mask_dict=self._mask_dict, + ).result + ) counter += 1 else: - title = '' + title = "" self._fig.suptitle(title) - for key in self._plot['SCATTER'].keys(): - if 'LABEL' in self._plot.keys(): + for key in self._plot["SCATTER"].keys(): + if "LABEL" in self._plot.keys(): try: - label = self._plot['LABEL'][key] - s = re.split('@', label) + label = self._plot["LABEL"][key] + s = re.split("@", label) if len(s) >= 3: label = s[0] jj = 1 @@ -995,58 +1008,60 @@ def _make_scatter(self): if jj % 2 == 0: label += j else: - label += str(StrInterpreter( - j, - self._cat, - make_compare=False, - mask_dict=self._mask_dict, - ).result) + label += str( + StrInterpreter( + j, + self._cat, + make_compare=False, + mask_dict=self._mask_dict, + ).result + ) jj += 1 except Exception: label = None else: label = None - if 'MARKER' in self._plot.keys(): + if "MARKER" in self._plot.keys(): try: - marker = self._plot['MARKER'][key] + marker = self._plot["MARKER"][key] except Exception: - marker = '+' + marker = "+" else: - marker = '+' - if 'ALPHA' in self._plot.keys(): + marker = "+" + if "ALPHA" in self._plot.keys(): try: - alpha = self._plot['ALPHA'][key] + alpha = self._plot["ALPHA"][key] except Exception: alpha = None else: alpha = None try: - x = self._plot['X'][key] + x = self._plot["X"][key] except Exception: - if len(self._plot['X']) == 1: - x = self._plot['X'][self._plot['X'].keys()[0]] + if len(self._plot["X"]) == 1: + x = self._plot["X"][self._plot["X"].keys()[0]] else: raise ValueError( - 'You need to specify X for each SCATTER provided if ' - + 'they dont have the same' + "You need to specify X for each SCATTER provided if " + + "they dont have the same" ) try: - y = self._plot['Y'][key] + y = self._plot["Y"][key] except Exception: - if len(self._plot['Y']) == 1: - y = self._plot['Y'][self._plot['Y'].keys()[0]] + if len(self._plot["Y"]) == 1: + y = self._plot["Y"][self._plot["Y"].keys()[0]] else: raise ValueError( - 'You need to specify Y for each SCATTER provided if ' - + 'they dont have the same' + "You need to specify Y for each SCATTER provided if " + + "they dont have the same" ) plt.scatter( StrInterpreter(x, self._cat, mask_dict=self._mask_dict).result, StrInterpreter(y, self._cat, mask_dict=self._mask_dict).result, c=StrInterpreter( - self._plot['SCATTER'][key], + self._plot["SCATTER"][key], self._cat, mask_dict=self._mask_dict, ).result, @@ -1056,22 +1071,22 @@ def _make_scatter(self): figure=self._fig, ) - if 'LABEL' in self._plot.keys(): + if "LABEL" in self._plot.keys(): plt.legend() - if 'XLABEL' in self._plot.keys(): - plt.xlabel(self._plot['XLABEL']['0']) - if 'YLABEL' in self._plot.keys(): - plt.ylabel(self._plot['YLABEL']['0']) + if "XLABEL" in self._plot.keys(): + plt.xlabel(self._plot["XLABEL"]["0"]) + if "YLABEL" in self._plot.keys(): + plt.ylabel(self._plot["YLABEL"]["0"]) plt.colorbar() - if 'FORMAT' in self._plot.keys(): - out_format = self._plot['FORMAT']['0'] + if "FORMAT" in self._plot.keys(): + out_format = self._plot["FORMAT"]["0"] else: - out_format = 'PNG' + out_format = "PNG" self._fig.savefig( - f'{self._output_path}.{out_format.lower()}', + f"{self._output_path}.{out_format.lower()}", format=out_format, ) plt.close() @@ -1088,9 +1103,9 @@ def _make_hist(self): """ self._fig = plt.figure() - if 'TITLE' in self._plot.keys(): - title = self._plot['TITLE']['0'] - s = re.split('@', title) + if "TITLE" in self._plot.keys(): + title = self._plot["TITLE"]["0"] + s = re.split("@", title) if len(s) >= 3: title = s[0] counter = 1 @@ -1098,35 +1113,37 @@ def _make_hist(self): if counter % 2 == 0: title += idx else: - title += str(StrInterpreter( - idx, - self._cat, - make_compare=False, - mask_dict=self._mask_dict, - ).result) + title += str( + StrInterpreter( + idx, + self._cat, + make_compare=False, + mask_dict=self._mask_dict, + ).result + ) counter += 1 else: - title = '' + title = "" self._fig.suptitle(title) - if 'HTYPE' in self._plot.keys(): - htype = self._plot['HTYPE']['0'] + if "HTYPE" in self._plot.keys(): + htype = self._plot["HTYPE"]["0"] else: - htype = 'bar' - if 'LOG' in self._plot.keys(): - if self._plot['LOG']['0'] in ['True', 'true', '1']: + htype = "bar" + if "LOG" in self._plot.keys(): + if self._plot["LOG"]["0"] in ["True", "true", "1"]: log = True else: log = False else: log = False - for key in self._plot['Y'].keys(): - if 'LABEL' in self._plot.keys(): + for key in self._plot["Y"].keys(): + if "LABEL" in self._plot.keys(): try: - label = self._plot['LABEL'][key] - s = re.split('@', label) + label = self._plot["LABEL"][key] + s = re.split("@", label) if len(s) >= 3: label = s[0] jj = 1 @@ -1134,37 +1151,39 @@ def _make_hist(self): if jj % 2 == 0: label += j else: - label += str(StrInterpreter( - j, - self._cat, - make_compare=False, - mask_dict=self._mask_dict, - ).result) + label += str( + StrInterpreter( + j, + self._cat, + make_compare=False, + mask_dict=self._mask_dict, + ).result + ) jj += 1 except Exception: label = None else: label = None - if 'COLOR' in self._plot.keys(): + if "COLOR" in self._plot.keys(): try: - color = self._plot['COLOR'][key] + color = self._plot["COLOR"][key] except Exception: color = None else: color = None - if 'BIN' in self._plot.keys(): + if "BIN" in self._plot.keys(): try: - bins = int(self._plot['BIN'][key]) + bins = int(self._plot["BIN"][key]) except Exception: - if len(self._plot['BIN']) == 1: + if len(self._plot["BIN"]) == 1: bins = int( - self._plot['BIN'][self._plot['BIN'].keys()[0]] + self._plot["BIN"][self._plot["BIN"].keys()[0]] ) else: bins = 50 - if 'ALPHA' in self._plot.keys(): + if "ALPHA" in self._plot.keys(): try: - alpha = float(self._plot['ALPHA'][key]) + alpha = float(self._plot["ALPHA"][key]) except Exception: alpha = None else: @@ -1172,7 +1191,7 @@ def _make_hist(self): plt.hist( StrInterpreter( - self._plot['Y'][key], + self._plot["Y"][key], self._cat, mask_dict=self._mask_dict, ).result, @@ -1184,19 +1203,19 @@ def _make_hist(self): log=log, ) - if 'LABEL' in self._plot.keys(): + if "LABEL" in self._plot.keys(): plt.legend() - if 'XLABEL' in self._plot.keys(): - plt.xlabel(self._plot['XLABEL']['0']) - if 'YLABEL' in self._plot.keys(): - plt.ylabel(self._plot['YLABEL']['0']) - if 'FORMAT' in self._plot.keys(): - out_format = self._plot['FORMAT']['0'] + if "XLABEL" in self._plot.keys(): + plt.xlabel(self._plot["XLABEL"]["0"]) + if "YLABEL" in self._plot.keys(): + plt.ylabel(self._plot["YLABEL"]["0"]) + if "FORMAT" in self._plot.keys(): + out_format = self._plot["FORMAT"]["0"] else: - out_format = 'PNG' + out_format = "PNG" self._fig.savefig( - f'{self._output_path}.{out_format.lower()}', + f"{self._output_path}.{out_format.lower()}", format=out_format, ) plt.close() diff --git a/shapepipe/modules/setools_runner.py b/shapepipe/modules/setools_runner.py index a076bd08e..f68720de3 100644 --- a/shapepipe/modules/setools_runner.py +++ b/shapepipe/modules/setools_runner.py @@ -11,11 +11,11 @@ @module_runner( - input_module='sextractor_runner', - version='1.1', - file_pattern=['sexcat'], - file_ext=['.fits'], - depends=['numpy', 'matplotlib'], + input_module="sextractor_runner", + version="1.1", + file_pattern=["sexcat"], + file_ext=[".fits"], + depends=["numpy", "matplotlib"], ) def setools_runner( input_file_list, @@ -27,12 +27,12 @@ def setools_runner( ): """Define The SETools Runner.""" # Get path to setools configuration file - config_file = config.getexpanded(module_config_sec, 'SETOOLS_CONFIG_PATH') + config_file = config.getexpanded(module_config_sec, "SETOOLS_CONFIG_PATH") # Create instance of SETools se_inst = SETools( input_file_list[0], - run_dirs['output'], + run_dirs["output"], file_number_string, config_file, ) diff --git a/shapepipe/modules/sextractor_package/__init__.py b/shapepipe/modules/sextractor_package/__init__.py index 658acf8ef..e3cd01188 100644 --- a/shapepipe/modules/sextractor_package/__init__.py +++ b/shapepipe/modules/sextractor_package/__init__.py @@ -67,4 +67,4 @@ """ -__all__ = ['sextractor_script'] +__all__ = ["sextractor_script"] diff --git a/shapepipe/modules/sextractor_package/sextractor_script.py b/shapepipe/modules/sextractor_package/sextractor_script.py index 45f44cb49..2c0124eed 100644 --- a/shapepipe/modules/sextractor_package/sextractor_script.py +++ b/shapepipe/modules/sextractor_package/sextractor_script.py @@ -41,7 +41,7 @@ def get_header_value(image_path, key): val = float(val) except Exception: raise ValueError( - f'The key {key} does not return a float value. Got {val}' + f"The key {key} does not return a float value. Got {val}" ) return val @@ -77,7 +77,8 @@ def make_post_process(cat_path, f_wcs_path, pos_params, ccd_size): """ cat = file_io.FITSCatalogue( - cat_path, SEx_catalogue=True, + cat_path, + SEx_catalogue=True, open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite, ) cat.open() @@ -85,31 +86,35 @@ def make_post_process(cat_path, f_wcs_path, pos_params, ccd_size): f_wcs = SqliteDict(f_wcs_path) key_list = list(f_wcs.keys()) if len(key_list) == 0: - raise IOError(f'Could not read sql file \'{f_wcs_path}\'') + raise IOError(f"Could not read sql file '{f_wcs_path}'") n_hdu = len(f_wcs[key_list[0]]) history = [] for idx in cat.get_data(1)[0][0]: - if re.split('HISTORY', idx)[0] == '': + if re.split("HISTORY", idx)[0] == "": history.append(idx) exp_list = [] - pattern = r'([0-9]*)p\.(.*)' + pattern = r"([0-9]*)p\.(.*)" for hist in history: m = re.search(pattern, hist) exp_list.append(m.group(1)) - obj_id = np.copy(cat.get_data()['NUMBER']) + obj_id = np.copy(cat.get_data()["NUMBER"]) - n_epoch = np.zeros(len(obj_id), dtype='int32') + n_epoch = np.zeros(len(obj_id), dtype="int32") for idx, exp in enumerate(exp_list): - pos_tmp = np.ones(len(obj_id), dtype='int32') * -1 + pos_tmp = np.ones(len(obj_id), dtype="int32") * -1 for idx_j in range(n_hdu): - w = f_wcs[exp][idx_j]['WCS'] + if exp not in f_wcs: + raise KeyError( + f"Exposure {exp} used in image {cat_path} but not" + + f" found in header file {f_wcs_path}. Make sure this" + + " file is complete." + ) + w = f_wcs[exp][idx_j]["WCS"] pix_tmp = w.all_world2pix( - cat.get_data()[pos_params[0]], - cat.get_data()[pos_params[1]], - 0 + cat.get_data()[pos_params[0]], cat.get_data()[pos_params[1]], 0 ) ind = ( (pix_tmp[0] > int(ccd_size[0])) @@ -126,22 +131,22 @@ def make_post_process(cat_path, f_wcs_path, pos_params, ccd_size): for ii in range(len(exp_name)) ], dtype=[ - ('NUMBER', obj_id.dtype), - ('EXP_NAME', exp_name.dtype), - ('CCD_N', pos_tmp.dtype) - ] + ("NUMBER", obj_id.dtype), + ("EXP_NAME", exp_name.dtype), + ("CCD_N", pos_tmp.dtype), + ], ) - cat.save_as_fits(data=a, ext_name=f'EPOCH_{idx}') + cat.save_as_fits(data=a, ext_name=f"EPOCH_{idx}") cat.open() f_wcs.close() - cat.add_col('N_EPOCH', n_epoch) + cat.add_col("N_EPOCH", n_epoch) cat.close() -class SExtractorCaller(): +class SExtractorCaller: """The SExtractor Caller. This class constructs the command line to call SExtractor based on the @@ -187,28 +192,28 @@ class SExtractorCaller(): """ def __init__( - self, - path_input_files, - path_output_dir, - number_string, - path_dot_sex, - path_dot_param, - path_dot_conv, - use_weight, - use_flag, - use_psf, - use_detection_image, - use_detection_weight, - use_zero_point, - use_background, - zero_point_key=None, - background_key=None, - check_image=None, - output_prefix=None, + self, + path_input_files, + path_output_dir, + number_string, + path_dot_sex, + path_dot_param, + path_dot_conv, + use_weight, + use_flag, + use_psf, + use_detection_image, + use_detection_weight, + use_zero_point, + use_background, + zero_point_key=None, + background_key=None, + check_image=None, + output_prefix=None, ): - self.cmd_line = '' - self._cmd_line_extra = '' + self.cmd_line = "" + self._cmd_line_extra = "" self._meas_img_path = path_input_files[0] self._all_input_path = path_input_files @@ -221,8 +226,13 @@ def __init__( self._path_dot_param = path_dot_param self._path_dot_conv = path_dot_conv - self.set_input_files(use_weight, use_flag, use_psf, - use_detection_image, use_detection_weight) + self.set_input_files( + use_weight, + use_flag, + use_psf, + use_detection_image, + use_detection_weight, + ) # Collect optional arguments for SExtractor self.get_zero_point(use_zero_point, zero_point_key) @@ -246,25 +256,25 @@ def get_output_name(self, output_prefix=None): """ if isinstance(output_prefix, type(None)): - self.prefix = '' + self.prefix = "" else: - if (output_prefix.lower() is not None) & (output_prefix != ''): - self.prefix = output_prefix + '_' + if (output_prefix.lower() is not None) & (output_prefix != ""): + self.prefix = output_prefix + "_" else: - self.prefix = '' + self.prefix = "" - output_file_name = self.prefix + f'sexcat{self._num_str}.fits' - output_file_path = f'{self._path_output_dir}/{output_file_name}' + output_file_name = self.prefix + f"sexcat{self._num_str}.fits" + output_file_path = f"{self._path_output_dir}/{output_file_name}" return output_file_path def set_input_files( - self, - use_weight, - use_flag, - use_psf, - use_detect_img, - use_detect_weight, + self, + use_weight, + use_flag, + use_psf, + use_detect_img, + use_detect_weight, ): """Set Input Files. @@ -297,15 +307,13 @@ def set_input_files( if use_flag: self._cmd_line_extra += ( - ' -FLAG_IMAGE ' - + f'{self._all_input_path[extra]}' + " -FLAG_IMAGE " + f"{self._all_input_path[extra]}" ) extra += 1 if use_psf: self._cmd_line_extra += ( - ' -PSF_NAME ' - + f'{self._all_input_path[extra]}' + " -PSF_NAME " + f"{self._all_input_path[extra]}" ) extra += 1 @@ -314,13 +322,12 @@ def set_input_files( # First, consistency checks if use_detect_weight and not use_detect_img: raise ValueError( - 'DETECTION_WEIGHT cannot be True ' - + 'if DETECTION_IMAGE is False' + "DETECTION_WEIGHT cannot be True " + + "if DETECTION_IMAGE is False" ) if use_detect_weight and not use_weight: raise ValueError( - 'DETECTION_WEIGHT cannot be True ' - + 'if WEIGHT_FILE is False' + "DETECTION_WEIGHT cannot be True " + "if WEIGHT_FILE is False" ) # Check for separate image file for detection and measurement @@ -341,18 +348,17 @@ def set_input_files( else: detect_weight_path = weight_image self._cmd_line_extra += ( - f' -WEIGHT_IMAGE {detect_weight_path}' - + f',{weight_image}' + f" -WEIGHT_IMAGE {detect_weight_path}" + f",{weight_image}" ) else: - self._cmd_line_extra += ' -WEIGHT_TYPE None' + self._cmd_line_extra += " -WEIGHT_TYPE None" if extra != len(self._all_input_path): raise ValueError( - 'Incoherence between input file number and keys ' - + f'related to extra files: 1 regular + {extra-1} extra ' - + 'files not compatible with total file list ' - + f'length of {len(self._all_input_path)}' + "Incoherence between input file number and keys " + + f"related to extra files: 1 regular + {extra-1} extra " + + "files not compatible with total file list " + + f"length of {len(self._all_input_path)}" ) def get_zero_point(self, use_zp, zp_key=None): @@ -370,7 +376,7 @@ def get_zero_point(self, use_zp, zp_key=None): """ if use_zp and not isinstance(zp_key, type(None)): zp_value = get_header_value(self._meas_img_path, zp_key) - self._cmd_line_extra += f' -MAG_ZEROPOINT {zp_value}' + self._cmd_line_extra += f" -MAG_ZEROPOINT {zp_value}" def get_background(self, use_bkg, bkg_key=None): """Get Background. @@ -388,7 +394,7 @@ def get_background(self, use_bkg, bkg_key=None): if use_bkg and not isinstance(bkg_key, type(None)): bkg_value = get_header_value(self._meas_img_path, bkg_key) self._cmd_line_extra += ( - f' -BACK_TYPE MANUAL -BACK_VALUE {bkg_value}' + f" -BACK_TYPE MANUAL -BACK_VALUE {bkg_value}" ) def get_check_image(self, check_image): @@ -402,18 +408,21 @@ def get_check_image(self, check_image): List of SExtractor keys corresponding to check images """ - if (len(check_image) == 1) & (check_image[0] == ''): - check_type = ['NONE'] - check_name = ['none'] + if (len(check_image) == 1) & (check_image[0] == ""): + check_type = ["NONE"] + check_name = ["none"] else: check_type = [] check_name = [] for key in check_image: check_type.append(key.upper()) check_name.append( - self._path_output_dir + '/' + self.prefix + self._path_output_dir + + "/" + + self.prefix + key.lower() - + self._num_str + '.fits' + + self._num_str + + ".fits" ) self._cmd_line_extra += ( @@ -439,14 +448,14 @@ def make_command_line(self, exec_path): """ # Base arguments for SExtractor command_line_base = ( - f'{exec_path} {self._detect_img_path},{self._meas_img_path} ' - + f'-c {self._path_dot_sex} ' - + f'-PARAMETERS_NAME {self._path_dot_param} ' - + f'-FILTER_NAME {self._path_dot_conv} ' - + f'-CATALOG_NAME {self.path_output_file}' + f"{exec_path} {self._detect_img_path},{self._meas_img_path} " + + f"-c {self._path_dot_sex} " + + f"-PARAMETERS_NAME {self._path_dot_param} " + + f"-FILTER_NAME {self._path_dot_conv} " + + f"-CATALOG_NAME {self.path_output_file}" ) - command_line = f'{command_line_base} {self._cmd_line_extra}' + command_line = f"{command_line_base} {self._cmd_line_extra}" return command_line @@ -470,11 +479,11 @@ def parse_errors(stderr, stdout): Updated standard output and error """ - check_error = re.findall('error', stdout.lower()) - check_error2 = re.findall('all done', stdout.lower()) + check_error = re.findall("error", stdout.lower()) + check_error2 = re.findall("all done", stdout.lower()) if check_error == []: - stderr2 = '' + stderr2 = "" else: stderr2 = stdout diff --git a/shapepipe/modules/sextractor_runner.py b/shapepipe/modules/sextractor_runner.py index 9e3bac7d3..869523441 100644 --- a/shapepipe/modules/sextractor_runner.py +++ b/shapepipe/modules/sextractor_runner.py @@ -2,7 +2,7 @@ Module runner for ``sextractor``. -:Author: Axel Guinot +:Author:s Axel Guinot, Martin Kilbinger """ @@ -14,12 +14,12 @@ @module_runner( - version='1.0.1', - input_module='mask_runner', - file_pattern=['image', 'weight', 'flag'], - file_ext=['.fits', '.fits', '.fits'], - executes=['sex'], - depends=['numpy'], + version="1.0.1", + input_module="mask_runner", + file_pattern=["image", "weight", "flag"], + file_ext=[".fits", ".fits", ".fits"], + executes=["sex"], + depends=["numpy"], ) def sextractor_runner( input_file_list, @@ -31,47 +31,47 @@ def sextractor_runner( ): """Define The SExtractor Runner.""" # Set the SExtractor executable name - if config.has_option(module_config_sec, 'EXEC_PATH'): - exec_path = config.getexpanded(module_config_sec, 'EXEC_PATH') + if config.has_option(module_config_sec, "EXEC_PATH"): + exec_path = config.getexpanded(module_config_sec, "EXEC_PATH") else: - exec_path = 'sex' + exec_path = "sex" # Get SExtractor config options - dot_sex = config.getexpanded(module_config_sec, 'DOT_SEX_FILE') - dot_param = config.getexpanded(module_config_sec, 'DOT_PARAM_FILE') - dot_conv = config.getexpanded(module_config_sec, 'DOT_CONV_FILE') - weight_file = config.getboolean(module_config_sec, 'WEIGHT_IMAGE') - flag_file = config.getboolean(module_config_sec, 'FLAG_IMAGE') - psf_file = config.getboolean(module_config_sec, 'PSF_FILE') - detection_image = config.getboolean(module_config_sec, 'DETECTION_IMAGE') - detection_weight = config.getboolean(module_config_sec, 'DETECTION_WEIGHT') - - zp_from_header = config.getboolean(module_config_sec, 'ZP_FROM_HEADER') + dot_sex = config.getexpanded(module_config_sec, "DOT_SEX_FILE") + dot_param = config.getexpanded(module_config_sec, "DOT_PARAM_FILE") + dot_conv = config.getexpanded(module_config_sec, "DOT_CONV_FILE") + weight_file = config.getboolean(module_config_sec, "WEIGHT_IMAGE") + flag_file = config.getboolean(module_config_sec, "FLAG_IMAGE") + psf_file = config.getboolean(module_config_sec, "PSF_FILE") + detection_image = config.getboolean(module_config_sec, "DETECTION_IMAGE") + detection_weight = config.getboolean(module_config_sec, "DETECTION_WEIGHT") + + zp_from_header = config.getboolean(module_config_sec, "ZP_FROM_HEADER") if zp_from_header: - zp_key = config.get(module_config_sec, 'ZP_KEY') + zp_key = config.get(module_config_sec, "ZP_KEY") else: zp_key = None - bkg_from_header = config.getboolean(module_config_sec, 'BKG_FROM_HEADER') + bkg_from_header = config.getboolean(module_config_sec, "BKG_FROM_HEADER") if bkg_from_header: - bkg_key = config.get(module_config_sec, 'BKG_KEY') + bkg_key = config.get(module_config_sec, "BKG_KEY") else: bkg_key = None - if config.has_option(module_config_sec, 'CHECKIMAGE'): - check_image = config.getlist(module_config_sec, 'CHECKIMAGE') + if config.has_option(module_config_sec, "CHECKIMAGE"): + check_image = config.getlist(module_config_sec, "CHECKIMAGE") else: - check_image = [''] + check_image = [""] - if config.has_option(module_config_sec, 'PREFIX'): - prefix = config.get(module_config_sec, 'PREFIX') + if config.has_option(module_config_sec, "PREFIX"): + prefix = config.get(module_config_sec, "PREFIX") else: prefix = None # Create sextractor caller class instance ss_inst = ss.SExtractorCaller( input_file_list, - run_dirs['output'], + run_dirs["output"], file_number_string, dot_sex, dot_param, @@ -91,7 +91,7 @@ def sextractor_runner( # Generate sextractor command line command_line = ss_inst.make_command_line(exec_path) - w_log.info(f'Calling command: {command_line}') + w_log.info(f"Calling command: {command_line}") # Execute command line stderr, stdout = execute(command_line) @@ -100,14 +100,12 @@ def sextractor_runner( stdout, stderr = ss_inst.parse_errors(stderr, stdout) # Run sextractor post processing - if config.getboolean(module_config_sec, 'MAKE_POST_PROCESS'): - f_wcs_path = config.getexpanded(module_config_sec, 'LOG_WCS') - pos_params = config.getlist(module_config_sec, 'WORLD_POSITION') - ccd_size = config.getlist(module_config_sec, 'CCD_SIZE') + if config.getboolean(module_config_sec, "MAKE_POST_PROCESS"): + f_wcs_path = config.getexpanded(module_config_sec, "LOG_WCS") + pos_params = config.getlist(module_config_sec, "WORLD_POSITION") + ccd_size = config.getlist(module_config_sec, "CCD_SIZE") ss.make_post_process( - ss_inst.path_output_file, - f_wcs_path, - pos_params, ccd_size + ss_inst.path_output_file, f_wcs_path, pos_params, ccd_size ) # Return stdout and stderr diff --git a/shapepipe/modules/split_exp_package/__init__.py b/shapepipe/modules/split_exp_package/__init__.py index fb55a7f42..4cfb8a764 100644 --- a/shapepipe/modules/split_exp_package/__init__.py +++ b/shapepipe/modules/split_exp_package/__init__.py @@ -39,4 +39,4 @@ """ -__all__ = ['split_exp.py'] +__all__ = ["split_exp.py"] diff --git a/shapepipe/modules/split_exp_package/split_exp.py b/shapepipe/modules/split_exp_package/split_exp.py index 2dd1a5875..c4b824389 100644 --- a/shapepipe/modules/split_exp_package/split_exp.py +++ b/shapepipe/modules/split_exp_package/split_exp.py @@ -42,7 +42,7 @@ def __init__( output_dir, file_number_string, output_suffix, - n_hdu + n_hdu, ): self._input_file_list = input_file_list @@ -58,29 +58,19 @@ def process(self): """ for exp_path, output_suffix in zip( - self._input_file_list, - self._output_suffix + self._input_file_list, self._output_suffix ): - transf_int = 'flag' in output_suffix - transf_coord = 'image' in output_suffix - save_header = 'image' in output_suffix + transf_int = "flag" in output_suffix + transf_coord = "image" in output_suffix + save_header = "image" in output_suffix self.create_hdus( - exp_path, - output_suffix, - transf_coord, - transf_int, - save_header + exp_path, output_suffix, transf_coord, transf_int, save_header ) def create_hdus( - self, - exp_path, - output_suffix, - transf_coord, - transf_int, - save_header + self, exp_path, output_suffix, transf_coord, transf_int, save_header ): """Create HDUs. @@ -100,26 +90,43 @@ def create_hdus( Save WCS information if ``True`` """ - header_file = np.zeros(self._n_hdu, dtype='O') + header_file = np.zeros(self._n_hdu, dtype="O") + + hdu_list = fits.open(exp_path) + if len(hdu_list) != self._n_hdu + 1: + raise ValueError( + f"Image {exp_path} has {len(hdu_list)} + 1 HDUs," + + f" expected were {self._n_hdu} + 1" + ) for idx in range(1, self._n_hdu + 1): - h = fits.getheader(exp_path, idx) + # h = fits.getheader(exp_path, idx) + h = hdu_list[idx].header if transf_coord: stp.pv_to_sip(h) - d = fits.getdata(exp_path, idx) + # d = fits.getdata(exp_path, idx) + try: + d = hdu_list[idx].data + except TypeError as e: + msg = ( + f"Error retrieving data of HDU #{idx} of image {exp_path}." + + f" Check if image file is complete." + ) + print(msg, e) + raise + if transf_int: d = d.astype(np.int16) file_name = ( - f'{self._output_dir}/{output_suffix}' - + f'{self._file_number_string}-{str(idx-1)}.fits' + f"{self._output_dir}/{output_suffix}" + + f"{self._file_number_string}-{str(idx-1)}.fits" ) new_file = file_io.FITSCatalogue( - file_name, - open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite + file_name, open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite ) new_file.save_as_fits(data=d, image=True, image_header=h) @@ -127,12 +134,12 @@ def create_hdus( try: w = WCS(h) except Exception: - print(f'WCS error for file {exp_path}') + print(f"WCS error for file {exp_path}") raise - header_file[idx - 1] = {'WCS': w, 'header': h.tostring()} + header_file[idx - 1] = {"WCS": w, "header": h.tostring()} if save_header: file_name = ( - f'{self._output_dir}/headers{self._file_number_string}.npy' + f"{self._output_dir}/headers{self._file_number_string}.npy" ) np.save(file_name, header_file) diff --git a/shapepipe/modules/split_exp_runner.py b/shapepipe/modules/split_exp_runner.py index 5ddae5328..77e6010d0 100644 --- a/shapepipe/modules/split_exp_runner.py +++ b/shapepipe/modules/split_exp_runner.py @@ -11,12 +11,12 @@ @module_runner( - version='1.1', - input_module='get_images_runner', - file_pattern=['image', 'weight', 'flag'], - file_ext=['.fz', '.fz', '.fz'], - depends=['numpy', 'astropy', 'sip_tpv'], - run_method='parallel', + version="1.1", + input_module="get_images_runner", + file_pattern=["image", "weight", "flag"], + file_ext=[".fz", ".fz", ".fz"], + depends=["numpy", "astropy", "sip_tpv"], + run_method="parallel", ) def split_exp_runner( input_file_list, @@ -28,17 +28,17 @@ def split_exp_runner( ): """Define The Split Exposures Runner.""" # Get file suffix - output_suffix = config.getlist(module_config_sec, 'OUTPUT_SUFFIX') + output_suffix = config.getlist(module_config_sec, "OUTPUT_SUFFIX") # Get the number of HDUs - n_hdu = config.getint(module_config_sec, 'N_HDU') + n_hdu = config.getint(module_config_sec, "N_HDU") # Create split exposures class instance split_inst = SplitExposures( input_file_list, - run_dirs['output'], + run_dirs["output"], file_number_string, output_suffix, - n_hdu + n_hdu, ) # Process splitting diff --git a/shapepipe/modules/spread_model_package/__init__.py b/shapepipe/modules/spread_model_package/__init__.py index 045e19977..336283e78 100644 --- a/shapepipe/modules/spread_model_package/__init__.py +++ b/shapepipe/modules/spread_model_package/__init__.py @@ -33,4 +33,4 @@ """ -__all__ = ['spread_model'] +__all__ = ["spread_model"] diff --git a/shapepipe/modules/spread_model_package/spread_model.py b/shapepipe/modules/spread_model_package/spread_model.py index 9d4bd76ea..0ea9c51f9 100644 --- a/shapepipe/modules/spread_model_package/spread_model.py +++ b/shapepipe/modules/spread_model_package/spread_model.py @@ -61,7 +61,7 @@ def get_sm(obj_vign, psf_vign, model_vign, weight_vign): tnt = np.sum(t_v * noise_v * t_v * w_v) pnp = np.sum(psf_v * noise_v * psf_v * w_v) tnp = np.sum(t_v * noise_v * psf_v * w_v) - err = tnt * pg ** 2 + pnp * tg ** 2 - 2 * tnp * pg * tg + err = tnt * pg**2 + pnp * tg**2 - 2 * tnp * pg * tg # Compute spread model if pg > 0: @@ -102,9 +102,7 @@ def get_model(sigma, flux, img_shape, pixel_scale=0.186): """ # Get scale radius - scale_radius = ( - 1 / 16 * galaxy.sigma_to_fwhm(sigma, pixel_scale=pixel_scale) - ) + scale_radius = 1 / 16 * galaxy.sigma_to_fwhm(sigma, pixel_scale=pixel_scale) # Get galaxy model gal_obj = galsim.Exponential(scale_radius=scale_radius, flux=flux) @@ -117,15 +115,11 @@ def get_model(sigma, flux, img_shape, pixel_scale=0.186): # Draw galaxy and PSF on vignets gal_vign = gal_obj.drawImage( - nx=img_shape[0], - ny=img_shape[1], - scale=pixel_scale + nx=img_shape[0], ny=img_shape[1], scale=pixel_scale ).array psf_vign = psf_obj.drawImage( - nx=img_shape[0], - ny=img_shape[1], - scale=pixel_scale + nx=img_shape[0], ny=img_shape[1], scale=pixel_scale ).array return gal_vign, psf_vign @@ -167,7 +161,7 @@ def __init__( weight_cat_path, output_path, pixel_scale, - output_mode + output_mode, ): self._sex_cat_path = sex_cat_path @@ -186,11 +180,11 @@ def process(self): # Get data sex_cat = file_io.FITSCatalogue(self._sex_cat_path, SEx_catalogue=True) sex_cat.open() - obj_id = np.copy(sex_cat.get_data()['NUMBER']) - obj_vign = np.copy(sex_cat.get_data()['VIGNET']) + obj_id = np.copy(sex_cat.get_data()["NUMBER"]) + obj_vign = np.copy(sex_cat.get_data()["VIGNET"]) obj_mag = None - if self._output_mode == 'new': - obj_mag = np.copy(sex_cat.get_data()['MAG_AUTO']) + if self._output_mode == "new": + obj_mag = np.copy(sex_cat.get_data()["MAG_AUTO"]) sex_cat.close() psf_cat = SqliteDict(self._psf_cat_path) @@ -200,7 +194,7 @@ def process(self): SEx_catalogue=True, ) weight_cat.open() - weigh_vign = weight_cat.get_data()['VIGNET'] + weigh_vign = weight_cat.get_data()["VIGNET"] weight_cat.close() # Get spread model @@ -210,7 +204,7 @@ def process(self): for idx, id_tmp in enumerate(obj_id): sigma_list = [] - if psf_cat[str(id_tmp)] == 'empty': + if psf_cat[str(id_tmp)] == "empty": spread_model_final.append(-1) spread_model_err_final.append(1) continue @@ -219,44 +213,40 @@ def process(self): for expccd_name_tmp in psf_expccd_name: psf_cat_id_ccd = psf_cat[str(id_tmp)][expccd_name_tmp] - sigma_list.append( - psf_cat_id_ccd['SHAPES']['SIGMA_PSF_HSM'] - ) + sigma_list.append(psf_cat_id_ccd["SHAPES"]["SIGMA_PSF_HSM"]) - obj_vign_tmp = obj_vign[idx] - obj_flux_tmp = 1. obj_sigma_tmp = np.mean(sigma_list) - obj_weight_tmp = weigh_vign[idx] - obj_model_tmp, obj_psf_tmp = get_model( - obj_sigma_tmp, - obj_flux_tmp, - obj_vign_tmp.shape, - self._pixel_scale - ) + if obj_sigma_tmp > 0: + obj_vign_tmp = obj_vign[idx] + obj_flux_tmp = 1.0 + obj_weight_tmp = weigh_vign[idx] + obj_model_tmp, obj_psf_tmp = get_model( + obj_sigma_tmp, + obj_flux_tmp, + obj_vign_tmp.shape, + self._pixel_scale, + ) - obj_sm, obj_sm_err = get_sm( - obj_vign_tmp, - obj_psf_tmp, - obj_model_tmp, - obj_weight_tmp - ) + obj_sm, obj_sm_err = get_sm( + obj_vign_tmp, obj_psf_tmp, obj_model_tmp, obj_weight_tmp + ) + else: + # size < 0, something is not right with this object + obj_sm, obj_sm_err = -1.0, -1.0 spread_model_final.append(obj_sm) spread_model_err_final.append(obj_sm_err) - spread_model_final = np.array(spread_model_final, dtype='float64') + spread_model_final = np.array(spread_model_final, dtype="float64") spread_model_err_final = np.array( spread_model_err_final, - dtype='float64', + dtype="float64", ) psf_cat.close() self.save_results( - spread_model_final, - spread_model_err_final, - obj_mag, - obj_id + spread_model_final, spread_model_err_final, obj_mag, obj_id ) def save_results(self, sm, sm_err, mag, number): @@ -281,23 +271,22 @@ def save_results(self, sm, sm_err, mag, number): For incorrect output mode """ - if self._output_mode == 'new': + if self._output_mode == "new": new_cat = file_io.FITSCatalogue( self._output_path, SEx_catalogue=True, - open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite + open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite, ) dict_data = { - 'NUMBER': number, - 'MAG': mag, - 'SPREAD_MODEL': sm, - 'SPREADERR_MODEL': sm_err + "NUMBER": number, + "MAG": mag, + "SPREAD_MODEL": sm, + "SPREADERR_MODEL": sm_err, } new_cat.save_as_fits( - data=dict_data, - sex_cat_path=self._sex_cat_path + data=dict_data, sex_cat_path=self._sex_cat_path ) - elif self._output_mode == 'add': + elif self._output_mode == "add": ori_cat = file_io.FITSCatalogue( self._sex_cat_path, SEx_catalogue=True, @@ -306,17 +295,14 @@ def save_results(self, sm, sm_err, mag, number): new_cat = file_io.FITSCatalogue( self._output_path, SEx_catalogue=True, - open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite + open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite, ) ori_cat.add_col( - 'SPREAD_MODEL', - sm, - new_cat=True, - new_cat_inst=new_cat + "SPREAD_MODEL", sm, new_cat=True, new_cat_inst=new_cat ) ori_cat.close() new_cat.open() - new_cat.add_col('SPREADERR_MODEL', sm_err) + new_cat.add_col("SPREADERR_MODEL", sm_err) new_cat.close() else: - raise ValueError('Mode must be in [new, add].') + raise ValueError("Mode must be in [new, add].") diff --git a/shapepipe/modules/spread_model_runner.py b/shapepipe/modules/spread_model_runner.py index 59e1319be..16c9a2d3b 100644 --- a/shapepipe/modules/spread_model_runner.py +++ b/shapepipe/modules/spread_model_runner.py @@ -11,16 +11,16 @@ @module_runner( - version='1.1', + version="1.1", input_module=[ - 'sextractor_runner', - 'psfex_interp_runner', - 'vignetmaker_runner' + "sextractor_runner", + "psfex_interp_runner", + "vignetmaker_runner", ], - file_pattern=['sexcat', 'galaxy_psf', 'weight_vign'], - file_ext=['.fits', '.sqlite', '.fits'], - depends=['numpy', 'galsim'], - run_method='parallel', + file_pattern=["sexcat", "galaxy_psf", "weight_vign"], + file_ext=[".fits", ".sqlite", ".fits"], + depends=["numpy", "galsim"], + run_method="parallel", ) def spread_model_runner( input_file_list, @@ -35,21 +35,21 @@ def spread_model_runner( sex_cat_path, psf_cat_path, weight_cat_path = input_file_list # Get file prefix (optional) - if config.has_option(module_config_sec, 'PREFIX'): - prefix = config.get(module_config_sec, 'PREFIX') - if (prefix.lower() != 'none') & (prefix != ''): - prefix = prefix + '_' + if config.has_option(module_config_sec, "PREFIX"): + prefix = config.get(module_config_sec, "PREFIX") + if (prefix.lower() != "none") & (prefix != ""): + prefix = prefix + "_" else: - prefix = '' + prefix = "" else: - prefix = '' + prefix = "" # Get pixel scale and output mode - pixel_scale = config.getfloat(module_config_sec, 'PIXEL_SCALE') - output_mode = config.get(module_config_sec, 'OUTPUT_MODE') + pixel_scale = config.getfloat(module_config_sec, "PIXEL_SCALE") + output_mode = config.get(module_config_sec, "OUTPUT_MODE") # Set output file path - file_name = f'{prefix}sexcat_sm{file_number_string}.fits' + file_name = f"{prefix}sexcat_sm{file_number_string}.fits" output_path = f'{run_dirs["output"]}/{file_name}' # Create spread model class instance diff --git a/shapepipe/modules/uncompress_fits_package/__init__.py b/shapepipe/modules/uncompress_fits_package/__init__.py index 2630e1ab4..5f5cd26bc 100644 --- a/shapepipe/modules/uncompress_fits_package/__init__.py +++ b/shapepipe/modules/uncompress_fits_package/__init__.py @@ -29,4 +29,4 @@ """ -__all__ = ['uncompress_fits'] +__all__ = ["uncompress_fits"] diff --git a/shapepipe/modules/uncompress_fits_package/uncompress_fits.py b/shapepipe/modules/uncompress_fits_package/uncompress_fits.py index f8eca921d..55f3d4d75 100644 --- a/shapepipe/modules/uncompress_fits_package/uncompress_fits.py +++ b/shapepipe/modules/uncompress_fits_package/uncompress_fits.py @@ -35,7 +35,7 @@ def __init__( output_pattern_list, output_dir, file_number_string, - data_hdu + data_hdu, ): self._input_file_list = input_file_list @@ -61,7 +61,7 @@ def process(self): hdu = fits.PrimaryHDU(data, header) hdul = fits.HDUList([hdu]) hdul.writeto( - f'{self._output_dir}/' - + f'{self._output_pattern_list[idx]}' - + f'{self._file_number_string}.fits' + f"{self._output_dir}/" + + f"{self._output_pattern_list[idx]}" + + f"{self._file_number_string}.fits" ) diff --git a/shapepipe/modules/uncompress_fits_runner.py b/shapepipe/modules/uncompress_fits_runner.py index 3ff070233..39ee4186e 100644 --- a/shapepipe/modules/uncompress_fits_runner.py +++ b/shapepipe/modules/uncompress_fits_runner.py @@ -11,10 +11,10 @@ @module_runner( - version='1.1', - file_pattern=['image'], - file_ext=['.fits'], - numbering_scheme='_0', + version="1.1", + file_pattern=["image"], + file_ext=[".fits"], + numbering_scheme="_0", ) def uncompress_fits_runner( input_file_list, @@ -26,27 +26,27 @@ def uncompress_fits_runner( ): """Define The Uncompress Fits Runner.""" # Get HDU number of input image data - if config.has_option(module_config_sec, 'HDU_DATA'): - data_hdu = config.getint(module_config_sec, 'HDU_DATA') + if config.has_option(module_config_sec, "HDU_DATA"): + data_hdu = config.getint(module_config_sec, "HDU_DATA") else: data_hdu = 0 # Get output patterns - output_pattern_list = config.getlist(module_config_sec, 'OUTPUT_PATTERN') + output_pattern_list = config.getlist(module_config_sec, "OUTPUT_PATTERN") # Check consistency of input and output list lengths if len(input_file_list) != len(output_pattern_list): raise ValueError( - f'Lists INPUT_PATH ({len(input_file_list)})' - + f' and OUTPUT_PATTERN ({len(output_pattern_list)})' - + 'need to be of equal length.' + f"Lists INPUT_PATH ({len(input_file_list)})" + + f" and OUTPUT_PATTERN ({len(output_pattern_list)})" + + "need to be of equal length." ) # Create instance of uncompress uncompress_inst = uncompress_fits.Uncompress( input_file_list, output_pattern_list, - run_dirs['output'], + run_dirs["output"], file_number_string, data_hdu, ) diff --git a/shapepipe/modules/vignetmaker_package/__init__.py b/shapepipe/modules/vignetmaker_package/__init__.py index a61e83c27..b24f8397e 100644 --- a/shapepipe/modules/vignetmaker_package/__init__.py +++ b/shapepipe/modules/vignetmaker_package/__init__.py @@ -47,4 +47,4 @@ """ -__all__ = ['vignetmaker'] +__all__ = ["vignetmaker"] diff --git a/shapepipe/modules/vignetmaker_package/vignetmaker.py b/shapepipe/modules/vignetmaker_package/vignetmaker.py index 047de8a6b..de05a9f2b 100644 --- a/shapepipe/modules/vignetmaker_package/vignetmaker.py +++ b/shapepipe/modules/vignetmaker_package/vignetmaker.py @@ -7,6 +7,7 @@ """ import re +import os import numpy as np from astropy.wcs import WCS @@ -68,17 +69,24 @@ def process(self, image_path_list, rad, prefix): Prefix of the output file """ + # Loop over input image files for _prefix, img in zip(prefix, image_path_list): image_path = img - if self._pos_type == 'PIX': + # Set x and y positions according to input coordinate type + if self._pos_type == "PIX": + # Cartesian pixel coordinates: leave as is pos = self._pos - elif self._pos_type == 'SPHE': + + elif self._pos_type == "SPHE": + # Spherical world coordinates: transform using image header WCS pos = convert_pos(image_path) + else: raise ValueError( - 'Coordinates type must be in : PIX (pixel), ' - + 'SPHE (spherical).' + f"Invalid coordinates type {self._pos_type}; allowed are" + + " 'PIX' (Cartesian pixel coordinates) and " + + "'SPHE' (spherical world coordinates))" ) vign = self._get_stamp(image_path, pos - 1, rad) @@ -94,13 +102,14 @@ def process(self, image_path_list, rad, prefix): def get_pos(self, pos_params): """Get Positions. - Get the positions of the given parameters from SExtractor catalogue. + Get the positions according to the position parameter column names + from the SExtractor cinput atalogue. Parameters ---------- pos_params : list - List of string containing the SExtractor's parameters to use as - positions + column names (SExtractor output parameters) to use as + positions for x and y (ra and dec); length has to be 2 Returns ------- @@ -122,7 +131,8 @@ def get_pos(self, pos_params): def convert_pos(self, image_path): """Convert Position. - Convert positions from world coordinates to pixel coordinates. + Convert positions from world coordinates to pixel coordinates using + image header WCS. Parameters ---------- @@ -135,18 +145,25 @@ def convert_pos(self, image_path): New positions in pixel coordinates """ + # Get image header file = file_io.FITSCatalogue(image_path) file.open() head = file.get_header(0) file.close() + # Get WCS transformation matrix wcs = WCS(head) + # Create copy of input positions pos_tmp = np.copy(self._pos) + + # Exchange x and y pos_tmp[:, [0, 1]] = pos_tmp[:, [1, 0]] + # Transform from world to pixel coordinates new_pos = wcs.all_world2pix(pos_tmp, 1) + # Exchange x and y back to original new_pos[:, [0, 1]] = new_pos[:, [1, 0]] return new_pos @@ -183,40 +200,39 @@ def _get_stamp(self, img_path, pos, rad): return vign - def _get_stamp_me(self, image_dir, image_pattern): + def _get_stamp_me(self, image_dirs, image_pattern): """Get Stamp Multi-Epoch. Get stamps for multi-epoch data. Parameters ---------- - image_dir : str - Path to the directory where the images are + image_dirs : list + Path to directories to search for input images image_pattern : str Common part of the file names Returns ------- dict - Directory containing object id and vignets for each epoch + Dictionary containing object id and vignets for each epoch """ cat = file_io.FITSCatalogue(self._galcat_path, SEx_catalogue=True) cat.open() - all_id = np.copy(cat.get_data()['NUMBER']) - n_epoch = np.copy(cat.get_data()['N_EPOCH']) + all_id = np.copy(cat.get_data()["NUMBER"]) + n_epoch = np.copy(cat.get_data()["N_EPOCH"]) list_ext_name = cat.get_ext_name() hdu_ind = [ - i for i in range(len(list_ext_name)) - if 'EPOCH' in list_ext_name[i] + i for i in range(len(list_ext_name)) if "EPOCH" in list_ext_name[i] ] final_list = [] for hdu_index in hdu_ind: - exp_name = cat.get_data(hdu_index)['EXP_NAME'][0] - ccd_list = list(set(cat.get_data(hdu_index)['CCD_N'])) + exp_name = cat.get_data(hdu_index)["EXP_NAME"][0] + ccd_list = list(set(cat.get_data(hdu_index)["CCD_N"])) array_vign = None array_id = None array_exp_name = None @@ -226,19 +242,30 @@ def _get_stamp_me(self, image_dir, image_pattern): if ccd == -1: continue - img_path = ( - image_dir + '/' + image_pattern + '-' - + exp_name + '-' + str(ccd) + '.fits' - ) - ind_obj = np.where(cat.get_data(hdu_index)['CCD_N'] == ccd)[0] + # Look for input image + found = False + image_name = f"{image_pattern}-{exp_name}-{ccd}.fits" + for image_dir in image_dirs: + img_path = f"{image_dir}/{image_name}" + if os.path.exists(img_path): + found = True + break + if not found: + raise FileNotFoundError( + f"Could not find image {image_name}" + ) + + ind_obj = np.where(cat.get_data(hdu_index)["CCD_N"] == ccd)[0] obj_id = all_id[ind_obj] - wcs_file = self._f_wcs_file[exp_name][ccd]['WCS'] - pos = np.array(wcs_file.all_world2pix( - self._pos[:, 1][ind_obj], - self._pos[:, 0][ind_obj], - 1, - )).T + wcs_file = self._f_wcs_file[exp_name][ccd]["WCS"] + pos = np.array( + wcs_file.all_world2pix( + self._pos[:, 1][ind_obj], + self._pos[:, 0][ind_obj], + 1, + ) + ).T pos[:, [0, 1]] = pos[:, [1, 0]] tmp_vign = self._get_stamp(img_path, pos - 1, self._rad) @@ -246,9 +273,7 @@ def _get_stamp_me(self, image_dir, image_pattern): if array_vign is None: array_vign = np.copy(tmp_vign) else: - array_vign = np.concatenate( - (array_vign, np.copy(tmp_vign)) - ) + array_vign = np.concatenate((array_vign, np.copy(tmp_vign))) if array_id is None: array_id = np.copy(obj_id) @@ -256,7 +281,7 @@ def _get_stamp_me(self, image_dir, image_pattern): array_id = np.concatenate((array_id, np.copy(obj_id))) exp_name_tmp = np.array( - [exp_name + '-' + str(ccd) for i in range(len(obj_id))] + [exp_name + "-" + str(ccd) for i in range(len(obj_id))] ) if array_exp_name is None: array_exp_name = exp_name_tmp @@ -279,36 +304,36 @@ def _get_stamp_me(self, image_dir, image_pattern): where_res = np.where(final_list[j][0] == id_tmp)[0] - if (len(where_res) != 0): + if len(where_res) != 0: index = final_list[j][2][where_res[0]] output_dict[id_tmp][index] = {} - output_dict[id_tmp][index]['VIGNET'] = ( - final_list[j][1][where_res[0]] - ) + output_dict[id_tmp][index]["VIGNET"] = final_list[j][1][ + where_res[0] + ] counter += 1 if counter == 0: - output_dict[id_tmp] = 'empty' + output_dict[id_tmp] = "empty" return output_dict - def process_me(self, image_dir, image_pattern, f_wcs_path, rad): + def process_me(self, image_dirs, image_pattern, f_wcs_path, rad): """Process Multi-Epoch. Main function to create the stamps in the multi-epoch case. Parameters ---------- - image_dir : list - List of directories where the image are; ff ``len(image_dir) == 1`` - -> all images are in the same directory, else ``len(image_dir)`` - must match ``len(image_pattern)`` + image_dirs : list + Directories of image locations. + Each list item contains sublist in which images are searched. + Length of outer list has to match image_pattern, or be single item. image_pattern : list Common part of each kind of file names f_wcs_path : str Path to the log file containing the WCS for each CCDs rad : int - Radius of the stamp, must be odd + Radius of the stamp, must be an odd integer """ self._f_wcs_file = SqliteDict(f_wcs_path) @@ -316,17 +341,15 @@ def process_me(self, image_dir, image_pattern, f_wcs_path, rad): for idx in range(len(image_pattern)): - if len(image_dir) != len(image_pattern): - output_dict = self._get_stamp_me( - image_dir[0], - image_pattern[idx], - ) - + if len(image_dirs) != len(image_pattern): + index = 0 else: - output_dict = self._get_stamp_me( - image_dir[idx], - image_pattern[idx], - ) + index = idx + + output_dict = self._get_stamp_me( + image_dirs[index], + image_pattern[idx], + ) self._save_vignet_me(output_dict, image_pattern[idx]) @@ -345,8 +368,8 @@ def _save_vignet_me(self, output_dict, prefix): Prefix to use for the output file name """ - output_name = f'{self._output_dir}/{prefix}_vignet{self._image_num}' - output_file = SqliteDict(output_name + '.sqlite') + output_name = f"{self._output_dir}/{prefix}_vignet{self._image_num}" + output_file = SqliteDict(output_name + ".sqlite") for _index in output_dict.keys(): output_file[str(_index)] = output_dict[_index] @@ -374,7 +397,7 @@ def get_original_vignet(galcat_path): file = file_io.FITSCatalogue(galcat_path, SEx_catalogue=True) file.open() - vignet = file.get_data()['VIGNET'] + vignet = file.get_data()["VIGNET"] file.close() @@ -425,7 +448,7 @@ def save_vignet(vignet, sexcat_path, output_dir, prefix, image_num): Image numbering """ - output_name = f'{output_dir}/{prefix}_vignet{image_num}.fits' + output_name = f"{output_dir}/{prefix}_vignet{image_num}.fits" file = file_io.FITSCatalogue( output_name, @@ -433,4 +456,4 @@ def save_vignet(vignet, sexcat_path, output_dir, prefix, image_num): open_mode=file_io.BaseCatalogue.OpenMode.ReadWrite, ) - file.save_as_fits(vignet, names=['VIGNET'], sex_cat_path=sexcat_path) + file.save_as_fits(vignet, names=["VIGNET"], sex_cat_path=sexcat_path) diff --git a/shapepipe/modules/vignetmaker_runner.py b/shapepipe/modules/vignetmaker_runner.py index 972e54e16..2448f9bbd 100644 --- a/shapepipe/modules/vignetmaker_runner.py +++ b/shapepipe/modules/vignetmaker_runner.py @@ -2,22 +2,22 @@ Module runner for ``vignetmaker``. -:Author: Axel Guinot +:Authors: Axel Guinot, Martin Kilbinger """ from shapepipe.modules.module_decorator import module_runner from shapepipe.modules.vignetmaker_package import vignetmaker as vm -from shapepipe.pipeline.run_log import get_last_dir +from shapepipe.pipeline.run_log import get_last_dir, get_all_dirs @module_runner( - version='1.1', - input_module='sextractor_runner', - file_pattern=['galaxy_selection', 'image'], - file_ext=['.fits', '.fits'], - depends=['numpy', 'astropy', 'sf_tools', 'sqlitedict'], + version="1.1", + input_module="sextractor_runner", + file_pattern=["galaxy_selection", "image"], + file_ext=[".fits", ".fits"], + depends=["numpy", "astropy", "sf_tools", "sqlitedict"], ) def vignetmaker_runner( input_file_list, @@ -31,84 +31,107 @@ def vignetmaker_runner( # Get path to galaxy catalogue galcat_path = input_file_list[0] - # Check if masking should be performed - # With masking - if config.getboolean(module_config_sec, 'MASKING'): - # Fetch the mask value - mask_value = config.getfloat(module_config_sec, 'MASK_VALUE') - # Make a mask + # Check whether mask is to be created + if config.getboolean(module_config_sec, "MASKING"): + + # Get the mask value + mask_value = config.getfloat(module_config_sec, "MASK_VALUE") + + # Create a mask postage stamp vignet = vm.make_mask(galcat_path=galcat_path, mask_value=mask_value) - # Save the vignet + + # Save the mask postage stamp vignet vm.save_vignet( vignet=vignet, sexcat_path=galcat_path, - output_dir=run_dirs['output'], - prefix='cat', + output_dir=run_dirs["output"], + prefix="cat", image_num=file_number_string, ) - # Without masking else: - # Fetch stamp size - stamp_size = config.getint(module_config_sec, 'STAMP_SIZE') - 1 - # Check stamp size + + # Get stamp size + stamp_size = config.getint(module_config_sec, "STAMP_SIZE") - 1 + + # Make sure stamp size is odd number if stamp_size % 2 != 0: - raise ValueError('The STAMP_SIZE must be odd') + raise ValueError( + f"Found even value {stamp_size} for postage stame size (STAMP" + + f"_SIZE entry in config file), must be odd" + ) + # Set radius radius = int(stamp_size / 2) - # Fetch position type and values - pos_type = config.get(module_config_sec, 'COORD') - pos_params = config.getlist(module_config_sec, 'POSITION_PARAMS') - # Fetch vignet run mode - mode = config.get(module_config_sec, 'MODE') + # Get position type; allowed are "PIX" and "SPHE" + pos_type = config.get(module_config_sec, "COORD") + + # Get position column names for x and y / ra and dec + pos_params = config.getlist(module_config_sec, "POSITION_PARAMS") + + # Get vignet run mode; allowed are "CLASSIC", "MULTI-EPOCH" + mode = config.get(module_config_sec, "MODE") # Create instance of VignetMaker vm_inst = vm.VignetMaker( galcat_path=galcat_path, pos_type=pos_type, pos_params=pos_params, - output_dir=run_dirs['output'], + output_dir=run_dirs["output"], image_num=file_number_string, ) - # Run in CLASSIC mode - if mode == 'CLASSIC': - # Fetch prefix - prefix = config.getlist(module_config_sec, 'PREFIX') - # Check prefix + # Process module according to mode + if mode == "CLASSIC": + # Classsic mode = Single exposures + + # Get file name prefix + prefix = config.getlist(module_config_sec, "PREFIX") + + # Make sure number of prefixes match input files if len(prefix) != len(input_file_list[1:]): raise ValueError( - f'The number of prefixes ({len(prefix)}) has to be ' - + 'equal to the number of input file types ' - + f'({len(input_file_list[1:])}).' + f"The number of prefixes ({len(prefix)}) has to be " + + "equal to the number of input file types " + + f"({len(input_file_list[1:])})." ) # Process inputs vm_inst.process(input_file_list[1:], radius, prefix) - # Run in MULTI-EPOCH mode - elif mode == 'MULTI-EPOCH': - # Fetch image directory and patterns - modules = config.getlist(module_config_sec, 'ME_IMAGE_DIR') - image_dir = [] + elif mode == "MULTI-EPOCH": + # Multi-epoch exposures + + # Get input image directory and file patterns + modules = config.getlist(module_config_sec, "ME_IMAGE_DIR") + image_dirs = [] for module in modules: - last_dir = get_last_dir(run_dirs['run_log'], module) - image_dir.append(last_dir) + module_name = module.split(":")[-1] + if "last" in module: + dirs = [get_last_dir(run_dirs["run_log"], module_name)] + elif "all" in module: + dirs = get_all_dirs(run_dirs["run_log"], module_name) + else: + raise ValueError( + "Expected qualifier 'last:' or 'all' before module" + + f" '{module}' in config entry 'ME_IMAGE_DIR'" + ) + image_dirs.append(dirs) + image_pattern = config.getlist( module_config_sec, - 'ME_IMAGE_PATTERN', + "ME_IMAGE_PATTERN", ) - # Fetch WCS log path - f_wcs_path = config.getexpanded(module_config_sec, 'ME_LOG_WCS') + + # Get WCS log file path + f_wcs_path = config.getexpanded(module_config_sec, "ME_LOG_WCS") # Process inputs - vm_inst.process_me(image_dir, image_pattern, f_wcs_path, radius) + vm_inst.process_me(image_dirs, image_pattern, f_wcs_path, radius) - # Invalid mode else: - # Raise error for invalid run mode - raise ValueError(f'Invalid MODE=\'{mode}\'') - # No return objects + raise ValueError(f"Invalid MODE='{mode}'") + return None, None diff --git a/shapepipe/pipeline/__init__.py b/shapepipe/pipeline/__init__.py index 588c375a5..3966563f6 100644 --- a/shapepipe/pipeline/__init__.py +++ b/shapepipe/pipeline/__init__.py @@ -7,17 +7,17 @@ """ __all__ = [ - 'args', - 'config', - 'dependency_handler', - 'execute', - 'file_handler', - 'file_io', - 'job_handler', - 'mpi_run', - 'run_log', - 'shared', - 'str_handler', - 'timeout', - 'worker_handler', + "args", + "config", + "dependency_handler", + "execute", + "file_handler", + "file_io", + "job_handler", + "mpi_run", + "run_log", + "shared", + "str_handler", + "timeout", + "worker_handler", ] diff --git a/shapepipe/pipeline/args.py b/shapepipe/pipeline/args.py index e06e44ef9..70cb8c38b 100644 --- a/shapepipe/pipeline/args.py +++ b/shapepipe/pipeline/args.py @@ -42,16 +42,24 @@ def print_message(message): Custom action class object """ + class customAction(ap.Action): - def __init__(self, option_strings, version=None, dest=ap.SUPPRESS, - default=ap.SUPPRESS, help=help): + def __init__( + self, + option_strings, + version=None, + dest=ap.SUPPRESS, + default=ap.SUPPRESS, + help=help, + ): super(customAction, self).__init__( option_strings=option_strings, dest=dest, default=default, nargs=0, - help=help) + help=help, + ) def __call__(self, parser, args, values, option_string=None): print(message) @@ -71,10 +79,10 @@ def module_str(): Formatted string of module names """ - string = '' + string = "" for module in __module_list__: - string += f' - {module}\n' + string += f" - {module}\n" return string @@ -92,41 +100,44 @@ def create_arg_parser(): """ # Create parser parser = ap.ArgumentParser( - add_help=False, description=shapepipe_logo(), + add_help=False, + description=shapepipe_logo(), formatter_class=cutomFormatter, ) - optional = parser.add_argument_group('Optional Arguments') + optional = parser.add_argument_group("Optional Arguments") # Add arguments optional.add_argument( - '-h', - '--help', - action='help', - help='show this help message and exit', + "-h", + "--help", + action="help", + help="show this help message and exit", ) optional.add_argument( - '-v', - '--version', - action='version', - version=f'%(prog)s v{__version__}' + "-v", "--version", action="version", version=f"%(prog)s v{__version__}" ) optional.add_argument( - '-l', - '--list_modules', + "-l", + "--list_modules", action=print_message( - f'ShapePipe modules currently available:\n{module_str()}' + f"ShapePipe modules currently available:\n{module_str()}" ), - help='list modules currently available and exit', + help="list modules currently available and exit", ) optional.add_argument( - '-c', - '--config', - default='config.ini', - help='configuration file name', + "-c", + "--config", + default="config.ini", + help="configuration file name", ) + optional.add_argument( + "-e", + "--exclusive", + help="exclusive input file number string", + ) # Return parser return parser.parse_args() diff --git a/shapepipe/pipeline/config.py b/shapepipe/pipeline/config.py index 3db2a7b98..f43bf7345 100644 --- a/shapepipe/pipeline/config.py +++ b/shapepipe/pipeline/config.py @@ -37,7 +37,7 @@ def getexpanded(self, section, option): """ return self._get(section, os.path.expandvars, option) - def getlist(self, section, option, delimiter=','): + def getlist(self, section, option, delimiter=","): """Get List. This method retrieves a list of strings separated by a given @@ -100,7 +100,7 @@ def file_name(self): def file_name(self, value): if not os.path.exists(value): - raise IOError(f'Configuration file {value} does not exist.') + raise IOError(f"Configuration file {value} does not exist.") self._file_name = value @@ -110,14 +110,14 @@ def _set_defaults(self): Set default configuration options. """ - if not self.config.has_option('DEFAULT', 'RUN_NAME'): - self.config.set('DEFAULT', 'RUN_NAME', 'shapepipe_run') + if not self.config.has_option("DEFAULT", "RUN_NAME"): + self.config.set("DEFAULT", "RUN_NAME", "shapepipe_run") - if not self.config.has_option('DEFAULT', 'RUN_DATETIME'): - self.config.set('DEFAULT', 'RUN_DATETIME', 'True') + if not self.config.has_option("DEFAULT", "RUN_DATETIME"): + self.config.set("DEFAULT", "RUN_DATETIME", "True") - if not self.config.has_option('DEFAULT', 'VERBOSE'): - self.config.set('DEFAULT', 'VERBOSE', 'True') + if not self.config.has_option("DEFAULT", "VERBOSE"): + self.config.set("DEFAULT", "VERBOSE", "True") def _set_execution_options(self): """Set Execution Options. @@ -132,11 +132,11 @@ def _set_execution_options(self): For non-existent module runner """ - if not self.config.has_option('EXECUTION', 'MODULE'): - raise RuntimeError('No module(s) specified') + if not self.config.has_option("EXECUTION", "MODULE"): + raise RuntimeError("No module(s) specified") - if not self.config.has_option('EXECUTION', 'MODE'): - self.config.set('EXECUTION', 'MODE', 'smp') + if not self.config.has_option("EXECUTION", "MODE"): + self.config.set("EXECUTION", "MODE", "smp") def _set_file_options(self): """Set File Options. @@ -155,26 +155,26 @@ def _set_file_options(self): For non-existent output directory """ - if not self.config.has_option('FILE', 'LOG_NAME'): - self.config.set('FILE', 'LOG_NAME', 'shapepipe') + if not self.config.has_option("FILE", "LOG_NAME"): + self.config.set("FILE", "LOG_NAME", "shapepipe") - if not self.config.has_option('FILE', 'RUN_LOG_NAME'): - self.config.set('FILE', 'RUN_LOG_NAME', 'shapepipe_runs') + if not self.config.has_option("FILE", "RUN_LOG_NAME"): + self.config.set("FILE", "RUN_LOG_NAME", "shapepipe_runs") - if not self.config.has_option('FILE', 'INPUT_DIR'): - raise RuntimeError('Not input directory specified') + if not self.config.has_option("FILE", "INPUT_DIR"): + raise RuntimeError("Not input directory specified") - if not self.config.has_option('FILE', 'OUTPUT_DIR'): - raise RuntimeError('Not output directory specified') + if not self.config.has_option("FILE", "OUTPUT_DIR"): + raise RuntimeError("Not output directory specified") - elif not os.path.isdir(self.config.getexpanded('FILE', 'OUTPUT_DIR')): + elif not os.path.isdir(self.config.getexpanded("FILE", "OUTPUT_DIR")): raise OSError( f'Directory {self.config.getexpanded("FILE", "OUTPUT_DIR")} ' - + 'not found.' + + "not found." ) - if not self.config.has_option('FILE', 'CORRECT_FILE_PATTERN'): - self.config.set('FILE', 'CORRECT_FILE_PATTERN', 'True') + if not self.config.has_option("FILE", "CORRECT_FILE_PATTERN"): + self.config.set("FILE", "CORRECT_FILE_PATTERN", "True") def _set_worker_options(self): """Set Worker Options. @@ -182,11 +182,11 @@ def _set_worker_options(self): This module checks the worker options in the configuration file. """ - if not self.config.has_section('WORKER'): - self.config.add_section('WORKER') + if not self.config.has_section("WORKER"): + self.config.add_section("WORKER") - if not self.config.has_option('WORKER', 'PROCESS_PRINT_LIMIT'): - self.config.set('WORKER', 'PROCESS_PRINT_LIMIT', '200') + if not self.config.has_option("WORKER", "PROCESS_PRINT_LIMIT"): + self.config.set("WORKER", "PROCESS_PRINT_LIMIT", "200") def get_parser(self): """Get Parser. diff --git a/shapepipe/pipeline/dependency_handler.py b/shapepipe/pipeline/dependency_handler.py index 33b98f6f4..f4779e5ed 100644 --- a/shapepipe/pipeline/dependency_handler.py +++ b/shapepipe/pipeline/dependency_handler.py @@ -31,10 +31,10 @@ def __init__(self, dependencies=[], executables=[]): self.depend = dependencies self.execute = executables - self._greq = '>=' - self._equal = '==' - self._great = '>' - self._less = '<' + self._greq = ">=" + self._equal = "==" + self._great = ">" + self._less = "<" self.dependency_list = [] self.executable_list = list(set(self.execute)) @@ -51,10 +51,10 @@ def depend(self): def depend(self, value): if not isinstance(value, list): - raise TypeError('Input must be list type.') + raise TypeError("Input must be list type.") if not all(isinstance(x, str) for x in value): - raise ValueError('List elements must be strings.') + raise ValueError("List elements must be strings.") self._depend = value @@ -67,10 +67,10 @@ def execute(self): def execute(self, value): if not isinstance(value, list): - raise TypeError('Input must be list type.') + raise TypeError("Input must be list type.") if not all(isinstance(x, str) for x in value): - raise ValueError('List elements must be strings.') + raise ValueError("List elements must be strings.") self._execute = value @@ -160,8 +160,7 @@ def _get_indices(array, value): """ return [ - index for index, element in enumerate(array) - if element == value + index for index, element in enumerate(array) if element == value ] @classmethod @@ -210,7 +209,7 @@ def _check_executable(exe_name): """ if not isinstance(exe_name, str): - raise TypeError('Executable name must be a string.') + raise TypeError("Executable name must be a string.") def is_exe(fpath): return os.path.isfile(fpath) and os.access(fpath, os.X_OK) @@ -218,18 +217,20 @@ def is_exe(fpath): fpath, fname = os.path.split(exe_name) if not fpath: - res = any([ - is_exe(os.path.join(path, exe_name)) - for path in os.environ['PATH'].split(os.pathsep) - ]) + res = any( + [ + is_exe(os.path.join(path, exe_name)) + for path in os.environ["PATH"].split(os.pathsep) + ] + ) else: res = is_exe(exe_name) if not res: raise IOError( - f'{exe_name} does not appear to be a valid executable on ' - + 'this system.' + f"{exe_name} does not appear to be a valid executable on " + + "this system." ) def _split_string(self, string): @@ -249,19 +250,19 @@ def _split_string(self, string): """ if self._greq in string: - val = re.split(f'({self._greq})', string) + val = re.split(f"({self._greq})", string) elif self._equal in string: - val = re.split(f'({self._equal})', string) + val = re.split(f"({self._equal})", string) elif self._great in string: - val = re.split(f'({self._great})', string) + val = re.split(f"({self._great})", string) elif self._less in string: raise ValueError('"<" not permitted in package version string.') else: - val = [string, '', ''] + val = [string, "", ""] return val @@ -271,10 +272,12 @@ def _split_strings(self): This method splits the input dependency modules strings. """ - self._depend_arr = list(map( - list, - zip(*[self._split_string(string) for string in self.depend]) - )) + self._depend_arr = list( + map( + list, + zip(*[self._split_string(string) for string in self.depend]), + ) + ) self._dependency_set = set(self._depend_arr[0]) def _unique_dependencies(self): @@ -290,18 +293,18 @@ def _unique_dependencies(self): if any(self._equal in element for element in subset): subset = self._slice_col_val(subset, 1, self._equal) - if any([ver != '' for ver in subset[2]]): - subset = (self._slice_col_val( + if any([ver != "" for ver in subset[2]]): + subset = self._slice_col_val( subset, 2, - str(max( - [self._convert_to_float(ver) for ver in subset[2]] - )) - )) + str( + max([self._convert_to_float(ver) for ver in subset[2]]) + ), + ) subset = [element[0] for element in self._slice_2d(subset, [0])] - self.dependency_list.append(''.join(subset)) + self.dependency_list.append("".join(subset)) def check_dependencies(self): """Check Dependencies. @@ -322,23 +325,23 @@ def check_dependencies(self): package = importlib.import_module(dependency) except Exception: raise ImportError( - f'Could not import pipeline dependency {dependency}' + f"Could not import pipeline dependency {dependency}" ) - if hasattr(package, '__version__'): + if hasattr(package, "__version__"): version = package.__version__ else: - version = 'N/A' + version = "N/A" - if hasattr(package, '__path__'): + if hasattr(package, "__path__"): path = package.__path__[0] - elif hasattr(package, '__file__'): + elif hasattr(package, "__file__"): path = package.__file__ else: - path = 'N/A' + path = "N/A" dependency_status_list.append( - f' - {package.__name__} {version} {path}' + f" - {package.__name__} {version} {path}" ) return dependency_status_list @@ -361,7 +364,7 @@ def check_executables(self): self._check_executable(executable) exe_path, err = subprocess.Popen( - f'which {executable}', + f"which {executable}", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, diff --git a/shapepipe/pipeline/execute.py b/shapepipe/pipeline/execute.py index d9c63bcb1..0a69fae7f 100644 --- a/shapepipe/pipeline/execute.py +++ b/shapepipe/pipeline/execute.py @@ -32,7 +32,7 @@ def execute(command_line): """ if not isinstance(command_line, str): - raise TypeError('Command line must be a string.') + raise TypeError("Command line must be a string.") command = command_line.split() check_executable(command[0]) @@ -40,7 +40,7 @@ def execute(command_line): process = sp.Popen(command, stdout=sp.PIPE, stderr=sp.PIPE) stdout, stderr = process.communicate() - return stdout.decode('utf-8'), stderr.decode('utf-8') + return stdout.decode("utf-8"), stderr.decode("utf-8") def check_executable(exe_name): @@ -62,7 +62,7 @@ def check_executable(exe_name): """ if not isinstance(exe_name, str): - raise TypeError('Executable name must be a string.') + raise TypeError("Executable name must be a string.") def is_exe(fpath): return os.path.isfile(fpath) and os.access(fpath, os.X_OK) @@ -70,16 +70,18 @@ def is_exe(fpath): fpath, fname = os.path.split(exe_name) if not fpath: - res = any([ - is_exe(os.path.join(path, exe_name)) - for path in os.environ['PATH'].split(os.pathsep) - ]) + res = any( + [ + is_exe(os.path.join(path, exe_name)) + for path in os.environ["PATH"].split(os.pathsep) + ] + ) else: res = is_exe(exe_name) if not res: raise OSError( - f'{exe_name} does not appear to be a valid executable on this ' - + 'system.' + f"{exe_name} does not appear to be a valid executable on this " + + "system." ) diff --git a/shapepipe/pipeline/file_handler.py b/shapepipe/pipeline/file_handler.py index b7479f6f3..e16ae99e8 100644 --- a/shapepipe/pipeline/file_handler.py +++ b/shapepipe/pipeline/file_handler.py @@ -32,52 +32,55 @@ class FileHandler(object): List of modules to be run config : CustomParser Configuaration parser instance + exclusive : str, optional + Run this file number string exclusively if given, the default is None verbose : bool, optional Verbose setting, default is True """ - def __init__(self, run_name, modules, config, verbose=True): + def __init__(self, run_name, modules, config, exclusive=None, verbose=True): self._run_name = run_name self._module_list = modules - if self._module_list[-1] == '': - raise ValueError('Invalid module list, check for a trailing comma') + if self._module_list[-1] == "": + raise ValueError("Invalid module list, check for a trailing comma") self._config = config + self._exclusive = exclusive self._verbose = verbose self.module_runners = get_module_runners(self._module_list) - self._input_list = config.getlist('FILE', 'INPUT_DIR') - self._output_dir = config.getexpanded('FILE', 'OUTPUT_DIR') - self._log_name = config.get('FILE', 'LOG_NAME') + self._input_list = config.getlist("FILE", "INPUT_DIR") + self._output_dir = config.getexpanded("FILE", "OUTPUT_DIR") + self._log_name = config.get("FILE", "LOG_NAME") self._correct_pattern = config.getboolean( - 'FILE', - 'CORRECT_FILE_PATTERN', + "FILE", + "CORRECT_FILE_PATTERN", ) self._run_log_file = self.setpath( self._output_dir, - config.get('FILE', 'RUN_LOG_NAME'), - '.txt', + config.get("FILE", "RUN_LOG_NAME"), + ".txt", ) self._module_dict = {} - if config.has_option('FILE', 'FILE_PATTERN'): - self._file_pattern = config.getlist('FILE', 'FILE_PATTERN') - if config.has_option('FILE', 'FILE_EXT'): - self._file_ext = config.getlist('FILE', 'FILE_EXT') - if config.has_option('FILE', 'NUMBERING_SCHEME'): - self._numbering_scheme = config.get('FILE', 'NUMBERING_SCHEME') + if config.has_option("FILE", "FILE_PATTERN"): + self._file_pattern = config.getlist("FILE", "FILE_PATTERN") + if config.has_option("FILE", "FILE_EXT"): + self._file_ext = config.getlist("FILE", "FILE_EXT") + if config.has_option("FILE", "NUMBERING_SCHEME"): + self._numbering_scheme = config.get("FILE", "NUMBERING_SCHEME") else: - self._numbering_scheme = r'RE:\_\d+' - if config.has_option('FILE', 'NUMBER_LIST'): - if os.path.isfile(config.get('FILE', 'NUMBER_LIST')): - self._number_list = ( - self.read_number_list(config.get('FILE', 'NUMBER_LIST')) + self._numbering_scheme = r"RE:\_\d+" + if config.has_option("FILE", "NUMBER_LIST"): + if os.path.isfile(config.get("FILE", "NUMBER_LIST")): + self._number_list = self.read_number_list( + config.get("FILE", "NUMBER_LIST") ) else: - self._number_list = config.getlist('FILE', 'NUMBER_LIST') + self._number_list = config.getlist("FILE", "NUMBER_LIST") else: self._number_list = None @@ -93,7 +96,7 @@ def run_dir(self): @run_dir.setter def run_dir(self, value): - self._run_dir = self.check_dir(value, check_exists=True) + self._run_dir = self.check_dir(value, check_exists=False) @property def _input_dir(self): @@ -138,7 +141,7 @@ def read_number_list(file_name): with open(file_name) as data_file: number_list = data_file.readlines() - return [value.rstrip('\n') for value in number_list] + return [value.rstrip("\n") for value in number_list] @classmethod def check_dir(cls, dir_name, check_exists=False): @@ -158,7 +161,8 @@ def check_dir(cls, dir_name, check_exists=False): """ if check_exists and os.path.isdir(dir_name): - raise OSError(f'Directory {dir_name} already exists.') + #raise OSError(f'Directory {dir_name} already exists.') + print(f'Warning: Directory {dir_name} already exists.') return cls.strip_slash(dir_name) @@ -188,11 +192,12 @@ def mkdir(cls, dir_name): Directory name with full path """ - cls.check_dir(dir_name, check_exists=True) - mkdir(dir_name) + cls.check_dir(dir_name, check_exists=False) + if not os.path.isdir(dir_name): + mkdir(dir_name) @staticmethod - def setpath(path, name, ext=''): + def setpath(path, name, ext=""): """Set Path Name. This method appends the file/directory name to the input path. @@ -212,7 +217,7 @@ def setpath(path, name, ext=''): Formated path """ - return f'{path}/{name}{ext}' + return f"{path}/{name}{ext}" @staticmethod def strip_slash(path): @@ -231,7 +236,7 @@ def strip_slash(path): Updated path """ - return path.rstrip('/') + return path.rstrip("/") @classmethod def strip_slash_list(cls, path_list): @@ -289,8 +294,8 @@ def _get_module_run_name(dir): Module run name, module name, search string """ - string, module_run = dir.split(':') - module = module_run.split('/')[0] + string, module_run = dir.split(":") + module = module_run.split("/")[0] return module_run.lower(), module.lower(), string @@ -318,30 +323,32 @@ def _check_input_dir_list(self, dir_list): if os.path.isdir(dir): input_dir.append(dir) - elif 'last' in dir.lower(): + elif "last" in dir.lower(): module_run, module, _ = self._get_module_run_name(dir) runs = get_list(self._run_log_file) last_module = get_last(runs, module) input_dir.append( self.setpath( self.setpath(last_module, module_run), - 'output', + "output", ) ) - elif 'all' in dir.lower(): + elif "all" in dir.lower(): module_run, module, _ = self._get_module_run_name(dir) runs = get_list(self._run_log_file) all_runs = get_all(runs, module) - input_dir.extend([ - self.setpath( - self.setpath(run.split(' ')[0], module_run), - 'output' - ) - for run in all_runs - ]) + input_dir.extend( + [ + self.setpath( + self.setpath(run.split(" ")[0], module_run), + "output", + ) + for run in all_runs + ] + ) - elif ':' in dir.lower(): + elif ":" in dir.lower(): module_run, _, string = self._get_module_run_name(dir) input_dir.append( self.setpath( @@ -349,15 +356,15 @@ def _check_input_dir_list(self, dir_list): self._run_log.get_run(string), module_run, ), - 'output', + "output", ) ) else: raise ValueError( - f'Invalid INPUT_DIR ({dir}). Make sure the paths ' - + 'provided are valid directories or use the ' - + 'allowed special keys.' + f"Invalid INPUT_DIR ({dir}). Make sure the paths " + + "provided are valid directories or use the " + + "allowed special keys." ) return input_dir @@ -377,8 +384,8 @@ def create_global_run_dirs(self): """ self.run_dir = self.setpath(self._output_dir, self._run_name) - self._log_dir = self.setpath(self.run_dir, 'logs') - self._tmp_dir = self.setpath(self.run_dir, 'tmp') + self._log_dir = self.setpath(self.run_dir, "logs") + self._tmp_dir = self.setpath(self.run_dir, "tmp") self.log_name = self.setpath(self._log_dir, self._log_name) self._run_log = RunLog( self._run_log_file, @@ -386,9 +393,12 @@ def create_global_run_dirs(self): self.run_dir, ) - self.mkdir(self.run_dir) - self.mkdir(self._log_dir) - self.mkdir(self._tmp_dir) + if not os.path.exists(self.run_dir): + self.mkdir(self.run_dir) + if not os.path.exists(self._log_dir): + self.mkdir(self._log_dir) + if not os.path.exists(self._tmp_dir): + self.mkdir(self._tmp_dir) self._get_input_dir() self._copy_config_to_log() @@ -403,7 +413,7 @@ def _copy_config_to_log(self): copyfile( self._config.file_name, - f'{self._log_dir}/{config_file_name}', + f"{self._log_dir}/{config_file_name}", ) def get_module_current_run(self, module): @@ -422,7 +432,7 @@ def get_module_current_run(self, module): Module run count """ - return str(self._module_dict[module]['run_count']) + return str(self._module_dict[module]["run_count"]) def get_module_run_prop(self, module, property): """Get Module Run Property. @@ -447,9 +457,9 @@ def get_module_run_prop(self, module, property): For invalid module dictionary key """ - run_name = self._module_dict[module]['latest'] + run_name = self._module_dict[module]["latest"] - if property == 'run_name': + if property == "run_name": value = run_name elif property in self._module_dict[module].keys(): value = self._module_dict[module][property] @@ -457,7 +467,7 @@ def get_module_run_prop(self, module, property): value = self._module_dict[module][run_name][property] else: raise ValueError( - f'Property {property} not found for module {module}.' + f"Property {property} not found for module {module}." ) return value @@ -478,7 +488,7 @@ def get_module_config_sec(self, module): Configuration file section name """ - return self._module_dict[module]['latest'].upper() + return self._module_dict[module]["latest"].upper() def get_add_module_property(self, run_name, property): """Get Additional Module Properties. @@ -498,14 +508,14 @@ def get_add_module_property(self, run_name, property): Additional module property values """ - if (self._config.has_option( + if self._config.has_option( run_name.upper(), - f'ADD_{property.upper()}', - )): + f"ADD_{property.upper()}", + ): return self._config.getlist( run_name.upper(), - f'ADD_{property.upper()}', + f"ADD_{property.upper()}", ) def _set_module_property(self, module, run_name, property, get_type): @@ -541,22 +551,22 @@ def _set_module_property(self, module, run_name, property, get_type): """ # 1) Check for parameter value in module section of config file if self._config.has_option(run_name.upper(), property.upper()): - if get_type == 'str': + if get_type == "str": prop_val = self._config.get( run_name.upper(), property.upper(), ) - elif get_type == 'list': + elif get_type == "list": prop_val = self._config.getlist( run_name.upper(), property.upper(), ) else: - raise ValueError(f'{get_type} is not a valid get type') + raise ValueError(f"{get_type} is not a valid get type") # 2) Check for default parameter values in file handler - elif hasattr(self, f'_{property}'): - prop_val = getattr(self, f'_{property}') + elif hasattr(self, f"_{property}"): + prop_val = getattr(self, f"_{property}") # 3) Check for default parameter values in module runner elif hasattr(self.module_runners[module], property): @@ -564,13 +574,12 @@ def _set_module_property(self, module, run_name, property, get_type): else: raise ValueError( - f'No value for {property} in {module} could be found.' + f"No value for {property} in {module} could be found." ) # Look for additional module properties for list objects - if ( - isinstance(prop_val, list) - and self.get_add_module_property(run_name, property) + if isinstance(prop_val, list) and self.get_add_module_property( + run_name, property ): prop_val += self.get_add_module_property(run_name, property) @@ -588,37 +597,35 @@ def _set_module_properties(self, module, run_name): """ module_props = { - 'numbering_scheme': 'str', - 'run_method': 'str', - 'input_module': 'list', - 'file_pattern': 'list', - 'file_ext': 'list', - 'depends': 'list', - 'executes': 'list' + "numbering_scheme": "str", + "run_method": "str", + "input_module": "list", + "file_pattern": "list", + "file_ext": "list", + "depends": "list", + "executes": "list", } for property, get_type in module_props.items(): self._set_module_property(module, run_name, property, get_type) # Make sure the number of patterns and extensions match - if ( - (len(self._module_dict[module][run_name]['file_ext']) == 1) - and (len(self._module_dict[module][run_name]['file_pattern']) > 1) + if (len(self._module_dict[module][run_name]["file_ext"]) == 1) and ( + len(self._module_dict[module][run_name]["file_pattern"]) > 1 ): - self._module_dict[module][run_name]['file_ext'] = [ - self._module_dict[module][run_name]['file_ext'][0] - for i in self._module_dict[module][run_name]['file_pattern'] + self._module_dict[module][run_name]["file_ext"] = [ + self._module_dict[module][run_name]["file_ext"][0] + for i in self._module_dict[module][run_name]["file_pattern"] ] - if ( - len(self._module_dict[module][run_name]['file_ext']) - != len(self._module_dict[module][run_name]['file_pattern']) + if len(self._module_dict[module][run_name]["file_ext"]) != len( + self._module_dict[module][run_name]["file_pattern"] ): - n_fext = len(self._module_dict[module][run_name]['file_ext']) - n_fpat = len(self._module_dict[module][run_name]['file_pattern']) + n_fext = len(self._module_dict[module][run_name]["file_ext"]) + n_fpat = len(self._module_dict[module][run_name]["file_pattern"]) raise ValueError( - f'The number of file_ext values ({n_fext}) does not match the ' - + f'number of file_pattern values ({n_fpat}).' + f"The number of file_ext values ({n_fext}) does not match the " + + f"number of file_pattern values ({n_fpat})." ) def _create_module_run_dirs(self, module, run_name): @@ -632,34 +639,33 @@ def _create_module_run_dirs(self, module, run_name): Module name """ - self._module_dict[module][run_name]['run_dir'] = ( - self.setpath(self._run_dir, run_name) + self._module_dict[module][run_name]["run_dir"] = self.setpath( + self._run_dir, run_name ) - self._module_dict[module][run_name]['log_dir'] = ( - self.setpath( - self._module_dict[module][run_name]['run_dir'], - 'logs', - ) + self._module_dict[module][run_name]["log_dir"] = self.setpath( + self._module_dict[module][run_name]["run_dir"], + "logs", ) - self._module_dict[module][run_name]['output_dir'] = ( - self.setpath( - self._module_dict[module][run_name]['run_dir'], - 'output', - ) + self._module_dict[module][run_name]["output_dir"] = self.setpath( + self._module_dict[module][run_name]["run_dir"], + "output", ) - self.mkdir(self._module_dict[module][run_name]['run_dir']) - self.mkdir(self._module_dict[module][run_name]['log_dir']) - self.mkdir(self._module_dict[module][run_name]['output_dir']) + if not os.path.exists(self._module_dict[module][run_name]['run_dir']): + self.mkdir(self._module_dict[module][run_name]['run_dir']) + if not os.path.exists(self._module_dict[module][run_name]['log_dir']): + self.mkdir(self._module_dict[module][run_name]['log_dir']) + if not os.path.exists(self._module_dict[module][run_name]['output_dir']): + self.mkdir(self._module_dict[module][run_name]['output_dir']) # Set current output directory to module output directory - self.output_dir = self._module_dict[module][run_name]['output_dir'] + self.output_dir = self._module_dict[module][run_name]["output_dir"] self.module_run_dirs = { - 'run': self.run_dir, - 'log': self._log_dir, - 'tmp': self._tmp_dir, - 'output': self.output_dir, - 'run_log': self._run_log_file + "run": self.run_dir, + "log": self._log_dir, + "tmp": self._tmp_dir, + "output": self.output_dir, + "run_log": self._run_log_file, } def _set_module_input_dir(self, module, run_name): @@ -690,88 +696,82 @@ def _set_module_input_dir(self, module, run_name): # run in the pipeline if ( isinstance( - self._module_dict[module][run_name]['input_module'], + self._module_dict[module][run_name]["input_module"], type(None), ) or len(self._module_dict) == 1 ): # If so, use the input directory/ies set in the [FILE] section input_dir = self._input_dir - dir_set_by = '[FILE]' + dir_set_by = "[FILE]" # Check if input directory/ies has/have been set in the module config # section - if self._config.has_option(run_name.upper(), 'INPUT_DIR'): + if self._config.has_option(run_name.upper(), "INPUT_DIR"): # If so set this/these as the input directory/ies, note that this # overrides the value set in the [FILE] section input_dir = self._check_input_dir_list( - self._config.getlist(run_name.upper(), 'INPUT_DIR') + self._config.getlist(run_name.upper(), "INPUT_DIR") ) - dir_set_by = f'[{run_name.upper()}]' + dir_set_by = f"[{run_name.upper()}]" # Check if input directory/ies has/have has not been set and if input # modules have been defined for the current module - if ( - not input_dir - and isinstance( - self._module_dict[module][run_name]['input_module'], - list - ) + if not input_dir and isinstance( + self._module_dict[module][run_name]["input_module"], list ): - dir_set_by = f'{module}.py' + dir_set_by = f"{module}.py" # If so, loop through all the input modules defined for the current # module - for input_module in ( - self._module_dict[module][run_name]['input_module'] - ): + for input_module in self._module_dict[module][run_name][ + "input_module" + ]: # Get the input module name and run - input_module, in_mod_run = ( - shared.split_module_run(input_module) - ) + input_module, in_mod_run = shared.split_module_run(input_module) # Check if the input module was part of the current pipeline if input_module in self._module_dict: # If so, check if the input module was a single run if in_mod_run == input_module: # If so, Set the input module run to the latest run - in_mod_run = self._module_dict[input_module]['latest'] + in_mod_run = self._module_dict[input_module]["latest"] # Add the output directory of the input module to # the list of input directories for the current module input_dir.append( self._module_dict[input_module][in_mod_run][ - 'output_dir' + "output_dir" ] ) else: # If not, add the last run of the input module to the # list of input directories - input_dir.append(f'{input_module}:last') + input_dir.append(f"{input_module}:last") # Check if input directory/ies has/have been added in the module config # section - if self.get_add_module_property(run_name, 'input_dir'): + if self.get_add_module_property(run_name, "input_dir"): # If so add this/these to the input directory/ies - input_dir += self.get_add_module_property(run_name, 'input_dir') - if not dir_set_by == f'[{module}]': - dir_set_by = f'{dir_set_by} and [{run_name.upper()}]' + input_dir += self.get_add_module_property(run_name, "input_dir") + if not dir_set_by == f"[{module}]": + dir_set_by = f"{dir_set_by} and [{run_name.upper()}]" # Check if no input directory has been set if not input_dir: # If so, raise an error raise RuntimeError( - 'Could not find appropriate input directory ' - + f'for module {run_name}.' + "Could not find appropriate input directory " + + f"for module {run_name}." ) # Add the input directories for the current module to the module # dictionary - self._module_dict[module][run_name]['input_dir'] = ( - self.check_dirs(input_dir) + self._module_dict[module][run_name]["input_dir"] = self.check_dirs( + input_dir ) - self._module_dict[module][run_name]['dir_set_by'] = dir_set_by + self._module_dict[module][run_name]["dir_set_by"] = dir_set_by # Log the input directories and how they were set - module_input_dir = f' -- Input directories: {input_dir}' - module_dir_set_by = f' -- Inputs set by: {dir_set_by}' + module_input_dir = f" -- Input directories: {input_dir}" + module_dir_set_by = f" -- Inputs set by: {dir_set_by}" self.log.info(module_input_dir) self.log.info(module_dir_set_by) @@ -803,18 +803,18 @@ def _generate_re_pattern(match_pattern): """ if not isinstance(match_pattern, str): - TypeError('Match pattern must be a string.') + TypeError("Match pattern must be a string.") chars = [char for char in match_pattern if not char.isalnum()] - split_pattern = '|'.join(chars).replace('.', r'\.') - chars = [f'\\{char}' for char in chars] + [''] + split_pattern = "|".join(chars).replace(".", r"\.") + chars = [f"\\{char}" for char in chars] + [""] num_length = [ - f'\\d{{{len(digits)}}}' + f"\\d{{{len(digits)}}}" for digits in re.split(split_pattern, match_pattern) ] - re_pattern = r''.join( + re_pattern = r"".join( [a for b in zip(num_length, chars) for a in b] - ).replace('{1}', '+') + ).replace("{1}", "+") return re.compile(re_pattern) @@ -838,8 +838,9 @@ def _strip_dir_from_file(file_name, dir_list): """ return [ - file_name.replace(_dir + '/', '') - for _dir in dir_list if _dir in file_name + file_name.replace(_dir + "/", "") + for _dir in dir_list + if _dir in file_name ][0] @classmethod @@ -866,13 +867,13 @@ def _get_re(cls, num_scheme): """ # Raise an error if num_scheme is None, # but not if num_scheme=='' - if not num_scheme and num_scheme != '': + if not num_scheme and num_scheme != "": - raise ValueError('No numbering scheme adapted') + raise ValueError("No numbering scheme adapted") - elif num_scheme.startswith('RE:'): + elif num_scheme.startswith("RE:"): - re_pattern = num_scheme.replace('RE:', '') + re_pattern = num_scheme.replace("RE:", "") else: @@ -881,12 +882,7 @@ def _get_re(cls, num_scheme): return re_pattern def _save_num_patterns( - self, - dir_list, - re_pattern, - pattern, - ext, - output_file + self, dir_list, re_pattern, pattern, ext, output_file ): """Save Number Patterns. @@ -925,11 +921,11 @@ def _save_num_patterns( if not true_file_list: raise RuntimeError( f'No files found matching "{pattern}" and "{ext}" in the ' - + f'directories {dir_list}.' + + f"directories {dir_list}." ) # Correct the extension if necessary - new_ext = '.' + ext if not ext.startswith('.') else ext + new_ext = "." + ext if not ext.startswith(".") else ext if self._verbose and new_ext != ext: print(f'Updating file extension from "{ext}" to "{new_ext}".') @@ -957,7 +953,7 @@ def _save_num_patterns( new_pattern = striped for substring in (new_ext, file_name): - new_pattern = new_pattern.replace(substring, '') + new_pattern = new_pattern.replace(substring, "") if new_pattern != pattern: print( @@ -976,13 +972,13 @@ def _save_num_patterns( ) elem = shared.check_duplicate(final_file_list) - if elem != '': + if elem != "": raise RuntimeError( - 'Input file list contains at least one duplicate element, ' - + f'\'{elem}\' that matches ' - + 'file pattern and numbering scheme, leading to identical ' - + 'input files. Make sure that the correct input ' - + 'directory is used.' + "Input file list contains at least one duplicate element, " + + f"'{elem}' that matches " + + "file pattern and numbering scheme, leading to identical " + + "input files. Make sure that the correct input " + + "directory is used." ) # Save file list @@ -1006,14 +1002,13 @@ def _save_match_patterns(output_file, mmap_list): List of memory maps """ - num_pattern_list = [np.load(mmap, mmap_mode='r') for mmap in mmap_list] + num_pattern_list = [np.load(mmap, mmap_mode="r") for mmap in mmap_list] np.save( output_file, reduce( - partial(np.intersect1d, assume_unique=True), - num_pattern_list - ) + partial(np.intersect1d, assume_unique=True), num_pattern_list + ), ) del num_pattern_list @@ -1042,7 +1037,7 @@ def _get_file_name(path, pattern, number, ext): File name """ - return f'{path}/{pattern}{number}{ext}' + return f"{path}/{pattern}{number}{ext}" @staticmethod def _remove_mmaps(mmap_list): @@ -1096,7 +1091,7 @@ def _format_process_list( pattern_list, ext_list, path_list = list(zip(*patterns)) if isinstance(self._number_list, type(None)): - number_list = np.load(memory_map, mmap_mode='r') + number_list = np.load(memory_map, mmap_mode="r") else: number_list = self._number_list @@ -1110,16 +1105,39 @@ def _format_process_list( + f'numbering scheme "{num_scheme}".' ) - if run_method == 'serial': + # If "exclusive" options is set: discard all non-matching IDs + if self._exclusive is not None: + id_to_test = f"-{self._exclusive.replace('.', '-')}" + if number == id_to_test: + if self._verbose: + print( + f"-- Using exclusive number {self._exclusive} ({id_to_test})" + ) + else: + if self._verbose: + # print(f"Skipping {number}, not equal to {self._exclusive} ({id_to_test})") + pass + continue + + if run_method == "serial": process_items = [] else: process_items = [number] - process_items.extend([ - self._get_file_name(path, fp, number, ext) - for path, fp, ext in zip(path_list, pattern_list, ext_list) - ]) + process_items.extend( + [ + self._get_file_name(path, fp, number, ext) + for path, fp, ext in zip(path_list, pattern_list, ext_list) + ] + ) process_list.append(process_items) + if len(process_list) == 0: + msg = "Empty process list" + if self._exclusive is not None: + if len(number_list) > 0: + msg = f"{msg}. No input file found matching exclusive ID" + raise ValueError(msg) + return process_list def _save_process_list( @@ -1147,24 +1165,19 @@ def _save_process_list( """ np_mmap_list = [ - self.setpath(self._tmp_dir, f'nums_{pattern}_{ext}.npy') + self.setpath(self._tmp_dir, f"nums_{pattern}_{ext}.npy") for pattern, ext in zip(pattern_list, ext_list) ] - match_mmap = self.setpath(self._tmp_dir, 'matching_num_patterns.npy') - self.process_mmap = self.setpath(self._tmp_dir, 'process_list.npy') + match_mmap = self.setpath(self._tmp_dir, "matching_num_patterns.npy") + self.process_mmap = self.setpath(self._tmp_dir, "process_list.npy") re_pattern = self._get_re(num_scheme) temp = [ - self._save_num_patterns( - dir_list, - re_pattern, - pattern, - ext, - np_mmap + self._save_num_patterns(dir_list, re_pattern, pattern, ext, np_mmap) + for pattern, ext, np_mmap in zip( + pattern_list, ext_list, np_mmap_list ) - for pattern, ext, np_mmap in - zip(pattern_list, ext_list, np_mmap_list) ] self._save_match_patterns(match_mmap, np_mmap_list) @@ -1180,7 +1193,7 @@ def _save_process_list( np.save(self.process_mmap, np.array(process_list)) del process_list - self.process_list = np.load(self.process_mmap, mmap_mode='r') + self.process_list = np.load(self.process_mmap, mmap_mode="r") self.missed = [] @@ -1205,11 +1218,11 @@ def _get_module_input_files(self, module, run_name): Module name """ - dir_list = self._module_dict[module][run_name]['input_dir'] - pattern_list = self._module_dict[module][run_name]['file_pattern'] - ext_list = self._module_dict[module][run_name]['file_ext'] - num_scheme = self._module_dict[module][run_name]['numbering_scheme'] - run_method = self._module_dict[module][run_name]['run_method'] + dir_list = self._module_dict[module][run_name]["input_dir"] + pattern_list = self._module_dict[module][run_name]["file_pattern"] + ext_list = self._module_dict[module][run_name]["file_ext"] + num_scheme = self._module_dict[module][run_name]["numbering_scheme"] + run_method = self._module_dict[module][run_name]["run_method"] self._save_process_list( dir_list, @@ -1233,19 +1246,19 @@ def set_up_module(self, module): multi_call = self._module_list.count(module) > 1 if module in self._module_dict.keys(): - self._module_dict[module]['run_count'] += 1 + self._module_dict[module]["run_count"] += 1 else: self._module_dict[module] = {} - self._module_dict[module]['run_count'] = 1 + self._module_dict[module]["run_count"] = 1 if multi_call: - call_num = self._module_dict[module]['run_count'] - run_name = f'{module}_run_{call_num}' + call_num = self._module_dict[module]["run_count"] + run_name = f"{module}_run_{call_num}" else: run_name = module # Log run count - module_prop_text = ' - Module properties' + module_prop_text = " - Module properties" module_run_num = f' -- Run: {self._module_dict[module]["run_count"]}' self.log.info(module_prop_text) @@ -1255,7 +1268,7 @@ def set_up_module(self, module): print(module_prop_text) print(module_run_num) - self._module_dict[module]['latest'] = run_name + self._module_dict[module]["latest"] = run_name self._module_dict[module][run_name] = {} self._set_module_properties(module, run_name) @@ -1281,7 +1294,7 @@ def get_worker_log_name(self, module, file_number_string): Worker log file name """ - run_name = self._module_dict[module]['latest'] - log_dir = self._module_dict[module][run_name]['log_dir'] + run_name = self._module_dict[module]["latest"] + log_dir = self._module_dict[module][run_name]["log_dir"] - return f'{log_dir}/process{file_number_string}' + return f"{log_dir}/process{file_number_string}" diff --git a/shapepipe/pipeline/file_io.py b/shapepipe/pipeline/file_io.py index 52e847147..ffe8bed82 100644 --- a/shapepipe/pipeline/file_io.py +++ b/shapepipe/pipeline/file_io.py @@ -87,7 +87,7 @@ def get_nb_rows(self): Number of rows """ - raise BaseCatalogue.FeatureNotImplemented('get_nb_rows()') + raise BaseCatalogue.FeatureNotImplemented("get_nb_rows()") def get_nb_cols(self): """Get Number of Columns. @@ -111,7 +111,7 @@ def get_col_names(self): list list of column names """ - raise BaseCatalogue.FeatureNotImplemented('get_col_names()') + raise BaseCatalogue.FeatureNotImplemented("get_col_names()") def get_col_formats(self): """Get Column Formats. @@ -119,7 +119,7 @@ def get_col_formats(self): Get the list of column formats in the order of columns """ - raise BaseCatalogue.FeatureNotImplemented('get_col_names()') + raise BaseCatalogue.FeatureNotImplemented("get_col_names()") def add_col( self, @@ -144,7 +144,7 @@ def add_col( Column data as a numpy array """ - raise BaseCatalogue.FeatureNotImplemented('add_col()') + raise BaseCatalogue.FeatureNotImplemented("add_col()") def _file_exists(self, filepath): """File Exists. @@ -174,9 +174,9 @@ class InputFormat: class OpenMode: """Supported input catalogue open modes.""" - ReadOnly = 'readonly' - ReadWrite = 'update' - Append = 'append' + ReadOnly = "readonly" + ReadWrite = "update" + Append = "append" class Column(object): """Column. @@ -194,7 +194,7 @@ def name(self): Get the name of the column """ - raise BaseCatalogue.FeatureNotImplemented('column.name') + raise BaseCatalogue.FeatureNotImplemented("column.name") @property def format(self): @@ -203,7 +203,7 @@ def format(self): Get the format of the column """ - raise BaseCatalogue.FeatureNotImplemented('column.format') + raise BaseCatalogue.FeatureNotImplemented("column.format") @property def data(self): @@ -212,7 +212,7 @@ def data(self): Get the data associated with the column """ - raise BaseCatalogue.FeatureNotImplemented('column.data') + raise BaseCatalogue.FeatureNotImplemented("column.data") def get_nb_rows(self): """Get Number of Rows. @@ -220,7 +220,7 @@ def get_nb_rows(self): Retrieve the number of rows of the column. """ - raise BaseCatalogue.FeatureNotImplemented('get_nb_rows()') + raise BaseCatalogue.FeatureNotImplemented("get_nb_rows()") def get_info(self): """Get Information. @@ -228,7 +228,7 @@ def get_info(self): Retrieve information about the column. """ - raise BaseCatalogue.FeatureNotImplemented('get_info()') + raise BaseCatalogue.FeatureNotImplemented("get_info()") def get_type(self): """Get Type. @@ -236,7 +236,7 @@ def get_type(self): Get the data type of the column """ - raise BaseCatalogue.FeatureNotImplemented('get_type()') + raise BaseCatalogue.FeatureNotImplemented("get_type()") class FeatureNotImplemented(NotImplementedError): """Feature Not Implemented. @@ -253,8 +253,8 @@ def __init__(self, msg): def __str__(self): return ( - f'File IO *** ERROR ***: Feature: {self._msg} is not ' - + 'implemented in this class' + f"File IO *** ERROR ***: Feature: {self._msg} is not " + + "implemented in this class" ) class catalogueNotOpen(Exception): @@ -274,8 +274,8 @@ def __init__(self, filepath): def __str__(self): return ( - f'File IO *** ERROR ***: catalogue: {self._filepath} ' - + 'is not open' + f"File IO *** ERROR ***: catalogue: {self._filepath} " + + "is not open" ) class DataNotFound(Exception): @@ -298,8 +298,8 @@ def __init__(self, filepath, hdu): def __str__(self): return ( - f'File IO *** ERROR ***: File \'{self._filepath}\', ' - + f'hdu={self._hdu}: data not found' + f"File IO *** ERROR ***: File '{self._filepath}', " + + f"hdu={self._hdu}: data not found" ) class catalogueFileNotFound(Exception): @@ -319,7 +319,7 @@ def __init__(self, filepath): def __str__(self): """Set string representation of the exception object.""" - return f'File IO *** ERROR ***: file {self._filepath} no found' + return f"File IO *** ERROR ***: file {self._filepath} no found" class ColumnNotFound(Exception): """Column Not Found. @@ -338,7 +338,7 @@ def __init__(self, col_name): def __str__(self): """Set string representation of the exception object.""" - return f'File IO *** ERROR ***: column {self._col_name} no found' + return f"File IO *** ERROR ***: column {self._col_name} no found" class catalogueNotCreated(Exception): """Catalogue Not Created. @@ -357,8 +357,8 @@ def __init__(self, filepath): def __str__(self): return ( - f'File IO *** ERROR ***: catalogue: {self._filepath} could ' - + 'not be created' + f"File IO *** ERROR ***: catalogue: {self._filepath} could " + + "not be created" ) class OpenModeNotSupported(Exception): @@ -381,8 +381,8 @@ def __init__(self, filepath, open_mode): def __str__(self): return ( - f'File IO *** ERROR ***: catalogue: {self._filepath} ' - + 'Open Mode {self._open_mode} not supported' + f"File IO *** ERROR ***: catalogue: {self._filepath} " + + "Open Mode {self._open_mode} not supported" ) class OpenModeConflict(Exception): @@ -405,8 +405,8 @@ def __init__(self, open_mode, open_mode_needed): def __str__(self): return ( - 'File IO *** ERROR ***: catalogue has to be open as : ' - + f'{self._open_mode_needed} , Mode used : {self._open_mode}' + "File IO *** ERROR ***: catalogue has to be open as : " + + f"{self._open_mode_needed} , Mode used : {self._open_mode}" ) @@ -419,14 +419,17 @@ class FITSCatalogue(BaseCatalogue): ---------- fullpath : str Full path to file - hdu_no : int - HDU number - open_mode : OpenMode - File opening mode - memmap : Bool - Option to use memory mapping - SEx_catalogue : bool - Option to specify if the input is a SExtractor catalogue + hdu_no : int, optional + HDU number; default is ``None``, in which case + it will be set to 1 (2) if SEx_catalogue is ``False`` + (``True``) + open_mode : OpenMode, optional + File opening mode, default is ``BaseCatalogue.OpenMode.ReadOnly`` + memmap : bool, optional + Option to use memory mapping, default is ``False`` + SEx_catalogue : bool, optional + Option to specify if the input is a SExtractor catalogue; + default is ``False`` """ @@ -449,7 +452,7 @@ def __init__( self._SEx_catalogue = SEx_catalogue # HDU number of the underlying .FITS table if hdu_no is None: - # Default is 1 (or 2 if you are using ) + # Set to default value if not given by user if SEx_catalogue: self._hdu_no = 2 else: @@ -461,9 +464,9 @@ def __init__( def __str__(self): if self._cat_data is not None: - info = f'{self.get_info()}' + info = f"{self.get_info()}" else: - info = 'No information' + info = "No information" return info @property @@ -557,8 +560,8 @@ def create(self, ext_name=None, s_hdu=True, sex_cat_path=None): raise BaseCatalogue.catalogueFileNotFound(sex_cat_path) else: raise ValueError( - 'sex_cat_path needs to be provided to create a ' - + 'SEXtractor catalogue' + "sex_cat_path needs to be provided to create a " + + "SEXtractor catalogue" ) elif s_hdu: secondary_hdu = fits.BinTableHDU( @@ -639,9 +642,9 @@ def apply_mask( if fits_file._cat_data is None: raise BaseCatalogue.catalogueNotOpen(fits_file.fullpath) if mask is None: - raise ValueError('Mask not provided') + raise ValueError("Mask not provided") if type(mask) is not np.ndarray: - raise TypeError('Mask need to be a numpy.ndarray') + raise TypeError("Mask need to be a numpy.ndarray") if hdu_no is None: hdu_no = fits_file.hdu_no @@ -664,7 +667,7 @@ def apply_mask( ) ) else: - raise TypeError('Mask type must be of type int or bool') + raise TypeError("Mask type must be of type int or bool") def save_as_fits( self, @@ -718,7 +721,7 @@ def save_as_fits( ) if data is None: - raise ValueError('Data not provided') + raise ValueError("Data not provided") if not image: if type(data) is dict: @@ -758,7 +761,7 @@ def save_as_fits( names = data.dtype.names it = names else: - raise ValueError('Names not provided') + raise ValueError("Names not provided") else: it = range(len(names)) self._save_to_fits( @@ -772,7 +775,7 @@ def save_as_fits( elif type(data) is list: if names is None: - raise ValueError('Names not provided') + raise ValueError("Names not provided") it = range(len(names)) data = np.asarray(data) self._save_to_fits( @@ -786,7 +789,7 @@ def save_as_fits( elif type(data) is Table: if names is None: - raise ValueError('Names not provided') + raise ValueError("Names not provided") it = names self._save_to_fits( data, @@ -805,7 +808,7 @@ def save_as_fits( overwrite=overwrite, ) else: - raise TypeError('Data need to be a numpy.ndarray') + raise TypeError("Data need to be a numpy.ndarray") def create_from_numpy( self, @@ -848,7 +851,7 @@ def create_from_numpy( fits_header = None if header is not None: fits_header = fits.Header() - for (k, v) in header.items(): + for k, v in header.items(): fits_header[k] = v primary_hdu = fits.PrimaryHDU() @@ -1178,16 +1181,16 @@ def get_header_value(self, request, hdu_no=None): """ if request is None: - raise ValueError('request not provided') + raise ValueError("request not provided") if type(request) is not str: - raise TypeError('request has to be a string') + raise TypeError("request has to be a string") if hdu_no is None: hdu_no = self._hdu_no header = self.get_header(hdu_no=hdu_no) if header is None: - raise ValueError(f'Empty header in the hdu : {hdu_no}') + raise ValueError(f"Empty header in the hdu : {hdu_no}") return interpreter(string=request, catalogue=header).result @@ -1222,7 +1225,7 @@ def add_header_card(self, key, value=None, comment=None, hdu_no=None): card = [] if key is None: - raise ValueError('key not provided') + raise ValueError("key not provided") else: card.append(key) @@ -1230,7 +1233,7 @@ def add_header_card(self, key, value=None, comment=None, hdu_no=None): card.append(value) else: if comment is not None: - card.append('') + card.append("") if comment is not None: card.append(comment) @@ -1305,12 +1308,12 @@ def get_col_comments(self, hdu_no=None): if hdu_no is None: hdu_no = self.hdu_no hdr_col_types = [ - tt for tt in self._cat_data[hdu_no].header.keys() - if 'TTYPE' in tt + tt + for tt in self._cat_data[hdu_no].header.keys() + if "TTYPE" in tt ] return [ - self._cat_data[hdu_no].header.comments[c] - for c in hdr_col_types + self._cat_data[hdu_no].header.comments[c] for c in hdr_col_types ] else: raise BaseCatalogue.catalogueNotOpen(self.fullpath) @@ -1384,7 +1387,7 @@ def add_col( ) if type(col_data) != np.ndarray: - TypeError('col_data must be a numpy.ndarray') + TypeError("col_data must be a numpy.ndarray") if hdu_no is None: hdu_no = self.hdu_no @@ -1410,31 +1413,43 @@ def add_col( if len(data_shape) != 0: for k in data_shape: mem_size *= k - data_format = f'{mem_size}{data_type}' - new_col = fits.ColDefs([fits.Column( - name=col_name, - format=data_format, - array=col_data, - dim=dim, - )]) + data_format = f"{mem_size}{data_type}" + new_col = fits.ColDefs( + [ + fits.Column( + name=col_name, + format=data_format, + array=col_data, + dim=dim, + ) + ] + ) col_list += new_col - elif data_type == 'A': + elif data_type == "A": mem_size *= len(max(col_data, key=len)) - data_format = f'{mem_size}{data_type}' - new_col = fits.ColDefs([fits.Column( - name=col_name, - format=data_format, - array=col_data, - dim=str((mem_size,)), - )]) + data_format = f"{mem_size}{data_type}" + new_col = fits.ColDefs( + [ + fits.Column( + name=col_name, + format=data_format, + array=col_data, + dim=str((mem_size,)), + ) + ] + ) col_list += new_col else: - data_format = f'{mem_size}{data_type}' - new_col = fits.ColDefs([fits.Column( - name=col_name, - format=data_format, - array=col_data, - )]) + data_format = f"{mem_size}{data_type}" + new_col = fits.ColDefs( + [ + fits.Column( + name=col_name, + format=data_format, + array=col_data, + ) + ] + ) col_list += new_col new_fits.append(fits.BinTableHDU.from_columns(col_list, name=ext_name)) @@ -1463,7 +1478,7 @@ def remove_col(self, col_index): Index of the column to delete """ - raise BaseCatalogue.FeatureNotImplemented('remove_col()') + raise BaseCatalogue.FeatureNotImplemented("remove_col()") def remove_named_col(self, col_name): """Remove Named Column. @@ -1508,11 +1523,15 @@ def _append_col(self, column, hdu_no=None): orig_table = fits.open(self.fullpath)[hdu_no].data orig_cols = orig_table.columns - new_col = fits.ColDefs([fits.Column( - name=column.name, - format=column.format, - array=np.zeros(len(orig_table)), - )]) + new_col = fits.ColDefs( + [ + fits.Column( + name=column.name, + format=column.format, + array=np.zeros(len(orig_table)), + ) + ] + ) col_list = orig_cols + new_col hdu = fits.BinTableHDU.from_columns(col_list) hdu.data[column.name] = column.data @@ -1538,21 +1557,21 @@ def _get_fits_col_type(self, col_data): """ if col_data is None or len(col_data) == 0: - col_type = 'D' + col_type = "D" elif type(col_data[0]) in [np.int16]: - col_type = 'I' + col_type = "I" elif type(col_data[0]) in [np.int32]: - col_type = 'J' + col_type = "J" elif type(col_data[0]) in [int, np.int64]: - col_type = 'K' + col_type = "K" elif type(col_data[0]) in [float, np.float16, np.float32, np.float64]: - col_type = 'D' + col_type = "D" elif type(col_data[0]) is bool: - col_type = 'L' + col_type = "L" elif type(col_data[0]) in [str, np.str_, np.str0]: - col_type = 'A' + col_type = "A" else: - col_type = 'D' + col_type = "D" return col_type @@ -1572,27 +1591,27 @@ def _get_python_col_type(self, col_type): Column Python data type """ - if col_type in ['B', 'I', 'J', 'K']: - pcol_type = '%d' - elif col_type in ['D', 'E']: - pcol_type = '%f' - elif col_type in ['A', 'C', 'M']: - pcol_type = '%s' - elif col_type == 'L': - pcol_type = '%s' + if col_type in ["B", "I", "J", "K"]: + pcol_type = "%d" + elif col_type in ["D", "E"]: + pcol_type = "%f" + elif col_type in ["A", "C", "M"]: + pcol_type = "%s" + elif col_type == "L": + pcol_type = "%s" else: - pcol_type = '%f' + pcol_type = "%f" return pcol_type def _save_to_fits( - self, - data, - names, - it, - ext_name=None, - sex_cat_path=None, - overwrite=False, + self, + data, + names, + it, + ext_name=None, + sex_cat_path=None, + overwrite=False, ): """Save to FITS. @@ -1615,24 +1634,24 @@ def _save_to_fits( """ if data is None: - raise ValueError('Data not provided') + raise ValueError("Data not provided") if self._file_exists(self.fullpath) and not overwrite: if self._cat_data is None: self.open() if ext_name is None: - ext_name = 'new' + ext_name = "new" else: if self._SEx_catalogue: self.create(s_hdu=False, sex_cat_path=sex_cat_path) self.open() if ext_name is None: - ext_name = 'LDAC_OBJECTS' + ext_name = "LDAC_OBJECTS" else: self.create(s_hdu=False) self.open() if ext_name is None: - ext_name = 'new' + ext_name = "new" if len(names) == 1: data = np.array([data]) @@ -1646,29 +1665,35 @@ def _save_to_fits( if len(data_shape) != 0: for shape in data_shape: mem_size *= shape - data_format = f'{mem_size}{data_type}' - col_list.append(fits.Column( - name=name, - format=data_format, - array=data[idx], - dim=dim, - )) - elif data_type == 'A': + data_format = f"{mem_size}{data_type}" + col_list.append( + fits.Column( + name=name, + format=data_format, + array=data[idx], + dim=dim, + ) + ) + elif data_type == "A": mem_size *= len(max(data[idx], key=len)) - data_format = f'{mem_size}{data_type}' - col_list.append(fits.Column( - name=name, - format=data_format, - array=data[idx], - dim=str((mem_size,)), - )) + data_format = f"{mem_size}{data_type}" + col_list.append( + fits.Column( + name=name, + format=data_format, + array=data[idx], + dim=str((mem_size,)), + ) + ) else: - data_format = f'{mem_size}{data_type}' - col_list.append(fits.Column( - name=name, - format=data_format, - array=data[idx], - )) + data_format = f"{mem_size}{data_type}" + col_list.append( + fits.Column( + name=name, + format=data_format, + array=data[idx], + ) + ) self._cat_data.append( fits.BinTableHDU.from_columns(col_list, name=ext_name) @@ -1700,13 +1725,13 @@ def _save_from_recarray( """ if data is None: - raise ValueError('Data not provided') + raise ValueError("Data not provided") if self._file_exists(self.fullpath) and not overwrite: if self._cat_data is None: self.open() if ext_name is None: - ext_name = 'new' + ext_name = "new" self._cat_data.append(fits.BinTableHDU(data, name=ext_name)) self.close() else: @@ -1714,14 +1739,14 @@ def _save_from_recarray( self.create(s_hdu=False, sex_cat_path=sex_cat_path) self.open() if ext_name is None: - ext_name = 'LDAC_OBJECTS' + ext_name = "LDAC_OBJECTS" self._cat_data.append(fits.BinTableHDU(data, name=ext_name)) self.close() else: self.create(s_hdu=False) self.open() if ext_name is None: - ext_name = 'new' + ext_name = "new" self._cat_data.append(fits.BinTableHDU(data, name=ext_name)) self.close() @@ -1740,13 +1765,13 @@ def _save_image(self, data=None, header=None, overwrite=False): Option to overwrite an existing catalogue """ - if (data is not None): + if data is not None: fits.PrimaryHDU(data, header).writeto( self.fullpath, overwrite=overwrite, ) else: - raise ValueError('Data or names not provided') + raise ValueError("Data or names not provided") class Column(BaseCatalogue.Column): """Column. @@ -1772,7 +1797,7 @@ def __init__(self, name, format=None, comment=None, data=None): self._name = name if format is None: - format = 'D' + format = "D" self._format = format if comment is None: @@ -1788,7 +1813,7 @@ def __init__(self, name, format=None, comment=None, data=None): self._data = data def __str__(self): - info = f'{self._cat_col}' + info = f"{self._cat_col}" return info @property @@ -1871,7 +1896,7 @@ def get_unit_from_fits_header(header, key): idx = 1 idx_found = -1 while True: - ttype_idx = f'TTYPE{idx}' + ttype_idx = f"TTYPE{idx}" if ttype_idx not in header: # Reached beyond last column break @@ -1883,14 +1908,13 @@ def get_unit_from_fits_header(header, key): idx += 1 if idx_found == -1: - raise IndexError(f'Column \'{key}\' not found in FITS header') + raise IndexError(f"Column '{key}' not found in FITS header") # Extract coordinate unit string from header - tcunit_idx = f'TCUNI{idx}' + tcunit_idx = f"TCUNI{idx}" if tcunit_idx not in header: raise IndexError( - f'No coordinate unit found for column \'{key}\'' - ' in FITS header' + f"No coordinate unit found for column '{key}'" " in FITS header" ) unit_str = header[tcunit_idx] diff --git a/shapepipe/pipeline/job_handler.py b/shapepipe/pipeline/job_handler.py index d6baebd89..9a6e01f1f 100644 --- a/shapepipe/pipeline/job_handler.py +++ b/shapepipe/pipeline/job_handler.py @@ -42,6 +42,8 @@ class JobHandler(object): Joblib backend, the default is None (which corresponds to 'loky') timeout : int, optional Timeout limit for a given job in seconds, the default is None + exclusive : str, optional + Run this file number string exclusively if given, the default is None verbose : bool, optional Verbose setting, default is True @@ -53,11 +55,12 @@ def __init__( filehd, config, log, - job_type='parallel', - parallel_mode='smp', + job_type="parallel", + parallel_mode="smp", batch_size=None, backend=None, timeout=None, + exclusive=None, verbose=True, ): @@ -72,6 +75,7 @@ def __init__( self._module = module self._module_runner = self.filehd.module_runners[self._module] self.error_count = 0 + self.exclusive = exclusive self._verbose = verbose # Add the job parameters to the log @@ -105,7 +109,7 @@ def config(self, value): if not isinstance(value, ConfigParser): raise TypeError( - 'config must be an instane of configparser.ConfigParser' + "config must be an instane of configparser.ConfigParser" ) self._config = value @@ -128,7 +132,7 @@ def log(self): def log(self, value): if not isinstance(value, Logger): - raise TypeError('log must be an instance of logging.Logger.') + raise TypeError("log must be an instance of logging.Logger.") self._log = value @@ -149,8 +153,8 @@ def job_type(self): @job_type.setter def job_type(self, value): - if value not in ('serial', 'parallel'): - raise TypeError(f'{value} is not a valid job type.') + if value not in ("serial", "parallel"): + raise TypeError(f"{value} is not a valid job type.") self._job_type = value @@ -171,8 +175,8 @@ def parallel_mode(self): @parallel_mode.setter def parallel_mode(self, value): - if value not in ('smp', 'mpi'): - raise TypeError(f'{value} is not a valid parallel mode.') + if value not in ("smp", "mpi"): + raise TypeError(f"{value} is not a valid parallel mode.") self._parallel_mode = value @@ -193,20 +197,19 @@ def batch_size(self): @batch_size.setter def batch_size(self, value): - if ( - isinstance(value, type(None)) - and self.config.has_option('JOB', 'SMP_BATCH_SIZE') + if isinstance(value, type(None)) and self.config.has_option( + "JOB", "SMP_BATCH_SIZE" ): - value = self.config.getint('JOB', 'SMP_BATCH_SIZE') + value = self.config.getint("JOB", "SMP_BATCH_SIZE") elif isinstance(value, type(None)): value = 1 if not isinstance(value, int) or (value < 1): - raise ValueError('Batch size must be an integer >= 1.') + raise ValueError("Batch size must be an integer >= 1.") if value > cpu_count(): - warn('Batch size exeeds the number of available CPUs.') + warn("Batch size exeeds the number of available CPUs.") self._batch_size = value @@ -227,16 +230,15 @@ def backend(self): @backend.setter def backend(self, value): - if ( - isinstance(value, type(None)) - and self.config.has_option('JOB', 'SMP_BACKEND') + if isinstance(value, type(None)) and self.config.has_option( + "JOB", "SMP_BACKEND" ): - value = self.config.get('JOB', 'SMP_BACKEND').lower() + value = self.config.get("JOB", "SMP_BACKEND").lower() elif isinstance(value, type(None)): - value = 'loky' + value = "loky" - if value not in ('loky', 'multiprocessing', 'threading'): - raise ValueError(f'{value} is not a valid joblib backend.') + if value not in ("loky", "multiprocessing", "threading"): + raise ValueError(f"{value} is not a valid joblib backend.") self._backend = value @@ -259,15 +261,14 @@ def timeout(self): @timeout.setter def timeout(self, value): - if ( - isinstance(value, type(None)) - and self.config.has_option('JOB', 'TIMEOUT') + if isinstance(value, type(None)) and self.config.has_option( + "JOB", "TIMEOUT" ): - value = self.config.get('JOB', 'TIMEOUT') - value = self.hms2sec(value) if ':' in value else int(value) + value = self.config.get("JOB", "TIMEOUT") + value = self.hms2sec(value) if ":" in value else int(value) if not isinstance(value, (type(None), int)): - raise TypeError('Timeout must be None or an integer.') + raise TypeError("Timeout must be None or an integer.") self._timeout = value @@ -279,12 +280,12 @@ def finish_up(self): """ self._check_for_errors() self._check_missed_processes() - self.log.info('All processes complete') - self.log.info('') + self.log.info("All processes complete") + self.log.info("") if self._verbose: - print('All processes complete') - print('') + print("All processes complete") + print("") collect() @@ -296,7 +297,7 @@ def submit_jobs(self): Submit jobs in serial or parallel. """ - if self.job_type == 'serial': + if self.job_type == "serial": self.submit_serial_job() else: self._distribute_smp_jobs() @@ -324,7 +325,7 @@ def hms2sec(time_str): Time strings should take the form 'HH:MM:SS'. """ - h, m, s = time_str.split(':') + h, m, s = time_str.split(":") return int(h) * 3600 + int(m) * 60 + int(s) @@ -334,15 +335,15 @@ def _log_job_parameters(self): This method logs the job handler instance parameters. """ - text = 'Starting job handler with:' - module_info = f' - Module: {self._module}' - job_prop_text = ' - Job Properties:' - job_type = f' -- Job Type: {self.job_type}' - batch_info = f' -- Batch size: {self.batch_size}' - time_info = f' -- Timeout Limit: {self.timeout}s' + text = "Starting job handler with:" + module_info = f" - Module: {self._module}" + job_prop_text = " - Job Properties:" + job_type = f" -- Job Type: {self.job_type}" + batch_info = f" -- Batch size: {self.batch_size}" + time_info = f" -- Timeout Limit: {self.timeout}s" show_batch_into = ( - self.job_type == 'parallel' and self.parallel_mode == 'smp' + self.job_type == "parallel" and self.parallel_mode == "smp" ) self.log.info(text) @@ -368,7 +369,7 @@ def _log_num_processes(self): This method logs the number of processes detected for a given module. """ - proc_info = f' -- Total number of processes: {self._n_procs}' + proc_info = f" -- Total number of processes: {self._n_procs}" self.log.info(proc_info) @@ -381,20 +382,18 @@ def _distribute_smp_jobs(self): This method distributes the jobs to the workers using SMP. """ - result = ( - Parallel(n_jobs=self.batch_size, backend=self.backend)( - delayed(WorkerHandler(verbose=self._verbose).worker)( - process[1:], - process[0], - self.filehd.get_worker_log_name(self._module, process[0]), - self.filehd.module_run_dirs, - self.config, - self.filehd.get_module_config_sec(self._module), - self.timeout, - self._module_runner - ) - for process in self.filehd.process_list + result = Parallel(n_jobs=self.batch_size, backend=self.backend)( + delayed(WorkerHandler(verbose=self._verbose).worker)( + process[1:], + process[0], + self.filehd.get_worker_log_name(self._module, process[0]), + self.filehd.module_run_dirs, + self.config, + self.filehd.get_module_config_sec(self._module), + self.timeout, + self._module_runner, ) + for process in self.filehd.process_list ) self.worker_dicts = result @@ -410,9 +409,10 @@ def submit_serial_job(self): result = wh.worker( process, - '', - self.filehd.get_worker_log_name(self._module, '_serial'), - self.filehd.module_run_dirs, self.config, + "", + self.filehd.get_worker_log_name(self._module, "_serial"), + self.filehd.module_run_dirs, + self.config, self.filehd.get_module_config_sec(self._module), self.timeout, self._module_runner, @@ -438,7 +438,7 @@ def _check_exception_status(self): """ for worker_dict in self.worker_dicts: - if worker_dict['exception']: + if worker_dict["exception"]: self.log.info( f'ERROR: {worker_dict["exception"]} recorded ' + f'in: {worker_dict["log"]}' @@ -453,7 +453,7 @@ def _check_stderr_status(self): """ for worker_dict in self.worker_dicts: - if worker_dict['stderr']: + if worker_dict["stderr"]: self.log.info( f'ERROR: stderr recorded in: {worker_dict["log"]}' ) @@ -466,18 +466,16 @@ def _check_missed_processes(self): submitted. """ - missed_txt = ( - ' - The following processes were not submitted to workers:' - ) + missed_txt = " - The following processes were not submitted to workers:" if self.filehd.missed: self.log.info(missed_txt) - self.log.info(f' - {self.filehd.missed}') + self.log.info(f" - {self.filehd.missed}") if self._verbose: print(missed_txt) - print(f' - {self.filehd.missed}') + print(f" - {self.filehd.missed}") def clean_up(self): """Finish. diff --git a/shapepipe/pipeline/mpi_run.py b/shapepipe/pipeline/mpi_run.py index c92d943c8..5baf84227 100644 --- a/shapepipe/pipeline/mpi_run.py +++ b/shapepipe/pipeline/mpi_run.py @@ -36,6 +36,7 @@ def submit_mpi_jobs( timeout, run_dirs, module_runner, + module_config_sec, worker_log, verbose, ): @@ -57,6 +58,7 @@ def submit_mpi_jobs( w_log_name, run_dirs, config, + module_config_sec, timeout, module_runner )) diff --git a/shapepipe/pipeline/run_log.py b/shapepipe/pipeline/run_log.py index 115e87de0..110378539 100644 --- a/shapepipe/pipeline/run_log.py +++ b/shapepipe/pipeline/run_log.py @@ -30,7 +30,7 @@ class RunLog(object): def __init__(self, run_log_file, module_list, current_run): self.run_log_file = run_log_file - self._module_list = ','.join(module_list) + self._module_list = ",".join(module_list) self.current_run = current_run self._write() self._runs = get_list(run_log_file) @@ -41,8 +41,8 @@ def _write(self): Write current run to the run log. """ - with open(self.run_log_file, 'a') as run_log: - run_log.write(f'{self.current_run} {self._module_list}\n') + with open(self.run_log_file, "a") as run_log: + run_log.write(f"{self.current_run} {self._module_list}\n") def get_run(self, search_string): """Get Run. @@ -71,16 +71,16 @@ def get_run(self, search_string): if len(runs) < 1: raise RuntimeError( - f'No runs found matching search string \'{search_string}\'.' + f"No runs found matching search string '{search_string}'." ) elif len(runs) > 1: raise RuntimeError( - 'More than one run found matching search string ' - + f'\'{search_string}\'' + "More than one run found matching search string " + + f"'{search_string}'" ) - return runs[0].split(' ')[0] + return runs[0].split(" ")[0] def get_list(run_log_file): @@ -99,7 +99,7 @@ def get_list(run_log_file): Run log file entries """ - with open(run_log_file, 'r') as run_log: + with open(run_log_file, "r") as run_log: lines = run_log.readlines() runs = [line.rstrip() for line in lines] @@ -132,14 +132,9 @@ def get_all(runs, module): """ module_base, _ = split_module_run(module) - all_runs = [ - run for run in runs - if module_base in run.split()[1].split(',') - ] + all_runs = [run for run in runs if module_base in run.split()[1].split(",")] if len(all_runs) == 0: - raise RuntimeError( - f'No previous run of module \'{module_base}\' found' - ) + raise RuntimeError(f"No previous run of module '{module_base}' found") all_runs = all_runs[::-1] @@ -167,7 +162,36 @@ def get_last(runs, module): all_runs = get_all(runs, module) last_run = all_runs[0] - return last_run.split(' ')[0] + return last_run.split(" ")[0] + + +def get_all_dirs(run_log_file, module): + """Get All Dirs. + + Return directory paths corresponding to all runs of given module. + + Parameters + ---------- + run_log_file : str + Run log file name + module : str + Module name + + Returns + ------- + list + Directory names of all module runs + + """ + runs = get_list(run_log_file) + all_runs = get_all(runs, module) + + all_dirs = [] + for run in all_runs: + dir_name = run.split(" ")[0] + all_dirs.append(f"{dir_name}/{module}/output") + + return all_dirs def get_last_dir(run_log_file, module): @@ -188,9 +212,7 @@ def get_last_dir(run_log_file, module): Directory name of last module run """ - runs = get_list(run_log_file) - all_runs = get_all(runs, module) - last_run = all_runs[0].split(' ')[0] - last_dir = f'{last_run}/{module}/output' + all_dirs = get_all_dirs(run_log_file, module) + last_dir = all_dirs[0] return last_dir diff --git a/shapepipe/pipeline/shared.py b/shapepipe/pipeline/shared.py index 75873251b..24984b34b 100644 --- a/shapepipe/pipeline/shared.py +++ b/shapepipe/pipeline/shared.py @@ -33,10 +33,10 @@ def check_duplicate(input_list): else: input_set.add(elem) - return '' + return "" -def find_files(path, pattern='*', ext='*'): +def find_files(path, pattern="*", ext="*"): """Find Files. This method recursively retrieves file names from a given path that @@ -66,8 +66,8 @@ def find_files(path, pattern='*', ext='*'): For invalid extension format """ - dot = '.' - star = '*' + dot = "." + star = "*" if pattern != star and star in pattern: raise ValueError('Do not include "*" in pattern.') @@ -81,7 +81,7 @@ def find_files(path, pattern='*', ext='*'): if ext != star and not ext.startswith(dot): ext = dot + ext - search_string = f'{path}/**/*{pattern}*{ext}' + search_string = f"{path}/**/*{pattern}*{ext}" return glob(search_string, recursive=True) @@ -109,10 +109,10 @@ def split_module_run(module_str): """ if not isinstance(module_str, str): raise TypeError( - f'Input module_str must be a string not {type(module_str)}.' + f"Input module_str must be a string not {type(module_str)}." ) - run_split = '_run_' + run_split = "_run_" module_run = module_str if run_split in module_str: diff --git a/shapepipe/pipeline/str_handler.py b/shapepipe/pipeline/str_handler.py index f64da49f0..e443e31f6 100644 --- a/shapepipe/pipeline/str_handler.py +++ b/shapepipe/pipeline/str_handler.py @@ -39,7 +39,7 @@ class StrInterpreter(object): def __init__(self, string, catalogue, make_compare=False, mask_dict=None): if type(string) is not str: - raise ValueError('string has to be str type') + raise ValueError("string has to be str type") else: self._string = string @@ -52,7 +52,7 @@ def __init__(self, string, catalogue, make_compare=False, mask_dict=None): else: self._cat = catalogue else: - raise ValueError('catalogue not provided') + raise ValueError("catalogue not provided") self._make_compare = make_compare @@ -61,12 +61,12 @@ def __init__(self, string, catalogue, make_compare=False, mask_dict=None): self._init_stat_function() self._comp_dict = { - '<': operator.lt, - '>': operator.gt, - '<=': operator.le, - '>=': operator.ge, - '==': operator.eq, - '!=': operator.ne, + "<": operator.lt, + ">": operator.gt, + "<=": operator.le, + ">=": operator.ge, + "==": operator.eq, + "!=": operator.ne, } self.result = self.interpret(self._string, self._make_compare) @@ -107,7 +107,7 @@ def interpret( result = self._compare(string) else: if make_operate: - string_split = re.split(r'\*|\/|\-|\+\s*(?![^()]*\))', string) + string_split = re.split(r"\*|\/|\-|\+\s*(?![^()]*\))", string) result = self._operate(string, string_split) else: if make_func: @@ -128,14 +128,14 @@ def _compare(self, string): strind containing the comparison. """ - comp = '<|>|<=|>=|==|!=' + comp = "<|>|<=|>=|==|!=" if len(re.split(comp, string)) != 2: raise Exception( - 'Only one comparison in [<, >, <=, >=, ==, !=] per line' + "Only one comparison in [<, >, <=, >=, ==, !=] per line" ) - for operator in ['<=', '>=', '<', '>', '==', '!=']: + for operator in ["<=", ">=", "<", ">", "==", "!="]: terms = re.split(operator, string) if len(terms) == 2: self._make_compare = False @@ -158,7 +158,7 @@ def _apply_func(self, string): result of the function """ - str_split = re.split(r'\(|\)', string) + str_split = re.split(r"\(|\)", string) if len(str_split) == 1: return self.interpret( @@ -168,7 +168,7 @@ def _apply_func(self, string): make_operate=False, ) elif len(str_split) == 3: - str_split_2 = re.split(',', str_split[1]) + str_split_2 = re.split(",", str_split[1]) if len(str_split_2) > 1: param = [ self.interpret( @@ -176,7 +176,8 @@ def _apply_func(self, string): self._make_compare, make_func=False, make_operate=True, - ) for char in str_split_2 + ) + for char in str_split_2 ] # Evaluate statistical function, raise error if failure @@ -190,19 +191,21 @@ def _apply_func(self, string): else: if str_split[0] not in self._stat_func: raise KeyError( - f'Invalid function \'{str_split[0]}\' in expression ' - + f'\'{string}\'' + f"Invalid function '{str_split[0]}' in expression " + + f"'{string}'" + ) + return self._stat_func[str_split[0]]( + self.interpret( + str_split[1], + self._make_compare, + make_func=False, + make_operate=True, ) - return self._stat_func[str_split[0]](self.interpret( - str_split[1], - self._make_compare, - make_func=False, - make_operate=True, - )) + ) else: raise Exception( - 'Only one function can be applied. Problem with the ' - + f'term: {string}' + "Only one function can be applied. Problem with the " + + f"term: {string}" ) def _init_stat_function(self): @@ -212,21 +215,21 @@ def _init_stat_function(self): """ self._stat_func = {} - self._stat_func['mean'] = np.mean - self._stat_func['median'] = np.median - self._stat_func['mode'] = self._mode - self._stat_func['sqrt'] = np.sqrt - self._stat_func['pow'] = pow - self._stat_func['log'] = np.log - self._stat_func['log10'] = np.log10 - self._stat_func['exp'] = np.exp - self._stat_func['std'] = np.std - self._stat_func['var'] = np.var - self._stat_func['sigma_mad'] = self._sigma_mad - self._stat_func['len'] = len - self._stat_func['min'] = min - self._stat_func['max'] = max - self._stat_func['homogen'] = self._test_homogeneity + self._stat_func["mean"] = np.mean + self._stat_func["median"] = np.median + self._stat_func["mode"] = self._mode + self._stat_func["sqrt"] = np.sqrt + self._stat_func["pow"] = pow + self._stat_func["log"] = np.log + self._stat_func["log10"] = np.log10 + self._stat_func["exp"] = np.exp + self._stat_func["std"] = np.std + self._stat_func["var"] = np.var + self._stat_func["sigma_mad"] = self._sigma_mad + self._stat_func["len"] = len + self._stat_func["min"] = min + self._stat_func["max"] = max + self._stat_func["homogen"] = self._test_homogeneity def _mean(self, input): """Get Mean. @@ -303,7 +306,7 @@ def _mode(self, input, eps=0.001, iter_max=1000): iteration += 1 if iteration == iter_max: - raise ValueError('Mode computation failed') + raise ValueError("Mode computation failed") else: mode = (b_min + b_max) / 2.0 return mode @@ -361,18 +364,18 @@ def _test_homogeneity(self, *args): n_cells = args[2] else: raise ValueError( - 'Inputs should be param_1, param_2 [optional], n_cells' + "Inputs should be param_1, param_2 [optional], n_cells" ) if n_param == 2: if len(param[0]) != len(param[1]): raise ValueError( - 'Both param_1 and param_2 must have the same ' - + f'length : {len(param[0])}, {len(param[1])}' + "Both param_1 and param_2 must have the same " + + f"length : {len(param[0])}, {len(param[1])}" ) if np.sqrt(n_cells) % 1 != 0: - raise ValueError('N_cells must be a square number') + raise ValueError("N_cells must be a square number") n_tot = len(param[0]) homo_ratio = float(n_tot) / float(n_cells) @@ -380,37 +383,52 @@ def _test_homogeneity(self, *args): param_min = [] param_max = [] for idx in param: - step = ( - (np.max(idx) - np.min(idx)) - / pow(n_cells, 1.0 / float(n_param)) + step = (np.max(idx) - np.min(idx)) / pow( + n_cells, 1.0 / float(n_param) ) param_min.append( [val for val in np.arange(np.min(idx), np.max(idx), step)] ) param_max.append( [ - val for val in - np.arange(np.min(idx) + step, np.max(idx) + step, step) + val + for val in np.arange( + np.min(idx) + step, np.max(idx) + step, step + ) ] ) if n_param == 1: - n_obj = np.asarray([ - float(len(np.where( - (param[0] >= param_min[0][idx]) - & (param[0] <= param_max[0][idx]) - )[0])) for idx in range(int(n_cells)) - ]) + n_obj = np.asarray( + [ + float( + len( + np.where( + (param[0] >= param_min[0][idx]) + & (param[0] <= param_max[0][idx]) + )[0] + ) + ) + for idx in range(int(n_cells)) + ] + ) elif n_param == 2: it = itertools.product(range(int(np.sqrt(n_cells))), repeat=2) - n_obj = np.asarray([ - float(len(np.where( - (param[0] >= param_min[0][idx_i]) - & (param[0] <= param_max[0][idx_i]) - & (param[1] >= param_min[1][idx_j]) - & (param[1] <= param_max[1][idx_j]) - )[0])) for idx_i, idx_j in it - ]) + n_obj = np.asarray( + [ + float( + len( + np.where( + (param[0] >= param_min[0][idx_i]) + & (param[0] <= param_max[0][idx_i]) + & (param[1] >= param_min[1][idx_j]) + & (param[1] <= param_max[1][idx_j]) + )[0] + ) + ) + for idx_i, idx_j in it + ] + ) actual_std = np.std(n_obj / homo_ratio) @@ -442,47 +460,47 @@ def _operate(self, string, string_split): It's used as a recursive function """ - op = r'\*|\/|\-|\+\s*(?![^()]*\))' + op = r"\*|\/|\-|\+\s*(?![^()]*\))" if string is None: - raise ValueError('Parameter not specified') + raise ValueError("Parameter not specified") if string_split is None: - raise ValueError('Parameters splited not specified') + raise ValueError("Parameters splited not specified") if len(re.split(op, string)) == 1: return self.interpret(string, make_operate=False) tmp = self._string_op_func( - re.split(r'\+\s*(?![^()]*\))', string), + re.split(r"\+\s*(?![^()]*\))", string), string_split, operator.add, 0, ) - if not np.isscalar(tmp) or tmp != 'pass': + if not np.isscalar(tmp) or tmp != "pass": return tmp else: tmp = self._string_op_func( - re.split(r'\-\s*(?![^()]*\))', string), + re.split(r"\-\s*(?![^()]*\))", string), string_split, operator.sub, - 'init', + "init", ) - if not np.isscalar(tmp) or tmp != 'pass': + if not np.isscalar(tmp) or tmp != "pass": return tmp else: tmp = self._string_op_func( - re.split(r'\*\s*(?![^()]*\))', string), + re.split(r"\*\s*(?![^()]*\))", string), string_split, operator.mul, 1, ) - if not np.isscalar(tmp) or tmp != 'pass': + if not np.isscalar(tmp) or tmp != "pass": return tmp else: return self._string_op_func( - re.split(r'\/\s*(?![^()]*\))', string), + re.split(r"\/\s*(?![^()]*\))", string), string_split, operator.truediv, - 'init', + "init", ) def _string_op_func(self, string_op, string_split, op, tmp): @@ -512,7 +530,7 @@ def _string_op_func(self, string_op, string_split, op, tmp): """ if len(string_op) > 2: for operator in string_op: - if tmp == 'init': + if tmp == "init": tmp = self._operate(operator, string_split) else: tmp = op(tmp, self._operate(operator, string_split)) @@ -528,7 +546,7 @@ def _string_op_func(self, string_op, string_split, op, tmp): second = self._operate(string_op[1], string_split) return op(first, second) else: - return 'pass' + return "pass" def _get_value(self, string): """Get Value. @@ -558,28 +576,26 @@ def _get_value(self, string): string_value = float(string) return string_value except Exception: - str_split = re.split(r'\{|\}', string) + str_split = re.split(r"\{|\}", string) if len(str_split) == 1: try: return self._cat[string] except Exception: raise ValueError( - 'String has to be a float or a catalogue parameter. ' - + f'{string} not found' + "String has to be a float or a catalogue parameter. " + + f"{string} not found" ) if len(str_split) == 3: if str_split[1] in self._mask.keys(): try: - return ( - self._cat[str_split[0]][self._mask[str_split[1]]] - ) + return self._cat[str_split[0]][self._mask[str_split[1]]] except Exception: raise ValueError( - 'String has to be a catalogue parameter. ' - + f'{str_split[0]} not found' + "String has to be a catalogue parameter. " + + f"{str_split[0]} not found" ) else: raise ValueError( - f'Mask has to be provided. {str_split[1]} not ' - + 'found in mask' + f"Mask has to be provided. {str_split[1]} not " + + "found in mask" ) diff --git a/shapepipe/pipeline/timeout.py b/shapepipe/pipeline/timeout.py index a27726b30..f37e1876e 100644 --- a/shapepipe/pipeline/timeout.py +++ b/shapepipe/pipeline/timeout.py @@ -28,9 +28,10 @@ def with_timeout(timeout, log_file): For process exceeding timeout limit """ + def handler(signum, frame): raise TimeoutError( - f'The process time exceeded {timeout}s in {log_file}' + f"The process time exceeded {timeout}s in {log_file}" ) def decorator(decorated): diff --git a/shapepipe/pipeline/worker_handler.py b/shapepipe/pipeline/worker_handler.py index c8fb7cb2d..bdd8b037e 100644 --- a/shapepipe/pipeline/worker_handler.py +++ b/shapepipe/pipeline/worker_handler.py @@ -39,7 +39,7 @@ def worker( config, module_config_sec, timeout, - module_runner + module_runner, ): """Worker. @@ -73,8 +73,7 @@ def worker( self._config = config self._module_config_sec = module_config_sec self._module_runner = module_runner - self._prepare_worker(process, job_name, timeout, - module_runner.__name__) + self._prepare_worker(process, job_name, timeout, module_runner.__name__) self._create_worker_log() self._run_worker() close_log(self.w_log, verbose=False) @@ -98,7 +97,7 @@ def _set_job_name(num): Job name """ - return f'process{num}' + return f"process{num}" def _prepare_worker(self, process, job_name, timeout, module): """Prepare Worker. @@ -117,18 +116,18 @@ def _prepare_worker(self, process, job_name, timeout, module): Module runner name """ - self.worker_dict['pid'] = getpid() - self.worker_dict['threads'] = active_count() - self.worker_dict['node'] = platform.node() - self.worker_dict['system'] = platform.system() - self.worker_dict['machine'] = platform.machine() - self.worker_dict['exception'] = False - self.worker_dict['stderr'] = False - self.worker_dict['process'] = list(process) - self.worker_dict['file_number_string'] = job_name - self.worker_dict['job_name'] = self._set_job_name(job_name) - self.worker_dict['timeout'] = timeout - self.worker_dict['module'] = module + self.worker_dict["pid"] = getpid() + self.worker_dict["threads"] = active_count() + self.worker_dict["node"] = platform.node() + self.worker_dict["system"] = platform.system() + self.worker_dict["machine"] = platform.machine() + self.worker_dict["exception"] = False + self.worker_dict["stderr"] = False + self.worker_dict["process"] = list(process) + self.worker_dict["file_number_string"] = job_name + self.worker_dict["job_name"] = self._set_job_name(job_name) + self.worker_dict["timeout"] = timeout + self.worker_dict["module"] = module def _create_worker_log(self): """Create Worker Log. @@ -137,18 +136,17 @@ def _create_worker_log(self): worker parameters. """ - process_size = len(str(self.worker_dict['process'])) + process_size = len(str(self.worker_dict["process"])) if self._verbose: - job_name = self.worker_dict['job_name'] - pid = self.worker_dict['pid'] + job_name = self.worker_dict["job_name"] + pid = self.worker_dict["pid"] - print(f' - {job_name} PID: {pid} ', end='') + print(f" - {job_name} PID: {pid} ", end="") - if ( - process_size - < self._config.getint('WORKER', 'PROCESS_PRINT_LIMIT') + if process_size < self._config.getint( + "WORKER", "PROCESS_PRINT_LIMIT" ): print( f'processing {self.worker_dict["file_number_string"]} ' @@ -158,8 +156,8 @@ def _create_worker_log(self): print() self.w_log = set_up_log(self._w_log_name, verbose=False) - self.worker_dict['log'] = self.w_log.name - self.w_log.info('Worker process running with:') + self.worker_dict["log"] = self.w_log.name + self.w_log.info("Worker process running with:") self.w_log.info(f' - Job Name: {self.worker_dict["job_name"]}') self.w_log.info(f' - PID: {self.worker_dict["pid"]}') self.w_log.info(f' - Threads: {self.worker_dict["threads"]}') @@ -177,13 +175,13 @@ def _run_worker(self): """ try: - with_timeout(self.worker_dict['timeout'], self.w_log.name)( + with_timeout(self.worker_dict["timeout"], self.w_log.name)( self._worker_execution )() except Exception as err: catch_error(err, self.w_log) - self.worker_dict['exception'] = type(err).__name__ + self.worker_dict["exception"] = type(err).__name__ def _worker_execution(self): """Worker Execution. @@ -205,12 +203,10 @@ def _run_module(self): For non-existent module runner """ - self.w_log.info( - f' - Running module: {self.worker_dict["module"]}' - ) + self.w_log.info(f' - Running module: {self.worker_dict["module"]}') - file_number_string = self.worker_dict['file_number_string'] - input_file_list = self.worker_dict['process'] + file_number_string = self.worker_dict["file_number_string"] + input_file_list = self.worker_dict["process"] self._stdout, self._stderr = self._module_runner( input_file_list, @@ -228,11 +224,11 @@ def _log_stdout(self): """ self.w_log.info( - f'Process produced the following output: {self._stdout}' + f"Process produced the following output: {self._stdout}" ) if self._stderr: self.w_log.info( - f'Process produced the following error(s): {self._stderr}' + f"Process produced the following error(s): {self._stderr}" ) - self.worker_dict['stderr'] = True + self.worker_dict["stderr"] = True diff --git a/shapepipe/run.py b/shapepipe/run.py index 2443eab50..52d772145 100644 --- a/shapepipe/run.py +++ b/shapepipe/run.py @@ -29,7 +29,7 @@ import_mpi = True -class ShapePipe(): +class ShapePipe: """ShapePipe. ShapePipe runner class. @@ -49,14 +49,16 @@ def set_up(self): self._args = create_arg_parser() self.config = create_config_parser(self._args.config) self._set_run_name() - self.modules = self.config.getlist('EXECUTION', 'MODULE') - self.mode = self.config.get('EXECUTION', 'MODE').lower() - self.verbose = self.config.getboolean('DEFAULT', 'VERBOSE') + self.modules = self.config.getlist("EXECUTION", "MODULE") + self.mode = self.config.get("EXECUTION", "MODE").lower() + self.exclusive = self._args.exclusive + self.verbose = self.config.getboolean("DEFAULT", "VERBOSE") self.filehd = FileHandler( self._run_name, self.modules, self.config, - self.verbose, + exclusive=self._args.exclusive, + verbose=self.verbose, ) self.error_count = 0 self._prep_run() @@ -67,10 +69,10 @@ def _set_run_name(self): Set the name of the current pipeline run. """ - self._run_name = self.config.get('DEFAULT', 'RUN_NAME') + self._run_name = self.config.get("DEFAULT", "RUN_NAME") - if self.config.getboolean('DEFAULT', 'RUN_DATETIME'): - self._run_name += datetime.now().strftime('_%Y-%m-%d_%H-%M-%S') + if self.config.getboolean("DEFAULT", "RUN_DATETIME"): + self._run_name += datetime.now().strftime("_%Y-%m-%d_%H-%M-%S") def _create_pipeline_log(self): """Create Pipeline Log. @@ -80,16 +82,16 @@ def _create_pipeline_log(self): """ self.log = set_up_log(self.filehd.log_name, verbose=False) - start_text = f'Starting ShapePipe Run: {self._run_name}' + start_text = f"Starting ShapePipe Run: {self._run_name}" self.log.info(shapepipe_logo()) self.log.info(start_text) - self.log.info('') + self.log.info("") if self.verbose: print(shapepipe_logo(colour=True)) print(start_text) - print('') + print("") # Temporary fix to give file handler access to the log. This should # be improved at some point. @@ -107,13 +109,13 @@ def close_pipeline_log(self): """ if self.error_count == 1: - plur = ' was' + plur = " was" else: - plur = 's were' + plur = "s were" final_error_count = ( - f'A total of {self.error_count} error{plur} recorded.' + f"A total of {self.error_count} error{plur} recorded." ) - end_text = 'Finishing ShapePipe Run' + end_text = "Finishing ShapePipe Run" self.log.info(final_error_count) self.log.info(end_text) @@ -172,15 +174,15 @@ def _check_dependencies(self): Check that all pipeline dependencies have been installed. """ - module_dep = self._get_module_depends('depends') + __installs__ - module_exe = self._get_module_depends('executes') + module_dep = self._get_module_depends("depends") + __installs__ + module_exe = self._get_module_depends("executes") - module_dep += ['mpi4py'] if import_mpi else module_dep + module_dep += ["mpi4py"] if import_mpi else module_dep dh = DependencyHandler(module_dep, module_exe) - dep_text = 'Checking Python Dependencies:' - exe_text = 'Checking System Executables:' + dep_text = "Checking Python Dependencies:" + exe_text = "Checking System Executables:" self.log.info(dep_text) if self.verbose: @@ -193,9 +195,9 @@ def _check_dependencies(self): if self.verbose: print(dep) - self.log.info('') + self.log.info("") if self.verbose: - print('') + print("") self.log.info(exe_text) if self.verbose: @@ -208,9 +210,9 @@ def _check_dependencies(self): if self.verbose: print(exe) - self.log.info('') + self.log.info("") if self.verbose: - print('') + print("") def _check_module_versions(self): """Check Module Version. @@ -218,7 +220,7 @@ def _check_module_versions(self): Check versions of the modules. """ - ver_text = 'Checking Module Versions:' + ver_text = "Checking Module Versions:" self.log.info(ver_text) if self.verbose: @@ -227,16 +229,16 @@ def _check_module_versions(self): for module in set(self.modules): module_txt = ( - f' - {module} {self.filehd.module_runners[module].version}' + f" - {module} {self.filehd.module_runners[module].version}" ) self.log.info(module_txt) if self.verbose: print(module_txt) - self.log.info('') + self.log.info("") if self.verbose: - print('') + print("") def _check_system_setup(self): """Check System Set Up. @@ -244,17 +246,17 @@ def _check_system_setup(self): Check the set up of the machine on which the pipeline is running. """ - setup_text = 'Checking System Set Up:' - cpu_info = f' - Number of available CPUs: {cpu_count()}' + setup_text = "Checking System Set Up:" + cpu_info = f" - Number of available CPUs: {cpu_count()}" self.log.info(setup_text) self.log.info(cpu_info) - self.log.info('') + self.log.info("") if self.verbose: print(setup_text) print(cpu_info) - print('') + print("") def _get_module_run_methods(self): """Get Module Run Method. @@ -266,9 +268,9 @@ def _get_module_run_methods(self): for module in self.modules: - self.run_method[module] = ( - self.filehd.module_runners[module].run_method - ) + self.run_method[module] = self.filehd.module_runners[ + module + ].run_method def _prep_run(self): """Prepare Run. @@ -300,13 +302,13 @@ def record_mode(self): Log mode in which ShapePipe is running. """ - mode_text = f'Running ShapePipe using {self.mode}' + mode_text = f"Running ShapePipe using {self.mode}" self.log.info(mode_text) - self.log.info('') + self.log.info("") if self.verbose: print(mode_text) - print('') + print("") def run_smp(pipe): @@ -330,6 +332,7 @@ def run_smp(pipe): config=pipe.config, log=pipe.log, job_type=pipe.run_method[module], + exclusive=pipe.exclusive, verbose=pipe.verbose, ) @@ -387,7 +390,8 @@ def run_mpi(pipe, comm): config=config, log=pipe.log, job_type=pipe.run_method[module], - parallel_mode='mpi', + parallel_mode="mpi", + exclusive=pipe.exclusive, verbose=verbose, ) @@ -395,7 +399,7 @@ def run_mpi(pipe, comm): job_type = jh.job_type # Handle serial jobs - if job_type == 'serial': + if job_type == "serial": jh.submit_jobs() # Handle parallel jobs @@ -405,6 +409,7 @@ def run_mpi(pipe, comm): # Get file handler objects run_dirs = jh.filehd.module_run_dirs module_runner = jh.filehd.module_runners[module] + module_config_sec = jh.filehd.get_module_config_sec(module) worker_log = jh.filehd.get_worker_log_name # Define process list process_list = jh.filehd.process_list @@ -412,18 +417,19 @@ def run_mpi(pipe, comm): jobs = split_mpi_jobs(process_list, comm.size) del process_list else: - job_type = module_runner = worker_log = timeout = \ - jobs = run_dirs = None + job_type = module_runner = module_config_sec = worker_log = \ + timeout = jobs = run_dirs = None # Broadcast job type to all nodes job_type = comm.bcast(job_type, root=0) - if job_type == 'parallel': + if job_type == "parallel": # Broadcast objects to all nodes run_dirs = comm.bcast(run_dirs, root=0) module_runner = comm.bcast(module_runner, root=0) + module_config_sec = comm.bcast(module_config_sec, root=0) worker_log = comm.bcast(worker_log, root=0) timeout = comm.bcast(timeout, root=0) jobs = comm.scatter(jobs, root=0) @@ -436,14 +442,15 @@ def run_mpi(pipe, comm): timeout, run_dirs, module_runner, + module_config_sec, worker_log, - verbose + verbose, ), root=0, ) # Delete broadcast objects - del module_runner, worker_log, timeout, jobs + del module_runner, module_config_sec, worker_log, timeout, jobs # Finish up parallel jobs if master: @@ -486,13 +493,13 @@ def run(*args): pipe = None mode = None - mode = comm.bcast(mode, root=0) if import_mpi else 'smp' + mode = comm.bcast(mode, root=0) if import_mpi else "smp" if master: pipe.mode = mode pipe.record_mode() - if mode == 'mpi': + if mode == "mpi": run_mpi(pipe, comm) else: run_smp(pipe) diff --git a/shapepipe/tests/test_get_images.py b/shapepipe/tests/test_get_images.py index ca492e9b6..860f37f97 100644 --- a/shapepipe/tests/test_get_images.py +++ b/shapepipe/tests/test_get_images.py @@ -19,8 +19,8 @@ class GetImagesTestCase(TestCase): def setUp(self): - self.number_tile = '123.456' - self.number_exp = '2490092p' + self.number_tile = "123.456" + self.number_exp = "2490092p" self.number_int = 123456 def tearDown(self): @@ -32,13 +32,11 @@ def tearDown(self): def test_in2out_pattern(self): npt.assert_string_equal( - get_images.in2out_pattern(self.number_tile), - '123-456' + get_images.in2out_pattern(self.number_tile), "123-456" ) npt.assert_string_equal( - get_images.in2out_pattern(self.number_exp), - '2490092' + get_images.in2out_pattern(self.number_exp), "2490092" ) npt.assert_raises( diff --git a/shapepipe/tests/test_pipeline.py b/shapepipe/tests/test_pipeline.py index 24b9ce8ca..2a59a6c74 100644 --- a/shapepipe/tests/test_pipeline.py +++ b/shapepipe/tests/test_pipeline.py @@ -18,8 +18,8 @@ class ExecuteTestCase(TestCase): def setUp(self): - self.command_line = 'echo 1' - self.output_tuple = ('1\n', '') + self.command_line = "echo 1" + self.output_tuple = ("1\n", "") def tearDown(self): @@ -34,5 +34,5 @@ def test_execute(self): def test_check_executable(self): npt.assert_raises(TypeError, execute.check_executable, 1) - npt.assert_raises(OSError, execute.check_executable, '') - self.assertIsNone(execute.check_executable('/bin/ls')) + npt.assert_raises(OSError, execute.check_executable, "") + self.assertIsNone(execute.check_executable("/bin/ls")) diff --git a/shapepipe/tests/test_utilities.py b/shapepipe/tests/test_utilities.py index d5c02233a..83d624108 100644 --- a/shapepipe/tests/test_utilities.py +++ b/shapepipe/tests/test_utilities.py @@ -45,22 +45,22 @@ def test_sigma_to_fwhm(self): npt.assert_almost_equal( galaxy.sigma_to_fwhm(self.sigma_float), self.sigma_float_exp, - err_msg='sigma_to_fwhm gave invalid result for float input', + err_msg="sigma_to_fwhm gave invalid result for float input", ) npt.assert_almost_equal( galaxy.sigma_to_fwhm(self.sigma_float, self.pixel_scale), self.sigma_float_ps_exp, err_msg=( - 'sigma_to_fwhm gave invalid result for float input with ' - + 'non-default pixel scale' + "sigma_to_fwhm gave invalid result for float input with " + + "non-default pixel scale" ), ) npt.assert_allclose( galaxy.sigma_to_fwhm(self.sigma_array), self.sigma_array_exp, - err_msg='sigma_to_fwhm gave invalid result for array input', + err_msg="sigma_to_fwhm gave invalid result for array input", ) npt.assert_raises(TypeError, galaxy.sigma_to_fwhm, self.sigma_int) diff --git a/shapepipe/utilities/__init__.py b/shapepipe/utilities/__init__.py index 63b425136..15e59739c 100644 --- a/shapepipe/utilities/__init__.py +++ b/shapepipe/utilities/__init__.py @@ -7,4 +7,4 @@ """ -__all__ = ['file_system', 'cfis', 'galaxy'] +__all__ = ["file_system", "cfis", "galaxy"] diff --git a/shapepipe/utilities/cfis.py b/shapepipe/utilities/cfis.py index c8cdcb7a5..0d94b3be3 100644 --- a/shapepipe/utilities/cfis.py +++ b/shapepipe/utilities/cfis.py @@ -18,17 +18,17 @@ from shapepipe.utilities.file_system import mkdir -unitdef = 'degree' +unitdef = "degree" # Maybe define class for these constants? size = {} -size['tile'] = 0.5 -size['weight'] = 0.5 -size['exposure'] = 1.0 +size["tile"] = 0.5 +size["weight"] = 0.5 +size["exposure"] = 1.0 # Cut criteria for exposures exp_time_min = 95 -flag_valid = 'V' +flag_valid = "V" class param: @@ -60,7 +60,7 @@ class CfisError(Exception): pass -class image(): +class image: """Image Class. Class to store and create image information. @@ -80,7 +80,7 @@ class image(): """ - def __init__(self, name, ra, dec, exp_time=-1, valid='Unknown'): + def __init__(self, name, ra, dec, exp_time=-1, valid="Unknown"): self.name = name self.ra = ra self.dec = dec @@ -89,7 +89,7 @@ def __init__(self, name, ra, dec, exp_time=-1, valid='Unknown'): else: self.exp_time = exp_time if valid is None: - self.valid = 'Unknown' + self.valid = "Unknown" else: self.valid = valid @@ -119,7 +119,7 @@ def cut(self, no_cuts=False): return True # Cut if validation flag is not valid (and not unknown) - if self.valid != flag_valid and self.valid != 'Unknown': + if self.valid != flag_valid and self.valid != "Unknown": return True return False @@ -140,18 +140,14 @@ def get_ID(self): if name does not match to ID pattern """ - m = re.search(r'(\d{3}).{1}(\d{3})', self.name) + m = re.search(r"(\d{3}).{1}(\d{3})", self.name) if m is None: - raise ValueError(f'No ID match in file name {name}') + raise ValueError(f"No ID match in file name {name}") else: - return f'{m[1]}.{m[2]}' + return f"{m[1]}.{m[2]}" def print( - self, - file=sys.stdout, - base_name=False, - name_only=True, - ID_only=False + self, file=sys.stdout, base_name=False, name_only=True, ID_only=False ): """Print. @@ -180,21 +176,21 @@ def print( name = self.name if ID_only: - m = re.search(r'\d{3}.\d{3}', name) + m = re.search(r"\d{3}.\d{3}", name) if m is None: - raise ValueError(f'No ID match in file name {name}') + raise ValueError(f"No ID match in file name {name}") else: name = m[0] - print(name, end='', file=file) + print(name, end="", file=file) if not name_only: if self.ra is not None: ra_unit = getattr(self.ra, unitdef) - print(f' {ra_unit:10.2f}', end='', file=file) + print(f" {ra_unit:10.2f}", end="", file=file) if self.dec is not None: dec_unit = getattr(self.dec, unitdef) - print(f' {dec_unit:10.2f}', end='', file=file) - print(f' {self.exp_time:5d} {self.valid:8s}', end='', file=file) + print(f" {dec_unit:10.2f}", end="", file=file) + print(f" {self.exp_time:5d} {self.valid:8s}", end="", file=file) print(file=file) def print_header(self, file=sys.stdout): @@ -209,8 +205,8 @@ def print_header(self, file=sys.stdout): """ print( - f'#Name ra[{unitdef}] dec[{unitdef}] exp_time[s] validation', - file=file + f"#Name ra[{unitdef}] dec[{unitdef}] exp_time[s] validation", + file=file, ) @@ -237,30 +233,30 @@ def log_command(argv, name=None, close_no_return=True): """ if name is None: - name = 'log_' + os.path.basename(argv[0]) + name = "log_" + os.path.basename(argv[0]) - if name == 'sys.stdout': + if name == "sys.stdout": f = sys.stdout - elif name == 'sys.stderr': + elif name == "sys.stderr": f = sys.stderr else: - f = open(name, 'w') + f = open(name, "w") for a in argv: # Quote argument if special characters - if ']' in a or ']' in a: - a = f'\"{a}\"' + if "]" in a or "]" in a: + a = f'"{a}"' - print(a, end='', file=f) - print(' ', end='', file=f) + print(a, end="", file=f) + print(" ", end="", file=f) - print('', file=f) + print("", file=f) if not close_no_return: return f - if name != 'sys.stdout' and name != 'sys.stderr': + if name != "sys.stdout" and name != "sys.stderr": f.close() @@ -301,30 +297,30 @@ def my_string_split(string, num=-1, verbose=False, stop=False, sep=None): return None if sep is None: - has_space = string.find(' ') - has_underscore = string.find('_') - has_dot = string.find('.') + has_space = string.find(" ") + has_underscore = string.find("_") + has_dot = string.find(".") if has_space != -1: - my_sep = ' ' + my_sep = " " elif has_underscore != -1: - my_sep = '_' + my_sep = "_" elif has_dot != -1: - my_sep = '.' + my_sep = "." else: # no separator found, does string consist of only one element? if num == -1 or num == 1: my_sep = None else: raise Valueerror( - 'No separator (\' \', \'_\', or \'.\') found in string' - + f' \'{string}\', cannot split' + "No separator (' ', '_', or '.') found in string" + + f" '{string}', cannot split" ) else: if not string.find(sep): raise ValueError( - f'No separator \'{sep}\' found in string \'{string}\', ' - + 'cannot split' + f"No separator '{sep}' found in string '{string}', " + + "cannot split" ) my_sep = sep @@ -332,7 +328,7 @@ def my_string_split(string, num=-1, verbose=False, stop=False, sep=None): if num != -1 and num != len(res) and stop: raise CfisError( - f'String \'{len(res)}\' has length {num}, required is {num}' + f"String '{len(res)}' has length {num}, required is {num}" ) return res @@ -364,46 +360,46 @@ def get_file_pattern(pattern, band, image_type, want_re=True, ext=True): output pattern """ - if pattern == '': + if pattern == "": if image_type in ( - 'exposure', - 'exposure_flag', - 'exposure_flag.fz', - 'exposure_weight', - 'exposure_weight.fz' + "exposure", + "exposure_flag", + "exposure_flag.fz", + "exposure_weight", + "exposure_weight.fz", ): - pattern_base = r'\d{7}p' + pattern_base = r"\d{7}p" else: - pattern_base = rf'CFIS.*\.{band}' + pattern_base = rf"CFIS.*\.{band}" else: pattern_base = pattern if ext: - if image_type == 'exposure': - pattern_out = rf'{pattern_base}\.fits\.fz' - elif image_type == 'exposure_flag': - pattern_out = rf'{pattern_base}\.flag\.fits' - elif image_type == 'exposure_flag.fz': - pattern_out = rf'{pattern_base}\.flag\.fits\.fz' - elif image_type == 'exposure_weight': - pattern_out = rf'{pattern_base}\.weight\.fits' - elif image_type == 'exposure_weight.fz': - pattern_out = rf'{pattern_base}\.weight\.fits\.fz' - elif image_type == 'tile': - pattern_out = rf'{pattern_base}\.fits' - elif image_type == 'cat': - pattern_out = rf'{pattern_base}\.cat' - elif image_type == 'weight': - pattern_out = rf'{pattern_base}\.weight\.fits' - elif image_type == 'weight.fz': - pattern_out = rf'{pattern_base}\.weight\.fits\.fz' + if image_type == "exposure": + pattern_out = rf"{pattern_base}\.fits\.fz" + elif image_type == "exposure_flag": + pattern_out = rf"{pattern_base}\.flag\.fits" + elif image_type == "exposure_flag.fz": + pattern_out = rf"{pattern_base}\.flag\.fits\.fz" + elif image_type == "exposure_weight": + pattern_out = rf"{pattern_base}\.weight\.fits" + elif image_type == "exposure_weight.fz": + pattern_out = rf"{pattern_base}\.weight\.fits\.fz" + elif image_type == "tile": + pattern_out = rf"{pattern_base}\.fits" + elif image_type == "cat": + pattern_out = rf"{pattern_base}\.cat" + elif image_type == "weight": + pattern_out = rf"{pattern_base}\.weight\.fits" + elif image_type == "weight.fz": + pattern_out = rf"{pattern_base}\.weight\.fits\.fz" else: - raise CfisError(f'Invalid type \'{image_type}\'') + raise CfisError(f"Invalid type '{image_type}'") else: pattern_out = pattern_base if not want_re: - pattern_out = pattern_out.replace('\\', '') + pattern_out = pattern_out.replace("\\", "") return pattern_out @@ -443,13 +439,13 @@ def get_tile_number_from_coord(ra, dec, return_type=str): xi = 0 if return_type == str: - nix = f'{xi:03d}' - niy = f'{yi:03d}' + nix = f"{xi:03d}" + niy = f"{yi:03d}" elif return_type == int: nix = xi niy = yi else: - raise CfisError(f'Invalid return type {return_type}') + raise CfisError(f"Invalid return type {return_type}") return nix, niy @@ -482,14 +478,14 @@ def get_tile_coord_from_nixy(nix, niy): yi = int(niy) d = yi / 2 - 90 - dec = coords.Angle(d, unit='deg') + dec = coords.Angle(d, unit="deg") r = xi / 2 / np.cos(dec.radian) - ra = coords.Angle(r, unit='deg') + ra = coords.Angle(r, unit="deg") return ra, dec -def get_tile_name(nix, niy, band, image_type='tile', input_format='full'): +def get_tile_name(nix, niy, band, image_type="tile", input_format="full"): """Get Tile Name. Return tile name for given tile numbers. @@ -519,29 +515,29 @@ def get_tile_name(nix, niy, band, image_type='tile', input_format='full'): """ if type(nix) is int and type(niy) is int: - if input_format == 'ID_only': - tile_base = f'{nix:03d}.{niy:03d}' + if input_format == "ID_only": + tile_base = f"{nix:03d}.{niy:03d}" else: - tile_base = f'CFIS.{nix:03d}.{niy:03d}.{band}' + tile_base = f"CFIS.{nix:03d}.{niy:03d}.{band}" elif type(nix) is str and type(niy) is str: - if input_format == 'ID_only': - tile_base = f'{nix}.{niy}' + if input_format == "ID_only": + tile_base = f"{nix}.{niy}" else: - tile_base = f'CFIS.{nix}.{niy}.{band}' + tile_base = f"CFIS.{nix}.{niy}.{band}" else: - raise CfisError(f'Invalid type for input tile numbers {nix}, {niy}') + raise CfisError(f"Invalid type for input tile numbers {nix}, {niy}") - if input_format == 'ID_only': + if input_format == "ID_only": tile_name = tile_base else: - if image_type == 'tile': - tile_name = f'{tile_base}.fits' - elif image_type == 'weight': - tile_name = f'{tile_base}.weight.fits' - elif image_type == 'weight.fz': - tile_name = f'{tile_base}.weight.fits.fz' + if image_type == "tile": + tile_name = f"{tile_base}.fits" + elif image_type == "weight": + tile_name = f"{tile_base}.weight.fits" + elif image_type == "weight.fz": + tile_name = f"{tile_base}.weight.fits.fz" else: - raise CfisError(f'Invalid image type {image_type}') + raise CfisError(f"Invalid image type {image_type}") return tile_name @@ -567,10 +563,10 @@ def get_tile_number(tile_name): tile number for x and tile number for y """ - m = re.search(r'(\d{3})[\.-](\d{3})', tile_name) + m = re.search(r"(\d{3})[\.-](\d{3})", tile_name) if m is None or len(m.groups()) != 2: raise CfisError( - f'Image name \'{tile_name}\' does not match tile name syntax' + f"Image name '{tile_name}' does not match tile name syntax" ) nix = m.groups()[0] @@ -629,12 +625,12 @@ def get_log_file(path, verbose=False): """ if not os.path.isfile(path): - raise CfisError(f'Log file \'{path}\' not found') + raise CfisError(f"Log file '{path}' not found") - f_log = open(path, 'r') + f_log = open(path, "r") log = f_log.readlines() if verbose: - print(f'Reading log file, {len(log)} lines found') + print(f"Reading log file, {len(log)} lines found") f_log.close() return log @@ -663,7 +659,7 @@ def check_ra(ra): """ print(ra.deg) if ra.deg < 0 or ra.deg > 360: - raise CfisError('Invalid ra, valid range is 0 < ra < 360 deg') + raise CfisError("Invalid ra, valid range is 0 < ra < 360 deg") return 1 return 0 @@ -691,7 +687,7 @@ def check_dec(dec): """ if dec.deg < -90 or dec.deg > 90: - raise CfisError('Invalid dec, valid range is -90 < dec < 90 deg') + raise CfisError("Invalid dec, valid range is -90 < dec < 90 deg") return 1 return 0 @@ -744,10 +740,7 @@ def get_Angle_arr(str_coord, num=-1, wrap=True, verbose=False): """ angles_mixed = my_string_split( - str_coord, - num=num, - verbose=verbose, - stop=True + str_coord, num=num, verbose=verbose, stop=True ) n = len(angles_mixed) n = int(n / 2) @@ -784,12 +777,13 @@ def read_list(fname, col=None): """ if col is None: - f = open(fname, 'rU', encoding='latin1') + f = open(fname, "rU", encoding="latin1") file_list = [x.strip() for x in f.readlines()] f.close() else: import pandas as pd - dat = pd.read_csv(fname, sep=r'\s+', dtype='string', header=None) + + dat = pd.read_csv(fname, sep=r"\s+", dtype="string", header=None) if col not in dat: col = int(col) file_list = dat[col] @@ -827,17 +821,17 @@ def create_image_list(fname, ra, dec, exp_time=[], valid=[]): nr = len(ra) nd = len(dec) if nf == 0: - raise CfisError('No entries in file name list') + raise CfisError("No entries in file name list") if (nf != nr or nf != nd) and nr != 0 and nd != 0: raise CfisError( - f'Lists fname, ra, dec have not same length ({nf}, {nr}, {nd})' + f"Lists fname, ra, dec have not same length ({nf}, {nr}, {nd})" ) images = [] for i in range(nf): if nr > 0 and nd > 0: - r = Angle(f'{ra[i]} {unitdef}') - d = Angle(f'{dec[i]} {unitdef}') + r = Angle(f"{ra[i]} {unitdef}") + d = Angle(f"{dec[i]} {unitdef}") else: r = None d = None @@ -856,12 +850,7 @@ def create_image_list(fname, ra, dec, exp_time=[], valid=[]): def get_image_list( - inp, - band, - image_type, - col=None, - input_format='full', - verbose=False + inp, band, image_type, col=None, input_format="full", verbose=False ): """Get Image List. @@ -897,29 +886,29 @@ def get_image_list( if os.path.isdir(inp): if col is not None: raise CfisError( - 'Column name (-c option) only valid if input is file' + "Column name (-c option) only valid if input is file" ) # Read file names from directory listing - inp_type = 'dir' - file_list = glob.glob(f'{os.path.abspath(inp)}/*') + inp_type = "dir" + file_list = glob.glob(f"{os.path.abspath(inp)}/*") elif os.path.isfile(inp): - if image_type in ('tile', 'weight', 'weight.fz'): + if image_type in ("tile", "weight", "weight.fz"): # File names in single-column ascii file - inp_type = 'file' + inp_type = "file" file_list = read_list(inp, col=col) - elif image_type == 'exposure': + elif image_type == "exposure": # File names and coordinates in ascii file - inp_type = 'file' + inp_type = "file" dat = ascii.read(inp) if len(dat.keys()) == 3: # File is exposure + coord list # (obtained from get_coord_CFIS_pointings.py) - file_list = dat['Pointing'] - ra_list = dat['R.A.[degree]'] - dec_list = dat['Declination[degree]'] + file_list = dat["Pointing"] + ra_list = dat["R.A.[degree]"] + dec_list = dat["Declination[degree]"] elif len(dat.keys()) == 12: # File is log file, e.g. from # http://www.cfht.hawaii.edu/Science/CFIS-DATA @@ -927,41 +916,35 @@ def get_image_list( # Default file separator is '|' for d in dat: file_list.append(f'd{d["col1"]}p.fits.fz') - ra = re.split(r'\s*', d['col4'])[0] - dec = re.split(r'\s*', d['col4'])[1] - ang = coords.Angle('{ra} hours') + ra = re.split(r"\s*", d["col4"])[0] + dec = re.split(r"\s*", d["col4"])[1] + ang = coords.Angle("{ra} hours") ra_list.append(ang.degree) dec_list.append(dec) - exp_time = int(d['col5']) + exp_time = int(d["col5"]) exp_time_list.append(exp_time) - valid = re.split(r'\s*', d['col11'])[2] + valid = re.split(r"\s*", d["col11"])[2] valid_list.append(valid) else: raise CfisError( - f'Wrong file format, #columns={len(dat.keys())},' - + f' has to be 3 or 12' + f"Wrong file format, #columns={len(dat.keys())}," + + f" has to be 3 or 12" ) else: - raise CfisError(f'Image type \'{image_type}\' not supported') + raise CfisError(f"Image type '{image_type}' not supported") # Create list of objects, coordinate lists can be empty image_list = create_image_list( - file_list, - ra_list, - dec_list, - exp_time=exp_time_list, - valid=valid_list + file_list, ra_list, dec_list, exp_time=exp_time_list, valid=valid_list ) # Filter file list to match CFIS image pattern img_list = [] - if input_format == 'ID_only': - pattern = get_file_pattern(r'\d{3}.\d{3}', band, image_type, ext=False) + if input_format == "ID_only": + pattern = get_file_pattern(r"\d{3}.\d{3}", band, image_type, ext=False) else: pattern = get_file_pattern( - rf'CFIS.\d{{3}}.\d{{3}}\.{band}', - band, - image_type + rf"CFIS.\d{{3}}.\d{{3}}\.{band}", band, image_type ) for img in image_list: @@ -979,9 +962,7 @@ def get_image_list( img_list.append(img) if verbose and len(img_list) > 0: - print( - f'{len(img_list)} image files found in input {inp_type} \'{inp}\'' - ) + print(f"{len(img_list)} image files found in input {inp_type} '{inp}'") return img_list @@ -1013,8 +994,8 @@ def find_image_at_coord( band, image_type, no_cuts=False, - input_format='full', - verbose=False + input_format="full", + verbose=False, ): """Find Image At Coordinates. @@ -1055,16 +1036,12 @@ def find_image_at_coord( ra, dec = get_Angle(coord) if verbose: - print(f'Looking for image at coordinates {ra}, {dec}') + print(f"Looking for image at coordinates {ra}, {dec}") - if image_type in ('tile', 'weight', 'weight.fz'): + if image_type in ("tile", "weight", "weight.fz"): nix, niy = get_tile_number_from_coord(ra, dec, return_type=int) tile_name = get_tile_name( - nix, - niy, - band, - image_type, - input_format=input_format + nix, niy, band, image_type, input_format=input_format ) img_found = [] @@ -1074,9 +1051,9 @@ def find_image_at_coord( ra_c, dec_c = get_tile_coord_from_nixy(nix, niy) if img.ra is not None or img.dec is not None: raise CfisError( - 'Coordinates in image are already ' - + f'set to {img.ra}, {img.rec}, ' - + f'cannot update to {ra_c}, {ra_dec}' + "Coordinates in image are already " + + f"set to {img.ra}, {img.rec}, " + + f"cannot update to {ra_c}, {ra_dec}" ) img.ra = ra_c img.dec = dec_c @@ -1086,12 +1063,12 @@ def find_image_at_coord( pass else: if verbose: - print(f'Tile with numbers ({nix}, {niy}) not found') + print(f"Tile with numbers ({nix}, {niy}) not found") if len(img_found) > 1: - raise CfisError(f'More than one tile ({img_found}) found') + raise CfisError(f"More than one tile ({img_found}) found") - elif image_type == 'exposure': + elif image_type == "exposure": sc_input = coords.SkyCoord(ra, dec) img_found = [] @@ -1112,21 +1089,16 @@ def find_image_at_coord( pass else: if verbose: - print('No exposure image found') + print("No exposure image found") else: - raise CfisError('Only implemented for image_type=tile') + raise CfisError("Only implemented for image_type=tile") return img_found def find_images_in_area( - images, - angles, - band, - image_type, - no_cuts=False, - verbose=False + images, angles, band, image_type, no_cuts=False, verbose=False ): """Fine Images In Area. @@ -1164,22 +1136,22 @@ def find_images_in_area( if angles[1].ra > threesixty: ra_bounds = [ [angles[0].ra, threesixty], - [coords.Angle(0, unitdef), angles[1].ra - threesixty] + [coords.Angle(0, unitdef), angles[1].ra - threesixty], ] else: ra_bounds = [[angles[0].ra, angles[1].ra]] if verbose: print( - 'Looking for all images within rectangle, ' - + f'dec=({angles[0].dec}, {angles[1].dec}), ', - end='' + "Looking for all images within rectangle, " + + f"dec=({angles[0].dec}, {angles[1].dec}), ", + end="", ) for ra_min_max in ra_bounds: - print(f'ra=[({ra_min_max[0]}, {ra_min_max[1]}) ', end='') + print(f"ra=[({ra_min_max[0]}, {ra_min_max[1]}) ", end="") print() - if image_type in ('tile', 'weight', 'weight.fz'): + if image_type in ("tile", "weight", "weight.fz"): for img in images: nix, niy = get_tile_number(img.name) ra, dec = get_tile_coord_from_nixy(nix, niy) @@ -1188,7 +1160,7 @@ def find_images_in_area( within = False # Check whether image is in any of the ra bound pairs - for (ra_min, ra_max) in ra_bounds: + for ra_min, ra_max in ra_bounds: if ra.is_within_bounds(ra_min, ra_max): within = True break @@ -1199,13 +1171,13 @@ def find_images_in_area( found.append(img) - elif image_type == 'exposure': + elif image_type == "exposure": for img in images: if img.dec.is_within_bounds(angles[0].dec, angles[1].dec): within = False # Check whether image is in any of the ra bound pairs - for (ra_min, ra_max) in ra_bounds: + for ra_min, ra_max in ra_bounds: if ra.is_within_bounds(ra_min, ra_max): within = True break @@ -1214,10 +1186,10 @@ def find_images_in_area( found.append(img) else: - raise CfisError(f'Image type \'{image_type}\' not implemented yet') + raise CfisError(f"Image type '{image_type}' not implemented yet") if verbose: - print(f'{len(found)} images found in area') + print(f"{len(found)} images found in area") return found @@ -1235,9 +1207,9 @@ def plot_init(): ax.yaxis.label.set_size(fs) ax.xaxis.label.set_size(fs) - plt.tick_params(axis='both', which='major', labelsize=fs) + plt.tick_params(axis="both", which="major", labelsize=fs) - plt.rcParams.update({'figure.autolayout': True}) + plt.rcParams.update({"figure.autolayout": True}) return ax @@ -1255,7 +1227,7 @@ def plot_area( ax=None, lw=None, save=True, - dxy=0 + dxy=0, ): """Plot Area. @@ -1292,15 +1264,15 @@ def plot_area( """ if outbase is None: - outname = 'plot.pdf' + outname = "plot.pdf" else: - outname = f'{outbase}.pdf' + outname = f"{outbase}.pdf" if not lw: my_lw = 0.1 else: my_lw = lw - color = {'tile': 'b', 'exposure': 'g', 'weight': 'r'} + color = {"tile": "b", "exposure": "g", "weight": "r"} if not ax: ax = plot_init() @@ -1322,16 +1294,16 @@ def plot_area( dy = abs(angles[0].dec - angles[1].dec) dx = getattr(dx, unitdef) dy = getattr(dy, unitdef) - radius = ( - max(dx, dy) / 2 + (size['exposure'] + size['tile']) * np.sqrt(2) + radius = max(dx, dy) / 2 + (size["exposure"] + size["tile"]) * np.sqrt( + 2 ) circle = plt.Circle( (ra_c.deg, dec_c.deg), radius, - color='r', + color="r", fill=False, ) - plt.plot(ra_c, dec_c, 'or', mfc='none', ms=3) + plt.plot(ra_c, dec_c, "or", mfc="none", ms=3) ax.add_artist(circle) else: radius = 0 @@ -1349,24 +1321,24 @@ def plot_area( plt.text( x, y, - f'{nix}.{niy}', + f"{nix}.{niy}", fontsize=3, - horizontalalignment='center', - verticalalignment='center' + horizontalalignment="center", + verticalalignment="center", ) # Image boundary dx = size[image_type] / 2 / cos_dec_c dy = size[image_type] / 2 cx, cy = square_from_centre(x, y, dx, dy, dxy=dxy) - ax.plot(cx, cy, '-', color=c, linewidth=my_lw) + ax.plot(cx, cy, "-", color=c, linewidth=my_lw) if show_area_border: cx, cy = square_from_corners(angles[0], angles[1]) - ax.plot(cx, cy, 'r-.', linewidth=my_lw) + ax.plot(cx, cy, "r-.", linewidth=my_lw) - plt.xlabel('R.A. [degree]') - plt.ylabel('Declination [degree]') + plt.xlabel("R.A. [degree]") + plt.ylabel("Declination [degree]") if outbase is not None: plt.title(outbase) @@ -1385,7 +1357,7 @@ def plot_area( plt.ylim(ym - lim / 2 - border, ym + lim / 2 + border) if save: - print(f'Saving plot to {outname}') + print(f"Saving plot to {outname}") plt.savefig(outname) if interactive: diff --git a/shapepipe/utilities/file_system.py b/shapepipe/utilities/file_system.py index 52f5fd906..b274a2aaf 100644 --- a/shapepipe/utilities/file_system.py +++ b/shapepipe/utilities/file_system.py @@ -37,7 +37,7 @@ def check_dir(dir_name): """ if not isinstance(dir_name, str): raise TypeError( - f'Directory name must be of type string, not {type(dir_name)}' + f"Directory name must be of type string, not {type(dir_name)}" ) return os.path.isdir(dir_name) @@ -67,9 +67,9 @@ def mkdir(dir_name, check_created=True, exist_ok=True): If directory not properly created """ - os.makedirs(dir_name, exist_ok=exist_ok) + os.makedirs(dir_name, exist_ok=True) if check_created and not check_dir(dir_name): raise FileSystemError( - f'Directory \"{dir_name}\" not found after mkdir command.' + f'Directory "{dir_name}" not found after mkdir command.' ) diff --git a/shapepipe/utilities/galaxy.py b/shapepipe/utilities/galaxy.py index eb05c4bc2..40948a8f1 100644 --- a/shapepipe/utilities/galaxy.py +++ b/shapepipe/utilities/galaxy.py @@ -61,32 +61,32 @@ def sigma_to_fwhm(sigma, pixel_scale=1.0): """ if not isinstance(sigma, (np.ndarray, float)): raise TypeError( - f'Sigma must be of type numpy array or float, not {type(sigma)}.' + f"Sigma must be of type numpy array or float, not {type(sigma)}." ) elif isinstance(sigma, np.ndarray) and sigma.dtype != np.float64: raise TypeError( - f'Sigma array values must be of type float, not {sigma.dtype}.' + f"Sigma array values must be of type float, not {sigma.dtype}." ) if not isinstance(pixel_scale, float): raise TypeError( - f'The pixel scale must of type float, not {type(pixel_scale)}.' + f"The pixel scale must of type float, not {type(pixel_scale)}." ) if isinstance(sigma, np.ndarray) and np.any(sigma <= 0.0): raise ValueError( - f'Found {sigma[sigma <=0].size} invalid standard deviation array ' - + 'values, all elements must to be greater than 0.0.' + f"Found {sigma[sigma <=0].size} invalid standard deviation array " + + "values, all elements must to be greater than 0.0." ) elif isinstance(sigma, float) and sigma <= 0.0: raise ValueError( - f'Invalid standard deviation {sigma}, needs to be greater than ' - + '0.0.' + f"Invalid standard deviation {sigma}, needs to be greater than " + + "0.0." ) if pixel_scale <= 0.0: raise ValueError( - f'Invalid pixel scale {pixel_scale}, needs to be greater than 0.0.' + f"Invalid pixel scale {pixel_scale}, needs to be greater than 0.0." ) cst = 2.35482004503 diff --git a/shapepipe/utilities/summary.py b/shapepipe/utilities/summary.py new file mode 100755 index 000000000..201cbcd30 --- /dev/null +++ b/shapepipe/utilities/summary.py @@ -0,0 +1,788 @@ +"""SUMMARY + +Author: Martin Kilbinger + +""" + +import sys +import os +import re +import fnmatch + +import logging + +from collections import Counter + +from tqdm import tqdm + +print("summaary v1.4") + + +def init_par_runtime(list_tile_IDs): + + # Numbers updated at runtime + par_runtime = {} + + par_runtime["n_tile_IDs"] = len(list_tile_IDs) + par_runtime["list_tile_IDs"] = list_tile_IDs + + return par_runtime + + +def update_par_runtime_after_find_exp(par_runtime, all_exposures): + + # Single-exposure images + par_runtime["n_exposures"] = len(all_exposures) + par_runtime["list_exposures"] = all_exposures + + # Single-HDU single exposure images + n_CCD = 40 + par_runtime["n_shdus"] = get_par_runtime(par_runtime, "exposures") * n_CCD + par_runtime["list_shdus"] = get_all_shdus(all_exposures, n_CCD) + + return par_runtime + + +def get_IDs_from_file(path): + """Get IDs From File. + + Return IDs from text file. Removes letters and replaces + dots "." with dashes "-". + + Parameters + ---------- + path: str + input file path + + Returns + -------- + list + IDs + + """ + numbers = [] + with open(path) as f_in: + for line in f_in: + entry = line.rstrip() + number = re.sub("[a-zA-Z]", "", entry) + numbers.append(number) + + return numbers + + +def get_all_exposures(exp_number_file_list, verbose=False): + """Get All Exposures. + + Return all exposure names from a list of text files. + + Parameters + ---------- + exp_number_list: list + input file names + + """ + exposures = set() + for idx, path in enumerate(exp_number_file_list): + exps = get_IDs_from_file(path) + exposures.update(exps) + + return list(exposures) + + +def get_all_shdus(exposures, n_CCD): + """Get All SHDUs. + + Return all single-exposure single-HDU (CCD) IDs. + + Parameters + ---------- + exposures: list + exposure names + n_CCD: int + number of CCDs per exposure + + Returns + -------- + list + single-exposure single-HDU IDs + + """ + shdus = [] + for exposure in exposures: + for idx_CCD in range(n_CCD): + shdus.append(f"{exposure}-{idx_CCD}") + + return shdus + + +def set_as_list(item=None, n=None, default=1): + """Set As List. + + Return input as list. + + Parameters + ----------- + item: str, int, or list, optional + input item(s); default is None, in which + case the return is [1] * n + n: int, optional + number of list items to return, default is None, + in which case the number will be set to 1. If item and + n are not None, n has to be equal to len(item) + default: int, optional + value to return if item is not given; + default is 1 + + Raises + ------- + IndexError + if n != len(item) + + Returns + ------- + list + input item(s) as list + """ + my_n = n or 1 + + if not item: + result = [default] * my_n + elif not isinstance(item, list): + result = [item] * my_n + else: + result = item + if len(item) != my_n: + raise IndexError(f"item has length {len(item)} != {n}") + + return result + + +def check_special_one(module, path): + + with open(path) as f_in: + lines = f_in.readlines() + for line in lines: + entry = line.rstrip() + + if module == "setools_runner": + m = re.search("Nb stars = (\S*)", line) + if m: + value = int(m[1]) + if value < 2: + code = 0 + msg = ( + f"Not enough stars for random split:" + + f" #stars = {value}" + ) + return msg, code + break + m = re.search("Mode computation failed", line) + if m: + code = 1 + msg = "Mode computation of stellar locus failed" + return msg, code + + if module == "psfex_interp_runner": + m = re.search("Key N_EPOCH not found", line) + if m: + code = 2 + msg = "N_EPOCH not in SEx cat, rerun job 16" + return msg, code + + m = re.search( + "ValueError: cannot reshape array of size 0 into shape", + line, + ) + if m: + code = 3 + msg = "found array of size 0" + return msg, code + + + return None, None + + +class job_data(object): + """Job Data. + + Class to handle a job. + + Parameters + ---------- + bit: int + bit-coded job number + run_dir: str or list + run directory(ies) + modules: list + module names + key_expected: int or str + number of expected output files; if str: will be updated + with runtime value + n_mult: int or list, optional + multiplicity of output files, default `None`, in which + case it is set to 1 + pattern: list, optional + if not None, file pattern to match; defafult is `None` + path_main: str, optional + main (left-most) part of output directory, default is "." + path_left: str, optional + left (first) part of output directory, default is "./output" + output_subdirs: str, optional + output subdirectories if not `None`; default is `None` + path_right: str, optional + right (last) part of output subdir suffix if not `None`; + default is `None` + path_output: str, optional + module output path, default is "output" + output_path_missing_IDs: list, optional + output path of missing ID, if `None` (default) will be + given by job bit and module. + special: bool, optional + if True check output file content for special messages; + default is False + verbose: bool, optional + verbose output if True; default is False + + """ + + def __init__( + self, + bit, + run_dir, + modules, + key_expected, + n_mult=None, + pattern=None, + path_main=".", + path_left="output", + output_subdirs=None, + path_right=None, + path_output="output", + output_path_missing_IDs=None, + special=False, + verbose=False, + ): + self._bit = bit + self._run_dir = set_as_list(item=run_dir, n=len(modules)) + self._modules = modules + self._key_expected = set_as_list(item=key_expected, n=len(modules)) + self._n_mult = set_as_list(item=n_mult, n=len(modules)) + self._pattern = set_as_list(item=pattern, n=len(modules), default="") + self._path_main = path_main + self._path_left = path_left + self._output_subdirs = output_subdirs or [""] + self._path_right = set_as_list( + path_right, + len(modules), + default=".", + ) + self._path_output = set_as_list( + path_output, + len(modules), + default="output", + ) + self._output_path_missing_IDs=output_path_missing_IDs + self._special = set_as_list( + special, + len(modules), + default=False, + ) + self._path_right = set_as_list(path_right, len(modules), default=".") + self._output_path_missing_IDs = output_path_missing_IDs + self._verbose = verbose + + def print_intro(self): + """Print Intro. + + Print header line for job statistics. + + """ + logging.info(f" # Job {self._bit}:") + + @classmethod + def print_stats_header(self): + """Print Stats Header. + + Print overall header information for stats output. + + """ + logging.info( + "module expected found" + + " missing uniq_miss fr_found" + ) + logging.info("=" * 100) + + def print_stats( + self, + module, + n_expected, + n_found, + n_special, + n_missing, + idx, + ): + """Print Stats. + + Print output file statistics. + + Parameters + ---------- + module: str + module name + n_expected: int + number of expected files + n_found: int + number of found files + n_special: int + number of special cases + n_missing: int + number of missing files + idx: int + module index + + """ + module_str = module + + if not self._special[idx]: + if n_expected > 0: + fraction_found = n_found / n_expected + else: + fraction_found = 1 + + n_missing_per_mult = n_missing / self._n_mult[idx] + + else: + module_str = f"{module_str} (special)" + n_found = n_special + n_missing = -1 + n_missing_per_mult = -1 + fraction_found = n_found / n_expected + n_expected = -1 + + logging.info( + f"{module_str:30s} {n_expected:9d} {n_found:9d}" + + f" {n_missing:9d}" + + f" {n_missing_per_mult:9.1f} {fraction_found:9.1%}" + ) + + @classmethod + def is_ID_in_str(self, ID, path): + if ID in path: + return True + + @classmethod + def is_not_in_any(self, ID, list_str): + return not any(ID in string for string in list_str) + + @classmethod + def replace_dot_dash(self, numbers): + + results = [re.sub("\.", "-", number) for number in numbers] + + return results + + @classmethod + def replace_dash_dot_if_tile(self, numbers): + + pattern = re.compile(r"(\d{3})-(\d{3})") + results = [pattern.sub(r"\1.\2", number) for number in numbers] + + return results + + @classmethod + def get_unique(self, names): + n_all = len(names) + names_unique = list(set(names)) + n_unique = len(names_unique) + + if n_all != n_unique: + if True: # self._verbose: + logging.warning( + f"{n_all - n_unique} duplicates removed from {n_all} IDs" + ) + + return names_unique + + @classmethod + def write_IDs_to_file(self, output_path, IDs): + """Write IDs to file. + + Write list if image IDs to text file. + + Parameters + ---------- + output_path: str + output file path + IDs: list + image IDs + + """ + IDs_dot = self.replace_dash_dot_if_tile(IDs) + if len(IDs_dot) > 0: + # Write IDs to file + with open(output_path, "w") as f_out: + for ID in IDs_dot: + print(ID, file=f_out) + elif os.path.exists(output_path): + # Remove preivous obsolete ID file + os.unlink(output_path) + + def check_special(self, module, idx): + + messages = {} + + if self._special[idx]: + + # Loop over input file names and paths + for name, path in zip(self._names_in_dir[idx], self._paths_in_dir[idx]): + + # Check if special case is found + msg, code = check_special_one(module, path) + if msg: + # First time occurance: create empty list for this code + if code not in messages: + messages[code] = [msg] + else: + # Append file name, message, and code + messages[code].append(f"{name} {code} {msg}") + + if len(messages) > 0: + # Loop over codes = key in messages dict + for code in messages: + # Create output file for this code + output_path = ( + f"{self._path_main}/summary/special_job_{self._bit}" + + f"_{module}_{code}.txt" + ) + # Write all messages + with open(output_path, "w") as f_out: + for msg in messages[code]: + print(msg, file=f_out) + + # Count all special cases = sum of cases over all codes + n_all = sum([len(messages[code]) for code in messages]) + return n_all + + def output_missing( + self, + module, + idx, + par_runtime=None, + ): + """Output Missing. + + Writes IDs of missing images to disk. + + """ + key_expected = self._key_expected[idx] + names_in_dir = self._names_in_dir[idx] + paths_in_dir = self._paths_in_dir[idx] + n_mult = self._n_mult[idx] + + list_expected = get_par_runtime(par_runtime, key_expected, kind="list") + + # Count image IDs in names that were found earlier + + # Get file name pattern + if module != "split_exp_runner": + pattern = re.compile(r"(?:\d{3}-\d{3}|\d{7}-\d+|\d{7})") + else: + # split_exp_runner: input is exp, output is shdu (images) and exp + # (header); ignore hdu number + pattern = re.compile( + r"(?:\d{3}-\d{3}|\d{7})" + ) + + ## Extract image IDs from names + IDs = [] + for name, path in zip(names_in_dir, paths_in_dir): + + match = pattern.search(name) + if match: + ID = match.group() + IDs.append(ID) + else: + msg = f"No ID found in {name}" + #raise ValueError(msg) + print(f"Warning: msg, continuing") + + + ## Count occurences + ID_counts = Counter(IDs) + + ## Add to missing if ocurence less than n_mult + missing_IDs = [] + for ID in list_expected: + if ID_counts[ID] < n_mult: + missing_IDs.append(ID) + + n_all = len(missing_IDs) + missing_IDs_unique = self.get_unique(missing_IDs) + + if not self._output_path_missing_IDs: + # Default name using bit and module + output_path = ( + f"{self._path_main}/summary/missing_job_{self._bit}" + + f"_{module}.txt" + ) + else: + # User-defined name (e.g. ngmix_runner_X) + output_path = self._output_path_missing_IDs[idx] + self.write_IDs_to_file(output_path, missing_IDs_unique) + + return missing_IDs_unique + + def output_missing_job(self): + output_path = ( + f"{self._path_main}/summary/missing_job_{self._bit}_all.txt" + ) + + missing_IDs_all = set(self._missing_IDs_job) + + self.write_IDs_to_file(output_path, missing_IDs_all) + + @classmethod + def get_last_full_path(self, base_and_subdir, matches): + """Get Last Full Path + + Return full path of last file in list. + + """ + # Sort according to creation time + matches_sorted = sorted( + matches, + key=lambda entry: entry.name, + ) + + # Get most recent one + last = matches_sorted[-1] + + # Get full path + full_path = os.path.join(base_and_subdir, last.name) + + return full_path + + @classmethod + def get_module_output_dir(self, full_path, module, path_output): + """Get Module Output Dir. + + Return output directory name for given module. + + """ + directory = f"{full_path}/{module}/{path_output}" + + return directory + + def get_matches_final(self, directory, idx): + + # Loop over files + # os.path.whether exists is twice faster than try/except + + if os.path.exists(directory): + pattern = f"{self._pattern[idx]}*" + for entry2 in os.scandir(directory): + if ( + entry2.is_file() + and (fnmatch.fnmatch(entry2.name, pattern)) + and entry2.stat().st_size > 0 + ): + # Append matching files + self._names_in_dir[idx].append(entry2.name) + self._paths_in_dir[idx].append( + os.path.join(directory, entry2.name) + ) + + def get_names_in_dir(self, iterable, module, idx): + + # Initialise output file names and paths + self._names_in_dir[idx] = [] + self._paths_in_dir[idx] = [] + + # Loop over subdirs + for jdx, subdir in enumerate(iterable): + base_and_subdir = ( + f"{self._path_main}/" + + f"{self._path_left}/{subdir}/" + + f"{self._path_right[idx]}" + ) + if self._verbose: + print(f"**** base_and_subdir {base_and_subdir}") + + if os.path.isdir(base_and_subdir): + + matches = [] + + # Loop over entries (files and dirs) + with os.scandir(base_and_subdir) as entries: + for entry in entries: + + # Append directory name if matches module + if entry.name.startswith(self._run_dir[idx]): + matches.append(entry) + + # This entry does not match module -> next + if not matches: + continue + + if self._verbose: + print("**** Matching entries: ", end="") + for match in matches: + print(match.name) + + full_path = self.get_last_full_path( + base_and_subdir, + matches, + ) + + # Get module output directory + directory = self.get_module_output_dir( + full_path, + module, + self._path_output[idx], + ) + if self._verbose: + print(f"**** Output dir = {directory}") + + # Find matching file names and paths + self.get_matches_final(directory, idx) + else: + if self._verbose: + print(f"Directory {base_and_subdir} not found") + + def update_subdirs(self, par_runtime): + """Update Subdirs. + + Update subdir names with runtime information if required. + + """ + if not isinstance(self._output_subdirs, list): + self._output_subdirs = get_par_runtime( + par_runtime, self._output_subdirs, kind="list" + ) + + def check_numbers(self, par_runtime=None, indices=None): + """Check Numbers. + + Check output file numbers and IDs. + + Parameters + ---------- + par_runtime : dict, optional + runtime parameter. default is None + indices: list, optional + if not None (default), only check modules corresponding + to indices + + """ + # Update subdirs if not already set as list + self.update_subdirs(par_runtime) + + # Initialise variables + self._names_in_dir = {} + self._paths_in_dir = {} + self._missing_IDs_job = [] + n_missing_job = 0 + + # Loop over modules + for idx, module in enumerate(self._modules): + if indices is not None and idx not in indices: + continue + + if self._verbose: + print(f"** module {module}") + + # Look over subdirs + iterable = self._output_subdirs + if len(iterable) > 1 and self._verbose: + iterable = tqdm(iterable, desc="subdirs", leave=False) + + if self._verbose: + print(f"*** subdirs {self._output_subdirs}") + + # Get output file names and paths + self.get_names_in_dir( + iterable, + module, + idx, + ) + + # If expected is string: Update parameter with runtime value + # and set as integer + if isinstance(self._key_expected[idx], str): + n_expected_base = get_par_runtime( + par_runtime, self._key_expected[idx], kind="n" + ) + else: + n_expected_base = self._key_expected[idx] + + # Get some numbers + n_found = len(self._names_in_dir[idx]) + n_expected = n_expected_base * self._n_mult[idx] + n_missing = n_expected - n_found + + n_special = self.check_special( + module, + idx, + ) + + # Print statistics + self.print_stats( + module, + n_expected, + n_found, + n_special, + n_missing, + idx, + ) + + # Write missing IDs for module to file + if n_missing > 0: + missing_IDs = self.output_missing( + module, + idx, + par_runtime=par_runtime, + ) + n_missing_job += n_missing + self._missing_IDs_job.extend(missing_IDs) + + # Empty line after job + logging.info("") + + # Write missing IDs for entire job to file + # if n_missing_job > 0: + self.output_missing_job() + + +def get_par_runtime(par_runtime, key, kind="n"): + """Get Par RunTime. + + Return runtime parameter value. + + Parameters + ---------- + par_runtime: dict + runtime parameter + key: str + key + + """ + combined_key = f"{kind}_{key}" + + return par_runtime[combined_key] + + +def print_par_runtime(par_runtime, verbose=True): + # Print runtime parameter values + if True: + logging.info("") + logging.info("===========") + logging.info("par_runtime") + logging.info("-----------") + for key, value in par_runtime.items(): + if not key.startswith("list"): + logging.info(f"{key:30s} {value:6d}") + else: + # logging.info(f"{key:30s} {len(value):6d} entries") + pass + logging.info("===========") + logging.info("") diff --git a/xterm-start.sh b/xterm-start.sh new file mode 100755 index 000000000..007a2516f --- /dev/null +++ b/xterm-start.sh @@ -0,0 +1,2 @@ +#!/bin/bash +xterm