fuzzyworld

shadow-zone / commit

Add seismic shadow zone SPA

0ed883872a213ea7b3ee0135464dba62f3e02a9d · Pavel Safronov · 2026-06-11 20:24:25 -0700 · parents 0a81e745efcc

Add seismic shadow zone SPA

TypeScript + Vite single-page app visualising P/S-wave ray tracing
through a parameterised Earth model (PREM-like presets).

- Bouguer's-law ray tracer with inner/outer core, lower/upper mantle
- Shadow zone detection: finds all angular gaps in ray coverage,
  merges nearby zones to reduce visual clutter
- Canvas renderer: concentric velocity-coloured layers, ray paths on
  both sides, shadow zone arcs on the surface rim, canvas legend
- Sidebar controls: preset selector, velocity/radius sliders, wave
  type, ray count, shadow zone summary, collapsible About section
- Hover tooltip over shadow zone arcs shows exact degree range
- ResizeObserver keeps canvas fitted to available space

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
 .gitignore                        |    4 +
 .gitlab-ci.yml                    |   13 +
 package-lock.json                 | 1002 +++++++++++
 package.json                      |   16 +
 scripts/fetch-earthquake-data.mjs |  301 ++++
 src/controls.ts                   |  102 ++
 src/data/chile-2010.json          | 3513 +++++++++++++++++++++++++++++++++++++
 src/data/okhotsk-2013.json        | 2491 ++++++++++++++++++++++++++
 src/data/tohoku-2011.json         | 3513 +++++++++++++++++++++++++++++++++++++
 src/earth.ts                      |  189 ++
 src/earthquakeData.ts             |   58 +
 src/main.ts                       |  165 ++
 src/rayTracer.ts                  |  190 ++
 src/renderer.ts                   |  186 ++
 src/shadowZone.ts                 |   75 +
 src/validator.ts                  |  183 ++
 tsconfig.json                     |   12 +
 vite.config.ts                    |    8 +
 18 files changed, 12021 insertions(+)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..3aee1b3
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+node_modules/
+.playwright-mcp/
+.screenshots/
+.temp/
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000..915efe1
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,13 @@
+image: node:20
+
+pages:
+  stage: deploy
+  script:
+    - npm ci
+    - npm run build
+    - mv dist public
+  artifacts:
+    paths:
+      - public
+  rules:
+    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..b271170
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,1002 @@
+{
+  "name": "shadow-zone",
+  "version": "0.0.1",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "shadow-zone",
+      "version": "0.0.1",
+      "devDependencies": {
+        "typescript": "^5.4.0",
+        "vite": "^5.2.0"
+      }
+    },
+    "node_modules/@esbuild/aix-ppc64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
+      "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "aix"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/android-arm": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
+      "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/android-arm64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
+      "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/android-x64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
+      "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/darwin-arm64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
+      "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/darwin-x64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
+      "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/freebsd-arm64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
+      "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/freebsd-x64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
+      "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-arm": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
+      "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-arm64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
+      "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-ia32": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
+      "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-loong64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
+      "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
+      "cpu": [
+        "loong64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-mips64el": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
+      "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
+      "cpu": [
+        "mips64el"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-ppc64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
+      "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-riscv64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
+      "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-s390x": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
+      "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-x64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
+      "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/netbsd-x64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
+      "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/openbsd-x64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
+      "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/sunos-x64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
+      "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "sunos"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/win32-arm64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
+      "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/win32-ia32": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
+      "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/win32-x64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
+      "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@rollup/rollup-android-arm-eabi": {
+      "version": "4.61.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.61.1.tgz",
+      "integrity": "sha512-JnBB8MdXj45cajvTuO5FmPlvFVJRQgvrz1uSEl3NwqFnReAPGwb8EanbGi4z2nRaqLzjJSv5/JmycoTKlRZxHA==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ]
+    },
+    "node_modules/@rollup/rollup-android-arm64": {
+      "version": "4.61.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.61.1.tgz",
+      "integrity": "sha512-Jx2g7iSjw4AOT0HDPHM9RV3GNjRXwybWtSFZiZAYUTjUwjVrYIwq3kBf+LnhqJlzXFAqTAh2F7IGI+O568exPw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ]
+    },
+    "node_modules/@rollup/rollup-darwin-arm64": {
+      "version": "4.61.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.61.1.tgz",
+      "integrity": "sha512-0F1L/Z3Eqv8mT2n3dCpeO8GcTvHvVqkP5/t6DMsn0KzhYVcg+s7Ncl5DS8qjKYEeio6Az0Gt6nyBORay5qIlCA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/@rollup/rollup-darwin-x64": {
+      "version": "4.61.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.61.1.tgz",
+      "integrity": "sha512-qLttcH871ujY4YcVfUSShhOw+CsoTatYz8gRbHO7Bb92QH059/P0y5do1KMs41fY0BpD2x4AJH/gID0zFiqVKQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/@rollup/rollup-freebsd-arm64": {
+      "version": "4.61.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.61.1.tgz",
+      "integrity": "sha512-fUI4RapGE0Oh3mb8mgfvC1O2nU1RpDZUKnDQm3xB1Ipg7C2wTs5Kstz7G2uWK99a8S2yTMq8/P4uycwNa0nJyw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ]
+    },
+    "node_modules/@rollup/rollup-freebsd-x64": {
+      "version": "4.61.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.61.1.tgz",
+      "integrity": "sha512-H5YrdvJaDtI/U9/emrD4b++xkvp3y/JvOe4rizHbxvkyMfRS/CiRYdji+Pl8D0brEaNFWUh1drQxgAGIl6Xudw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+      "version": "4.61.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.61.1.tgz",
+      "integrity": "sha512-Q8CBCCQtDFrYtXoeUXSrnFXKOnyUhx6bz+SkL6A0E7V8kAiCJ5pamq1WtbfpVGhR5TSpXY6ak3avmDc5fHTyJA==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+      "version": "4.61.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.61.1.tgz",
+      "integrity": "sha512-nwnhk1581l0FBVellGcVCAT0Oi06onEA3WB53sf01VO3I0UPBkMH9sXONYME2K0ovXcNayJfNtHfm6mpJElatQ==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm64-gnu": {
+      "version": "4.61.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.61.1.tgz",
+      "integrity": "sha512-x5Xr49hwt3hdW75UOZm3395YwwzPyauktslv29KpWL/T+vVAzoT3azLcTWv0eMciBNrx+DYjH4paehHoLpPvpg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm64-musl": {
+      "version": "4.61.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.61.1.tgz",
+      "integrity": "sha512-unMS3H73DpaoPyyEVPjGKleM/s0mkmsauTENpw4INQY8y4+IuLNjkueQ5QCtC0D3N38Y38yhAU8OoZ20S2Tm6w==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-loong64-gnu": {
+      "version": "4.61.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.61.1.tgz",
+      "integrity": "sha512-zNZzGRnAhwjFEYmvphJRV5XaQGjs62cCmeYYHUT//NbvEnHauw+I85nGG+SiVg5ld4GX8D1IbKIX+ozITQnhMQ==",
+      "cpu": [
+        "loong64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-loong64-musl": {
+      "version": "4.61.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.61.1.tgz",
+      "integrity": "sha512-LdpWGL8X209B2SIvWjqlc8VZgM6PKfontSerGepuldQmHYrAOtnMCXeJkxXGbC+PPZVOuu5czJo7fNV6aeW8rQ==",
+      "cpu": [
+        "loong64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+      "version": "4.61.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.61.1.tgz",
+      "integrity": "sha512-EC5kTtNaNGOmbMGqar8dvJy6y/hg99GAwjfBz++pxZhQATXGcRjd6c5en5wcbru0vkRmiMGsQKdMJOOf6sza4g==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-ppc64-musl": {
+      "version": "4.61.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.61.1.tgz",
+      "integrity": "sha512-8hiwp6D4acEcNK78I4rP0/XtS1sknWIAMJBPdR4l6zUtyTm5KiTDr5bXmWt4foY7nAN7AThDHgkLIEZOWKbzWw==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+      "version": "4.61.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.61.1.tgz",
+      "integrity": "sha512-10dh/h/BqA7DuMPWSxkR8uks18FRwnwOEqr5zOTEl+NOwP/OMzKX8OFR/Of9xxDA7D5qef1Nzar5WDD2kCCr1g==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-riscv64-musl": {
+      "version": "4.61.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.61.1.tgz",
+      "integrity": "sha512-YKJ5lg35DP17gcAOggnihe+APw9HLyj1Xn7gsmGumBJAUDa6NGXNixJzmkWLhcK9TOuuyQjdamzvJefkO7qHZQ==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-s390x-gnu": {
+      "version": "4.61.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.61.1.tgz",
+      "integrity": "sha512-Mlil5G2Jj6a7B3LWGctg+XPL9vdXYuzCtNXfxOQ0nPjc2m6ueUktocPGH9bnAM0bNRKb/bAWTujUU7IJQdQA+g==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-x64-gnu": {
+      "version": "4.61.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.61.1.tgz",
+      "integrity": "sha512-bVWIOIk6pV01p4CdUbPP7CJ/434z+OooYjDuFcR+44N35YvKUC66G8MGnvcWx5mWKW3g61J+t74l3Kj15Kwn2Q==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-x64-musl": {
+      "version": "4.61.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.61.1.tgz",
+      "integrity": "sha512-qy5pBvZbqNFheBz61R1rzsezjm0J7O2oNGoWtGoY89SZYLUfxAJTBAqDChqAIdB4rCiIbi9nF7yZ83GnNiLwSw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-openbsd-x64": {
+      "version": "4.61.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.61.1.tgz",
+      "integrity": "sha512-E83TXjI4zm0+5f2qO+UOudaCYIhYwpJ5jq6YCZNIZ+6CbfhKrkAGezeiASBL9ElxAxFsRS9ZhESv8mfnj6TKeg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openbsd"
+      ]
+    },
+    "node_modules/@rollup/rollup-openharmony-arm64": {
+      "version": "4.61.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.61.1.tgz",
+      "integrity": "sha512-fbWnKqVkjrJN38vNe3ahkbk6iejS/3b0Nt7EEtPpE6RBacZcGXNKbzfHN3GUUlXOPghUg0j6XUGrtjX9z1sIvA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openharmony"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-arm64-msvc": {
+      "version": "4.61.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.61.1.tgz",
+      "integrity": "sha512-ArMl38iVAbk0New1ogihQNY6iphLi4ZaRsa037gUzv5yeKPY8TD3Dmy4x2RNC1VztU/uqm+G+/RwFrSka3Oy2g==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-ia32-msvc": {
+      "version": "4.61.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.61.1.tgz",
+      "integrity": "sha512-0mYtjHS9ucAbcATycCNK9IGBk/cCe/ma7EmSLGZdsxnOA8cjRIyU04wDpVAD9NiOfLUR9KTxdiO53uOkherqjQ==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-x64-gnu": {
+      "version": "4.61.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.61.1.tgz",
+      "integrity": "sha512-gK1iCEPfpoSG9wfBihXxvBMi8ZfcWffYkEsC/Eih+iFENTaewvNcrEQ69lIOWYO5pePHKLHHO7nq5AILGO/HQQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-x64-msvc": {
+      "version": "4.61.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.61.1.tgz",
+      "integrity": "sha512-X+zaP2x+j4RXGfbp/seSoRHWnPxzApilDszisZxbYH5C/jTxFhCtDNdPGZb9lJyYPs24wGxruPF7Y+sIXt9Gzw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@types/estree": {
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
+      "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/esbuild": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
+      "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
+      "dev": true,
+      "hasInstallScript": true,
+      "license": "MIT",
+      "bin": {
+        "esbuild": "bin/esbuild"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "optionalDependencies": {
+        "@esbuild/aix-ppc64": "0.21.5",
+        "@esbuild/android-arm": "0.21.5",
+        "@esbuild/android-arm64": "0.21.5",
+        "@esbuild/android-x64": "0.21.5",
+        "@esbuild/darwin-arm64": "0.21.5",
+        "@esbuild/darwin-x64": "0.21.5",
+        "@esbuild/freebsd-arm64": "0.21.5",
+        "@esbuild/freebsd-x64": "0.21.5",
+        "@esbuild/linux-arm": "0.21.5",
+        "@esbuild/linux-arm64": "0.21.5",
+        "@esbuild/linux-ia32": "0.21.5",
+        "@esbuild/linux-loong64": "0.21.5",
+        "@esbuild/linux-mips64el": "0.21.5",
+        "@esbuild/linux-ppc64": "0.21.5",
+        "@esbuild/linux-riscv64": "0.21.5",
+        "@esbuild/linux-s390x": "0.21.5",
+        "@esbuild/linux-x64": "0.21.5",
+        "@esbuild/netbsd-x64": "0.21.5",
+        "@esbuild/openbsd-x64": "0.21.5",
+        "@esbuild/sunos-x64": "0.21.5",
+        "@esbuild/win32-arm64": "0.21.5",
+        "@esbuild/win32-ia32": "0.21.5",
+        "@esbuild/win32-x64": "0.21.5"
+      }
+    },
+    "node_modules/fsevents": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+      "dev": true,
+      "hasInstallScript": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+      }
+    },
+    "node_modules/nanoid": {
+      "version": "3.3.12",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz",
+      "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "bin": {
+        "nanoid": "bin/nanoid.cjs"
+      },
+      "engines": {
+        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+      }
+    },
+    "node_modules/picocolors": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+      "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/postcss": {
+      "version": "8.5.15",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz",
+      "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/postcss"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "nanoid": "^3.3.12",
+        "picocolors": "^1.1.1",
+        "source-map-js": "^1.2.1"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      }
+    },
+    "node_modules/rollup": {
+      "version": "4.61.1",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.61.1.tgz",
+      "integrity": "sha512-I4KW6iuRpuu2uHBLraZ1wNZe0DP7lnRha+VJ9tNaYVaVgKhW0aI3h4RYnoRPeql0flHm/Co55b7snEDcOfOJrA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/estree": "1.0.9"
+      },
+      "bin": {
+        "rollup": "dist/bin/rollup"
+      },
+      "engines": {
+        "node": ">=18.0.0",
+        "npm": ">=8.0.0"
+      },
+      "optionalDependencies": {
+        "@rollup/rollup-android-arm-eabi": "4.61.1",
+        "@rollup/rollup-android-arm64": "4.61.1",
+        "@rollup/rollup-darwin-arm64": "4.61.1",
+        "@rollup/rollup-darwin-x64": "4.61.1",
+        "@rollup/rollup-freebsd-arm64": "4.61.1",
+        "@rollup/rollup-freebsd-x64": "4.61.1",
+        "@rollup/rollup-linux-arm-gnueabihf": "4.61.1",
+        "@rollup/rollup-linux-arm-musleabihf": "4.61.1",
+        "@rollup/rollup-linux-arm64-gnu": "4.61.1",
+        "@rollup/rollup-linux-arm64-musl": "4.61.1",
+        "@rollup/rollup-linux-loong64-gnu": "4.61.1",
+        "@rollup/rollup-linux-loong64-musl": "4.61.1",
+        "@rollup/rollup-linux-ppc64-gnu": "4.61.1",
+        "@rollup/rollup-linux-ppc64-musl": "4.61.1",
+        "@rollup/rollup-linux-riscv64-gnu": "4.61.1",
+        "@rollup/rollup-linux-riscv64-musl": "4.61.1",
+        "@rollup/rollup-linux-s390x-gnu": "4.61.1",
+        "@rollup/rollup-linux-x64-gnu": "4.61.1",
+        "@rollup/rollup-linux-x64-musl": "4.61.1",
+        "@rollup/rollup-openbsd-x64": "4.61.1",
+        "@rollup/rollup-openharmony-arm64": "4.61.1",
+        "@rollup/rollup-win32-arm64-msvc": "4.61.1",
+        "@rollup/rollup-win32-ia32-msvc": "4.61.1",
+        "@rollup/rollup-win32-x64-gnu": "4.61.1",
+        "@rollup/rollup-win32-x64-msvc": "4.61.1",
+        "fsevents": "~2.3.2"
+      }
+    },
+    "node_modules/source-map-js": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+      "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/typescript": {
+      "version": "5.9.3",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+      "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "bin": {
+        "tsc": "bin/tsc",
+        "tsserver": "bin/tsserver"
+      },
+      "engines": {
+        "node": ">=14.17"
+      }
+    },
+    "node_modules/vite": {
+      "version": "5.4.21",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz",
+      "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "esbuild": "^0.21.3",
+        "postcss": "^8.4.43",
+        "rollup": "^4.20.0"
+      },
+      "bin": {
+        "vite": "bin/vite.js"
+      },
+      "engines": {
+        "node": "^18.0.0 || >=20.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/vitejs/vite?sponsor=1"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.3"
+      },
+      "peerDependencies": {
+        "@types/node": "^18.0.0 || >=20.0.0",
+        "less": "*",
+        "lightningcss": "^1.21.0",
+        "sass": "*",
+        "sass-embedded": "*",
+        "stylus": "*",
+        "sugarss": "*",
+        "terser": "^5.4.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/node": {
+          "optional": true
+        },
+        "less": {
+          "optional": true
+        },
+        "lightningcss": {
+          "optional": true
+        },
+        "sass": {
+          "optional": true
+        },
+        "sass-embedded": {
+          "optional": true
+        },
+        "stylus": {
+          "optional": true
+        },
+        "sugarss": {
+          "optional": true
+        },
+        "terser": {
+          "optional": true
+        }
+      }
+    }
+  }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..d82570e
--- /dev/null
+++ b/package.json
@@ -0,0 +1,16 @@
+{
+  "name": "shadow-zone",
+  "private": true,
+  "version": "0.0.1",
+  "type": "module",
+  "scripts": {
+    "dev": "vite",
+    "build": "tsc --noEmit && vite build",
+    "preview": "vite preview",
+    "fetch-data": "node scripts/fetch-earthquake-data.mjs"
+  },
+  "devDependencies": {
+    "typescript": "^5.4.0",
+    "vite": "^5.2.0"
+  }
+}
diff --git a/scripts/fetch-earthquake-data.mjs b/scripts/fetch-earthquake-data.mjs
new file mode 100644
index 0000000..761b028
--- /dev/null
+++ b/scripts/fetch-earthquake-data.mjs
@@ -0,0 +1,301 @@
+#!/usr/bin/env node
+/**
+ * Fetch real seismic phase arrival data from public sources and write formatted
+ * JSON into src/data/ for use by the validation module.
+ *
+ * Data source: USGS ComCat (QuakeML product)
+ *   1. GET /fdsnws/event/1/query?format=geojson&eventid=<id>
+ *      → find products['phase-data'][0].contents['quakeml.xml'].url
+ *   2. Parse QuakeML: match <pick> publicIDs with <arrival> pickIDs to get
+ *      station, epicentral distance (degrees), and observed travel time.
+ *
+ * Usage:
+ *   node scripts/fetch-earthquake-data.mjs
+ *   node scripts/fetch-earthquake-data.mjs --event tohoku-2011
+ *   node scripts/fetch-earthquake-data.mjs --max-stations 300
+ *
+ * Writes: src/data/{id}.json
+ */
+
+import { writeFileSync, mkdirSync } from 'fs';
+import { dirname, join } from 'path';
+import { fileURLToPath } from 'url';
+
+const __dirname = dirname(fileURLToPath(import.meta.url));
+const OUT_DIR = join(__dirname, '..', 'src', 'data');
+
+mkdirSync(OUT_DIR, { recursive: true });
+
+// ── CLI args ──────────────────────────────────────────────────────────────────
+const args = process.argv.slice(2);
+const filterEvent = argVal(args, '--event');
+const maxStations = parseInt(argVal(args, '--max-stations') ?? '500', 10);
+
+function argVal(arr, flag) {
+  const i = arr.indexOf(flag);
+  return i !== -1 ? arr[i + 1] : null;
+}
+
+// ── Event registry ────────────────────────────────────────────────────────────
+const EVENTS = [
+  {
+    id: 'tohoku-2011',
+    name: '2011 Tōhoku, Japan (Mw 9.1)',
+    originTime: '2011-03-11T05:46:24Z',
+    latitude: 38.297,
+    longitude: 142.373,
+    depthKm: 29,
+    magnitudeMw: 9.1,
+    usgsId: 'official20110311054624120_30',
+    note: 'Largest recorded earthquake in Japan. Shallow source, excellent global coverage. Clear P shadow zone near 105°–140°.',
+  },
+  {
+    id: 'chile-2010',
+    name: '2010 Maule, Chile (Mw 8.8)',
+    originTime: '2010-02-27T06:34:11Z',
+    latitude: -35.909,
+    longitude: -72.733,
+    depthKm: 22,
+    magnitudeMw: 8.8,
+    usgsId: 'official20100227063411530_30',
+    note: 'Megathrust earthquake, shallow source. Complementary geometry to Tōhoku — stations in shadow zone are different parts of the global network.',
+  },
+  {
+    id: 'okhotsk-2013',
+    name: '2013 Sea of Okhotsk (Mw 8.3, depth 608 km)',
+    originTime: '2013-05-24T05:44:49Z',
+    latitude: 54.874,
+    longitude: 153.281,
+    depthKm: 608,
+    magnitudeMw: 8.3,
+    usgsId: 'usb000h4jh',
+    note: 'Very deep focus earthquake. Rays launch from 608 km depth, altering shadow zone geometry. Good for demonstrating that depth matters in the model.',
+  },
+];
+
+// ── Main ──────────────────────────────────────────────────────────────────────
+const toFetch = filterEvent ? EVENTS.filter(e => e.id === filterEvent) : EVENTS;
+
+if (toFetch.length === 0) {
+  console.error(`Unknown event id: ${filterEvent}`);
+  console.error('Available:', EVENTS.map(e => e.id).join(', '));
+  process.exit(1);
+}
+
+for (const event of toFetch) {
+  console.log(`\n── ${event.id} ──────────────────────────────────`);
+  try {
+    const arrivals = await fetchArrivals(event, maxStations);
+    const dataset = { ...event, arrivals };
+    const outPath = join(OUT_DIR, `${event.id}.json`);
+    writeFileSync(outPath, JSON.stringify(dataset, null, 2));
+    console.log(`✅  Wrote ${arrivals.length} arrivals → ${outPath}`);
+    if (arrivals.length === 0) {
+      console.warn('   ⚠️  No arrivals found — check the usgsId or run with --debug');
+    }
+  } catch (err) {
+    console.error(`❌  Failed: ${err.message}`);
+    if (process.env.DEBUG) console.error(err.stack);
+  }
+}
+
+// ── USGS ComCat + QuakeML parser ──────────────────────────────────────────────
+
+async function fetchArrivals(event, maxStations) {
+  // Step 1: get the QuakeML URL from the event detail
+  const detailUrl =
+    `https://earthquake.usgs.gov/fdsnws/event/1/query?format=geojson&eventid=${event.usgsId}`;
+  console.log(`  Fetching event detail from USGS…`);
+  const detail = await fetchJSON(detailUrl);
+
+  // Search all phase-data product variants for a quakeml.xml content.
+  // 'trump-phase-data' is sometimes present but with empty contents, so we
+  // scan all candidates and take the first that has a real quakeml.xml.
+  const allProducts = [
+    ...(detail?.properties?.products?.['phase-data'] ?? []),
+    ...(detail?.properties?.products?.['trump-phase-data'] ?? []),
+  ];
+
+  if (allProducts.length === 0) {
+    throw new Error('No phase-data product found in ComCat response');
+  }
+
+  let quakemlUrl = null;
+  for (const product of allProducts) {
+    const contents = product?.contents;
+    if (!contents || typeof contents !== 'object' || Array.isArray(contents)) continue;
+    const qml = Object.entries(contents).find(([k]) => k.endsWith('quakeml.xml'));
+    if (qml) {
+      quakemlUrl = qml[1].url;
+      break;
+    }
+  }
+  if (!quakemlUrl) {
+    throw new Error('quakeml.xml not found in any phase-data product');
+  }
+
+  console.log(`  Downloading QuakeML (${quakemlUrl.split('/').slice(-3).join('/')})…`);
+  const xml = await fetchText(quakemlUrl);
+  console.log(`  Parsing (${(xml.length / 1024).toFixed(0)} KB)…`);
+
+  return parseQuakeML(xml, event.originTime, maxStations);
+}
+
+/**
+ * Parse USGS QuakeML to extract P/S travel times.
+ *
+ * QuakeML structure:
+ *   <pick publicID=".../<sta>/<phase>">
+ *     <time><value>ISO8601</value></time>
+ *     <waveformID networkCode="IU" stationCode="ANMO" />
+ *     <phaseHint>P</phaseHint>
+ *   </pick>
+ *
+ *   <arrival publicID="...">
+ *     <pickID>.../<sta>/<phase></pickID>   ← matches pick publicID
+ *     <phase>P</phase>
+ *     <distance>28.14</distance>            ← degrees
+ *   </arrival>
+ *
+ * Travel time = pick.time − origin.time.
+ */
+function parseQuakeML(xml, fallbackOriginTime, maxStations) {
+  // Extract origin time (prefer the first reviewed origin)
+  const originTimeStr = extractOriginTime(xml) ?? fallbackOriginTime;
+  const originMs = new Date(originTimeStr).getTime();
+  if (isNaN(originMs)) throw new Error(`Bad origin time: ${originTimeStr}`);
+  console.log(`  Origin time: ${originTimeStr}`);
+
+  // Build pick map: publicID → { time, network, station, phaseHint }
+  const picks = new Map();
+  for (const block of iterXmlElements(xml, 'pick')) {
+    const pid = extractAttr(block, 'publicID');
+    // <time><value>ISO8601</value></time>  — nested, so use a two-level match
+    const timeStr = extractNestedTag(block, 'time', 'value');
+    const network = extractAttr(block, 'networkCode') ?? '';
+    const station = extractAttr(block, 'stationCode') ?? '';
+    const phase = extractTag(block, 'phaseHint') ?? '';
+
+    if (!pid || !timeStr) continue;
+    const tMs = new Date(timeStr).getTime();
+    if (isNaN(tMs)) continue;
+
+    picks.set(pid, { tMs, network, station, phase });
+  }
+  console.log(`  Parsed ${picks.size} picks`);
+
+  // Process arrivals — each arrival references a pick and adds distance
+  const stationMap = new Map(); // key: net.sta → record
+
+  for (const block of iterXmlElements(xml, 'arrival')) {
+    const pickId = extractTag(block, 'pickID');
+    const phase = extractTag(block, 'phase') ?? '';
+    const distStr = extractTag(block, 'distance');
+
+    if (!pickId || !distStr) continue;
+
+    const distDeg = parseFloat(distStr);
+    if (isNaN(distDeg) || distDeg <= 0 || distDeg > 180) continue;
+
+    const pick = picks.get(pickId);
+    if (!pick) continue;
+
+    // Accept direct P/S phases only (not PP, PKP, PcP, etc.)
+    const isP = /^P[ng]?$/.test(phase);
+    const isS = /^S[ng]?$/.test(phase);
+    if (!isP && !isS) continue;
+
+    const travelSec = (pick.tMs - originMs) / 1000;
+    if (travelSec <= 0 || travelSec > 4000) continue;
+
+    const key = `${pick.network}.${pick.station}`;
+    if (!stationMap.has(key)) {
+      stationMap.set(key, {
+        station: pick.station,
+        network: pick.network,
+        distanceDeg: parseFloat(distDeg.toFixed(2)),
+        pTravelTimeSec: null,
+        sTravelTimeSec: null,
+      });
+    }
+
+    const rec = stationMap.get(key);
+    if (isP && (rec.pTravelTimeSec === null || travelSec < rec.pTravelTimeSec)) {
+      rec.pTravelTimeSec = Math.round(travelSec * 10) / 10;
+    }
+    if (isS && (rec.sTravelTimeSec === null || travelSec < rec.sTravelTimeSec)) {
+      rec.sTravelTimeSec = Math.round(travelSec * 10) / 10;
+    }
+  }
+
+  const result = [...stationMap.values()]
+    .filter(r => r.pTravelTimeSec !== null || r.sTravelTimeSec !== null)
+    .sort((a, b) => a.distanceDeg - b.distanceDeg)
+    .slice(0, maxStations);
+
+  const pCount = result.filter(r => r.pTravelTimeSec !== null).length;
+  const sCount = result.filter(r => r.sTravelTimeSec !== null).length;
+  console.log(`  P: ${pCount}, S: ${sCount}, total stations: ${result.length}`);
+  return result;
+}
+
+// ── Minimal XML helpers (no library dependency) ───────────────────────────────
+
+/** Iterate over all <tagName ...>...</tagName> blocks in XML text. */
+function* iterXmlElements(xml, tagName) {
+  const open = new RegExp(`<${tagName}[\\s>]`, 'g');
+  const close = `</${tagName}>`;
+  let match;
+  while ((match = open.exec(xml)) !== null) {
+    // Rewind 1 to include the '<'
+    const start = match.index;
+    const end = xml.indexOf(close, start);
+    if (end === -1) continue;
+    yield xml.slice(start, end + close.length);
+  }
+}
+
+/**
+ * Extract text of the first <outer><inner>TEXT</inner></outer> nested pair.
+ * Handles the common QuakeML pattern where values are doubly-wrapped.
+ */
+function extractNestedTag(xml, outer, inner) {
+  const re = new RegExp(`<${outer}[^>]*>\\s*<${inner}[^>]*>([^<]+)</${inner}>`);
+  const m = xml.match(re);
+  return m ? m[1].trim() : null;
+}
+
+/** Extract text of the first <tag>TEXT</tag> (no nested tags inside). */
+function extractTag(xml, tag) {
+  const m = xml.match(new RegExp(`<${tag}[^>]*>([^<]+)</${tag}>`));
+  return m ? m[1].trim() : null;
+}
+
+/** Extract a named attribute value from anywhere in the string. */
+function extractAttr(xml, attr) {
+  const m = xml.match(new RegExp(`\\b${attr}="([^"]*)"`));
+  return m ? m[1] : null;
+}
+
+/** Extract the preferred origin time from the first <origin> block. */
+function extractOriginTime(xml) {
+  for (const block of iterXmlElements(xml, 'origin')) {
+    const t = extractNestedTag(block, 'time', 'value');
+    if (t) return t;
+  }
+  return null;
+}
+
+// ── HTTP helpers ──────────────────────────────────────────────────────────────
+
+async function fetchJSON(url) {
+  const res = await fetch(url, { headers: { 'User-Agent': 'shadow-zone-edu/1.0' } });
+  if (!res.ok) throw new Error(`HTTP ${res.status} for ${url}`);
+  return res.json();
+}
+
+async function fetchText(url) {
+  const res = await fetch(url, { headers: { 'User-Agent': 'shadow-zone-edu/1.0' } });
+  if (!res.ok) throw new Error(`HTTP ${res.status} for ${url}`);
+  return res.text();
+}
diff --git a/src/controls.ts b/src/controls.ts
new file mode 100644
index 0000000..45d0e6f
--- /dev/null
+++ b/src/controls.ts
@@ -0,0 +1,102 @@
+import { PRESETS } from './earth';
+import { EARTHQUAKE_DATASETS } from './earthquakeData';
+
+export interface AppState {
+  outerCoreRadius: number;
+  outerCoreVTop: number;
+  outerCoreVBottom: number;
+  innerCoreRadius: number;
+  innerCoreV: number;
+  waveType: 'P' | 'S' | 'both';
+  numRays: number;
+  preset: string;
+  /** Currently selected earthquake dataset id, or '' for none */
+  earthquakeId: string;
+}
+
+function el<T extends HTMLElement>(id: string): T {
+  return document.getElementById(id) as T;
+}
+
+function syncDisplay(inputId: string, displayId: string, decimals = 0) {
+  const input = el<HTMLInputElement>(inputId);
+  const display = el<HTMLSpanElement>(displayId);
+  display.textContent = parseFloat(input.value).toFixed(decimals);
+}
+
+export function initControls(onChange: (state: AppState) => void): AppState {
+  const state: AppState = { ...PRESETS['earth'], earthquakeId: '' };
+
+  // Populate earthquake selector dynamically
+  const eqSelect = el<HTMLSelectElement>('earthquake-select');
+  const noneOpt = document.createElement('option');
+  noneOpt.value = '';
+  noneOpt.textContent = '— None —';
+  eqSelect.appendChild(noneOpt);
+  for (const ds of EARTHQUAKE_DATASETS) {
+    const opt = document.createElement('option');
+    opt.value = ds.id;
+    opt.textContent = ds.name;
+    eqSelect.appendChild(opt);
+  }
+
+  function readState(): AppState {
+    return {
+      outerCoreRadius: parseFloat(el<HTMLInputElement>('outer-core-radius').value),
+      outerCoreVTop: parseFloat(el<HTMLInputElement>('outer-core-v-top').value),
+      outerCoreVBottom: parseFloat(el<HTMLInputElement>('outer-core-v-bottom').value),
+      innerCoreRadius: parseFloat(el<HTMLInputElement>('inner-core-radius').value),
+      innerCoreV: parseFloat(el<HTMLInputElement>('inner-core-v').value),
+      waveType: el<HTMLSelectElement>('wave-type').value as AppState['waveType'],
+      numRays: parseInt(el<HTMLInputElement>('num-rays').value, 10),
+      preset: el<HTMLSelectElement>('preset').value,
+      earthquakeId: el<HTMLSelectElement>('earthquake-select').value,
+    };
+  }
+
+  function applyStateToDOM(s: AppState) {
+    el<HTMLInputElement>('outer-core-radius').value = String(s.outerCoreRadius);
+    el<HTMLInputElement>('outer-core-v-top').value = String(s.outerCoreVTop);
+    el<HTMLInputElement>('outer-core-v-bottom').value = String(s.outerCoreVBottom);
+    el<HTMLInputElement>('inner-core-radius').value = String(s.innerCoreRadius);
+    el<HTMLInputElement>('inner-core-v').value = String(s.innerCoreV);
+    el<HTMLSelectElement>('wave-type').value = s.waveType;
+    el<HTMLInputElement>('num-rays').value = String(s.numRays);
+    el<HTMLSelectElement>('preset').value = s.preset;
+
+    syncDisplay('outer-core-radius', 'outer-core-radius-val', 0);
+    syncDisplay('outer-core-v-top', 'outer-core-v-top-val', 1);
+    syncDisplay('outer-core-v-bottom', 'outer-core-v-bottom-val', 1);
+    syncDisplay('inner-core-radius', 'inner-core-radius-val', 0);
+    syncDisplay('inner-core-v', 'inner-core-v-val', 1);
+    syncDisplay('num-rays', 'num-rays-val', 0);
+  }
+
+  function fire() {
+    const s = readState();
+    Object.assign(state, s);
+    applyStateToDOM(s);
+    onChange(s);
+  }
+
+  // Preset change: load preset values into DOM then fire
+  el('preset').addEventListener('change', () => {
+    const preset = PRESETS[el<HTMLSelectElement>('preset').value];
+    if (preset) {
+      applyStateToDOM(preset);
+      Object.assign(state, preset);
+    }
+    fire();
+  });
+
+  const sliders = ['outer-core-radius', 'outer-core-v-top', 'outer-core-v-bottom',
+    'inner-core-radius', 'inner-core-v', 'num-rays'];
+  for (const id of sliders) {
+    el(id).addEventListener('input', fire);
+  }
+  el('wave-type').addEventListener('change', fire);
+  el('earthquake-select').addEventListener('change', fire);
+
+  applyStateToDOM(state);
+  return state;
+}
diff --git a/src/data/chile-2010.json b/src/data/chile-2010.json
new file mode 100644
index 0000000..ed3d80d
--- /dev/null
+++ b/src/data/chile-2010.json
@@ -0,0 +1,3513 @@
+{
+  "id": "chile-2010",
+  "name": "2010 Maule, Chile (Mw 8.8)",
+  "originTime": "2010-02-27T06:34:11Z",
+  "latitude": -35.909,
+  "longitude": -72.733,
+  "depthKm": 22,
+  "magnitudeMw": 8.8,
+  "usgsId": "official20100227063411530_30",
+  "note": "Megathrust earthquake, shallow source. Complementary geometry to Tōhoku — stations in shadow zone are different parts of the global network.",
+  "arrivals": [
+    {
+      "station": "LNV",
+      "network": "IR",
+      "distanceDeg": 2.48,
+      "pTravelTimeSec": 39.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CACH",
+      "network": "IR",
+      "distanceDeg": 2.75,
+      "pTravelTimeSec": 44.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CHCH",
+      "network": "IR",
+      "distanceDeg": 2.86,
+      "pTravelTimeSec": 46.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TACH",
+      "network": "IR",
+      "distanceDeg": 2.94,
+      "pTravelTimeSec": 46.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SAN",
+      "network": "IR",
+      "distanceDeg": 3.24,
+      "pTravelTimeSec": 51.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FSR",
+      "network": "IR",
+      "distanceDeg": 3.28,
+      "pTravelTimeSec": 53.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CLCH",
+      "network": "IR",
+      "distanceDeg": 3.34,
+      "pTravelTimeSec": 52.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PEL",
+      "network": "IR",
+      "distanceDeg": 3.49,
+      "pTravelTimeSec": 54.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ROCH",
+      "network": "IR",
+      "distanceDeg": 3.51,
+      "pTravelTimeSec": 54.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "VLCH",
+      "network": "IR",
+      "distanceDeg": 3.69,
+      "pTravelTimeSec": 52.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PLCA",
+      "network": "IR",
+      "distanceDeg": 4.96,
+      "pTravelTimeSec": 71.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CFAA",
+      "network": "IR",
+      "distanceDeg": 5.94,
+      "pTravelTimeSec": 86.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FUTA",
+      "network": "IR",
+      "distanceDeg": 7.1,
+      "pTravelTimeSec": 101.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TRQA",
+      "network": "IR",
+      "distanceDeg": 8.94,
+      "pTravelTimeSec": 129.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LVC",
+      "network": "IR",
+      "distanceDeg": 13.9,
+      "pTravelTimeSec": 194.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CPUP",
+      "network": "IR",
+      "distanceDeg": 16.49,
+      "pTravelTimeSec": 225.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "EFI",
+      "network": "IR",
+      "distanceDeg": 18.81,
+      "pTravelTimeSec": 253.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "USHA",
+      "network": "IR",
+      "distanceDeg": 18.96,
+      "pTravelTimeSec": 258.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LPAZ",
+      "network": "IR",
+      "distanceDeg": 20.2,
+      "pTravelTimeSec": 276.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SIV",
+      "network": "IR",
+      "distanceDeg": 22.65,
+      "pTravelTimeSec": 299.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "NNA",
+      "network": "IR",
+      "distanceDeg": 24.29,
+      "pTravelTimeSec": 315.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SAML",
+      "network": "IR",
+      "distanceDeg": 28.46,
+      "pTravelTimeSec": 353.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PMSA",
+      "network": "IR",
+      "distanceDeg": 29.18,
+      "pTravelTimeSec": 357.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ATAH",
+      "network": "IR",
+      "distanceDeg": 29.42,
+      "pTravelTimeSec": 363,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BDFB",
+      "network": "IR",
+      "distanceDeg": 30.13,
+      "pTravelTimeSec": 367.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HOPE",
+      "network": "IR",
+      "distanceDeg": 30.96,
+      "pTravelTimeSec": 373.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RPN",
+      "network": "IR",
+      "distanceDeg": 32.14,
+      "pTravelTimeSec": 386.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "OTAV",
+      "network": "IR",
+      "distanceDeg": 36.54,
+      "pTravelTimeSec": 425.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ROSC",
+      "network": "IR",
+      "distanceDeg": 40.78,
+      "pTravelTimeSec": 461.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SDV",
+      "network": "IR",
+      "distanceDeg": 44.82,
+      "pTravelTimeSec": 491.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RCBR",
+      "network": "IR",
+      "distanceDeg": 45.37,
+      "pTravelTimeSec": 497.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BCIP",
+      "network": "IR",
+      "distanceDeg": 45.52,
+      "pTravelTimeSec": 498.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "JTS",
+      "network": "IR",
+      "distanceDeg": 47.54,
+      "pTravelTimeSec": 514.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "VNA3",
+      "network": "IR",
+      "distanceDeg": 47.68,
+      "pTravelTimeSec": 512.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TRIS",
+      "network": "IR",
+      "distanceDeg": 47.91,
+      "pTravelTimeSec": 518.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "VNA1",
+      "network": "IR",
+      "distanceDeg": 48.02,
+      "pTravelTimeSec": 516,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "VNA2",
+      "network": "IR",
+      "distanceDeg": 48.35,
+      "pTravelTimeSec": 518.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "GRGR",
+      "network": "IR",
+      "distanceDeg": 49.15,
+      "pTravelTimeSec": 525.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PTCN",
+      "network": "IR",
+      "distanceDeg": 49.83,
+      "pTravelTimeSec": 531.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SNAA",
+      "network": "IR",
+      "distanceDeg": 49.9,
+      "pTravelTimeSec": 530,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BBGH",
+      "network": "IR",
+      "distanceDeg": 50.59,
+      "pTravelTimeSec": 538.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FDF",
+      "network": "IR",
+      "distanceDeg": 51.78,
+      "pTravelTimeSec": 544.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "APG",
+      "network": "IR",
+      "distanceDeg": 53.49,
+      "pTravelTimeSec": 559.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ICMP",
+      "network": "IR",
+      "distanceDeg": 54.05,
+      "pTravelTimeSec": 561.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CRPR",
+      "network": "IR",
+      "distanceDeg": 54.11,
+      "pTravelTimeSec": 562.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "QSPA",
+      "network": "IR",
+      "distanceDeg": 54.12,
+      "pTravelTimeSec": 562.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SEUS",
+      "network": "IR",
+      "distanceDeg": 54.14,
+      "pTravelTimeSec": 562.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "OBIP",
+      "network": "IR",
+      "distanceDeg": 54.2,
+      "pTravelTimeSec": 562.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SABA",
+      "network": "IR",
+      "distanceDeg": 54.22,
+      "pTravelTimeSec": 563.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CELP",
+      "network": "IR",
+      "distanceDeg": 54.23,
+      "pTravelTimeSec": 562.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MTDJ",
+      "network": "IR",
+      "distanceDeg": 54.23,
+      "pTravelTimeSec": 564.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CPD",
+      "network": "IR",
+      "distanceDeg": 54.27,
+      "pTravelTimeSec": 563.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LSP",
+      "network": "IR",
+      "distanceDeg": 54.28,
+      "pTravelTimeSec": 563.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MPR",
+      "network": "IR",
+      "distanceDeg": 54.31,
+      "pTravelTimeSec": 563.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HUMP",
+      "network": "IR",
+      "distanceDeg": 54.38,
+      "pTravelTimeSec": 563.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LRS",
+      "network": "IR",
+      "distanceDeg": 54.42,
+      "pTravelTimeSec": 563.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "AOPR",
+      "network": "IR",
+      "distanceDeg": 54.48,
+      "pTravelTimeSec": 564.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CBYP",
+      "network": "IR",
+      "distanceDeg": 54.5,
+      "pTravelTimeSec": 564.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PCDR",
+      "network": "IR",
+      "distanceDeg": 54.5,
+      "pTravelTimeSec": 565,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "AGP",
+      "network": "IR",
+      "distanceDeg": 54.5,
+      "pTravelTimeSec": 570,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ANWB",
+      "network": "IR",
+      "distanceDeg": 54.52,
+      "pTravelTimeSec": 564,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "AGPR",
+      "network": "IR",
+      "distanceDeg": 54.57,
+      "pTravelTimeSec": 564.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SMRT",
+      "network": "IR",
+      "distanceDeg": 54.67,
+      "pTravelTimeSec": 566.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "STVI",
+      "network": "IR",
+      "distanceDeg": 54.69,
+      "pTravelTimeSec": 565.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SDDR",
+      "network": "IR",
+      "distanceDeg": 54.82,
+      "pTravelTimeSec": 565.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SMN1",
+      "network": "IR",
+      "distanceDeg": 55.11,
+      "pTravelTimeSec": 569.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "GTBY",
+      "network": "IR",
+      "distanceDeg": 55.78,
+      "pTravelTimeSec": 574.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "GRTK",
+      "network": "IR",
+      "distanceDeg": 57.34,
+      "pTravelTimeSec": 586.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TEIG",
+      "network": "IR",
+      "distanceDeg": 57.9,
+      "pTravelTimeSec": 589.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ASCN",
+      "network": "IR",
+      "distanceDeg": 60.06,
+      "pTravelTimeSec": 605.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SBA",
+      "network": "IR",
+      "distanceDeg": 60.86,
+      "pTravelTimeSec": 611.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "VNDA",
+      "network": "IR",
+      "distanceDeg": 61.89,
+      "pTravelTimeSec": 620.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SHEL",
+      "network": "IR",
+      "distanceDeg": 62.43,
+      "pTravelTimeSec": 622.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TAOE",
+      "network": "IR",
+      "distanceDeg": 66.47,
+      "pTravelTimeSec": 648.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KVTX",
+      "network": "IR",
+      "distanceDeg": 67.57,
+      "pTravelTimeSec": 655.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TIGA",
+      "network": "IR",
+      "distanceDeg": 67.95,
+      "pTravelTimeSec": 655.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BRAL",
+      "network": "IR",
+      "distanceDeg": 68.09,
+      "pTravelTimeSec": 658.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BBSR",
+      "network": "IR",
+      "distanceDeg": 68.57,
+      "pTravelTimeSec": 660,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SACV",
+      "network": "IR",
+      "distanceDeg": 68.92,
+      "pTravelTimeSec": 663.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RGRS",
+      "network": "IR",
+      "distanceDeg": 69.01,
+      "pTravelTimeSec": 663.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HKT",
+      "network": "IR",
+      "distanceDeg": 69.17,
+      "pTravelTimeSec": 664.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "NHSC",
+      "network": "IR",
+      "distanceDeg": 69.2,
+      "pTravelTimeSec": 664.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PPT",
+      "network": "IR",
+      "distanceDeg": 69.27,
+      "pTravelTimeSec": 666.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "GOGA",
+      "network": "IR",
+      "distanceDeg": 69.87,
+      "pTravelTimeSec": 667.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "VBMS",
+      "network": "IR",
+      "distanceDeg": 69.96,
+      "pTravelTimeSec": 669.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LRAL",
+      "network": "IR",
+      "distanceDeg": 70.05,
+      "pTravelTimeSec": 669.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "NATX",
+      "network": "IR",
+      "distanceDeg": 70.54,
+      "pTravelTimeSec": 673.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "JCT",
+      "network": "IR",
+      "distanceDeg": 70.91,
+      "pTravelTimeSec": 675,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CNNC",
+      "network": "IR",
+      "distanceDeg": 71.15,
+      "pTravelTimeSec": 676.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TX31",
+      "network": "IR",
+      "distanceDeg": 71.25,
+      "pTravelTimeSec": 676.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TXAR",
+      "network": "IR",
+      "distanceDeg": 71.25,
+      "pTravelTimeSec": 677.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KMSC",
+      "network": "IR",
+      "distanceDeg": 71.33,
+      "pTravelTimeSec": 676.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MAW",
+      "network": "IR",
+      "distanceDeg": 71.35,
+      "pTravelTimeSec": 676.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "WHTX",
+      "network": "IR",
+      "distanceDeg": 71.56,
+      "pTravelTimeSec": 678.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "OXF",
+      "network": "IR",
+      "distanceDeg": 71.94,
+      "pTravelTimeSec": 680.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SWET",
+      "network": "IR",
+      "distanceDeg": 72,
+      "pTravelTimeSec": 681.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CPCT",
+      "network": "IR",
+      "distanceDeg": 72.02,
+      "pTravelTimeSec": 683.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TKL",
+      "network": "IR",
+      "distanceDeg": 72.13,
+      "pTravelTimeSec": 681.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ELIM",
+      "network": "IR",
+      "distanceDeg": 72.49,
+      "pTravelTimeSec": 685.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CER",
+      "network": "IR",
+      "distanceDeg": 72.82,
+      "pTravelTimeSec": 687.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "UALR",
+      "network": "IR",
+      "distanceDeg": 72.83,
+      "pTravelTimeSec": 685.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ABTX",
+      "network": "IR",
+      "distanceDeg": 72.83,
+      "pTravelTimeSec": 686.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MIAR",
+      "network": "IR",
+      "distanceDeg": 72.9,
+      "pTravelTimeSec": 686.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TZTN",
+      "network": "IR",
+      "distanceDeg": 72.97,
+      "pTravelTimeSec": 686.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HBAR",
+      "network": "IR",
+      "distanceDeg": 73.2,
+      "pTravelTimeSec": 687.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "WVT",
+      "network": "IR",
+      "distanceDeg": 73.21,
+      "pTravelTimeSec": 687.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HALT",
+      "network": "IR",
+      "distanceDeg": 73.28,
+      "pTravelTimeSec": 688.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "VWCC",
+      "network": "IR",
+      "distanceDeg": 73.29,
+      "pTravelTimeSec": 688.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BLA",
+      "network": "IR",
+      "distanceDeg": 73.3,
+      "pTravelTimeSec": 689.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BBTS",
+      "network": "IR",
+      "distanceDeg": 73.36,
+      "pTravelTimeSec": 690.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KOMG",
+      "network": "IR",
+      "distanceDeg": 73.41,
+      "pTravelTimeSec": 690.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "URVA",
+      "network": "IR",
+      "distanceDeg": 73.45,
+      "pTravelTimeSec": 690.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "JSRW",
+      "network": "IR",
+      "distanceDeg": 73.59,
+      "pTravelTimeSec": 690.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "GLAT",
+      "network": "IR",
+      "distanceDeg": 73.62,
+      "pTravelTimeSec": 691.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PVMO",
+      "network": "IR",
+      "distanceDeg": 73.84,
+      "pTravelTimeSec": 692.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MNTX",
+      "network": "IR",
+      "distanceDeg": 74.02,
+      "pTravelTimeSec": 692.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CBN",
+      "network": "IR",
+      "distanceDeg": 74.07,
+      "pTravelTimeSec": 693.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "GDL2",
+      "network": "IR",
+      "distanceDeg": 74.08,
+      "pTravelTimeSec": 694.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PARMO",
+      "network": "IR",
+      "distanceDeg": 74.09,
+      "pTravelTimeSec": 693.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PBMO",
+      "network": "IR",
+      "distanceDeg": 74.34,
+      "pTravelTimeSec": 694.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SUR",
+      "network": "IR",
+      "distanceDeg": 74.43,
+      "pTravelTimeSec": 696.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CPRX",
+      "network": "IR",
+      "distanceDeg": 74.65,
+      "pTravelTimeSec": 697.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "W34A",
+      "network": "IR",
+      "distanceDeg": 74.68,
+      "pTravelTimeSec": 696.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TUL1",
+      "network": "IR",
+      "distanceDeg": 74.76,
+      "pTravelTimeSec": 697.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "USIN",
+      "network": "IR",
+      "distanceDeg": 74.97,
+      "pTravelTimeSec": 698.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "WCI",
+      "network": "IR",
+      "distanceDeg": 75.01,
+      "pTravelTimeSec": 698.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SIUC",
+      "network": "IR",
+      "distanceDeg": 75.01,
+      "pTravelTimeSec": 698.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MSTX",
+      "network": "IR",
+      "distanceDeg": 75.1,
+      "pTravelTimeSec": 699.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "V34A",
+      "network": "IR",
+      "distanceDeg": 75.17,
+      "pTravelTimeSec": 699.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SDMD",
+      "network": "IR",
+      "distanceDeg": 75.25,
+      "pTravelTimeSec": 700.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RAR",
+      "network": "IR",
+      "distanceDeg": 75.39,
+      "pTravelTimeSec": 702.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "AMTX",
+      "network": "IR",
+      "distanceDeg": 75.57,
+      "pTravelTimeSec": 702.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "121A",
+      "network": "IR",
+      "distanceDeg": 75.71,
+      "pTravelTimeSec": 704.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "U34A",
+      "network": "IR",
+      "distanceDeg": 75.73,
+      "pTravelTimeSec": 703.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "OLIL",
+      "network": "IR",
+      "distanceDeg": 75.8,
+      "pTravelTimeSec": 702,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MVL",
+      "network": "IR",
+      "distanceDeg": 75.81,
+      "pTravelTimeSec": 718.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BLO",
+      "network": "IR",
+      "distanceDeg": 75.97,
+      "pTravelTimeSec": 703.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SLM",
+      "network": "IR",
+      "distanceDeg": 76.09,
+      "pTravelTimeSec": 704.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LIC",
+      "network": "IR",
+      "distanceDeg": 76.11,
+      "pTravelTimeSec": 706.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LUPA",
+      "network": "IR",
+      "distanceDeg": 76.38,
+      "pTravelTimeSec": 718.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BRNJ",
+      "network": "IR",
+      "distanceDeg": 76.44,
+      "pTravelTimeSec": 709.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SSPA",
+      "network": "IR",
+      "distanceDeg": 76.52,
+      "pTravelTimeSec": 707.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DBIC",
+      "network": "IR",
+      "distanceDeg": 76.53,
+      "pTravelTimeSec": 708.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ACSO",
+      "network": "IR",
+      "distanceDeg": 76.54,
+      "pTravelTimeSec": 707,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CPNY",
+      "network": "IR",
+      "distanceDeg": 76.54,
+      "pTravelTimeSec": 708.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BNM",
+      "network": "IR",
+      "distanceDeg": 76.67,
+      "pTravelTimeSec": 709.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PAL",
+      "network": "IR",
+      "distanceDeg": 76.76,
+      "pTravelTimeSec": 718.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TUC",
+      "network": "IR",
+      "distanceDeg": 76.77,
+      "pTravelTimeSec": 709.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LENM",
+      "network": "IR",
+      "distanceDeg": 76.82,
+      "pTravelTimeSec": 710.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LPM",
+      "network": "IR",
+      "distanceDeg": 76.82,
+      "pTravelTimeSec": 710.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ODNJ",
+      "network": "IR",
+      "distanceDeg": 76.85,
+      "pTravelTimeSec": 718.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "UPI",
+      "network": "IR",
+      "distanceDeg": 76.96,
+      "pTravelTimeSec": 711,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "WIN",
+      "network": "IR",
+      "distanceDeg": 77.06,
+      "pTravelTimeSec": 712.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "YLE",
+      "network": "IR",
+      "distanceDeg": 77.06,
+      "pTravelTimeSec": 718.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LAZ",
+      "network": "IR",
+      "distanceDeg": 77.09,
+      "pTravelTimeSec": 712.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SFIN",
+      "network": "IR",
+      "distanceDeg": 77.24,
+      "pTravelTimeSec": 710.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ANMO",
+      "network": "IR",
+      "distanceDeg": 77.32,
+      "pTravelTimeSec": 713.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KSPA",
+      "network": "IR",
+      "distanceDeg": 77.35,
+      "pTravelTimeSec": 728.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "214A",
+      "network": "IR",
+      "distanceDeg": 77.36,
+      "pTravelTimeSec": 713.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BRYW",
+      "network": "IR",
+      "distanceDeg": 77.67,
+      "pTravelTimeSec": 715.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ALLY",
+      "network": "IR",
+      "distanceDeg": 77.68,
+      "pTravelTimeSec": 713.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "GRM",
+      "network": "IR",
+      "distanceDeg": 77.88,
+      "pTravelTimeSec": 715.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CASY",
+      "network": "IR",
+      "distanceDeg": 77.89,
+      "pTravelTimeSec": 713.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KSU1",
+      "network": "IR",
+      "distanceDeg": 77.98,
+      "pTravelTimeSec": 715.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BINY",
+      "network": "IR",
+      "distanceDeg": 78,
+      "pTravelTimeSec": 715.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "QUA2",
+      "network": "IR",
+      "distanceDeg": 78.03,
+      "pTravelTimeSec": 728.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ERPA",
+      "network": "IR",
+      "distanceDeg": 78.13,
+      "pTravelTimeSec": 716,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "WES",
+      "network": "IR",
+      "distanceDeg": 78.14,
+      "pTravelTimeSec": 728.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HRV",
+      "network": "IR",
+      "distanceDeg": 78.26,
+      "pTravelTimeSec": 718.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TRY",
+      "network": "IR",
+      "distanceDeg": 78.48,
+      "pTravelTimeSec": 719.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "AAM",
+      "network": "IR",
+      "distanceDeg": 78.66,
+      "pTravelTimeSec": 718.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HVD",
+      "network": "IR",
+      "distanceDeg": 78.73,
+      "pTravelTimeSec": 721.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "W18A",
+      "network": "IR",
+      "distanceDeg": 78.75,
+      "pTravelTimeSec": 721.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ACCN",
+      "network": "IR",
+      "distanceDeg": 79.13,
+      "pTravelTimeSec": 722.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "GLA",
+      "network": "IR",
+      "distanceDeg": 79.2,
+      "pTravelTimeSec": 723.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FFD",
+      "network": "IR",
+      "distanceDeg": 79.22,
+      "pTravelTimeSec": 738.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TSUM",
+      "network": "IR",
+      "distanceDeg": 79.31,
+      "pTravelTimeSec": 723.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MCQ",
+      "network": "IR",
+      "distanceDeg": 79.34,
+      "pTravelTimeSec": 726.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HNH",
+      "network": "IR",
+      "distanceDeg": 79.45,
+      "pTravelTimeSec": 738.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SDCO",
+      "network": "IR",
+      "distanceDeg": 79.46,
+      "pTravelTimeSec": 724.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KSCO",
+      "network": "IR",
+      "distanceDeg": 79.64,
+      "pTravelTimeSec": 725.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BOSA",
+      "network": "IR",
+      "distanceDeg": 79.71,
+      "pTravelTimeSec": 725.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "NCB",
+      "network": "IR",
+      "distanceDeg": 79.72,
+      "pTravelTimeSec": 724.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MDV",
+      "network": "IR",
+      "distanceDeg": 79.74,
+      "pTravelTimeSec": 725.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BAR",
+      "network": "IR",
+      "distanceDeg": 79.77,
+      "pTravelTimeSec": 726.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "WUAZ",
+      "network": "IR",
+      "distanceDeg": 79.77,
+      "pTravelTimeSec": 726.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SCIA",
+      "network": "IR",
+      "distanceDeg": 79.85,
+      "pTravelTimeSec": 725.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LBNH",
+      "network": "IR",
+      "distanceDeg": 79.99,
+      "pTravelTimeSec": 727.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MVCO",
+      "network": "IR",
+      "distanceDeg": 80.07,
+      "pTravelTimeSec": 728.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "JFWS",
+      "network": "IR",
+      "distanceDeg": 80.24,
+      "pTravelTimeSec": 727.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PTN",
+      "network": "IR",
+      "distanceDeg": 80.34,
+      "pTravelTimeSec": 738.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "WVL",
+      "network": "IR",
+      "distanceDeg": 80.36,
+      "pTravelTimeSec": 738.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LONY",
+      "network": "IR",
+      "distanceDeg": 80.38,
+      "pTravelTimeSec": 728.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PFO",
+      "network": "IR",
+      "distanceDeg": 80.43,
+      "pTravelTimeSec": 730.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BGNE",
+      "network": "IR",
+      "distanceDeg": 80.55,
+      "pTravelTimeSec": 729.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FRNY",
+      "network": "IR",
+      "distanceDeg": 80.58,
+      "pTravelTimeSec": 738.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SWZ",
+      "network": "IR",
+      "distanceDeg": 80.59,
+      "pTravelTimeSec": 730.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "EMMW",
+      "network": "IR",
+      "distanceDeg": 80.61,
+      "pTravelTimeSec": 738.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BFZ",
+      "network": "IR",
+      "distanceDeg": 80.68,
+      "pTravelTimeSec": 738.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ODZ",
+      "network": "IR",
+      "distanceDeg": 80.9,
+      "pTravelTimeSec": 731.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PV01",
+      "network": "IR",
+      "distanceDeg": 80.92,
+      "pTravelTimeSec": 732.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LDFC",
+      "network": "IR",
+      "distanceDeg": 81.02,
+      "pTravelTimeSec": 734,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PV05",
+      "network": "IR",
+      "distanceDeg": 81.07,
+      "pTravelTimeSec": 733.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KHZ",
+      "network": "IR",
+      "distanceDeg": 81.1,
+      "pTravelTimeSec": 732.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SNZO",
+      "network": "IR",
+      "distanceDeg": 81.17,
+      "pTravelTimeSec": 736.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "OGNE",
+      "network": "IR",
+      "distanceDeg": 81.22,
+      "pTravelTimeSec": 733.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SMCO",
+      "network": "IR",
+      "distanceDeg": 81.26,
+      "pTravelTimeSec": 734.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PV04",
+      "network": "IR",
+      "distanceDeg": 81.28,
+      "pTravelTimeSec": 734.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PV10",
+      "network": "IR",
+      "distanceDeg": 81.31,
+      "pTravelTimeSec": 734.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ISCO",
+      "network": "IR",
+      "distanceDeg": 81.34,
+      "pTravelTimeSec": 734.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KSD",
+      "network": "IR",
+      "distanceDeg": 81.5,
+      "pTravelTimeSec": 736.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BKZ",
+      "network": "IR",
+      "distanceDeg": 81.51,
+      "pTravelTimeSec": 748.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SEK",
+      "network": "IR",
+      "distanceDeg": 81.57,
+      "pTravelTimeSec": 734.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "EKU",
+      "network": "IR",
+      "distanceDeg": 81.57,
+      "pTravelTimeSec": 736.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RPZ",
+      "network": "IR",
+      "distanceDeg": 81.58,
+      "pTravelTimeSec": 736.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KNB",
+      "network": "IR",
+      "distanceDeg": 81.65,
+      "pTravelTimeSec": 737.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "WHZ",
+      "network": "IR",
+      "distanceDeg": 81.69,
+      "pTravelTimeSec": 735.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MWC",
+      "network": "IR",
+      "distanceDeg": 81.69,
+      "pTravelTimeSec": 737.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RUDU",
+      "network": "IR",
+      "distanceDeg": 81.71,
+      "pTravelTimeSec": 737.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PASC",
+      "network": "IR",
+      "distanceDeg": 81.71,
+      "pTravelTimeSec": 737.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "URZ",
+      "network": "IR",
+      "distanceDeg": 81.72,
+      "pTravelTimeSec": 737,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BFSD",
+      "network": "IR",
+      "distanceDeg": 81.83,
+      "pTravelTimeSec": 737.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "GSC",
+      "network": "IR",
+      "distanceDeg": 81.98,
+      "pTravelTimeSec": 738.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MMU",
+      "network": "IR",
+      "distanceDeg": 82.04,
+      "pTravelTimeSec": 738.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LBTB",
+      "network": "IR",
+      "distanceDeg": 82.05,
+      "pTravelTimeSec": 737.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PRYS",
+      "network": "IR",
+      "distanceDeg": 82.21,
+      "pTravelTimeSec": 738.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SHPR",
+      "network": "IR",
+      "distanceDeg": 82.23,
+      "pTravelTimeSec": 740,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ICU",
+      "network": "IR",
+      "distanceDeg": 82.23,
+      "pTravelTimeSec": 740.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "OSI",
+      "network": "IR",
+      "distanceDeg": 82.33,
+      "pTravelTimeSec": 740.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CCUT",
+      "network": "IR",
+      "distanceDeg": 82.33,
+      "pTravelTimeSec": 741.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ECSD",
+      "network": "IR",
+      "distanceDeg": 82.35,
+      "pTravelTimeSec": 738.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DCZ",
+      "network": "IR",
+      "distanceDeg": 82.38,
+      "pTravelTimeSec": 743.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KSR",
+      "network": "IR",
+      "distanceDeg": 82.51,
+      "pTravelTimeSec": 740.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SRU",
+      "network": "IR",
+      "distanceDeg": 82.52,
+      "pTravelTimeSec": 740.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PQI",
+      "network": "IR",
+      "distanceDeg": 82.53,
+      "pTravelTimeSec": 748.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "O20A",
+      "network": "IR",
+      "distanceDeg": 82.56,
+      "pTravelTimeSec": 741,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ARUT",
+      "network": "IR",
+      "distanceDeg": 82.57,
+      "pTravelTimeSec": 741.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "OWUT",
+      "network": "IR",
+      "distanceDeg": 82.59,
+      "pTravelTimeSec": 742,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PHWY",
+      "network": "IR",
+      "distanceDeg": 82.63,
+      "pTravelTimeSec": 741.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DWU",
+      "network": "IR",
+      "distanceDeg": 82.65,
+      "pTravelTimeSec": 740.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MSU",
+      "network": "IR",
+      "distanceDeg": 82.66,
+      "pTravelTimeSec": 742.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KLOF",
+      "network": "IR",
+      "distanceDeg": 82.73,
+      "pTravelTimeSec": 742.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ROA",
+      "network": "IR",
+      "distanceDeg": 82.94,
+      "pTravelTimeSec": 743.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SPMN",
+      "network": "IR",
+      "distanceDeg": 82.95,
+      "pTravelTimeSec": 741.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TMUT",
+      "network": "IR",
+      "distanceDeg": 82.95,
+      "pTravelTimeSec": 743.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ISA",
+      "network": "IR",
+      "distanceDeg": 83.06,
+      "pTravelTimeSec": 744.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ARGU",
+      "network": "IR",
+      "distanceDeg": 83.14,
+      "pTravelTimeSec": 744.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "IMU",
+      "network": "IR",
+      "distanceDeg": 83.17,
+      "pTravelTimeSec": 745,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ERPM",
+      "network": "IR",
+      "distanceDeg": 83.19,
+      "pTravelTimeSec": 744.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FLU",
+      "network": "IR",
+      "distanceDeg": 83.4,
+      "pTravelTimeSec": 745.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RWWY",
+      "network": "IR",
+      "distanceDeg": 83.57,
+      "pTravelTimeSec": 758.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SLR",
+      "network": "IR",
+      "distanceDeg": 83.58,
+      "pTravelTimeSec": 746.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BRSD",
+      "network": "IR",
+      "distanceDeg": 83.6,
+      "pTravelTimeSec": 745.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MPU",
+      "network": "IR",
+      "distanceDeg": 83.73,
+      "pTravelTimeSec": 747.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "NLU",
+      "network": "IR",
+      "distanceDeg": 83.85,
+      "pTravelTimeSec": 748,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "WMUT",
+      "network": "IR",
+      "distanceDeg": 83.86,
+      "pTravelTimeSec": 747.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DAU",
+      "network": "IR",
+      "distanceDeg": 83.93,
+      "pTravelTimeSec": 750.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "R11A",
+      "network": "IR",
+      "distanceDeg": 83.95,
+      "pTravelTimeSec": 749,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RAO",
+      "network": "IR",
+      "distanceDeg": 84.15,
+      "pTravelTimeSec": 752.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "JLU",
+      "network": "IR",
+      "distanceDeg": 84.17,
+      "pTravelTimeSec": 749.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "K22A",
+      "network": "IR",
+      "distanceDeg": 84.19,
+      "pTravelTimeSec": 749.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FSU",
+      "network": "IR",
+      "distanceDeg": 84.19,
+      "pTravelTimeSec": 749.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DUG",
+      "network": "IR",
+      "distanceDeg": 84.35,
+      "pTravelTimeSec": 750.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CTU",
+      "network": "IR",
+      "distanceDeg": 84.36,
+      "pTravelTimeSec": 749.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TPH",
+      "network": "IR",
+      "distanceDeg": 84.45,
+      "pTravelTimeSec": 751.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TCUT",
+      "network": "IR",
+      "distanceDeg": 84.6,
+      "pTravelTimeSec": 751.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SAIU",
+      "network": "IR",
+      "distanceDeg": 84.67,
+      "pTravelTimeSec": 751.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FPU",
+      "network": "IR",
+      "distanceDeg": 84.68,
+      "pTravelTimeSec": 751.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RSSD",
+      "network": "IR",
+      "distanceDeg": 84.72,
+      "pTravelTimeSec": 751.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MCU",
+      "network": "IR",
+      "distanceDeg": 84.93,
+      "pTravelTimeSec": 753,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RSUT",
+      "network": "IR",
+      "distanceDeg": 85.05,
+      "pTravelTimeSec": 753.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BGU",
+      "network": "IR",
+      "distanceDeg": 85.06,
+      "pTravelTimeSec": 753.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "GZU",
+      "network": "IR",
+      "distanceDeg": 85.08,
+      "pTravelTimeSec": 753.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SPUT",
+      "network": "IR",
+      "distanceDeg": 85.16,
+      "pTravelTimeSec": 754,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "NV11",
+      "network": "IR",
+      "distanceDeg": 85.16,
+      "pTravelTimeSec": 755.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "EPU",
+      "network": "IR",
+      "distanceDeg": 85.22,
+      "pTravelTimeSec": 754.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "NV01",
+      "network": "IR",
+      "distanceDeg": 85.23,
+      "pTravelTimeSec": 754.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "NVAR",
+      "network": "IR",
+      "distanceDeg": 85.23,
+      "pTravelTimeSec": 755.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BMUT",
+      "network": "IR",
+      "distanceDeg": 85.25,
+      "pTravelTimeSec": 754.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HDU",
+      "network": "IR",
+      "distanceDeg": 85.32,
+      "pTravelTimeSec": 754.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LTU",
+      "network": "IR",
+      "distanceDeg": 85.32,
+      "pTravelTimeSec": 754.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "EYMN",
+      "network": "IR",
+      "distanceDeg": 85.33,
+      "pTravelTimeSec": 753.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PDAR",
+      "network": "IR",
+      "distanceDeg": 85.34,
+      "pTravelTimeSec": 754.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BW06",
+      "network": "IR",
+      "distanceDeg": 85.34,
+      "pTravelTimeSec": 754.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SAO",
+      "network": "IR",
+      "distanceDeg": 85.37,
+      "pTravelTimeSec": 756,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MTUT",
+      "network": "IR",
+      "distanceDeg": 85.5,
+      "pTravelTimeSec": 755.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TOA0",
+      "network": "IR",
+      "distanceDeg": 85.59,
+      "pTravelTimeSec": 756,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TORD",
+      "network": "IR",
+      "distanceDeg": 85.59,
+      "pTravelTimeSec": 756.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BEI",
+      "network": "IR",
+      "distanceDeg": 85.6,
+      "pTravelTimeSec": 756,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HVU",
+      "network": "IR",
+      "distanceDeg": 85.69,
+      "pTravelTimeSec": 756.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ELK",
+      "network": "IR",
+      "distanceDeg": 85.81,
+      "pTravelTimeSec": 757.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "OUZ",
+      "network": "IR",
+      "distanceDeg": 85.84,
+      "pTravelTimeSec": 760.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CMB",
+      "network": "IR",
+      "distanceDeg": 85.88,
+      "pTravelTimeSec": 757.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "AHID",
+      "network": "IR",
+      "distanceDeg": 85.9,
+      "pTravelTimeSec": 757.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DRLN",
+      "network": "IR",
+      "distanceDeg": 86.1,
+      "pTravelTimeSec": 758.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "REDW",
+      "network": "IR",
+      "distanceDeg": 86.33,
+      "pTravelTimeSec": 768.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SNOW",
+      "network": "IR",
+      "distanceDeg": 86.38,
+      "pTravelTimeSec": 768.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BMN",
+      "network": "IR",
+      "distanceDeg": 86.39,
+      "pTravelTimeSec": 759.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LOHW",
+      "network": "IR",
+      "distanceDeg": 86.45,
+      "pTravelTimeSec": 768.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TPAW",
+      "network": "IR",
+      "distanceDeg": 86.47,
+      "pTravelTimeSec": 760.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SAC",
+      "network": "IR",
+      "distanceDeg": 86.49,
+      "pTravelTimeSec": 764.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "AGMN",
+      "network": "IR",
+      "distanceDeg": 86.51,
+      "pTravelTimeSec": 759.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FXWY",
+      "network": "IR",
+      "distanceDeg": 86.63,
+      "pTravelTimeSec": 760.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "XMAS",
+      "network": "IR",
+      "distanceDeg": 86.78,
+      "pTravelTimeSec": 766.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "IMW",
+      "network": "IR",
+      "distanceDeg": 86.82,
+      "pTravelTimeSec": 762.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MSNA",
+      "network": "IR",
+      "distanceDeg": 86.89,
+      "pTravelTimeSec": 761.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FLWY",
+      "network": "IR",
+      "distanceDeg": 86.9,
+      "pTravelTimeSec": 762.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "H17A",
+      "network": "IR",
+      "distanceDeg": 87.12,
+      "pTravelTimeSec": 764.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MCID",
+      "network": "IR",
+      "distanceDeg": 87.16,
+      "pTravelTimeSec": 764.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MOPA",
+      "network": "IR",
+      "distanceDeg": 87.17,
+      "pTravelTimeSec": 765.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LKWY",
+      "network": "IR",
+      "distanceDeg": 87.21,
+      "pTravelTimeSec": 764.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "YFT",
+      "network": "IR",
+      "distanceDeg": 87.26,
+      "pTravelTimeSec": 765.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RLMT",
+      "network": "IR",
+      "distanceDeg": 87.3,
+      "pTravelTimeSec": 764,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "YNR",
+      "network": "IR",
+      "distanceDeg": 87.44,
+      "pTravelTimeSec": 766.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "YPM",
+      "network": "IR",
+      "distanceDeg": 87.45,
+      "pTravelTimeSec": 765.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "YMR",
+      "network": "IR",
+      "distanceDeg": 87.5,
+      "pTravelTimeSec": 766.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "YHH",
+      "network": "IR",
+      "distanceDeg": 87.56,
+      "pTravelTimeSec": 766.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LAO",
+      "network": "IR",
+      "distanceDeg": 87.71,
+      "pTravelTimeSec": 765.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "QLMT",
+      "network": "IR",
+      "distanceDeg": 87.8,
+      "pTravelTimeSec": 767.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HLID",
+      "network": "IR",
+      "distanceDeg": 87.84,
+      "pTravelTimeSec": 767.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HOPS",
+      "network": "IR",
+      "distanceDeg": 87.92,
+      "pTravelTimeSec": 767.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MFID",
+      "network": "IR",
+      "distanceDeg": 88.28,
+      "pTravelTimeSec": 770.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MCMT",
+      "network": "IR",
+      "distanceDeg": 88.32,
+      "pTravelTimeSec": 770.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ULM",
+      "network": "IR",
+      "distanceDeg": 88.36,
+      "pTravelTimeSec": 768.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BOZ",
+      "network": "IR",
+      "distanceDeg": 88.58,
+      "pTravelTimeSec": 770.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "WVOR",
+      "network": "IR",
+      "distanceDeg": 88.64,
+      "pTravelTimeSec": 771.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DLMT",
+      "network": "IR",
+      "distanceDeg": 88.68,
+      "pTravelTimeSec": 778.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KCPM",
+      "network": "IR",
+      "distanceDeg": 88.71,
+      "pTravelTimeSec": 773,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DGMT",
+      "network": "IR",
+      "distanceDeg": 88.72,
+      "pTravelTimeSec": 770.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PAF",
+      "network": "IR",
+      "distanceDeg": 88.82,
+      "pTravelTimeSec": 774.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LCCM",
+      "network": "IR",
+      "distanceDeg": 88.83,
+      "pTravelTimeSec": 772.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "WDC",
+      "network": "IR",
+      "distanceDeg": 88.91,
+      "pTravelTimeSec": 771.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "AFI",
+      "network": "IR",
+      "distanceDeg": 88.92,
+      "pTravelTimeSec": 776.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MOD",
+      "network": "IR",
+      "distanceDeg": 88.94,
+      "pTravelTimeSec": 773.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LRM",
+      "network": "IR",
+      "distanceDeg": 89.02,
+      "pTravelTimeSec": 773.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KMRM",
+      "network": "IR",
+      "distanceDeg": 89.18,
+      "pTravelTimeSec": 776.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LKVW",
+      "network": "IR",
+      "distanceDeg": 89.22,
+      "pTravelTimeSec": 774.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HRY",
+      "network": "IR",
+      "distanceDeg": 89.57,
+      "pTravelTimeSec": 775,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KHMM",
+      "network": "IR",
+      "distanceDeg": 89.7,
+      "pTravelTimeSec": 780.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LSZ",
+      "network": "IR",
+      "distanceDeg": 89.8,
+      "pTravelTimeSec": 778,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "K05A",
+      "network": "IR",
+      "distanceDeg": 89.86,
+      "pTravelTimeSec": 777.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "YBH",
+      "network": "IR",
+      "distanceDeg": 89.89,
+      "pTravelTimeSec": 777.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "EGMT",
+      "network": "IR",
+      "distanceDeg": 90.01,
+      "pTravelTimeSec": 776,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BMO",
+      "network": "IR",
+      "distanceDeg": 90.06,
+      "pTravelTimeSec": 777.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CHMT",
+      "network": "IR",
+      "distanceDeg": 90.25,
+      "pTravelTimeSec": 778.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "I07A",
+      "network": "IR",
+      "distanceDeg": 90.34,
+      "pTravelTimeSec": 779.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MSO",
+      "network": "IR",
+      "distanceDeg": 90.42,
+      "pTravelTimeSec": 778.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SLMT",
+      "network": "IR",
+      "distanceDeg": 90.61,
+      "pTravelTimeSec": 780.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HUMO",
+      "network": "IR",
+      "distanceDeg": 90.7,
+      "pTravelTimeSec": 783.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PINOR",
+      "network": "IR",
+      "distanceDeg": 90.71,
+      "pTravelTimeSec": 781.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SCHQ",
+      "network": "IR",
+      "distanceDeg": 90.74,
+      "pTravelTimeSec": 779.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "F10A",
+      "network": "IR",
+      "distanceDeg": 90.96,
+      "pTravelTimeSec": 781.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KBO",
+      "network": "IR",
+      "distanceDeg": 90.97,
+      "pTravelTimeSec": 783.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SWMT",
+      "network": "IR",
+      "distanceDeg": 91.02,
+      "pTravelTimeSec": 782,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "G08A",
+      "network": "IR",
+      "distanceDeg": 91.1,
+      "pTravelTimeSec": 783,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "JTMT",
+      "network": "IR",
+      "distanceDeg": 91.32,
+      "pTravelTimeSec": 782.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "YBMT",
+      "network": "IR",
+      "distanceDeg": 91.33,
+      "pTravelTimeSec": 783.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KEBM",
+      "network": "IR",
+      "distanceDeg": 91.54,
+      "pTravelTimeSec": 798.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BLMT",
+      "network": "IR",
+      "distanceDeg": 91.58,
+      "pTravelTimeSec": 786.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BSMT",
+      "network": "IR",
+      "distanceDeg": 91.6,
+      "pTravelTimeSec": 784.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CROR",
+      "network": "IR",
+      "distanceDeg": 91.7,
+      "pTravelTimeSec": 786,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "G06A",
+      "network": "IR",
+      "distanceDeg": 91.75,
+      "pTravelTimeSec": 786.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "E09A",
+      "network": "IR",
+      "distanceDeg": 91.76,
+      "pTravelTimeSec": 784.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "H04A",
+      "network": "IR",
+      "distanceDeg": 91.98,
+      "pTravelTimeSec": 785.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BLTW",
+      "network": "IR",
+      "distanceDeg": 92.1,
+      "pTravelTimeSec": 787.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "H2OWA",
+      "network": "IR",
+      "distanceDeg": 92.18,
+      "pTravelTimeSec": 787.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HAWA",
+      "network": "IR",
+      "distanceDeg": 92.22,
+      "pTravelTimeSec": 787.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "WALA",
+      "network": "IR",
+      "distanceDeg": 92.3,
+      "pTravelTimeSec": 787.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SNIWA",
+      "network": "IR",
+      "distanceDeg": 92.33,
+      "pTravelTimeSec": 789.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "WRD",
+      "network": "IR",
+      "distanceDeg": 92.4,
+      "pTravelTimeSec": 789.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "COR",
+      "network": "IR",
+      "distanceDeg": 92.4,
+      "pTravelTimeSec": 790,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "E07A",
+      "network": "IR",
+      "distanceDeg": 92.49,
+      "pTravelTimeSec": 788.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "D08A",
+      "network": "IR",
+      "distanceDeg": 92.52,
+      "pTravelTimeSec": 788.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FHE",
+      "network": "IR",
+      "distanceDeg": 92.66,
+      "pTravelTimeSec": 792,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "OD2",
+      "network": "IR",
+      "distanceDeg": 92.7,
+      "pTravelTimeSec": 789.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "NEW",
+      "network": "IR",
+      "distanceDeg": 92.8,
+      "pTravelTimeSec": 788.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "C09A",
+      "network": "IR",
+      "distanceDeg": 92.87,
+      "pTravelTimeSec": 790.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ASR",
+      "network": "IR",
+      "distanceDeg": 92.89,
+      "pTravelTimeSec": 791,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "EBG",
+      "network": "IR",
+      "distanceDeg": 93.06,
+      "pTravelTimeSec": 792.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "F04A",
+      "network": "IR",
+      "distanceDeg": 93.07,
+      "pTravelTimeSec": 798.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TAU",
+      "network": "IR",
+      "distanceDeg": 93.22,
+      "pTravelTimeSec": 793.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LTY",
+      "network": "IR",
+      "distanceDeg": 93.38,
+      "pTravelTimeSec": 792.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LON",
+      "network": "IR",
+      "distanceDeg": 93.45,
+      "pTravelTimeSec": 792,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "WTV",
+      "network": "IR",
+      "distanceDeg": 93.45,
+      "pTravelTimeSec": 792.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FMW",
+      "network": "IR",
+      "distanceDeg": 93.54,
+      "pTravelTimeSec": 795.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "F03A",
+      "network": "IR",
+      "distanceDeg": 93.56,
+      "pTravelTimeSec": 798.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MDT",
+      "network": "IR",
+      "distanceDeg": 93.69,
+      "pTravelTimeSec": 795.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "B08A",
+      "network": "IR",
+      "distanceDeg": 93.73,
+      "pTravelTimeSec": 793.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "D05A",
+      "network": "IR",
+      "distanceDeg": 93.87,
+      "pTravelTimeSec": 795.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FFC",
+      "network": "IR",
+      "distanceDeg": 93.88,
+      "pTravelTimeSec": 794.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "E03A",
+      "network": "IR",
+      "distanceDeg": 94.04,
+      "pTravelTimeSec": 796.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MSVF",
+      "network": "IR",
+      "distanceDeg": 94.26,
+      "pTravelTimeSec": 802,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TAM",
+      "network": "IR",
+      "distanceDeg": 94.37,
+      "pTravelTimeSec": 798.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "B06A",
+      "network": "IR",
+      "distanceDeg": 94.72,
+      "pTravelTimeSec": 808.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "NLWA",
+      "network": "IR",
+      "distanceDeg": 94.83,
+      "pTravelTimeSec": 799.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CMW",
+      "network": "IR",
+      "distanceDeg": 94.9,
+      "pTravelTimeSec": 799.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "OBC",
+      "network": "IR",
+      "distanceDeg": 95.42,
+      "pTravelTimeSec": 805.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PGC",
+      "network": "IR",
+      "distanceDeg": 95.63,
+      "pTravelTimeSec": 805.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "EDM",
+      "network": "IR",
+      "distanceDeg": 95.65,
+      "pTravelTimeSec": 801.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "POHA",
+      "network": "IR",
+      "distanceDeg": 95.71,
+      "pTravelTimeSec": 818.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FCC",
+      "network": "IR",
+      "distanceDeg": 96.17,
+      "pTravelTimeSec": 804,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MTE",
+      "network": "IR",
+      "distanceDeg": 96.96,
+      "pTravelTimeSec": 810.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PAB",
+      "network": "IR",
+      "distanceDeg": 98.24,
+      "pTravelTimeSec": 815.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ESDC",
+      "network": "IR",
+      "distanceDeg": 98.55,
+      "pTravelTimeSec": 816.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ESLA",
+      "network": "IR",
+      "distanceDeg": 98.55,
+      "pTravelTimeSec": 816.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KIP",
+      "network": "IR",
+      "distanceDeg": 98.56,
+      "pTravelTimeSec": 828.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ES19",
+      "network": "IR",
+      "distanceDeg": 98.6,
+      "pTravelTimeSec": 818.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ABPO",
+      "network": "IR",
+      "distanceDeg": 101.21,
+      "pTravelTimeSec": 838.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ARMA",
+      "network": "IR",
+      "distanceDeg": 101.71,
+      "pTravelTimeSec": 838.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SJPF",
+      "network": "IR",
+      "distanceDeg": 102.31,
+      "pTravelTimeSec": 835.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ETSF",
+      "network": "IR",
+      "distanceDeg": 102.57,
+      "pTravelTimeSec": 836.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "EPF",
+      "network": "IR",
+      "distanceDeg": 103.17,
+      "pTravelTimeSec": 839.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "QUIF",
+      "network": "IR",
+      "distanceDeg": 104.22,
+      "pTravelTimeSec": 843,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ROSF",
+      "network": "IR",
+      "distanceDeg": 104.42,
+      "pTravelTimeSec": 843.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MTLF",
+      "network": "IR",
+      "distanceDeg": 104.46,
+      "pTravelTimeSec": 844.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LFF",
+      "network": "IR",
+      "distanceDeg": 104.55,
+      "pTravelTimeSec": 845,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CRAG",
+      "network": "IR",
+      "distanceDeg": 104.68,
+      "pTravelTimeSec": 858.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MFF",
+      "network": "IR",
+      "distanceDeg": 105.04,
+      "pTravelTimeSec": 847.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RJF",
+      "network": "IR",
+      "distanceDeg": 105.21,
+      "pTravelTimeSec": 847.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CAF",
+      "network": "IR",
+      "distanceDeg": 105.3,
+      "pTravelTimeSec": 848.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "GRR",
+      "network": "IR",
+      "distanceDeg": 105.73,
+      "pTravelTimeSec": 849.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LASF",
+      "network": "IR",
+      "distanceDeg": 105.85,
+      "pTravelTimeSec": 850.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FLN",
+      "network": "IR",
+      "distanceDeg": 106.15,
+      "pTravelTimeSec": 851.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TCF",
+      "network": "IR",
+      "distanceDeg": 106.17,
+      "pTravelTimeSec": 852,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LDF",
+      "network": "IR",
+      "distanceDeg": 106.24,
+      "pTravelTimeSec": 852.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BBOO",
+      "network": "IR",
+      "distanceDeg": 106.27,
+      "pTravelTimeSec": 1118.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SIT",
+      "network": "IR",
+      "distanceDeg": 106.67,
+      "pTravelTimeSec": 1118.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BGF",
+      "network": "IR",
+      "distanceDeg": 106.69,
+      "pTravelTimeSec": 854.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "VSL",
+      "network": "IR",
+      "distanceDeg": 106.71,
+      "pTravelTimeSec": 1118.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "VIVF",
+      "network": "IR",
+      "distanceDeg": 106.77,
+      "pTravelTimeSec": 855.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SMRF",
+      "network": "IR",
+      "distanceDeg": 106.82,
+      "pTravelTimeSec": 856,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HYF",
+      "network": "IR",
+      "distanceDeg": 106.98,
+      "pTravelTimeSec": 855.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LMR",
+      "network": "IR",
+      "distanceDeg": 107.02,
+      "pTravelTimeSec": 856.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "AVF",
+      "network": "IR",
+      "distanceDeg": 107.11,
+      "pTravelTimeSec": 856.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FRF",
+      "network": "IR",
+      "distanceDeg": 107.23,
+      "pTravelTimeSec": 857.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SMF",
+      "network": "IR",
+      "distanceDeg": 107.3,
+      "pTravelTimeSec": 857.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SSF",
+      "network": "IR",
+      "distanceDeg": 107.35,
+      "pTravelTimeSec": 857,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ORIF",
+      "network": "IR",
+      "distanceDeg": 107.52,
+      "pTravelTimeSec": 859.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LOR",
+      "network": "IR",
+      "distanceDeg": 107.66,
+      "pTravelTimeSec": 858.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SBF",
+      "network": "IR",
+      "distanceDeg": 107.87,
+      "pTravelTimeSec": 860.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MBDF",
+      "network": "IR",
+      "distanceDeg": 107.95,
+      "pTravelTimeSec": 861.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "WDD",
+      "network": "IR",
+      "distanceDeg": 108.23,
+      "pTravelTimeSec": 1118.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LPL",
+      "network": "IR",
+      "distanceDeg": 108.35,
+      "pTravelTimeSec": 863.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LPG",
+      "network": "IR",
+      "distanceDeg": 108.35,
+      "pTravelTimeSec": 863.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SFTF",
+      "network": "IR",
+      "distanceDeg": 108.85,
+      "pTravelTimeSec": 863.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MEZF",
+      "network": "IR",
+      "distanceDeg": 109.02,
+      "pTravelTimeSec": 864.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "EDI",
+      "network": "IR",
+      "distanceDeg": 109.09,
+      "pTravelTimeSec": 1118.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BAIF",
+      "network": "IR",
+      "distanceDeg": 109.41,
+      "pTravelTimeSec": 866.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PAGF",
+      "network": "IR",
+      "distanceDeg": 109.42,
+      "pTravelTimeSec": 866.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HAU",
+      "network": "IR",
+      "distanceDeg": 109.48,
+      "pTravelTimeSec": 866.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "GIVF",
+      "network": "IR",
+      "distanceDeg": 109.76,
+      "pTravelTimeSec": 868.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "VLC",
+      "network": "IR",
+      "distanceDeg": 109.83,
+      "pTravelTimeSec": 1118.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CDF",
+      "network": "IR",
+      "distanceDeg": 110.22,
+      "pTravelTimeSec": 870.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CEL",
+      "network": "IR",
+      "distanceDeg": 110.39,
+      "pTravelTimeSec": 1118.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FUORN",
+      "network": "IR",
+      "distanceDeg": 111.02,
+      "pTravelTimeSec": 1118.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TIP",
+      "network": "IR",
+      "distanceDeg": 111.44,
+      "pTravelTimeSec": 879.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "STU",
+      "network": "IR",
+      "distanceDeg": 111.5,
+      "pTravelTimeSec": 1128.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RAGM",
+      "network": "IR",
+      "distanceDeg": 112.56,
+      "pTravelTimeSec": 1128.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FURI",
+      "network": "IR",
+      "distanceDeg": 112.61,
+      "pTravelTimeSec": 1128.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MID",
+      "network": "IR",
+      "distanceDeg": 112.74,
+      "pTravelTimeSec": 1128.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HNR",
+      "network": "IR",
+      "distanceDeg": 112.76,
+      "pTravelTimeSec": 1128.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CTAO",
+      "network": "IR",
+      "distanceDeg": 112.94,
+      "pTravelTimeSec": 1128.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DIV",
+      "network": "IR",
+      "distanceDeg": 113.42,
+      "pTravelTimeSec": 1128.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "VLS",
+      "network": "IR",
+      "distanceDeg": 113.58,
+      "pTravelTimeSec": 888.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KEK",
+      "network": "IR",
+      "distanceDeg": 113.76,
+      "pTravelTimeSec": 889.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PYL",
+      "network": "IR",
+      "distanceDeg": 113.79,
+      "pTravelTimeSec": 888.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "IGT",
+      "network": "IR",
+      "distanceDeg": 114.04,
+      "pTravelTimeSec": 889.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ITM",
+      "network": "IR",
+      "distanceDeg": 114.05,
+      "pTravelTimeSec": 890.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RLS",
+      "network": "IR",
+      "distanceDeg": 114.14,
+      "pTravelTimeSec": 888.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KHC",
+      "network": "IR",
+      "distanceDeg": 114.2,
+      "pTravelTimeSec": 1128.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DSL",
+      "network": "IR",
+      "distanceDeg": 114.38,
+      "pTravelTimeSec": 891,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SEW",
+      "network": "IR",
+      "distanceDeg": 114.43,
+      "pTravelTimeSec": 1128.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "VLX",
+      "network": "IR",
+      "distanceDeg": 114.46,
+      "pTravelTimeSec": 893,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "VLI",
+      "network": "IR",
+      "distanceDeg": 114.55,
+      "pTravelTimeSec": 891.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LAKA",
+      "network": "IR",
+      "distanceDeg": 114.58,
+      "pTravelTimeSec": 892.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KLV",
+      "network": "IR",
+      "distanceDeg": 114.61,
+      "pTravelTimeSec": 893.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "GUR",
+      "network": "IR",
+      "distanceDeg": 114.69,
+      "pTravelTimeSec": 893,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SML",
+      "network": "IR",
+      "distanceDeg": 114.82,
+      "pTravelTimeSec": 1128.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CLL",
+      "network": "IR",
+      "distanceDeg": 114.87,
+      "pTravelTimeSec": 1128.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SII",
+      "network": "IR",
+      "distanceDeg": 114.89,
+      "pTravelTimeSec": 1128.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DSF",
+      "network": "IR",
+      "distanceDeg": 115.04,
+      "pTravelTimeSec": 894.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RC01",
+      "network": "IR",
+      "distanceDeg": 115.05,
+      "pTravelTimeSec": 1128.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DID",
+      "network": "IR",
+      "distanceDeg": 115.13,
+      "pTravelTimeSec": 894.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LTK",
+      "network": "IR",
+      "distanceDeg": 115.17,
+      "pTravelTimeSec": 892.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "AGG",
+      "network": "IR",
+      "distanceDeg": 115.18,
+      "pTravelTimeSec": 895.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "AXAR",
+      "network": "IR",
+      "distanceDeg": 115.29,
+      "pTravelTimeSec": 895.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FNA",
+      "network": "IR",
+      "distanceDeg": 115.32,
+      "pTravelTimeSec": 894.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KZN",
+      "network": "IR",
+      "distanceDeg": 115.38,
+      "pTravelTimeSec": 894.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LKR",
+      "network": "IR",
+      "distanceDeg": 115.48,
+      "pTravelTimeSec": 895.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FYTO",
+      "network": "IR",
+      "distanceDeg": 115.78,
+      "pTravelTimeSec": 897.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LIT",
+      "network": "IR",
+      "distanceDeg": 115.78,
+      "pTravelTimeSec": 898.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SKO",
+      "network": "IR",
+      "distanceDeg": 115.89,
+      "pTravelTimeSec": 897.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "XOR",
+      "network": "IR",
+      "distanceDeg": 115.93,
+      "pTravelTimeSec": 895.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "NEO",
+      "network": "IR",
+      "distanceDeg": 115.93,
+      "pTravelTimeSec": 898.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "GRG",
+      "network": "IR",
+      "distanceDeg": 116.1,
+      "pTravelTimeSec": 899.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ZKR",
+      "network": "IR",
+      "distanceDeg": 116.18,
+      "pTravelTimeSec": 900.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "AOS",
+      "network": "IR",
+      "distanceDeg": 116.33,
+      "pTravelTimeSec": 900.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DPC",
+      "network": "IR",
+      "distanceDeg": 116.33,
+      "pTravelTimeSec": 1128.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "THE",
+      "network": "IR",
+      "distanceDeg": 116.34,
+      "pTravelTimeSec": 900.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "VAY",
+      "network": "IR",
+      "distanceDeg": 116.37,
+      "pTravelTimeSec": 901.1,
+      "sTravelTimeSec": null
+    }
+  ]
+}
\ No newline at end of file
diff --git a/src/data/okhotsk-2013.json b/src/data/okhotsk-2013.json
new file mode 100644
index 0000000..7689683
--- /dev/null
+++ b/src/data/okhotsk-2013.json
@@ -0,0 +1,2491 @@
+{
+  "id": "okhotsk-2013",
+  "name": "2013 Sea of Okhotsk (Mw 8.3, depth 608 km)",
+  "originTime": "2013-05-24T05:44:49Z",
+  "latitude": 54.874,
+  "longitude": 153.281,
+  "depthKm": 608,
+  "magnitudeMw": 8.3,
+  "usgsId": "usb000h4jh",
+  "note": "Very deep focus earthquake. Rays launch from 608 km depth, altering shadow zone geometry. Good for demonstrating that depth matters in the model.",
+  "arrivals": [
+    {
+      "station": "PETK",
+      "network": "IR",
+      "distanceDeg": 3.19,
+      "pTravelTimeSec": 79.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PEA0B",
+      "network": "IR",
+      "distanceDeg": 3.19,
+      "pTravelTimeSec": 79.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PEA1",
+      "network": "IR",
+      "distanceDeg": 3.19,
+      "pTravelTimeSec": 80.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PET",
+      "network": "IR",
+      "distanceDeg": 3.71,
+      "pTravelTimeSec": 82.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MA2",
+      "network": "IR",
+      "distanceDeg": 4.88,
+      "pTravelTimeSec": 93.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "YSS",
+      "network": "IR",
+      "distanceDeg": 10.32,
+      "pTravelTimeSec": 143.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SMY",
+      "network": "IR",
+      "distanceDeg": 12.52,
+      "pTravelTimeSec": 163,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ASAJ",
+      "network": "IR",
+      "distanceDeg": 12.79,
+      "pTravelTimeSec": 165.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KLR",
+      "network": "IR",
+      "distanceDeg": 14.34,
+      "pTravelTimeSec": 182.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ERM",
+      "network": "IR",
+      "distanceDeg": 14.49,
+      "pTravelTimeSec": 179.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BILL",
+      "network": "IR",
+      "distanceDeg": 14.6,
+      "pTravelTimeSec": 183.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "USA0B",
+      "network": "IR",
+      "distanceDeg": 17.37,
+      "pTravelTimeSec": 209.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "USRK",
+      "network": "IR",
+      "distanceDeg": 17.37,
+      "pTravelTimeSec": 210.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KIWB",
+      "network": "IR",
+      "distanceDeg": 17.87,
+      "pTravelTimeSec": 212,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ADK",
+      "network": "IR",
+      "distanceDeg": 18.13,
+      "pTravelTimeSec": 214,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MDJ",
+      "network": "IR",
+      "distanceDeg": 18.32,
+      "pTravelTimeSec": 218.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "GSTR",
+      "network": "IR",
+      "distanceDeg": 18.41,
+      "pTravelTimeSec": 216.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "GAMB",
+      "network": "IR",
+      "distanceDeg": 19.73,
+      "pTravelTimeSec": 230.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TIXI",
+      "network": "IR",
+      "distanceDeg": 19.78,
+      "pTravelTimeSec": 232.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MAJO",
+      "network": "IR",
+      "distanceDeg": 21.05,
+      "pTravelTimeSec": 243.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MJB9",
+      "network": "IR",
+      "distanceDeg": 21.05,
+      "pTravelTimeSec": 243.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HIA",
+      "network": "IR",
+      "distanceDeg": 21.19,
+      "pTravelTimeSec": 244.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "NIKH",
+      "network": "IR",
+      "distanceDeg": 22.23,
+      "pTravelTimeSec": 251.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "INU",
+      "network": "IR",
+      "distanceDeg": 22.53,
+      "pTravelTimeSec": 256.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "UNV",
+      "network": "IR",
+      "distanceDeg": 23.27,
+      "pTravelTimeSec": 260.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "AKUT",
+      "network": "IR",
+      "distanceDeg": 23.58,
+      "pTravelTimeSec": 264,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "JHJ2",
+      "network": "IR",
+      "distanceDeg": 23.73,
+      "pTravelTimeSec": 267.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RDOG",
+      "network": "IR",
+      "distanceDeg": 24.09,
+      "pTravelTimeSec": 270.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KS15",
+      "network": "IR",
+      "distanceDeg": 24.49,
+      "pTravelTimeSec": 275.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KSAR",
+      "network": "IR",
+      "distanceDeg": 24.53,
+      "pTravelTimeSec": 274.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FALS",
+      "network": "IR",
+      "distanceDeg": 24.66,
+      "pTravelTimeSec": 273,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SDPT",
+      "network": "IR",
+      "distanceDeg": 26.11,
+      "pTravelTimeSec": 284.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "JNU",
+      "network": "IR",
+      "distanceDeg": 26.83,
+      "pTravelTimeSec": 294.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CHGN",
+      "network": "IR",
+      "distanceDeg": 26.92,
+      "pTravelTimeSec": 292.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SVW2",
+      "network": "IR",
+      "distanceDeg": 27.19,
+      "pTravelTimeSec": 297.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "IMAR",
+      "network": "IR",
+      "distanceDeg": 27.51,
+      "pTravelTimeSec": 298.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BJT",
+      "network": "IR",
+      "distanceDeg": 28.73,
+      "pTravelTimeSec": 311.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MLY",
+      "network": "IR",
+      "distanceDeg": 28.83,
+      "pTravelTimeSec": 311.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "COLD",
+      "network": "IR",
+      "distanceDeg": 28.87,
+      "pTravelTimeSec": 311.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TOLK",
+      "network": "IR",
+      "distanceDeg": 29.06,
+      "pTravelTimeSec": 313.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TLY",
+      "network": "IR",
+      "distanceDeg": 29.31,
+      "pTravelTimeSec": 317.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "OHAK",
+      "network": "IR",
+      "distanceDeg": 29.32,
+      "pTravelTimeSec": 314.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KDAK",
+      "network": "IR",
+      "distanceDeg": 29.51,
+      "pTravelTimeSec": 316.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SONM",
+      "network": "IR",
+      "distanceDeg": 29.6,
+      "pTravelTimeSec": 319.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BRLK",
+      "network": "IR",
+      "distanceDeg": 29.77,
+      "pTravelTimeSec": 318.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MCK",
+      "network": "IR",
+      "distanceDeg": 29.8,
+      "pTravelTimeSec": 319.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MDM",
+      "network": "IR",
+      "distanceDeg": 29.9,
+      "pTravelTimeSec": 320.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RC01",
+      "network": "IR",
+      "distanceDeg": 29.99,
+      "pTravelTimeSec": 320.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "COLA",
+      "network": "IR",
+      "distanceDeg": 30.07,
+      "pTravelTimeSec": 322.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CCB",
+      "network": "IR",
+      "distanceDeg": 30.13,
+      "pTravelTimeSec": 322.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PMR",
+      "network": "IR",
+      "distanceDeg": 30.15,
+      "pTravelTimeSec": 321.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ILAR",
+      "network": "IR",
+      "distanceDeg": 30.49,
+      "pTravelTimeSec": 325.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HDA",
+      "network": "IR",
+      "distanceDeg": 30.53,
+      "pTravelTimeSec": 325.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DHY",
+      "network": "IR",
+      "distanceDeg": 30.61,
+      "pTravelTimeSec": 326.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SCM",
+      "network": "IR",
+      "distanceDeg": 30.93,
+      "pTravelTimeSec": 329.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "GLI",
+      "network": "IR",
+      "distanceDeg": 31.29,
+      "pTravelTimeSec": 332.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PAX",
+      "network": "IR",
+      "distanceDeg": 31.48,
+      "pTravelTimeSec": 333.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RIDG",
+      "network": "IR",
+      "distanceDeg": 31.58,
+      "pTravelTimeSec": 334.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HARP",
+      "network": "IR",
+      "distanceDeg": 31.77,
+      "pTravelTimeSec": 336.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DIV",
+      "network": "IR",
+      "distanceDeg": 31.83,
+      "pTravelTimeSec": 337.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MENT",
+      "network": "IR",
+      "distanceDeg": 32.27,
+      "pTravelTimeSec": 340.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "EGAK",
+      "network": "IR",
+      "distanceDeg": 32.89,
+      "pTravelTimeSec": 345.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SSE",
+      "network": "IR",
+      "distanceDeg": 32.9,
+      "pTravelTimeSec": 346.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BALM",
+      "network": "IR",
+      "distanceDeg": 33.45,
+      "pTravelTimeSec": 351.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DAWY",
+      "network": "IR",
+      "distanceDeg": 33.82,
+      "pTravelTimeSec": 353.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CTGM",
+      "network": "IR",
+      "distanceDeg": 33.94,
+      "pTravelTimeSec": 355.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "EPYK",
+      "network": "IR",
+      "distanceDeg": 34.27,
+      "pTravelTimeSec": 358,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PCA",
+      "network": "IR",
+      "distanceDeg": 34.75,
+      "pTravelTimeSec": 362.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "INK",
+      "network": "IR",
+      "distanceDeg": 34.96,
+      "pTravelTimeSec": 363.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "WAKE",
+      "network": "IR",
+      "distanceDeg": 36.99,
+      "pTravelTimeSec": 379.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "YOJ",
+      "network": "IR",
+      "distanceDeg": 37.71,
+      "pTravelTimeSec": 383.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BESE",
+      "network": "IR",
+      "distanceDeg": 37.89,
+      "pTravelTimeSec": 388.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TATO",
+      "network": "IR",
+      "distanceDeg": 37.94,
+      "pTravelTimeSec": 388.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "YHNB",
+      "network": "IR",
+      "distanceDeg": 38.25,
+      "pTravelTimeSec": 389.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "JIS",
+      "network": "IR",
+      "distanceDeg": 38.25,
+      "pTravelTimeSec": 391,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ZAA0",
+      "network": "IR",
+      "distanceDeg": 38.36,
+      "pTravelTimeSec": 390.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ZALV",
+      "network": "IR",
+      "distanceDeg": 38.36,
+      "pTravelTimeSec": 391,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ZAA1",
+      "network": "IR",
+      "distanceDeg": 38.36,
+      "pTravelTimeSec": 391.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SIT",
+      "network": "IR",
+      "distanceDeg": 38.37,
+      "pTravelTimeSec": 392,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SARN",
+      "network": "IR",
+      "distanceDeg": 38.55,
+      "pTravelTimeSec": 392,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "NACB",
+      "network": "IR",
+      "distanceDeg": 38.59,
+      "pTravelTimeSec": 390.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ANA2",
+      "network": "IR",
+      "distanceDeg": 38.91,
+      "pTravelTimeSec": 395.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SSLB",
+      "network": "IR",
+      "distanceDeg": 39.21,
+      "pTravelTimeSec": 397.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "YULB",
+      "network": "IR",
+      "distanceDeg": 39.4,
+      "pTravelTimeSec": 398.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ENH",
+      "network": "IR",
+      "distanceDeg": 39.59,
+      "pTravelTimeSec": 401.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TPUB",
+      "network": "IR",
+      "distanceDeg": 39.78,
+      "pTravelTimeSec": 402.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KNMB",
+      "network": "IR",
+      "distanceDeg": 39.8,
+      "pTravelTimeSec": 402.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TWG",
+      "network": "IR",
+      "distanceDeg": 40,
+      "pTravelTimeSec": 403.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "WRAK",
+      "network": "IR",
+      "distanceDeg": 40.11,
+      "pTravelTimeSec": 406.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DLBC",
+      "network": "IR",
+      "distanceDeg": 40.2,
+      "pTravelTimeSec": 407.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "GUMO",
+      "network": "IR",
+      "distanceDeg": 41.72,
+      "pTravelTimeSec": 416.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DIB",
+      "network": "IR",
+      "distanceDeg": 41.75,
+      "pTravelTimeSec": 418.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "WMQ",
+      "network": "IR",
+      "distanceDeg": 42.57,
+      "pTravelTimeSec": 426.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RES",
+      "network": "IR",
+      "distanceDeg": 43.14,
+      "pTravelTimeSec": 429,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KURK",
+      "network": "IR",
+      "distanceDeg": 43.31,
+      "pTravelTimeSec": 431,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HKPS",
+      "network": "IR",
+      "distanceDeg": 43.69,
+      "pTravelTimeSec": 433.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MK31",
+      "network": "IR",
+      "distanceDeg": 43.72,
+      "pTravelTimeSec": 434,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MKAR",
+      "network": "IR",
+      "distanceDeg": 43.72,
+      "pTravelTimeSec": 434,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MAKZ",
+      "network": "IR",
+      "distanceDeg": 43.88,
+      "pTravelTimeSec": 435.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KBS",
+      "network": "IR",
+      "distanceDeg": 44.47,
+      "pTravelTimeSec": 438.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "YKA",
+      "network": "IR",
+      "distanceDeg": 44.54,
+      "pTravelTimeSec": 439.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "YKB5",
+      "network": "IR",
+      "distanceDeg": 44.54,
+      "pTravelTimeSec": 439.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SPA0",
+      "network": "IR",
+      "distanceDeg": 44.62,
+      "pTravelTimeSec": 439.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BRVK",
+      "network": "IR",
+      "distanceDeg": 46.08,
+      "pTravelTimeSec": 451.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KMI",
+      "network": "IR",
+      "distanceDeg": 47.32,
+      "pTravelTimeSec": 461.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KWAJ",
+      "network": "IR",
+      "distanceDeg": 47.38,
+      "pTravelTimeSec": 462.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "JOHN",
+      "network": "IR",
+      "distanceDeg": 47.61,
+      "pTravelTimeSec": 463,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PATS",
+      "network": "IR",
+      "distanceDeg": 48.09,
+      "pTravelTimeSec": 466.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "QIZ",
+      "network": "IR",
+      "distanceDeg": 48.56,
+      "pTravelTimeSec": 471.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PGC",
+      "network": "IR",
+      "distanceDeg": 49.05,
+      "pTravelTimeSec": 473.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ARU",
+      "network": "IR",
+      "distanceDeg": 49.26,
+      "pTravelTimeSec": 474.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KIP",
+      "network": "IR",
+      "distanceDeg": 49.37,
+      "pTravelTimeSec": 476.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LVZ",
+      "network": "IR",
+      "distanceDeg": 49.38,
+      "pTravelTimeSec": 475.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TARG",
+      "network": "IR",
+      "distanceDeg": 49.45,
+      "pTravelTimeSec": 478.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HON",
+      "network": "IR",
+      "distanceDeg": 49.46,
+      "pTravelTimeSec": 476.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KDJ",
+      "network": "IR",
+      "distanceDeg": 49.53,
+      "pTravelTimeSec": 478.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KEV",
+      "network": "IR",
+      "distanceDeg": 49.73,
+      "pTravelTimeSec": 477.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SLVN",
+      "network": "IR",
+      "distanceDeg": 49.74,
+      "pTravelTimeSec": 479.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BOOM",
+      "network": "IR",
+      "distanceDeg": 49.95,
+      "pTravelTimeSec": 482.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "B06A",
+      "network": "IR",
+      "distanceDeg": 50.12,
+      "pTravelTimeSec": 481.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LSA",
+      "network": "IR",
+      "distanceDeg": 50.38,
+      "pTravelTimeSec": 486.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "AAK",
+      "network": "IR",
+      "distanceDeg": 50.64,
+      "pTravelTimeSec": 486.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "NRN",
+      "network": "IR",
+      "distanceDeg": 50.66,
+      "pTravelTimeSec": 487,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LTY",
+      "network": "IR",
+      "distanceDeg": 51.37,
+      "pTravelTimeSec": 489.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "POHA",
+      "network": "IR",
+      "distanceDeg": 52.06,
+      "pTravelTimeSec": 495.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MLH",
+      "network": "IR",
+      "distanceDeg": 52.35,
+      "pTravelTimeSec": 497.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ARSB",
+      "network": "IR",
+      "distanceDeg": 52.36,
+      "pTravelTimeSec": 499.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "AIN",
+      "network": "IR",
+      "distanceDeg": 52.41,
+      "pTravelTimeSec": 498.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "NEW",
+      "network": "IR",
+      "distanceDeg": 52.44,
+      "pTravelTimeSec": 497.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KKAR",
+      "network": "IR",
+      "distanceDeg": 52.45,
+      "pTravelTimeSec": 498.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KK31",
+      "network": "IR",
+      "distanceDeg": 52.45,
+      "pTravelTimeSec": 498.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "UWE",
+      "network": "IR",
+      "distanceDeg": 52.46,
+      "pTravelTimeSec": 498.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SUMG",
+      "network": "IR",
+      "distanceDeg": 52.57,
+      "pTravelTimeSec": 499,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DAV",
+      "network": "IR",
+      "distanceDeg": 52.57,
+      "pTravelTimeSec": 500.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ABKAR",
+      "network": "IR",
+      "distanceDeg": 53.49,
+      "pTravelTimeSec": 505.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PINE",
+      "network": "IR",
+      "distanceDeg": 53.61,
+      "pTravelTimeSec": 508.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KHMM",
+      "network": "IR",
+      "distanceDeg": 54.19,
+      "pTravelTimeSec": 512.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CHTO",
+      "network": "IR",
+      "distanceDeg": 54.47,
+      "pTravelTimeSec": 513.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FFC",
+      "network": "IR",
+      "distanceDeg": 54.6,
+      "pTravelTimeSec": 512.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KMRM",
+      "network": "IR",
+      "distanceDeg": 54.68,
+      "pTravelTimeSec": 515.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CMAR",
+      "network": "IR",
+      "distanceDeg": 54.76,
+      "pTravelTimeSec": 515.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CM31",
+      "network": "IR",
+      "distanceDeg": 54.76,
+      "pTravelTimeSec": 516,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SCO",
+      "network": "IR",
+      "distanceDeg": 54.88,
+      "pTravelTimeSec": 514.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ILULI",
+      "network": "IR",
+      "distanceDeg": 54.93,
+      "pTravelTimeSec": 514.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DLV",
+      "network": "IR",
+      "distanceDeg": 55.28,
+      "pTravelTimeSec": 519.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HOPS",
+      "network": "IR",
+      "distanceDeg": 55.88,
+      "pTravelTimeSec": 523,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FIA1",
+      "network": "IR",
+      "distanceDeg": 56.75,
+      "pTravelTimeSec": 526.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FINES",
+      "network": "IR",
+      "distanceDeg": 56.75,
+      "pTravelTimeSec": 527.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FIA0",
+      "network": "IR",
+      "distanceDeg": 56.75,
+      "pTravelTimeSec": 527.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MANU",
+      "network": "IR",
+      "distanceDeg": 56.95,
+      "pTravelTimeSec": 530,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MCMT",
+      "network": "IR",
+      "distanceDeg": 56.95,
+      "pTravelTimeSec": 530.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SFJD",
+      "network": "IR",
+      "distanceDeg": 57.12,
+      "pTravelTimeSec": 528.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RUBR",
+      "network": "IR",
+      "distanceDeg": 57.41,
+      "pTravelTimeSec": 533.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "NIL",
+      "network": "IR",
+      "distanceDeg": 57.71,
+      "pTravelTimeSec": 535.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TNTI",
+      "network": "IR",
+      "distanceDeg": 57.94,
+      "pTravelTimeSec": 536.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "YMR",
+      "network": "IR",
+      "distanceDeg": 57.99,
+      "pTravelTimeSec": 538.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "OBN",
+      "network": "IR",
+      "distanceDeg": 58.72,
+      "pTravelTimeSec": 541,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MOOW",
+      "network": "IR",
+      "distanceDeg": 58.77,
+      "pTravelTimeSec": 543.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "NVAR",
+      "network": "IR",
+      "distanceDeg": 58.85,
+      "pTravelTimeSec": 542.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "NV01",
+      "network": "IR",
+      "distanceDeg": 58.85,
+      "pTravelTimeSec": 543.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RABL",
+      "network": "IR",
+      "distanceDeg": 58.88,
+      "pTravelTimeSec": 542.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "REDW",
+      "network": "IR",
+      "distanceDeg": 59.01,
+      "pTravelTimeSec": 544.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KBL",
+      "network": "IR",
+      "distanceDeg": 59.4,
+      "pTravelTimeSec": 545.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PDAR",
+      "network": "IR",
+      "distanceDeg": 60.08,
+      "pTravelTimeSec": 550.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BW06",
+      "network": "IR",
+      "distanceDeg": 60.08,
+      "pTravelTimeSec": 550.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PD31",
+      "network": "IR",
+      "distanceDeg": 60.08,
+      "pTravelTimeSec": 551.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FAKI",
+      "network": "IR",
+      "distanceDeg": 60.17,
+      "pTravelTimeSec": 550.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "R11A",
+      "network": "IR",
+      "distanceDeg": 60.34,
+      "pTravelTimeSec": 552.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "NC303",
+      "network": "IR",
+      "distanceDeg": 60.36,
+      "pTravelTimeSec": 551.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DUG",
+      "network": "IR",
+      "distanceDeg": 60.39,
+      "pTravelTimeSec": 553.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TCUT",
+      "network": "IR",
+      "distanceDeg": 60.41,
+      "pTravelTimeSec": 553.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "NB201",
+      "network": "IR",
+      "distanceDeg": 60.54,
+      "pTravelTimeSec": 553.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ISA",
+      "network": "IR",
+      "distanceDeg": 60.81,
+      "pTravelTimeSec": 555.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DAC",
+      "network": "IR",
+      "distanceDeg": 60.82,
+      "pTravelTimeSec": 558.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LUWI",
+      "network": "IR",
+      "distanceDeg": 61.1,
+      "pTravelTimeSec": 555.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RSSD",
+      "network": "IR",
+      "distanceDeg": 61.67,
+      "pTravelTimeSec": 561.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SBUM",
+      "network": "IR",
+      "distanceDeg": 61.95,
+      "pTravelTimeSec": 564.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "AGMN",
+      "network": "IR",
+      "distanceDeg": 61.97,
+      "pTravelTimeSec": 561.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "GSC",
+      "network": "IR",
+      "distanceDeg": 61.98,
+      "pTravelTimeSec": 563.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PASC",
+      "network": "IR",
+      "distanceDeg": 62.09,
+      "pTravelTimeSec": 563.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KONO",
+      "network": "IR",
+      "distanceDeg": 62.16,
+      "pTravelTimeSec": 563.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "IVI",
+      "network": "IR",
+      "distanceDeg": 63.01,
+      "pTravelTimeSec": 568.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PHWY",
+      "network": "IR",
+      "distanceDeg": 63.18,
+      "pTravelTimeSec": 570.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PFO",
+      "network": "IR",
+      "distanceDeg": 63.45,
+      "pTravelTimeSec": 572.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PV09",
+      "network": "IR",
+      "distanceDeg": 63.53,
+      "pTravelTimeSec": 573.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SUW",
+      "network": "IR",
+      "distanceDeg": 63.92,
+      "pTravelTimeSec": 574.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BAR",
+      "network": "IR",
+      "distanceDeg": 64.04,
+      "pTravelTimeSec": 576.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PMG",
+      "network": "IR",
+      "distanceDeg": 64.26,
+      "pTravelTimeSec": 577.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HNR",
+      "network": "IR",
+      "distanceDeg": 64.34,
+      "pTravelTimeSec": 577.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KNTN",
+      "network": "IR",
+      "distanceDeg": 64.34,
+      "pTravelTimeSec": 578.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MVCO",
+      "network": "IR",
+      "distanceDeg": 64.84,
+      "pTravelTimeSec": 581.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KIEV",
+      "network": "IR",
+      "distanceDeg": 64.88,
+      "pTravelTimeSec": 580,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "AKBB",
+      "network": "IR",
+      "distanceDeg": 64.88,
+      "pTravelTimeSec": 580.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KULM",
+      "network": "IR",
+      "distanceDeg": 64.89,
+      "pTravelTimeSec": 581.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KIV",
+      "network": "IR",
+      "distanceDeg": 65.28,
+      "pTravelTimeSec": 584.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ECSD",
+      "network": "IR",
+      "distanceDeg": 65.3,
+      "pTravelTimeSec": 583.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "IPM",
+      "network": "IR",
+      "distanceDeg": 65.39,
+      "pTravelTimeSec": 584.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "113A",
+      "network": "IR",
+      "distanceDeg": 65.54,
+      "pTravelTimeSec": 586,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SCHQ",
+      "network": "IR",
+      "distanceDeg": 65.8,
+      "pTravelTimeSec": 585.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KAPI",
+      "network": "IR",
+      "distanceDeg": 65.84,
+      "pTravelTimeSec": 587.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RGN",
+      "network": "IR",
+      "distanceDeg": 66.05,
+      "pTravelTimeSec": 588.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "XMAS",
+      "network": "IR",
+      "distanceDeg": 66.1,
+      "pTravelTimeSec": 588.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TBLG",
+      "network": "IR",
+      "distanceDeg": 66.16,
+      "pTravelTimeSec": 589.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MYKOM",
+      "network": "IR",
+      "distanceDeg": 66.34,
+      "pTravelTimeSec": 591.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BGNE",
+      "network": "IR",
+      "distanceDeg": 66.48,
+      "pTravelTimeSec": 1089.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FUNA",
+      "network": "IR",
+      "distanceDeg": 66.83,
+      "pTravelTimeSec": 593.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LHMI",
+      "network": "IR",
+      "distanceDeg": 66.84,
+      "pTravelTimeSec": 595.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "AKH",
+      "network": "IR",
+      "distanceDeg": 66.97,
+      "pTravelTimeSec": 595.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "GNI",
+      "network": "IR",
+      "distanceDeg": 67.43,
+      "pTravelTimeSec": 598.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TUC",
+      "network": "IR",
+      "distanceDeg": 67.47,
+      "pTravelTimeSec": 597.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ANMO",
+      "network": "IR",
+      "distanceDeg": 67.64,
+      "pTravelTimeSec": 598.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PSI",
+      "network": "IR",
+      "distanceDeg": 67.98,
+      "pTravelTimeSec": 600.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LPM",
+      "network": "IR",
+      "distanceDeg": 68.05,
+      "pTravelTimeSec": 602.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "OJC",
+      "network": "IR",
+      "distanceDeg": 68.26,
+      "pTravelTimeSec": 602.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MMRI",
+      "network": "IR",
+      "distanceDeg": 68.41,
+      "pTravelTimeSec": 601.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ESK",
+      "network": "IR",
+      "distanceDeg": 68.47,
+      "pTravelTimeSec": 602.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SOEI",
+      "network": "IR",
+      "distanceDeg": 68.85,
+      "pTravelTimeSec": 604.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BUR08",
+      "network": "IR",
+      "distanceDeg": 68.86,
+      "pTravelTimeSec": 605.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BURAR",
+      "network": "IR",
+      "distanceDeg": 68.88,
+      "pTravelTimeSec": 604.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BKNI",
+      "network": "IR",
+      "distanceDeg": 68.97,
+      "pTravelTimeSec": 607.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CLL",
+      "network": "IR",
+      "distanceDeg": 69.1,
+      "pTravelTimeSec": 606.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "COEN",
+      "network": "IR",
+      "distanceDeg": 69.11,
+      "pTravelTimeSec": 607.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MORC",
+      "network": "IR",
+      "distanceDeg": 69.3,
+      "pTravelTimeSec": 608.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "GSI",
+      "network": "IR",
+      "distanceDeg": 69.86,
+      "pTravelTimeSec": 611.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SNOP",
+      "network": "IR",
+      "distanceDeg": 69.99,
+      "pTravelTimeSec": 611.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MTN",
+      "network": "IR",
+      "distanceDeg": 70.01,
+      "pTravelTimeSec": 612.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PSZ",
+      "network": "IR",
+      "distanceDeg": 70.29,
+      "pTravelTimeSec": 614.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MLR",
+      "network": "IR",
+      "distanceDeg": 70.48,
+      "pTravelTimeSec": 615.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SIRT",
+      "network": "IR",
+      "distanceDeg": 70.62,
+      "pTravelTimeSec": 616.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KHC",
+      "network": "IR",
+      "distanceDeg": 70.96,
+      "pTravelTimeSec": 618.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "L46A",
+      "network": "IR",
+      "distanceDeg": 70.98,
+      "pTravelTimeSec": null,
+      "sTravelTimeSec": 1141.2
+    },
+    {
+      "station": "GRA1",
+      "network": "IR",
+      "distanceDeg": 71.03,
+      "pTravelTimeSec": 618.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "GRFO",
+      "network": "IR",
+      "distanceDeg": 71.03,
+      "pTravelTimeSec": 618.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "JAGI",
+      "network": "IR",
+      "distanceDeg": 71.08,
+      "pTravelTimeSec": 615.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "GEC2",
+      "network": "IR",
+      "distanceDeg": 71.19,
+      "pTravelTimeSec": 618.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "GERES",
+      "network": "IR",
+      "distanceDeg": 71.19,
+      "pTravelTimeSec": 618.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SMRI",
+      "network": "IR",
+      "distanceDeg": 71.26,
+      "pTravelTimeSec": 619.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ILGA",
+      "network": "IR",
+      "distanceDeg": 71.41,
+      "pTravelTimeSec": 622,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "UCC",
+      "network": "IR",
+      "distanceDeg": 71.52,
+      "pTravelTimeSec": 620.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PLVO",
+      "network": "IR",
+      "distanceDeg": 71.7,
+      "pTravelTimeSec": 621.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "UGM",
+      "network": "IR",
+      "distanceDeg": 72,
+      "pTravelTimeSec": 622.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MNAI",
+      "network": "IR",
+      "distanceDeg": 72.15,
+      "pTravelTimeSec": 622.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "WLF",
+      "network": "IR",
+      "distanceDeg": 72.22,
+      "pTravelTimeSec": 624.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CCM",
+      "network": "IR",
+      "distanceDeg": 72.27,
+      "pTravelTimeSec": 624.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "STU",
+      "network": "IR",
+      "distanceDeg": 72.37,
+      "pTravelTimeSec": 625.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BR101",
+      "network": "IR",
+      "distanceDeg": 72.56,
+      "pTravelTimeSec": 627.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ANTO",
+      "network": "IR",
+      "distanceDeg": 72.78,
+      "pTravelTimeSec": 628.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CISI",
+      "network": "IR",
+      "distanceDeg": 72.81,
+      "pTravelTimeSec": 626.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LONY",
+      "network": "IR",
+      "distanceDeg": 72.89,
+      "pTravelTimeSec": 628.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BATG",
+      "network": "IR",
+      "distanceDeg": 72.94,
+      "pTravelTimeSec": 628.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BFO",
+      "network": "IR",
+      "distanceDeg": 72.99,
+      "pTravelTimeSec": 629.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MOQ",
+      "network": "IR",
+      "distanceDeg": 72.99,
+      "pTravelTimeSec": 629.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "OLIL",
+      "network": "IR",
+      "distanceDeg": 73.03,
+      "pTravelTimeSec": 628.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ERPA",
+      "network": "IR",
+      "distanceDeg": 73.26,
+      "pTravelTimeSec": 630.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "X37A",
+      "network": "IR",
+      "distanceDeg": 73.3,
+      "pTravelTimeSec": 632.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ECH",
+      "network": "IR",
+      "distanceDeg": 73.37,
+      "pTravelTimeSec": 631.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LTX",
+      "network": "IR",
+      "distanceDeg": 73.54,
+      "pTravelTimeSec": 633.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TXAR",
+      "network": "IR",
+      "distanceDeg": 73.54,
+      "pTravelTimeSec": 633.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ALLY",
+      "network": "IR",
+      "distanceDeg": 73.62,
+      "pTravelTimeSec": 632.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "VTS",
+      "network": "IR",
+      "distanceDeg": 73.94,
+      "pTravelTimeSec": 634.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BLY",
+      "network": "IR",
+      "distanceDeg": 73.96,
+      "pTravelTimeSec": 634.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PALK",
+      "network": "IR",
+      "distanceDeg": 74.05,
+      "pTravelTimeSec": 636,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FUORN",
+      "network": "IR",
+      "distanceDeg": 74.12,
+      "pTravelTimeSec": 636.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "WCI",
+      "network": "IR",
+      "distanceDeg": 74.21,
+      "pTravelTimeSec": 636.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SLBS",
+      "network": "IR",
+      "distanceDeg": 74.75,
+      "pTravelTimeSec": 640.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BALB",
+      "network": "IR",
+      "distanceDeg": 74.89,
+      "pTravelTimeSec": 640.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CTAO",
+      "network": "IR",
+      "distanceDeg": 74.91,
+      "pTravelTimeSec": 640,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "EMMW",
+      "network": "IR",
+      "distanceDeg": 74.94,
+      "pTravelTimeSec": 640.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SENIN",
+      "network": "IR",
+      "distanceDeg": 75.08,
+      "pTravelTimeSec": 641.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SSPA",
+      "network": "IR",
+      "distanceDeg": 75.32,
+      "pTravelTimeSec": 642,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "WVT",
+      "network": "IR",
+      "distanceDeg": 75.36,
+      "pTravelTimeSec": 642.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "O56A",
+      "network": "IR",
+      "distanceDeg": 75.4,
+      "pTravelTimeSec": null,
+      "sTravelTimeSec": 1182.2
+    },
+    {
+      "station": "HRV",
+      "network": "IR",
+      "distanceDeg": 75.74,
+      "pTravelTimeSec": 645.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FNA",
+      "network": "IR",
+      "distanceDeg": 76.2,
+      "pTravelTimeSec": 647.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "WRAB",
+      "network": "IR",
+      "distanceDeg": 76.25,
+      "pTravelTimeSec": 647.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "XMIS",
+      "network": "IR",
+      "distanceDeg": 76.36,
+      "pTravelTimeSec": 647.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "VLC",
+      "network": "IR",
+      "distanceDeg": 76.39,
+      "pTravelTimeSec": 649.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FITZ",
+      "network": "IR",
+      "distanceDeg": 76.41,
+      "pTravelTimeSec": 648.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CSS",
+      "network": "IR",
+      "distanceDeg": 76.75,
+      "pTravelTimeSec": 650.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PSUB",
+      "network": "IR",
+      "distanceDeg": 76.79,
+      "pTravelTimeSec": 651,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HKT",
+      "network": "IR",
+      "distanceDeg": 76.91,
+      "pTravelTimeSec": 651.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SWET",
+      "network": "IR",
+      "distanceDeg": 76.94,
+      "pTravelTimeSec": 650.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "V51A",
+      "network": "IR",
+      "distanceDeg": 77.08,
+      "pTravelTimeSec": 652,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "X48A",
+      "network": "IR",
+      "distanceDeg": 77.12,
+      "pTravelTimeSec": null,
+      "sTravelTimeSec": 1198.6
+    },
+    {
+      "station": "W50A",
+      "network": "IR",
+      "distanceDeg": 77.21,
+      "pTravelTimeSec": null,
+      "sTravelTimeSec": 1199.2
+    },
+    {
+      "station": "CPCT",
+      "network": "IR",
+      "distanceDeg": 77.32,
+      "pTravelTimeSec": 653.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "U54A",
+      "network": "IR",
+      "distanceDeg": 77.47,
+      "pTravelTimeSec": 654.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DZM",
+      "network": "IR",
+      "distanceDeg": 77.48,
+      "pTravelTimeSec": 655.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CBN",
+      "network": "IR",
+      "distanceDeg": 77.65,
+      "pTravelTimeSec": 654.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "R58B",
+      "network": "IR",
+      "distanceDeg": 77.69,
+      "pTravelTimeSec": 654.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "V53A",
+      "network": "IR",
+      "distanceDeg": 77.82,
+      "pTravelTimeSec": 655.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "W52A",
+      "network": "IR",
+      "distanceDeg": 77.87,
+      "pTravelTimeSec": 656.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "OUENC",
+      "network": "IR",
+      "distanceDeg": 77.88,
+      "pTravelTimeSec": 657.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "T57A",
+      "network": "IR",
+      "distanceDeg": 78.03,
+      "pTravelTimeSec": 656.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PINNC",
+      "network": "IR",
+      "distanceDeg": 78.15,
+      "pTravelTimeSec": 658.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BG3",
+      "network": "IR",
+      "distanceDeg": 78.36,
+      "pTravelTimeSec": 658.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "V56A",
+      "network": "IR",
+      "distanceDeg": 78.6,
+      "pTravelTimeSec": 660,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "T59A",
+      "network": "IR",
+      "distanceDeg": 78.68,
+      "pTravelTimeSec": 659.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KARP",
+      "network": "IR",
+      "distanceDeg": 78.75,
+      "pTravelTimeSec": 659.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "Y52A",
+      "network": "IR",
+      "distanceDeg": 78.88,
+      "pTravelTimeSec": 661.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PAULI",
+      "network": "IR",
+      "distanceDeg": 78.95,
+      "pTravelTimeSec": 661.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TIP",
+      "network": "IR",
+      "distanceDeg": 79.16,
+      "pTravelTimeSec": 663.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ITM",
+      "network": "IR",
+      "distanceDeg": 79.24,
+      "pTravelTimeSec": 662.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BIRD",
+      "network": "IR",
+      "distanceDeg": 79.64,
+      "pTravelTimeSec": 665.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "IDI",
+      "network": "IR",
+      "distanceDeg": 79.85,
+      "pTravelTimeSec": null,
+      "sTravelTimeSec": 1214.6
+    },
+    {
+      "station": "EIDS",
+      "network": "IR",
+      "distanceDeg": 79.95,
+      "pTravelTimeSec": 667.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ASAR",
+      "network": "IR",
+      "distanceDeg": 79.98,
+      "pTravelTimeSec": 667.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "AS31",
+      "network": "IR",
+      "distanceDeg": 79.98,
+      "pTravelTimeSec": 667.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "NIUE",
+      "network": "IR",
+      "distanceDeg": 80.09,
+      "pTravelTimeSec": 668.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "253A",
+      "network": "IR",
+      "distanceDeg": 80.41,
+      "pTravelTimeSec": null,
+      "sTravelTimeSec": 1234.9
+    },
+    {
+      "station": "PSA00",
+      "network": "IR",
+      "distanceDeg": 81.33,
+      "pTravelTimeSec": 672.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "VAE",
+      "network": "IR",
+      "distanceDeg": 81.45,
+      "pTravelTimeSec": 675.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MOIG",
+      "network": "IR",
+      "distanceDeg": 82.71,
+      "pTravelTimeSec": 683.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MTE",
+      "network": "IR",
+      "distanceDeg": 83.66,
+      "pTravelTimeSec": 684.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "COI",
+      "network": "IR",
+      "distanceDeg": 83.97,
+      "pTravelTimeSec": 687.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PAB",
+      "network": "IR",
+      "distanceDeg": 83.99,
+      "pTravelTimeSec": 687.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TAOE",
+      "network": "IR",
+      "distanceDeg": 84.17,
+      "pTravelTimeSec": 688.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KEST",
+      "network": "IR",
+      "distanceDeg": 84.55,
+      "pTravelTimeSec": 692,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DWPF",
+      "network": "IR",
+      "distanceDeg": 84.99,
+      "pTravelTimeSec": 693.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CART",
+      "network": "IR",
+      "distanceDeg": 85.27,
+      "pTravelTimeSec": 693.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RAR",
+      "network": "IR",
+      "distanceDeg": 85.76,
+      "pTravelTimeSec": 696.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LHI",
+      "network": "IR",
+      "distanceDeg": 86.21,
+      "pTravelTimeSec": 699.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ROSA",
+      "network": "IR",
+      "distanceDeg": 86.75,
+      "pTravelTimeSec": 701.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PPT",
+      "network": "IR",
+      "distanceDeg": 86.93,
+      "pTravelTimeSec": 703.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PPTF",
+      "network": "IR",
+      "distanceDeg": 86.95,
+      "pTravelTimeSec": 702.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "STKA",
+      "network": "IR",
+      "distanceDeg": 86.99,
+      "pTravelTimeSec": 701.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PFVI",
+      "network": "IR",
+      "distanceDeg": 87.05,
+      "pTravelTimeSec": 701.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BBSR",
+      "network": "IR",
+      "distanceDeg": 87.18,
+      "pTravelTimeSec": 703.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RAO",
+      "network": "IR",
+      "distanceDeg": 87.39,
+      "pTravelTimeSec": 703.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CMLA",
+      "network": "IR",
+      "distanceDeg": 87.71,
+      "pTravelTimeSec": 705.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FORT",
+      "network": "IR",
+      "distanceDeg": 88.03,
+      "pTravelTimeSec": 705.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BBOO",
+      "network": "IR",
+      "distanceDeg": 88.59,
+      "pTravelTimeSec": 708.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CAN",
+      "network": "IR",
+      "distanceDeg": 89.92,
+      "pTravelTimeSec": 716,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DGAR",
+      "network": "IR",
+      "distanceDeg": 90.73,
+      "pTravelTimeSec": 719.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "OUZ",
+      "network": "IR",
+      "distanceDeg": 91.45,
+      "pTravelTimeSec": 723.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ATD",
+      "network": "IR",
+      "distanceDeg": 92.01,
+      "pTravelTimeSec": 726.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PMOZ",
+      "network": "IR",
+      "distanceDeg": 92.25,
+      "pTravelTimeSec": 725.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "NWAO",
+      "network": "IR",
+      "distanceDeg": 92.78,
+      "pTravelTimeSec": 727.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FSCY",
+      "network": "IR",
+      "distanceDeg": 92.82,
+      "pTravelTimeSec": 729.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TGUH",
+      "network": "IR",
+      "distanceDeg": 94.54,
+      "pTravelTimeSec": 737,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HIZ",
+      "network": "IR",
+      "distanceDeg": 94.87,
+      "pTravelTimeSec": 738.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "URZ",
+      "network": "IR",
+      "distanceDeg": 95.02,
+      "pTravelTimeSec": 739.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BKZ",
+      "network": "IR",
+      "distanceDeg": 95.79,
+      "pTravelTimeSec": 743.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FURI",
+      "network": "IR",
+      "distanceDeg": 96.41,
+      "pTravelTimeSec": 747.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MACI",
+      "network": "IR",
+      "distanceDeg": 96.73,
+      "pTravelTimeSec": 746.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BFZ",
+      "network": "IR",
+      "distanceDeg": 97.22,
+      "pTravelTimeSec": 750.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SDDR",
+      "network": "IR",
+      "distanceDeg": 97.24,
+      "pTravelTimeSec": 749.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MJAR",
+      "network": "IR",
+      "distanceDeg": 121.05,
+      "pTravelTimeSec": 243.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BCAR",
+      "network": "IR",
+      "distanceDeg": 121.05,
+      "pTravelTimeSec": 347.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ARCES",
+      "network": "IR",
+      "distanceDeg": 121.05,
+      "pTravelTimeSec": 480.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "AKASG",
+      "network": "IR",
+      "distanceDeg": 121.05,
+      "pTravelTimeSec": 580.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BRTR",
+      "network": "IR",
+      "distanceDeg": 121.05,
+      "pTravelTimeSec": 627.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ESDC",
+      "network": "IR",
+      "distanceDeg": 121.05,
+      "pTravelTimeSec": 685.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SIV",
+      "network": "IR",
+      "distanceDeg": 133.04,
+      "pTravelTimeSec": 909,
+      "sTravelTimeSec": null
+    }
+  ]
+}
\ No newline at end of file
diff --git a/src/data/tohoku-2011.json b/src/data/tohoku-2011.json
new file mode 100644
index 0000000..0ab9448
--- /dev/null
+++ b/src/data/tohoku-2011.json
@@ -0,0 +1,3513 @@
+{
+  "id": "tohoku-2011",
+  "name": "2011 Tōhoku, Japan (Mw 9.1)",
+  "originTime": "2011-03-11T05:46:24Z",
+  "latitude": 38.297,
+  "longitude": 142.373,
+  "depthKm": 29,
+  "magnitudeMw": 9.1,
+  "usgsId": "official20110311054624120_30",
+  "note": "Largest recorded earthquake in Japan. Shallow source, excellent global coverage. Clear P shadow zone near 105°–140°.",
+  "arrivals": [
+    {
+      "station": "MJAR",
+      "network": "IR",
+      "distanceDeg": 3.75,
+      "pTravelTimeSec": 56.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MAJO",
+      "network": "IR",
+      "distanceDeg": 3.75,
+      "pTravelTimeSec": 57.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ERM",
+      "network": "IR",
+      "distanceDeg": 3.76,
+      "pTravelTimeSec": 54.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "INU",
+      "network": "IR",
+      "distanceDeg": 5.21,
+      "pTravelTimeSec": 77,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "JHJ2",
+      "network": "IR",
+      "distanceDeg": 5.58,
+      "pTravelTimeSec": 78.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ASAJ",
+      "network": "IR",
+      "distanceDeg": 5.82,
+      "pTravelTimeSec": 84,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "YSS",
+      "network": "IR",
+      "distanceDeg": 8.66,
+      "pTravelTimeSec": 123.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "JNU",
+      "network": "IR",
+      "distanceDeg": 10.67,
+      "pTravelTimeSec": 153.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CBIJ",
+      "network": "IR",
+      "distanceDeg": 11.17,
+      "pTravelTimeSec": 153.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MDJ",
+      "network": "IR",
+      "distanceDeg": 11.47,
+      "pTravelTimeSec": 163.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KSAR",
+      "network": "IR",
+      "distanceDeg": 11.49,
+      "pTravelTimeSec": 164.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "INCN",
+      "network": "IR",
+      "distanceDeg": 12.46,
+      "pTravelTimeSec": 176.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KLR",
+      "network": "IR",
+      "distanceDeg": 13.34,
+      "pTravelTimeSec": 185.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "JOW",
+      "network": "IR",
+      "distanceDeg": 16.47,
+      "pTravelTimeSec": 227,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PETK",
+      "network": "IR",
+      "distanceDeg": 18.21,
+      "pTravelTimeSec": 247,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PET",
+      "network": "IR",
+      "distanceDeg": 18.54,
+      "pTravelTimeSec": 254.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HIA",
+      "network": "IR",
+      "distanceDeg": 19.6,
+      "pTravelTimeSec": 264,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BJT",
+      "network": "IR",
+      "distanceDeg": 20.37,
+      "pTravelTimeSec": 272,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "YOJ",
+      "network": "IR",
+      "distanceDeg": 21.47,
+      "pTravelTimeSec": 282.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SARN",
+      "network": "IR",
+      "distanceDeg": 21.72,
+      "pTravelTimeSec": 289.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MA2",
+      "network": "IR",
+      "distanceDeg": 21.96,
+      "pTravelTimeSec": 289.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ANA2",
+      "network": "IR",
+      "distanceDeg": 22.07,
+      "pTravelTimeSec": 293.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TATO",
+      "network": "IR",
+      "distanceDeg": 22.13,
+      "pTravelTimeSec": 292,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "YHNB",
+      "network": "IR",
+      "distanceDeg": 22.41,
+      "pTravelTimeSec": 294.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "NACB",
+      "network": "IR",
+      "distanceDeg": 22.6,
+      "pTravelTimeSec": 294.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SSLB",
+      "network": "IR",
+      "distanceDeg": 23.29,
+      "pTravelTimeSec": 302.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "YULB",
+      "network": "IR",
+      "distanceDeg": 23.33,
+      "pTravelTimeSec": 302.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TPUB",
+      "network": "IR",
+      "distanceDeg": 23.84,
+      "pTravelTimeSec": 308.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TWG",
+      "network": "IR",
+      "distanceDeg": 23.88,
+      "pTravelTimeSec": 309.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "GUMO",
+      "network": "IR",
+      "distanceDeg": 24.71,
+      "pTravelTimeSec": 316.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "YAK",
+      "network": "IR",
+      "distanceDeg": 25.02,
+      "pTravelTimeSec": 320.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SEY",
+      "network": "IR",
+      "distanceDeg": 25.41,
+      "pTravelTimeSec": 324.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SMY",
+      "network": "IR",
+      "distanceDeg": 26.24,
+      "pTravelTimeSec": 332.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ULN",
+      "network": "IR",
+      "distanceDeg": 27.3,
+      "pTravelTimeSec": 341.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SONM",
+      "network": "IR",
+      "distanceDeg": 27.74,
+      "pTravelTimeSec": 346.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ENH",
+      "network": "IR",
+      "distanceDeg": 28.22,
+      "pTravelTimeSec": 349.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TLY",
+      "network": "IR",
+      "distanceDeg": 30.1,
+      "pTravelTimeSec": 366.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TGY",
+      "network": "IR",
+      "distanceDeg": 30.68,
+      "pTravelTimeSec": 373.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BILL",
+      "network": "IR",
+      "distanceDeg": 32.6,
+      "pTravelTimeSec": 387.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ATKA",
+      "network": "IR",
+      "distanceDeg": 33.06,
+      "pTravelTimeSec": 392.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TIXI",
+      "network": "IR",
+      "distanceDeg": 34.13,
+      "pTravelTimeSec": 401.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "QIZ",
+      "network": "IR",
+      "distanceDeg": 34.15,
+      "pTravelTimeSec": 405,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PATS",
+      "network": "IR",
+      "distanceDeg": 34.49,
+      "pTravelTimeSec": 405.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DAV",
+      "network": "IR",
+      "distanceDeg": 34.61,
+      "pTravelTimeSec": 407.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MIDW",
+      "network": "IR",
+      "distanceDeg": 34.9,
+      "pTravelTimeSec": 405.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "NIKH",
+      "network": "IR",
+      "distanceDeg": 36.38,
+      "pTravelTimeSec": 421.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KWAJ",
+      "network": "IR",
+      "distanceDeg": 37.13,
+      "pTravelTimeSec": 423.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "GAMB",
+      "network": "IR",
+      "distanceDeg": 37.24,
+      "pTravelTimeSec": 428.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "AKUT",
+      "network": "IR",
+      "distanceDeg": 38.28,
+      "pTravelTimeSec": 445.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MYLDM",
+      "network": "IR",
+      "distanceDeg": 39.47,
+      "pTravelTimeSec": 448.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FALS",
+      "network": "IR",
+      "distanceDeg": 39.68,
+      "pTravelTimeSec": 450.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TNTI",
+      "network": "IR",
+      "distanceDeg": 39.81,
+      "pTravelTimeSec": 449.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KKM",
+      "network": "IR",
+      "distanceDeg": 39.92,
+      "pTravelTimeSec": 450.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MANU",
+      "network": "IR",
+      "distanceDeg": 40.4,
+      "pTravelTimeSec": 454.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "JAY",
+      "network": "IR",
+      "distanceDeg": 40.64,
+      "pTravelTimeSec": 457.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SDPT",
+      "network": "IR",
+      "distanceDeg": 41.38,
+      "pTravelTimeSec": 461.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ZALV",
+      "network": "IR",
+      "distanceDeg": 41.64,
+      "pTravelTimeSec": 465,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FAKI",
+      "network": "IR",
+      "distanceDeg": 42.07,
+      "pTravelTimeSec": 467.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CHGN",
+      "network": "IR",
+      "distanceDeg": 42.53,
+      "pTravelTimeSec": 472.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CMAR",
+      "network": "IR",
+      "distanceDeg": 42.56,
+      "pTravelTimeSec": 473.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LSA",
+      "network": "IR",
+      "distanceDeg": 42.86,
+      "pTravelTimeSec": 476.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LUWI",
+      "network": "IR",
+      "distanceDeg": 43.12,
+      "pTravelTimeSec": 476.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RABL",
+      "network": "IR",
+      "distanceDeg": 43.24,
+      "pTravelTimeSec": 479.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TTA",
+      "network": "IR",
+      "distanceDeg": 43.95,
+      "pTravelTimeSec": 484.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SVW2",
+      "network": "IR",
+      "distanceDeg": 44.06,
+      "pTravelTimeSec": 484.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MKAR",
+      "network": "IR",
+      "distanceDeg": 44.11,
+      "pTravelTimeSec": 486,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MAKZ",
+      "network": "IR",
+      "distanceDeg": 44.31,
+      "pTravelTimeSec": 487.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SBUM",
+      "network": "IR",
+      "distanceDeg": 45.09,
+      "pTravelTimeSec": 492.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "OHAK",
+      "network": "IR",
+      "distanceDeg": 45.31,
+      "pTravelTimeSec": 493.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RSO",
+      "network": "IR",
+      "distanceDeg": 45.44,
+      "pTravelTimeSec": 495.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KDAK",
+      "network": "IR",
+      "distanceDeg": 45.65,
+      "pTravelTimeSec": 495.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PPLA",
+      "network": "IR",
+      "distanceDeg": 45.7,
+      "pTravelTimeSec": 498.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KURK",
+      "network": "IR",
+      "distanceDeg": 45.76,
+      "pTravelTimeSec": 497.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CAST",
+      "network": "IR",
+      "distanceDeg": 45.76,
+      "pTravelTimeSec": 499.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SPU",
+      "network": "IR",
+      "distanceDeg": 45.77,
+      "pTravelTimeSec": 498.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HOM",
+      "network": "IR",
+      "distanceDeg": 46.03,
+      "pTravelTimeSec": 500.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TARA",
+      "network": "IR",
+      "distanceDeg": 46.22,
+      "pTravelTimeSec": 497.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BPAW",
+      "network": "IR",
+      "distanceDeg": 46.25,
+      "pTravelTimeSec": 502.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KTH",
+      "network": "IR",
+      "distanceDeg": 46.28,
+      "pTravelTimeSec": 503.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MLY",
+      "network": "IR",
+      "distanceDeg": 46.38,
+      "pTravelTimeSec": 502.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BRLK",
+      "network": "IR",
+      "distanceDeg": 46.41,
+      "pTravelTimeSec": 503.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TRF",
+      "network": "IR",
+      "distanceDeg": 46.56,
+      "pTravelTimeSec": 503.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "COLD",
+      "network": "IR",
+      "distanceDeg": 46.68,
+      "pTravelTimeSec": 505.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RC01",
+      "network": "IR",
+      "distanceDeg": 46.9,
+      "pTravelTimeSec": 506.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KSM",
+      "network": "IR",
+      "distanceDeg": 46.97,
+      "pTravelTimeSec": 509.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SEW",
+      "network": "IR",
+      "distanceDeg": 47.1,
+      "pTravelTimeSec": 508.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "JOHN",
+      "network": "IR",
+      "distanceDeg": 47.15,
+      "pTravelTimeSec": 510.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PMR",
+      "network": "IR",
+      "distanceDeg": 47.16,
+      "pTravelTimeSec": 508.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MCK",
+      "network": "IR",
+      "distanceDeg": 47.16,
+      "pTravelTimeSec": 510.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SAUI",
+      "network": "IR",
+      "distanceDeg": 47.18,
+      "pTravelTimeSec": 525.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RND",
+      "network": "IR",
+      "distanceDeg": 47.21,
+      "pTravelTimeSec": 509.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MDM",
+      "network": "IR",
+      "distanceDeg": 47.44,
+      "pTravelTimeSec": 511.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "WRH",
+      "network": "IR",
+      "distanceDeg": 47.51,
+      "pTravelTimeSec": 511.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SML",
+      "network": "IR",
+      "distanceDeg": 47.53,
+      "pTravelTimeSec": 525.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "COLA",
+      "network": "IR",
+      "distanceDeg": 47.61,
+      "pTravelTimeSec": 513.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CCB",
+      "network": "IR",
+      "distanceDeg": 47.63,
+      "pTravelTimeSec": 513.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PMG",
+      "network": "IR",
+      "distanceDeg": 47.66,
+      "pTravelTimeSec": 514.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DHY",
+      "network": "IR",
+      "distanceDeg": 47.89,
+      "pTravelTimeSec": 516.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KAPI",
+      "network": "IR",
+      "distanceDeg": 47.93,
+      "pTravelTimeSec": 516.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SCM",
+      "network": "IR",
+      "distanceDeg": 48,
+      "pTravelTimeSec": 525.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HDA",
+      "network": "IR",
+      "distanceDeg": 48.01,
+      "pTravelTimeSec": 525.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ILAR",
+      "network": "IR",
+      "distanceDeg": 48.02,
+      "pTravelTimeSec": 513.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FYU",
+      "network": "IR",
+      "distanceDeg": 48.64,
+      "pTravelTimeSec": 521.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KLU",
+      "network": "IR",
+      "distanceDeg": 48.7,
+      "pTravelTimeSec": 535.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MID",
+      "network": "IR",
+      "distanceDeg": 48.74,
+      "pTravelTimeSec": 535.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PAX",
+      "network": "IR",
+      "distanceDeg": 48.77,
+      "pTravelTimeSec": 522.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DIV",
+      "network": "IR",
+      "distanceDeg": 48.81,
+      "pTravelTimeSec": 535.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "EYAK",
+      "network": "IR",
+      "distanceDeg": 48.89,
+      "pTravelTimeSec": 524,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DOT",
+      "network": "IR",
+      "distanceDeg": 49.33,
+      "pTravelTimeSec": 526.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BMRM",
+      "network": "IR",
+      "distanceDeg": 49.4,
+      "pTravelTimeSec": 527.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RAGM",
+      "network": "IR",
+      "distanceDeg": 49.44,
+      "pTravelTimeSec": 530,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MENT",
+      "network": "IR",
+      "distanceDeg": 49.57,
+      "pTravelTimeSec": 529.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TKM2",
+      "network": "IR",
+      "distanceDeg": 49.71,
+      "pTravelTimeSec": 529.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "VOSK",
+      "network": "IR",
+      "distanceDeg": 50.02,
+      "pTravelTimeSec": 530.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KULM",
+      "network": "IR",
+      "distanceDeg": 50.11,
+      "pTravelTimeSec": 532.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HNR",
+      "network": "IR",
+      "distanceDeg": 50.24,
+      "pTravelTimeSec": 533.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BVAR",
+      "network": "IR",
+      "distanceDeg": 50.29,
+      "pTravelTimeSec": 533.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MMRI",
+      "network": "IR",
+      "distanceDeg": 50.33,
+      "pTravelTimeSec": 535.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BRVK",
+      "network": "IR",
+      "distanceDeg": 50.35,
+      "pTravelTimeSec": 533.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "IPM",
+      "network": "IR",
+      "distanceDeg": 50.37,
+      "pTravelTimeSec": 534.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "EGAK",
+      "network": "IR",
+      "distanceDeg": 50.47,
+      "pTravelTimeSec": 535.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "AAK",
+      "network": "IR",
+      "distanceDeg": 50.57,
+      "pTravelTimeSec": 535.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MYKOM",
+      "network": "IR",
+      "distanceDeg": 50.62,
+      "pTravelTimeSec": 536.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SOEI",
+      "network": "IR",
+      "distanceDeg": 50.71,
+      "pTravelTimeSec": 537,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "EKS2",
+      "network": "IR",
+      "distanceDeg": 51.06,
+      "pTravelTimeSec": 539.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ZRNK",
+      "network": "IR",
+      "distanceDeg": 51.12,
+      "pTravelTimeSec": 539.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BATI",
+      "network": "IR",
+      "distanceDeg": 51.32,
+      "pTravelTimeSec": 547.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DAWY",
+      "network": "IR",
+      "distanceDeg": 51.33,
+      "pTravelTimeSec": 542.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KEKH",
+      "network": "IR",
+      "distanceDeg": 51.86,
+      "pTravelTimeSec": 546.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MTN",
+      "network": "IR",
+      "distanceDeg": 51.95,
+      "pTravelTimeSec": 545.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "COEN",
+      "network": "IR",
+      "distanceDeg": 51.98,
+      "pTravelTimeSec": 546.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "YKU2",
+      "network": "IR",
+      "distanceDeg": 52.08,
+      "pTravelTimeSec": 555.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LHMI",
+      "network": "IR",
+      "distanceDeg": 52.71,
+      "pTravelTimeSec": 554.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "INK",
+      "network": "IR",
+      "distanceDeg": 52.92,
+      "pTravelTimeSec": 554.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KKAR",
+      "network": "IR",
+      "distanceDeg": 53.16,
+      "pTravelTimeSec": 555.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PSI",
+      "network": "IR",
+      "distanceDeg": 53.17,
+      "pTravelTimeSec": 553.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "OPA",
+      "network": "IR",
+      "distanceDeg": 53.35,
+      "pTravelTimeSec": 556.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "JAGI",
+      "network": "IR",
+      "distanceDeg": 53.45,
+      "pTravelTimeSec": 558.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KIP",
+      "network": "IR",
+      "distanceDeg": 53.49,
+      "pTravelTimeSec": 557.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BKNI",
+      "network": "IR",
+      "distanceDeg": 53.54,
+      "pTravelTimeSec": 557.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SMRI",
+      "network": "IR",
+      "distanceDeg": 54.02,
+      "pTravelTimeSec": 562.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SKAG",
+      "network": "IR",
+      "distanceDeg": 54.23,
+      "pTravelTimeSec": 562.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "UGM",
+      "network": "IR",
+      "distanceDeg": 54.71,
+      "pTravelTimeSec": 565.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "GSI",
+      "network": "IR",
+      "distanceDeg": 55.1,
+      "pTravelTimeSec": 567.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HLK",
+      "network": "IR",
+      "distanceDeg": 55.24,
+      "pTravelTimeSec": 571.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LEM",
+      "network": "IR",
+      "distanceDeg": 55.32,
+      "pTravelTimeSec": 572.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CISI",
+      "network": "IR",
+      "distanceDeg": 55.82,
+      "pTravelTimeSec": 573.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ARU",
+      "network": "IR",
+      "distanceDeg": 55.92,
+      "pTravelTimeSec": 574.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MNAI",
+      "network": "IR",
+      "distanceDeg": 55.98,
+      "pTravelTimeSec": 576.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KKH",
+      "network": "IR",
+      "distanceDeg": 56.02,
+      "pTravelTimeSec": 577,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HPAH",
+      "network": "IR",
+      "distanceDeg": 56.06,
+      "pTravelTimeSec": 577.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KHU",
+      "network": "IR",
+      "distanceDeg": 56.56,
+      "pTravelTimeSec": 580,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CRAG",
+      "network": "IR",
+      "distanceDeg": 56.62,
+      "pTravelTimeSec": 581.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HPO",
+      "network": "IR",
+      "distanceDeg": 56.69,
+      "pTravelTimeSec": 581.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "UWE",
+      "network": "IR",
+      "distanceDeg": 56.71,
+      "pTravelTimeSec": 595.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "WRAK",
+      "network": "IR",
+      "distanceDeg": 56.91,
+      "pTravelTimeSec": 581.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DLBC",
+      "network": "IR",
+      "distanceDeg": 57.17,
+      "pTravelTimeSec": 583.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ABKAR",
+      "network": "IR",
+      "distanceDeg": 57.71,
+      "pTravelTimeSec": 586.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FUNA",
+      "network": "IR",
+      "distanceDeg": 57.86,
+      "pTravelTimeSec": 589.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CTAO",
+      "network": "IR",
+      "distanceDeg": 58.19,
+      "pTravelTimeSec": 590.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CTA",
+      "network": "IR",
+      "distanceDeg": 58.19,
+      "pTravelTimeSec": 592.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FITZ",
+      "network": "IR",
+      "distanceDeg": 58.26,
+      "pTravelTimeSec": 591.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "AKTO",
+      "network": "IR",
+      "distanceDeg": 58.4,
+      "pTravelTimeSec": 592.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "WRAB",
+      "network": "IR",
+      "distanceDeg": 58.41,
+      "pTravelTimeSec": 591.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "WRA",
+      "network": "IR",
+      "distanceDeg": 58.42,
+      "pTravelTimeSec": 589.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "XMIS",
+      "network": "IR",
+      "distanceDeg": 59.42,
+      "pTravelTimeSec": 600,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SPITS",
+      "network": "IR",
+      "distanceDeg": 59.43,
+      "pTravelTimeSec": 599.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BBB",
+      "network": "IR",
+      "distanceDeg": 60.63,
+      "pTravelTimeSec": 607.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RES",
+      "network": "IR",
+      "distanceDeg": 61.19,
+      "pTravelTimeSec": 610.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LVZ",
+      "network": "IR",
+      "distanceDeg": 61.27,
+      "pTravelTimeSec": 612.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ASAR",
+      "network": "IR",
+      "distanceDeg": 62.15,
+      "pTravelTimeSec": 618.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "YKA",
+      "network": "IR",
+      "distanceDeg": 62.34,
+      "pTravelTimeSec": 619.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KEV",
+      "network": "IR",
+      "distanceDeg": 62.53,
+      "pTravelTimeSec": 621.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MBWA",
+      "network": "IR",
+      "distanceDeg": 62.85,
+      "pTravelTimeSec": 621.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ARCES",
+      "network": "IR",
+      "distanceDeg": 63.08,
+      "pTravelTimeSec": 623.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PALK",
+      "network": "IR",
+      "distanceDeg": 63.38,
+      "pTravelTimeSec": 626.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "EIDS",
+      "network": "IR",
+      "distanceDeg": 63.85,
+      "pTravelTimeSec": 629.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PGC",
+      "network": "IR",
+      "distanceDeg": 64.92,
+      "pTravelTimeSec": 637,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MSVF",
+      "network": "IR",
+      "distanceDeg": 65.02,
+      "pTravelTimeSec": 638.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "NLWA",
+      "network": "IR",
+      "distanceDeg": 65.31,
+      "pTravelTimeSec": 640.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "XMAS",
+      "network": "IR",
+      "distanceDeg": 65.61,
+      "pTravelTimeSec": 640.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CMW",
+      "network": "IR",
+      "distanceDeg": 65.8,
+      "pTravelTimeSec": 642.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "COCO",
+      "network": "IR",
+      "distanceDeg": 65.83,
+      "pTravelTimeSec": 643.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "JCW",
+      "network": "IR",
+      "distanceDeg": 66.02,
+      "pTravelTimeSec": 642.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RPW",
+      "network": "IR",
+      "distanceDeg": 66.13,
+      "pTravelTimeSec": 644.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BLH",
+      "network": "IR",
+      "distanceDeg": 66.15,
+      "pTravelTimeSec": 645.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LCW",
+      "network": "IR",
+      "distanceDeg": 66.36,
+      "pTravelTimeSec": 648.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "GPW",
+      "network": "IR",
+      "distanceDeg": 66.51,
+      "pTravelTimeSec": 648.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "WRW",
+      "network": "IR",
+      "distanceDeg": 66.8,
+      "pTravelTimeSec": 650,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MTMW",
+      "network": "IR",
+      "distanceDeg": 66.99,
+      "pTravelTimeSec": 651,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "AFI",
+      "network": "IR",
+      "distanceDeg": 67.37,
+      "pTravelTimeSec": 652.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "OBN",
+      "network": "IR",
+      "distanceDeg": 67.54,
+      "pTravelTimeSec": 653.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TDH",
+      "network": "IR",
+      "distanceDeg": 67.63,
+      "pTravelTimeSec": 652.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SAW",
+      "network": "IR",
+      "distanceDeg": 67.73,
+      "pTravelTimeSec": 655,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "VFP",
+      "network": "IR",
+      "distanceDeg": 67.81,
+      "pTravelTimeSec": 658.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "EDM",
+      "network": "IR",
+      "distanceDeg": 67.89,
+      "pTravelTimeSec": 655,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FINES",
+      "network": "IR",
+      "distanceDeg": 68.05,
+      "pTravelTimeSec": 655.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HUMO",
+      "network": "IR",
+      "distanceDeg": 68.35,
+      "pTravelTimeSec": 658.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HAWA",
+      "network": "IR",
+      "distanceDeg": 68.36,
+      "pTravelTimeSec": 659.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "VTHM",
+      "network": "IR",
+      "distanceDeg": 68.42,
+      "pTravelTimeSec": 660.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "JCC",
+      "network": "IR",
+      "distanceDeg": 68.63,
+      "pTravelTimeSec": 675.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "NEW",
+      "network": "IR",
+      "distanceDeg": 68.7,
+      "pTravelTimeSec": 659.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ARMA",
+      "network": "IR",
+      "distanceDeg": 68.91,
+      "pTravelTimeSec": 662.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "YBH",
+      "network": "IR",
+      "distanceDeg": 68.97,
+      "pTravelTimeSec": 664,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KMRM",
+      "network": "IR",
+      "distanceDeg": 69.16,
+      "pTravelTimeSec": 665.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SUMG",
+      "network": "IR",
+      "distanceDeg": 69.42,
+      "pTravelTimeSec": 664.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "K05A",
+      "network": "IR",
+      "distanceDeg": 69.56,
+      "pTravelTimeSec": 666.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "WDC",
+      "network": "IR",
+      "distanceDeg": 69.71,
+      "pTravelTimeSec": 667.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "STKA",
+      "network": "IR",
+      "distanceDeg": 69.82,
+      "pTravelTimeSec": 667.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "WALA",
+      "network": "IR",
+      "distanceDeg": 69.99,
+      "pTravelTimeSec": 666.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BSMT",
+      "network": "IR",
+      "distanceDeg": 70.22,
+      "pTravelTimeSec": 671.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HOPS",
+      "network": "IR",
+      "distanceDeg": 70.24,
+      "pTravelTimeSec": 685.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BLMT",
+      "network": "IR",
+      "distanceDeg": 70.36,
+      "pTravelTimeSec": 672.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MOD",
+      "network": "IR",
+      "distanceDeg": 70.38,
+      "pTravelTimeSec": 671.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "JTMT",
+      "network": "IR",
+      "distanceDeg": 70.56,
+      "pTravelTimeSec": 673.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "YBMT",
+      "network": "IR",
+      "distanceDeg": 70.64,
+      "pTravelTimeSec": 673,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KIV",
+      "network": "IR",
+      "distanceDeg": 70.65,
+      "pTravelTimeSec": 672.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KVAR",
+      "network": "IR",
+      "distanceDeg": 70.65,
+      "pTravelTimeSec": 673,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KBZ",
+      "network": "IR",
+      "distanceDeg": 70.66,
+      "pTravelTimeSec": 672.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MCCM",
+      "network": "IR",
+      "distanceDeg": 70.84,
+      "pTravelTimeSec": 673.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SWMT",
+      "network": "IR",
+      "distanceDeg": 70.85,
+      "pTravelTimeSec": 673.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ORV",
+      "network": "IR",
+      "distanceDeg": 70.94,
+      "pTravelTimeSec": 672.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BBOO",
+      "network": "IR",
+      "distanceDeg": 70.99,
+      "pTravelTimeSec": 672.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "WVOR",
+      "network": "IR",
+      "distanceDeg": 71.1,
+      "pTravelTimeSec": 674.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LHI",
+      "network": "IR",
+      "distanceDeg": 71.18,
+      "pTravelTimeSec": 676.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "WSAR",
+      "network": "IR",
+      "distanceDeg": 71.28,
+      "pTravelTimeSec": 677.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MSO",
+      "network": "IR",
+      "distanceDeg": 71.29,
+      "pTravelTimeSec": 677.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "GNI",
+      "network": "IR",
+      "distanceDeg": 71.56,
+      "pTravelTimeSec": 678.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CHMT",
+      "network": "IR",
+      "distanceDeg": 71.62,
+      "pTravelTimeSec": 679.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "UOSS",
+      "network": "IR",
+      "distanceDeg": 72.15,
+      "pTravelTimeSec": 681.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MFID",
+      "network": "IR",
+      "distanceDeg": 72.22,
+      "pTravelTimeSec": 680.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FFC",
+      "network": "IR",
+      "distanceDeg": 72.23,
+      "pTravelTimeSec": 680.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CMB",
+      "network": "IR",
+      "distanceDeg": 72.52,
+      "pTravelTimeSec": 682.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FCC",
+      "network": "IR",
+      "distanceDeg": 72.53,
+      "pTravelTimeSec": 683.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SAO",
+      "network": "IR",
+      "distanceDeg": 72.56,
+      "pTravelTimeSec": 683.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LRM",
+      "network": "IR",
+      "distanceDeg": 72.72,
+      "pTravelTimeSec": 683.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "EGMT",
+      "network": "IR",
+      "distanceDeg": 72.82,
+      "pTravelTimeSec": 684.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "WAKR",
+      "network": "IR",
+      "distanceDeg": 72.86,
+      "pTravelTimeSec": 685.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DLMT",
+      "network": "IR",
+      "distanceDeg": 72.91,
+      "pTravelTimeSec": 685.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HLID",
+      "network": "IR",
+      "distanceDeg": 72.96,
+      "pTravelTimeSec": 685,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MCMT",
+      "network": "IR",
+      "distanceDeg": 73.1,
+      "pTravelTimeSec": 687.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HFS",
+      "network": "IR",
+      "distanceDeg": 73.25,
+      "pTravelTimeSec": 687.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BOZ",
+      "network": "IR",
+      "distanceDeg": 73.28,
+      "pTravelTimeSec": 688.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "NOA",
+      "network": "IR",
+      "distanceDeg": 73.32,
+      "pTravelTimeSec": 687.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CAN",
+      "network": "IR",
+      "distanceDeg": 73.51,
+      "pTravelTimeSec": 690.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "NVAR",
+      "network": "IR",
+      "distanceDeg": 73.63,
+      "pTravelTimeSec": 689.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "AKASG",
+      "network": "IR",
+      "distanceDeg": 73.76,
+      "pTravelTimeSec": 690.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KIEV",
+      "network": "IR",
+      "distanceDeg": 73.78,
+      "pTravelTimeSec": 690.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "QLMT",
+      "network": "IR",
+      "distanceDeg": 73.89,
+      "pTravelTimeSec": 692.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ELK",
+      "network": "IR",
+      "distanceDeg": 74.16,
+      "pTravelTimeSec": 692.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "YMR",
+      "network": "IR",
+      "distanceDeg": 74.25,
+      "pTravelTimeSec": 694.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "GCMT",
+      "network": "IR",
+      "distanceDeg": 74.27,
+      "pTravelTimeSec": 694.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "YFT",
+      "network": "IR",
+      "distanceDeg": 74.46,
+      "pTravelTimeSec": 695.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SFJD",
+      "network": "IR",
+      "distanceDeg": 74.56,
+      "pTravelTimeSec": 695.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "NWAO",
+      "network": "IR",
+      "distanceDeg": 74.62,
+      "pTravelTimeSec": 697.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "H17A",
+      "network": "IR",
+      "distanceDeg": 74.64,
+      "pTravelTimeSec": 696.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FLWY",
+      "network": "IR",
+      "distanceDeg": 74.77,
+      "pTravelTimeSec": 705.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FXWY",
+      "network": "IR",
+      "distanceDeg": 74.86,
+      "pTravelTimeSec": 697.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KONO",
+      "network": "IR",
+      "distanceDeg": 74.91,
+      "pTravelTimeSec": 698.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RLMT",
+      "network": "IR",
+      "distanceDeg": 74.91,
+      "pTravelTimeSec": 698.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MOOW",
+      "network": "IR",
+      "distanceDeg": 74.95,
+      "pTravelTimeSec": 697.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HVU",
+      "network": "IR",
+      "distanceDeg": 75,
+      "pTravelTimeSec": 697.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LOHW",
+      "network": "IR",
+      "distanceDeg": 75.11,
+      "pTravelTimeSec": 700.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SNOW",
+      "network": "IR",
+      "distanceDeg": 75.12,
+      "pTravelTimeSec": 699.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "REDW",
+      "network": "IR",
+      "distanceDeg": 75.13,
+      "pTravelTimeSec": 700.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ISA",
+      "network": "IR",
+      "distanceDeg": 75.15,
+      "pTravelTimeSec": 699.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "AHID",
+      "network": "IR",
+      "distanceDeg": 75.36,
+      "pTravelTimeSec": 700.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DAC",
+      "network": "IR",
+      "distanceDeg": 75.36,
+      "pTravelTimeSec": 700.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FRB",
+      "network": "IR",
+      "distanceDeg": 75.37,
+      "pTravelTimeSec": 698.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DGMT",
+      "network": "IR",
+      "distanceDeg": 75.38,
+      "pTravelTimeSec": 700.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BGU",
+      "network": "IR",
+      "distanceDeg": 75.38,
+      "pTravelTimeSec": 702.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "R11A",
+      "network": "IR",
+      "distanceDeg": 75.39,
+      "pTravelTimeSec": 699.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SPUT",
+      "network": "IR",
+      "distanceDeg": 75.48,
+      "pTravelTimeSec": 701.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LAO",
+      "network": "IR",
+      "distanceDeg": 75.52,
+      "pTravelTimeSec": 700.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TPNV",
+      "network": "IR",
+      "distanceDeg": 75.82,
+      "pTravelTimeSec": 702.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HWUT",
+      "network": "IR",
+      "distanceDeg": 75.82,
+      "pTravelTimeSec": 702.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DUG",
+      "network": "IR",
+      "distanceDeg": 75.96,
+      "pTravelTimeSec": 703,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TCUT",
+      "network": "IR",
+      "distanceDeg": 76.22,
+      "pTravelTimeSec": 715.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PASC",
+      "network": "IR",
+      "distanceDeg": 76.23,
+      "pTravelTimeSec": 706.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PDAR",
+      "network": "IR",
+      "distanceDeg": 76.24,
+      "pTravelTimeSec": 703.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BW06",
+      "network": "IR",
+      "distanceDeg": 76.24,
+      "pTravelTimeSec": 706.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CTU",
+      "network": "IR",
+      "distanceDeg": 76.28,
+      "pTravelTimeSec": 707.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BORG",
+      "network": "IR",
+      "distanceDeg": 76.49,
+      "pTravelTimeSec": 708,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "JLU",
+      "network": "IR",
+      "distanceDeg": 76.52,
+      "pTravelTimeSec": 708.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "NLU",
+      "network": "IR",
+      "distanceDeg": 76.55,
+      "pTravelTimeSec": 708.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RAO",
+      "network": "IR",
+      "distanceDeg": 76.77,
+      "pTravelTimeSec": 710.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SHPR",
+      "network": "IR",
+      "distanceDeg": 76.78,
+      "pTravelTimeSec": 707.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MPU",
+      "network": "IR",
+      "distanceDeg": 76.78,
+      "pTravelTimeSec": 709.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CCUT",
+      "network": "IR",
+      "distanceDeg": 77.26,
+      "pTravelTimeSec": 725.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MSU",
+      "network": "IR",
+      "distanceDeg": 77.39,
+      "pTravelTimeSec": 711.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TMUT",
+      "network": "IR",
+      "distanceDeg": 77.48,
+      "pTravelTimeSec": 712.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "P17A",
+      "network": "IR",
+      "distanceDeg": 77.65,
+      "pTravelTimeSec": 712.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LCMT",
+      "network": "IR",
+      "distanceDeg": 77.67,
+      "pTravelTimeSec": 712.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MTPU",
+      "network": "IR",
+      "distanceDeg": 77.68,
+      "pTravelTimeSec": 715.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PFO",
+      "network": "IR",
+      "distanceDeg": 77.71,
+      "pTravelTimeSec": 713.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RGN",
+      "network": "IR",
+      "distanceDeg": 77.71,
+      "pTravelTimeSec": 714.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "Q16A",
+      "network": "IR",
+      "distanceDeg": 77.75,
+      "pTravelTimeSec": 713.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "P18A",
+      "network": "IR",
+      "distanceDeg": 77.85,
+      "pTravelTimeSec": 714.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KNB",
+      "network": "IR",
+      "distanceDeg": 77.93,
+      "pTravelTimeSec": 714.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PKCU",
+      "network": "IR",
+      "distanceDeg": 77.98,
+      "pTravelTimeSec": 716.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SRU",
+      "network": "IR",
+      "distanceDeg": 78.01,
+      "pTravelTimeSec": 714.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "K22A",
+      "network": "IR",
+      "distanceDeg": 78.02,
+      "pTravelTimeSec": 716,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ULM",
+      "network": "IR",
+      "distanceDeg": 78.03,
+      "pTravelTimeSec": 714.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MDND",
+      "network": "IR",
+      "distanceDeg": 78.05,
+      "pTravelTimeSec": 717.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TIRR",
+      "network": "IR",
+      "distanceDeg": 78.35,
+      "pTravelTimeSec": 716.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RSSD",
+      "network": "IR",
+      "distanceDeg": 78.38,
+      "pTravelTimeSec": 716.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "OJC",
+      "network": "IR",
+      "distanceDeg": 78.41,
+      "pTravelTimeSec": 717.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "W13A",
+      "network": "IR",
+      "distanceDeg": 78.46,
+      "pTravelTimeSec": 716.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BRTR",
+      "network": "IR",
+      "distanceDeg": 78.58,
+      "pTravelTimeSec": 718.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "U15A",
+      "network": "IR",
+      "distanceDeg": 78.64,
+      "pTravelTimeSec": 718.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "OUZ",
+      "network": "IR",
+      "distanceDeg": 78.66,
+      "pTravelTimeSec": 720.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "O20A",
+      "network": "IR",
+      "distanceDeg": 78.7,
+      "pTravelTimeSec": 717.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "Y12C",
+      "network": "IR",
+      "distanceDeg": 78.89,
+      "pTravelTimeSec": 719.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MLR",
+      "network": "IR",
+      "distanceDeg": 78.91,
+      "pTravelTimeSec": 720.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ANTO",
+      "network": "IR",
+      "distanceDeg": 78.98,
+      "pTravelTimeSec": 721.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DGAR",
+      "network": "IR",
+      "distanceDeg": 79.12,
+      "pTravelTimeSec": 722.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PV09",
+      "network": "IR",
+      "distanceDeg": 79.24,
+      "pTravelTimeSec": 724.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PV10",
+      "network": "IR",
+      "distanceDeg": 79.37,
+      "pTravelTimeSec": 723.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "AGMN",
+      "network": "IR",
+      "distanceDeg": 79.47,
+      "pTravelTimeSec": 723.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PHWY",
+      "network": "IR",
+      "distanceDeg": 79.51,
+      "pTravelTimeSec": 725,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "N23A",
+      "network": "IR",
+      "distanceDeg": 79.51,
+      "pTravelTimeSec": 725.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PV05",
+      "network": "IR",
+      "distanceDeg": 79.53,
+      "pTravelTimeSec": 723.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "Y14A",
+      "network": "IR",
+      "distanceDeg": 79.76,
+      "pTravelTimeSec": 725.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "WUAZ",
+      "network": "IR",
+      "distanceDeg": 79.79,
+      "pTravelTimeSec": 724.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PV01",
+      "network": "IR",
+      "distanceDeg": 79.81,
+      "pTravelTimeSec": 724.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "113A",
+      "network": "IR",
+      "distanceDeg": 80,
+      "pTravelTimeSec": 725.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SMCO",
+      "network": "IR",
+      "distanceDeg": 80.06,
+      "pTravelTimeSec": 725.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PSZ",
+      "network": "IR",
+      "distanceDeg": 80.07,
+      "pTravelTimeSec": 727,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RAR",
+      "network": "IR",
+      "distanceDeg": 80.29,
+      "pTravelTimeSec": 729.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CLL",
+      "network": "IR",
+      "distanceDeg": 80.38,
+      "pTravelTimeSec": 727.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ISCO",
+      "network": "IR",
+      "distanceDeg": 80.43,
+      "pTravelTimeSec": 730.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "X16A",
+      "network": "IR",
+      "distanceDeg": 80.45,
+      "pTravelTimeSec": 729.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "VRAC",
+      "network": "IR",
+      "distanceDeg": 80.47,
+      "pTravelTimeSec": 729.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MVCO",
+      "network": "IR",
+      "distanceDeg": 80.47,
+      "pTravelTimeSec": 730,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RAYN",
+      "network": "IR",
+      "distanceDeg": 80.88,
+      "pTravelTimeSec": 730.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TAU",
+      "network": "IR",
+      "distanceDeg": 80.95,
+      "pTravelTimeSec": 732.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "W18A",
+      "network": "IR",
+      "distanceDeg": 81.07,
+      "pTravelTimeSec": 734.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "S22A",
+      "network": "IR",
+      "distanceDeg": 81.1,
+      "pTravelTimeSec": 731.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "Q24A",
+      "network": "IR",
+      "distanceDeg": 81.26,
+      "pTravelTimeSec": 734.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "X18A",
+      "network": "IR",
+      "distanceDeg": 81.32,
+      "pTravelTimeSec": 734.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ASF",
+      "network": "IR",
+      "distanceDeg": 81.43,
+      "pTravelTimeSec": 734.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "OGNE",
+      "network": "IR",
+      "distanceDeg": 81.64,
+      "pTravelTimeSec": 736.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "EYMN",
+      "network": "IR",
+      "distanceDeg": 81.67,
+      "pTravelTimeSec": 735.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MMAI",
+      "network": "IR",
+      "distanceDeg": 81.85,
+      "pTravelTimeSec": 736.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KHC",
+      "network": "IR",
+      "distanceDeg": 81.86,
+      "pTravelTimeSec": 735.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SDCO",
+      "network": "IR",
+      "distanceDeg": 81.88,
+      "pTravelTimeSec": 736,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CSS",
+      "network": "IR",
+      "distanceDeg": 81.88,
+      "pTravelTimeSec": 736.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "GERES",
+      "network": "IR",
+      "distanceDeg": 82.04,
+      "pTravelTimeSec": 736.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ALN",
+      "network": "IR",
+      "distanceDeg": 82.07,
+      "pTravelTimeSec": 738.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HIZ",
+      "network": "IR",
+      "distanceDeg": 82.07,
+      "pTravelTimeSec": 738.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "EKA",
+      "network": "IR",
+      "distanceDeg": 82.19,
+      "pTravelTimeSec": 737.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ESK",
+      "network": "IR",
+      "distanceDeg": 82.22,
+      "pTravelTimeSec": 739.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TUC",
+      "network": "IR",
+      "distanceDeg": 82.23,
+      "pTravelTimeSec": 737.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "GRFO",
+      "network": "IR",
+      "distanceDeg": 82.36,
+      "pTravelTimeSec": 739.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MXZ",
+      "network": "IR",
+      "distanceDeg": 82.44,
+      "pTravelTimeSec": 745.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ECSD",
+      "network": "IR",
+      "distanceDeg": 82.46,
+      "pTravelTimeSec": 740,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SMTH",
+      "network": "IR",
+      "distanceDeg": 82.65,
+      "pTravelTimeSec": 740.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "GADA",
+      "network": "IR",
+      "distanceDeg": 82.65,
+      "pTravelTimeSec": 740.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KSCO",
+      "network": "IR",
+      "distanceDeg": 82.66,
+      "pTravelTimeSec": 741.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "EZN",
+      "network": "IR",
+      "distanceDeg": 82.67,
+      "pTravelTimeSec": 742.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KAVA",
+      "network": "IR",
+      "distanceDeg": 82.82,
+      "pTravelTimeSec": 742.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "NVR",
+      "network": "IR",
+      "distanceDeg": 82.91,
+      "pTravelTimeSec": 741.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "T25A",
+      "network": "IR",
+      "distanceDeg": 82.93,
+      "pTravelTimeSec": 742.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PRK",
+      "network": "IR",
+      "distanceDeg": 83.1,
+      "pTravelTimeSec": 743.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SPMN",
+      "network": "IR",
+      "distanceDeg": 83.16,
+      "pTravelTimeSec": 744,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ANMO",
+      "network": "IR",
+      "distanceDeg": 83.19,
+      "pTravelTimeSec": 742.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BKZ",
+      "network": "IR",
+      "distanceDeg": 83.21,
+      "pTravelTimeSec": 742.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SRS",
+      "network": "IR",
+      "distanceDeg": 83.22,
+      "pTravelTimeSec": 741.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FETY",
+      "network": "IR",
+      "distanceDeg": 83.31,
+      "pTravelTimeSec": 742.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SIGR",
+      "network": "IR",
+      "distanceDeg": 83.36,
+      "pTravelTimeSec": 745,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BGNE",
+      "network": "IR",
+      "distanceDeg": 83.37,
+      "pTravelTimeSec": 744.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "YER",
+      "network": "IR",
+      "distanceDeg": 83.44,
+      "pTravelTimeSec": 748.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "Y22D",
+      "network": "IR",
+      "distanceDeg": 83.5,
+      "pTravelTimeSec": 755.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KNT",
+      "network": "IR",
+      "distanceDeg": 83.55,
+      "pTravelTimeSec": 742.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SOH",
+      "network": "IR",
+      "distanceDeg": 83.56,
+      "pTravelTimeSec": 744.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "OUR",
+      "network": "IR",
+      "distanceDeg": 83.57,
+      "pTravelTimeSec": 746.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "VAY",
+      "network": "IR",
+      "distanceDeg": 83.6,
+      "pTravelTimeSec": 747.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SKO",
+      "network": "IR",
+      "distanceDeg": 83.71,
+      "pTravelTimeSec": 747.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "319A",
+      "network": "IR",
+      "distanceDeg": 83.81,
+      "pTravelTimeSec": 744.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PLG",
+      "network": "IR",
+      "distanceDeg": 83.83,
+      "pTravelTimeSec": 747.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CHOS",
+      "network": "IR",
+      "distanceDeg": 83.83,
+      "pTravelTimeSec": 747.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HORT",
+      "network": "IR",
+      "distanceDeg": 83.85,
+      "pTravelTimeSec": 746.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SMG",
+      "network": "IR",
+      "distanceDeg": 83.86,
+      "pTravelTimeSec": 747.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "STU",
+      "network": "IR",
+      "distanceDeg": 83.88,
+      "pTravelTimeSec": 747.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "THE",
+      "network": "IR",
+      "distanceDeg": 83.9,
+      "pTravelTimeSec": 748.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SCHQ",
+      "network": "IR",
+      "distanceDeg": 83.91,
+      "pTravelTimeSec": 746.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "GRG",
+      "network": "IR",
+      "distanceDeg": 83.96,
+      "pTravelTimeSec": 745,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CWF",
+      "network": "IR",
+      "distanceDeg": 84,
+      "pTravelTimeSec": 747.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PAIG",
+      "network": "IR",
+      "distanceDeg": 84.03,
+      "pTravelTimeSec": 747.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BODT",
+      "network": "IR",
+      "distanceDeg": 84.05,
+      "pTravelTimeSec": 748.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "COWI",
+      "network": "IR",
+      "distanceDeg": 84.12,
+      "pTravelTimeSec": 747.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ARG",
+      "network": "IR",
+      "distanceDeg": 84.16,
+      "pTravelTimeSec": 749.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "WLF",
+      "network": "IR",
+      "distanceDeg": 84.26,
+      "pTravelTimeSec": 748.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HSIG",
+      "network": "IR",
+      "distanceDeg": 84.26,
+      "pTravelTimeSec": 749.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "EIL",
+      "network": "IR",
+      "distanceDeg": 84.32,
+      "pTravelTimeSec": 749.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CBKS",
+      "network": "IR",
+      "distanceDeg": 84.39,
+      "pTravelTimeSec": 750.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "THZ",
+      "network": "IR",
+      "distanceDeg": 84.4,
+      "pTravelTimeSec": 749.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "NIS1",
+      "network": "IR",
+      "distanceDeg": 84.44,
+      "pTravelTimeSec": 751.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TTG",
+      "network": "IR",
+      "distanceDeg": 84.45,
+      "pTravelTimeSec": 750.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "AOS",
+      "network": "IR",
+      "distanceDeg": 84.46,
+      "pTravelTimeSec": 749.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BIA",
+      "network": "IR",
+      "distanceDeg": 84.47,
+      "pTravelTimeSec": 750.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TRI",
+      "network": "IR",
+      "distanceDeg": 84.48,
+      "pTravelTimeSec": 750,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BFZ",
+      "network": "IR",
+      "distanceDeg": 84.49,
+      "pTravelTimeSec": 750.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SRIG",
+      "network": "IR",
+      "distanceDeg": 84.49,
+      "pTravelTimeSec": 765.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LIT",
+      "network": "IR",
+      "distanceDeg": 84.53,
+      "pTravelTimeSec": 749.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PPT",
+      "network": "IR",
+      "distanceDeg": 84.53,
+      "pTravelTimeSec": 751.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SNZO",
+      "network": "IR",
+      "distanceDeg": 84.55,
+      "pTravelTimeSec": 765.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BFO",
+      "network": "IR",
+      "distanceDeg": 84.57,
+      "pTravelTimeSec": 750.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FNA",
+      "network": "IR",
+      "distanceDeg": 84.61,
+      "pTravelTimeSec": 749.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "XOR",
+      "network": "IR",
+      "distanceDeg": 84.69,
+      "pTravelTimeSec": 746.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "NEO",
+      "network": "IR",
+      "distanceDeg": 84.72,
+      "pTravelTimeSec": 750.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KZN",
+      "network": "IR",
+      "distanceDeg": 84.76,
+      "pTravelTimeSec": 750.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FYTO",
+      "network": "IR",
+      "distanceDeg": 84.8,
+      "pTravelTimeSec": 749.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DSB",
+      "network": "IR",
+      "distanceDeg": 84.89,
+      "pTravelTimeSec": 751.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TIR",
+      "network": "IR",
+      "distanceDeg": 84.96,
+      "pTravelTimeSec": 753.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "APE",
+      "network": "IR",
+      "distanceDeg": 85.05,
+      "pTravelTimeSec": 753,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LTZ",
+      "network": "IR",
+      "distanceDeg": 85.15,
+      "pTravelTimeSec": 754.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FOZ",
+      "network": "IR",
+      "distanceDeg": 85.16,
+      "pTravelTimeSec": 754.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KARP",
+      "network": "IR",
+      "distanceDeg": 85.19,
+      "pTravelTimeSec": 756,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "FUORN",
+      "network": "IR",
+      "distanceDeg": 85.21,
+      "pTravelTimeSec": 753.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DAVOX",
+      "network": "IR",
+      "distanceDeg": 85.24,
+      "pTravelTimeSec": 753.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ATAL",
+      "network": "IR",
+      "distanceDeg": 85.27,
+      "pTravelTimeSec": 754.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PTL",
+      "network": "IR",
+      "distanceDeg": 85.28,
+      "pTravelTimeSec": 755.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LKR",
+      "network": "IR",
+      "distanceDeg": 85.31,
+      "pTravelTimeSec": 752.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ATHU",
+      "network": "IR",
+      "distanceDeg": 85.38,
+      "pTravelTimeSec": 755.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ATH",
+      "network": "IR",
+      "distanceDeg": 85.42,
+      "pTravelTimeSec": 755.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "VLY",
+      "network": "IR",
+      "distanceDeg": 85.46,
+      "pTravelTimeSec": 754.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SCIA",
+      "network": "IR",
+      "distanceDeg": 85.48,
+      "pTravelTimeSec": 756.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "THR2",
+      "network": "IR",
+      "distanceDeg": 85.55,
+      "pTravelTimeSec": 762.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "OXZ",
+      "network": "IR",
+      "distanceDeg": 85.58,
+      "pTravelTimeSec": 755,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "THR3",
+      "network": "IR",
+      "distanceDeg": 85.59,
+      "pTravelTimeSec": 757.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SANT",
+      "network": "IR",
+      "distanceDeg": 85.59,
+      "pTravelTimeSec": 757.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "THR6",
+      "network": "IR",
+      "distanceDeg": 85.63,
+      "pTravelTimeSec": 757.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RPZ",
+      "network": "IR",
+      "distanceDeg": 85.67,
+      "pTravelTimeSec": 756.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TUE",
+      "network": "IR",
+      "distanceDeg": 85.7,
+      "pTravelTimeSec": 756.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "JAN",
+      "network": "IR",
+      "distanceDeg": 85.72,
+      "pTravelTimeSec": 755.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DSF",
+      "network": "IR",
+      "distanceDeg": 85.74,
+      "pTravelTimeSec": 756.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "EVR",
+      "network": "IR",
+      "distanceDeg": 85.76,
+      "pTravelTimeSec": 755.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LTK",
+      "network": "IR",
+      "distanceDeg": 85.79,
+      "pTravelTimeSec": 756.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KSU1",
+      "network": "IR",
+      "distanceDeg": 85.86,
+      "pTravelTimeSec": 756.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KALE",
+      "network": "IR",
+      "distanceDeg": 85.97,
+      "pTravelTimeSec": 754.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DSL",
+      "network": "IR",
+      "distanceDeg": 85.97,
+      "pTravelTimeSec": 755.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CRLZ",
+      "network": "IR",
+      "distanceDeg": 85.98,
+      "pTravelTimeSec": 765.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DID",
+      "network": "IR",
+      "distanceDeg": 86.01,
+      "pTravelTimeSec": 755.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ZKR",
+      "network": "IR",
+      "distanceDeg": 86.04,
+      "pTravelTimeSec": 760,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MNTX",
+      "network": "IR",
+      "distanceDeg": 86.05,
+      "pTravelTimeSec": 757.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LBZ",
+      "network": "IR",
+      "distanceDeg": 86.06,
+      "pTravelTimeSec": 758.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "IGT",
+      "network": "IR",
+      "distanceDeg": 86.08,
+      "pTravelTimeSec": 755.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MSTX",
+      "network": "IR",
+      "distanceDeg": 86.08,
+      "pTravelTimeSec": 758.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "AMTX",
+      "network": "IR",
+      "distanceDeg": 86.08,
+      "pTravelTimeSec": 758.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "JFWS",
+      "network": "IR",
+      "distanceDeg": 86.11,
+      "pTravelTimeSec": 758.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MQZ",
+      "network": "IR",
+      "distanceDeg": 86.11,
+      "pTravelTimeSec": 765.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LAKA",
+      "network": "IR",
+      "distanceDeg": 86.16,
+      "pTravelTimeSec": 758.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "WKZ",
+      "network": "IR",
+      "distanceDeg": 86.17,
+      "pTravelTimeSec": 765.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "GUR",
+      "network": "IR",
+      "distanceDeg": 86.19,
+      "pTravelTimeSec": 758.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KLV",
+      "network": "IR",
+      "distanceDeg": 86.21,
+      "pTravelTimeSec": 757.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KEK",
+      "network": "IR",
+      "distanceDeg": 86.22,
+      "pTravelTimeSec": 758.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "NPS",
+      "network": "IR",
+      "distanceDeg": 86.29,
+      "pTravelTimeSec": 760.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DCZ",
+      "network": "IR",
+      "distanceDeg": 86.33,
+      "pTravelTimeSec": 761.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LAST",
+      "network": "IR",
+      "distanceDeg": 86.43,
+      "pTravelTimeSec": 761.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "MLZ",
+      "network": "IR",
+      "distanceDeg": 86.45,
+      "pTravelTimeSec": 760.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LKD2",
+      "network": "IR",
+      "distanceDeg": 86.46,
+      "pTravelTimeSec": 759.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "RLS",
+      "network": "IR",
+      "distanceDeg": 86.57,
+      "pTravelTimeSec": 761,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "VLX",
+      "network": "IR",
+      "distanceDeg": 86.58,
+      "pTravelTimeSec": 759.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SENIN",
+      "network": "IR",
+      "distanceDeg": 86.59,
+      "pTravelTimeSec": 759.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "IDI",
+      "network": "IR",
+      "distanceDeg": 86.68,
+      "pTravelTimeSec": 760.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "VLI",
+      "network": "IR",
+      "distanceDeg": 86.75,
+      "pTravelTimeSec": 759.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ODZ",
+      "network": "IR",
+      "distanceDeg": 86.79,
+      "pTravelTimeSec": 760.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DYA",
+      "network": "IR",
+      "distanceDeg": 86.8,
+      "pTravelTimeSec": 761.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PYZ",
+      "network": "IR",
+      "distanceDeg": 86.87,
+      "pTravelTimeSec": 775.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "WHZ",
+      "network": "IR",
+      "distanceDeg": 86.91,
+      "pTravelTimeSec": 775.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SIVA",
+      "network": "IR",
+      "distanceDeg": 86.92,
+      "pTravelTimeSec": 761.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "VLS",
+      "network": "IR",
+      "distanceDeg": 86.95,
+      "pTravelTimeSec": 763.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "VLDQ",
+      "network": "IR",
+      "distanceDeg": 86.96,
+      "pTravelTimeSec": 760.6,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ITM",
+      "network": "IR",
+      "distanceDeg": 86.97,
+      "pTravelTimeSec": 763.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "VAM",
+      "network": "IR",
+      "distanceDeg": 86.99,
+      "pTravelTimeSec": 761.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "KYTH",
+      "network": "IR",
+      "distanceDeg": 87.01,
+      "pTravelTimeSec": 761.4,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "GLMI",
+      "network": "IR",
+      "distanceDeg": 87.04,
+      "pTravelTimeSec": 763.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ANKY",
+      "network": "IR",
+      "distanceDeg": 87.16,
+      "pTravelTimeSec": 764.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "VLC",
+      "network": "IR",
+      "distanceDeg": 87.16,
+      "pTravelTimeSec": 764.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "DAMY",
+      "network": "IR",
+      "distanceDeg": 87.22,
+      "pTravelTimeSec": 764.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "PYL",
+      "network": "IR",
+      "distanceDeg": 87.28,
+      "pTravelTimeSec": 762.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "U34A",
+      "network": "IR",
+      "distanceDeg": 87.32,
+      "pTravelTimeSec": 763.8,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "GVD",
+      "network": "IR",
+      "distanceDeg": 87.46,
+      "pTravelTimeSec": 766.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "V34A",
+      "network": "IR",
+      "distanceDeg": 87.77,
+      "pTravelTimeSec": 767.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "WMOK",
+      "network": "IR",
+      "distanceDeg": 87.85,
+      "pTravelTimeSec": 767.7,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "LPIG",
+      "network": "IR",
+      "distanceDeg": 87.91,
+      "pTravelTimeSec": 766.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "BNI",
+      "network": "IR",
+      "distanceDeg": 87.93,
+      "pTravelTimeSec": 766.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CUC",
+      "network": "IR",
+      "distanceDeg": 87.99,
+      "pTravelTimeSec": 767.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "W34A",
+      "network": "IR",
+      "distanceDeg": 88.06,
+      "pTravelTimeSec": 768.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TIP",
+      "network": "IR",
+      "distanceDeg": 88.16,
+      "pTravelTimeSec": 767.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HDIL",
+      "network": "IR",
+      "distanceDeg": 88.4,
+      "pTravelTimeSec": 770.5,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SLBS",
+      "network": "IR",
+      "distanceDeg": 88.43,
+      "pTravelTimeSec": 769.9,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SSB",
+      "network": "IR",
+      "distanceDeg": 88.55,
+      "pTravelTimeSec": 769.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TUL1",
+      "network": "IR",
+      "distanceDeg": 88.66,
+      "pTravelTimeSec": 770.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "TXAR",
+      "network": "IR",
+      "distanceDeg": 88.75,
+      "pTravelTimeSec": 771.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "ABTX",
+      "network": "IR",
+      "distanceDeg": 88.88,
+      "pTravelTimeSec": 772.2,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "SADO",
+      "network": "IR",
+      "distanceDeg": 89.23,
+      "pTravelTimeSec": 774.1,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "CEL",
+      "network": "IR",
+      "distanceDeg": 89.29,
+      "pTravelTimeSec": 775.3,
+      "sTravelTimeSec": null
+    },
+    {
+      "station": "HHAR",
+      "network": "IR",
+      "distanceDeg": 89.37,
+      "pTravelTimeSec": 774.2,
+      "sTravelTimeSec": null
+    }
+  ]
+}
\ No newline at end of file
diff --git a/src/earth.ts b/src/earth.ts
new file mode 100644
index 0000000..464cdf7
--- /dev/null
+++ b/src/earth.ts
@@ -0,0 +1,189 @@
+import type { AppState } from './controls';
+
+// Map a P-wave velocity (km/s) to a fill colour.
+// Range 1–15.5 km/s → very dark brown (slow) to bright yellow (fast).
+// Same velocity always produces the same colour, regardless of which layer it
+// comes from — so equal-speed regions look identical on screen.
+function velocityToColor(v: number): string {
+  const t = Math.max(0, Math.min(1, (v - 1.0) / 14.5));
+  const hue = Math.round(22 + t * 26);   // 22° (red-orange) → 48° (golden yellow)
+  const sat = Math.round(65 + t * 30);   // 65% → 95%
+  const lit = Math.round(14 + t * 48);   // 14% → 62%
+  return `hsl(${hue}, ${sat}%, ${lit}%)`;
+}
+
+export interface EarthLayer {
+  rMin: number;
+  rMax: number;
+  vP: (r: number) => number;
+  vS: (r: number) => number;
+  name: string;
+  color: string;
+}
+
+export interface EarthModel {
+  radius: number;
+  layers: EarthLayer[];
+  vAt(r: number, wave: 'P' | 'S'): number;
+  layerAt(r: number): EarthLayer;
+}
+
+export const R_EARTH = 6371;
+
+export function buildEarthModel(state: AppState): EarthModel {
+  const { outerCoreRadius, outerCoreVTop, outerCoreVBottom, innerCoreRadius, innerCoreV } = state;
+
+  // Clamp inner core so it fits inside outer core
+  const icr = Math.min(innerCoreRadius, outerCoreRadius - 1);
+
+  // Mantle: linear velocity with depth (increases going down, i.e. as r decreases).
+  // Lower mantle: 3480–5701 km  v_P = 13.7 → 10.7 (with r)
+  // Upper mantle: 5701–6371 km  v_P = 10.5 → 7.5  (with r)
+  // We parameterise generically so the CMB velocity matches outerCoreRadius.
+  const CMB = outerCoreRadius;
+
+  // Fixed mantle model (not user-controlled) referenced from plan.md PREM table.
+  // Lower mantle base at CMB: 13.7 km/s, top at 5701: 10.7 km/s
+  // Upper mantle base at 5701: 10.5 km/s, top at surface: 7.5 km/s
+  const LM_RMIN = CMB;
+  const LM_RMAX = 5701;
+
+  const layers: EarthLayer[] = [];
+
+  // ── Inner core ───────────────────────────────────────────────────────────
+  if (icr > 0) {
+    layers.push({
+      rMin: 0,
+      rMax: icr,
+      vP: () => innerCoreV,
+      vS: () => 3.5,
+      name: 'Inner Core',
+      color: velocityToColor(innerCoreV),
+    });
+  }
+
+  // ── Outer core ───────────────────────────────────────────────────────────
+  // Velocity varies linearly from outerCoreVBottom at r=icr to outerCoreVTop at r=CMB.
+  // Treated as liquid (vS=0) when outerCoreVTop < 10 km/s; solid otherwise.
+  const ocRange = CMB - icr;
+  const ocMidV = ocRange <= 0 ? outerCoreVTop
+    : (outerCoreVBottom + outerCoreVTop) / 2;
+  const ocIsSolid = outerCoreVTop >= 10;
+  layers.push({
+    rMin: icr,
+    rMax: CMB,
+    vP: (r) => {
+      if (ocRange <= 0) return outerCoreVTop;
+      const t = (r - icr) / ocRange; // 0 at inner boundary, 1 at CMB
+      return outerCoreVBottom + t * (outerCoreVTop - outerCoreVBottom);
+    },
+    vS: ocIsSolid
+      ? (r) => {
+          if (ocRange <= 0) return outerCoreVTop * 0.6;
+          const t = (r - icr) / ocRange;
+          return (outerCoreVBottom + t * (outerCoreVTop - outerCoreVBottom)) * 0.6;
+        }
+      : () => 0,
+    name: 'Outer Core',
+    color: velocityToColor(ocMidV),
+  });
+
+  // ── Mantle (lower + upper) ───────────────────────────────────────────────
+  // For presets that change outerCoreRadius, the lower mantle simply starts at CMB.
+  // If CMB > 5701 there is no lower mantle, only upper.
+  if (CMB < LM_RMAX) {
+    const lmRmin = CMB;
+    const lmRmax = Math.min(LM_RMAX, R_EARTH);
+    const vLmBot = 13.7;
+    const vLmTop = 10.7;
+    layers.push({
+      rMin: lmRmin,
+      rMax: lmRmax,
+      vP: (r) => {
+        const t = (r - lmRmin) / (lmRmax - lmRmin);
+        return vLmBot + t * (vLmTop - vLmBot);
+      },
+      vS: (r) => {
+        const t = (r - lmRmin) / (lmRmax - lmRmin);
+        return 7.3 + t * (6.5 - 7.3);
+      },
+      name: 'Lower Mantle',
+      color: velocityToColor((vLmBot + vLmTop) / 2),
+    });
+  }
+
+  // Upper mantle (only if CMB < R_EARTH)
+  const umRmin = Math.max(CMB, LM_RMAX);
+  if (umRmin < R_EARTH) {
+    const umRmax = R_EARTH;
+    const vUmBot = CMB >= LM_RMAX ? 13.7 - 3.0 * (CMB - LM_RMIN) / (LM_RMAX - LM_RMIN) : 10.5;
+    const vUmTop = 7.5;
+    layers.push({
+      rMin: umRmin,
+      rMax: umRmax,
+      vP: (r) => {
+        const t = (r - umRmin) / (umRmax - umRmin);
+        return vUmBot + t * (vUmTop - vUmBot);
+      },
+      vS: (r) => {
+        const t = (r - umRmin) / (umRmax - umRmin);
+        return 4.5 + t * (5.5 - 4.5);
+      },
+      name: 'Upper Mantle',
+      color: velocityToColor((vUmBot + vUmTop) / 2),
+    });
+  }
+
+  // Sort layers innermost → outermost
+  layers.sort((a, b) => a.rMin - b.rMin);
+
+  const model: EarthModel = {
+    radius: R_EARTH,
+    layers,
+    vAt(r: number, wave: 'P' | 'S'): number {
+      const layer = this.layerAt(r);
+      return wave === 'P' ? layer.vP(r) : layer.vS(r);
+    },
+    layerAt(r: number): EarthLayer {
+      // Walk from inner to outer
+      for (const l of this.layers) {
+        if (r <= l.rMax) return l;
+      }
+      return this.layers[this.layers.length - 1];
+    },
+  };
+
+  return model;
+}
+
+// ── Presets ───────────────────────────────────────────────────────────────────
+
+const BASE: AppState = {
+  outerCoreRadius: 3480,
+  outerCoreVTop: 8.0,
+  outerCoreVBottom: 10.4,
+  innerCoreRadius: 1220,
+  innerCoreV: 11.3,
+  waveType: 'P',
+  numRays: 60,
+  preset: 'earth',
+  earthquakeId: '',
+};
+
+export const PRESETS: Record<string, AppState> = {
+  earth: { ...BASE, preset: 'earth' },
+  solid: {
+    // Solid (no liquid outer core): velocities increase with depth continuously.
+    // outerCoreVTop matches the lower mantle at the CMB (13.7) — no P-wave discontinuity.
+    // outerCoreVTop >= 10 triggers solid vS behaviour in buildEarthModel.
+    ...BASE,
+    outerCoreVTop: 13.7,
+    outerCoreVBottom: 14.5,
+    innerCoreV: 14.5,
+    preset: 'solid',
+  },
+  'water-core': { ...BASE, outerCoreVTop: 1.5, outerCoreVBottom: 1.8, preset: 'water-core' },
+  'giant-core': { ...BASE, outerCoreRadius: 5000, innerCoreRadius: 1220, preset: 'giant-core' },
+  'tiny-core': { ...BASE, outerCoreRadius: 500, innerCoreRadius: 200, preset: 'tiny-core' },
+  'fast-core': { ...BASE, outerCoreVTop: 15.0, outerCoreVBottom: 14.0, innerCoreV: 14.5, preset: 'fast-core' },
+};
diff --git a/src/earthquakeData.ts b/src/earthquakeData.ts
new file mode 100644
index 0000000..4e6c5bf
--- /dev/null
+++ b/src/earthquakeData.ts
@@ -0,0 +1,58 @@
+/**
+ * Types for pre-fetched real-world seismic datasets.
+ * JSON files in src/data/ are populated by scripts/fetch-earthquake-data.mjs.
+ */
+
+export interface PhaseArrival {
+  /** FDSN station code, e.g. "ANMO" */
+  station: string;
+  /** FDSN network code, e.g. "IU" */
+  network: string;
+  /** Epicentral distance in degrees */
+  distanceDeg: number;
+  /** Observed P travel time in seconds (arrival_time - origin_time). null if phase not picked. */
+  pTravelTimeSec: number | null;
+  /** Observed S travel time in seconds. null if not picked or in shadow. */
+  sTravelTimeSec: number | null;
+}
+
+export interface EarthquakeDataset {
+  /** Short unique identifier, e.g. "tohoku-2011" */
+  id: string;
+  /** Human-readable name */
+  name: string;
+  /** ISO8601 origin time */
+  originTime: string;
+  /** Epicenter latitude */
+  latitude: number;
+  /** Epicenter longitude */
+  longitude: number;
+  /** Hypocenter depth in km */
+  depthKm: number;
+  /** Moment magnitude */
+  magnitudeMw: number;
+  /** USGS ComCat event ID, e.g. "official20110311054624120_30" */
+  usgsId: string;
+  /** Short description of what makes this event interesting for shadow zone study */
+  note: string;
+  /** Phase arrival observations from global network */
+  arrivals: PhaseArrival[];
+}
+
+// ── Dataset registry ──────────────────────────────────────────────────────────
+// Each dataset JSON is imported statically so Vite bundles it.
+// Run `npm run fetch-data` to (re-)populate the JSON files.
+
+import tohoku from './data/tohoku-2011.json';
+import chile from './data/chile-2010.json';
+import okhotsk from './data/okhotsk-2013.json';
+
+export const EARTHQUAKE_DATASETS: EarthquakeDataset[] = [
+  tohoku as EarthquakeDataset,
+  chile as EarthquakeDataset,
+  okhotsk as EarthquakeDataset,
+];
+
+export function getDataset(id: string): EarthquakeDataset | undefined {
+  return EARTHQUAKE_DATASETS.find(d => d.id === id);
+}
diff --git a/src/main.ts b/src/main.ts
new file mode 100644
index 0000000..7a32802
--- /dev/null
+++ b/src/main.ts
@@ -0,0 +1,165 @@
+import { initControls } from './controls';
+import { buildEarthModel } from './earth';
+import type { EarthModel } from './earth';
+import { traceAllRays } from './rayTracer';
+import type { RayPath } from './rayTracer';
+import { findShadowZone } from './shadowZone';
+import type { ShadowZoneResult } from './shadowZone';
+import { Renderer } from './renderer';
+import { getDataset } from './earthquakeData';
+import { validateModel, fitnessLabel, countShadowZoneMismatches } from './validator';
+
+const canvas = document.getElementById('canvas') as HTMLCanvasElement;
+const canvasWrap = canvas.parentElement as HTMLDivElement;
+const renderer = new Renderer(canvas);
+const shadowInfoEl = document.getElementById('shadow-zone-info') as HTMLDivElement;
+const validationEl = document.getElementById('validation-info') as HTMLDivElement;
+
+// Restore collapsed/expanded state of the About section
+const descDetails = document.getElementById('description-details') as HTMLDetailsElement;
+descDetails.open = localStorage.getItem('descOpen') !== '0'; // default: open
+descDetails.addEventListener('toggle', () => {
+  localStorage.setItem('descOpen', descDetails.open ? '1' : '0');
+});
+
+// Cached render state — updated on every physics change, reused on resize
+let cachedModel: EarthModel | null = null;
+let cachedRays: RayPath[] = [];
+let cachedShadow: ShadowZoneResult[] = [];
+
+function resizeCanvas(): void {
+  const size = Math.min(canvasWrap.clientWidth - 24, canvasWrap.clientHeight - 24);
+  if (size < 100) return;
+  if (canvas.width === size && canvas.height === size) return;
+  canvas.width = size;
+  canvas.height = size;
+  if (cachedModel) renderer.render(cachedModel, cachedRays, cachedShadow);
+}
+new ResizeObserver(resizeCanvas).observe(canvasWrap);
+
+function updateShadowInfo(
+  pShadows: ShadowZoneResult[],
+  sShadows: ShadowZoneResult[],
+  waveType: string,
+): void {
+  const summary = (label: string, zones: ShadowZoneResult[]) =>
+    zones.length === 0
+      ? `No ${label} shadow zone`
+      : `${zones.length} ${label} shadow zone${zones.length > 1 ? 's' : ''}`;
+
+  if (waveType === 'P') {
+    shadowInfoEl.textContent = summary('P-wave', pShadows);
+  } else if (waveType === 'S') {
+    shadowInfoEl.textContent = summary('S-wave', sShadows);
+  } else {
+    shadowInfoEl.textContent =
+      summary('P-wave', pShadows) + ' · ' + summary('S-wave', sShadows);
+  }
+}
+
+function updateValidation(
+  model: ReturnType<typeof buildEarthModel>,
+  earthquakeId: string,
+): void {
+  if (!earthquakeId) {
+    validationEl.style.display = 'none';
+    return;
+  }
+
+  const dataset = getDataset(earthquakeId);
+  if (!dataset) {
+    validationEl.style.display = 'none';
+    return;
+  }
+
+  validationEl.style.display = '';
+  const result = validateModel(model, dataset);
+  const mismatch = countShadowZoneMismatches(model, dataset);
+
+  if (result.noData) {
+    validationEl.innerHTML =
+      `<b>📡 ${dataset.name}</b><br/>` +
+      `<span style="color:#f0a040">No data yet. Run:</span><br/>` +
+      `<code>npm run fetch-data</code>`;
+    return;
+  }
+
+  if (result.stationCount === 0) {
+    validationEl.innerHTML =
+      `<b>📡 ${dataset.name}</b><br/>No matched P arrivals.`;
+    return;
+  }
+
+  const label = fitnessLabel(result);
+  validationEl.innerHTML =
+    `<b>📡 ${dataset.name}</b><br/>` +
+    `${label}<br/>` +
+    `RMS residual: <b>${result.rmsSec.toFixed(1)} s</b><br/>` +
+    `Mean residual: ${result.meanResidualSec.toFixed(1)} s<br/>` +
+    `Stations matched: ${result.stationCount}<br/>` +
+    `Hit rate ±5s: ${(result.hitRate5s * 100).toFixed(0)}%` +
+    (mismatch.total > 0
+      ? `<br/>Shadow zone mismatches: ${mismatch.inShadow}/${mismatch.total}`
+      : '');
+}
+
+function doRender(newState: Parameters<typeof initControls>[0] extends (s: infer S) => void ? S : never): void {
+  const model = buildEarthModel(newState);
+  const rays = traceAllRays(model, newState.numRays, newState.waveType);
+  const pShadows = findShadowZone(model, 'P');
+  const sShadows = newState.waveType !== 'P' ? findShadowZone(model, 'S') : [];
+  // Canvas shows the wave type that's currently displayed; 'both' defaults to P zones
+  const displayShadows = newState.waveType === 'S' ? sShadows : pShadows;
+  cachedModel = model;
+  cachedRays = rays;
+  cachedShadow = displayShadows;
+  renderer.render(model, rays, displayShadows);
+  updateShadowInfo(pShadows, sShadows, newState.waveType);
+  updateValidation(model, newState.earthquakeId);
+}
+
+// ── Tooltip on shadow zone hover ──────────────────────────────────────────────
+
+const tooltipEl = document.createElement('div');
+tooltipEl.id = 'shadow-tooltip';
+document.body.appendChild(tooltipEl);
+
+function hitTestShadow(
+  mx: number, my: number,
+  shadows: ShadowZoneResult[],
+  cx: number, cy: number,
+  canvasScale: number,
+): ShadowZoneResult | null {
+  const arcW = canvasScale * 0.05;
+  const dist = Math.sqrt((mx - cx) ** 2 + (my - cy) ** 2);
+  if (Math.abs(dist - canvasScale) > arcW * 1.5) return null;
+  // Angle from top (clockwise), normalised to [−π, π]
+  let topAngle = Math.atan2(my - cy, mx - cx) + Math.PI / 2;
+  if (topAngle > Math.PI) topAngle -= 2 * Math.PI;
+  const epicDist = Math.abs(topAngle) * 180 / Math.PI;
+  return shadows.find(z => epicDist >= z.start && epicDist <= z.end) ?? null;
+}
+
+canvas.addEventListener('mousemove', (e) => {
+  const rect = canvas.getBoundingClientRect();
+  const mx = (e.clientX - rect.left) * (canvas.width / rect.width);
+  const my = (e.clientY - rect.top)  * (canvas.height / rect.height);
+  const canvasScale = Math.min(canvas.width, canvas.height) * 0.40;
+  const hit = hitTestShadow(mx, my, cachedShadow, canvas.width / 2, canvas.height / 2, canvasScale);
+  if (hit) {
+    tooltipEl.style.display = 'block';
+    tooltipEl.style.left = (e.clientX + 14) + 'px';
+    tooltipEl.style.top  = (e.clientY - 10) + 'px';
+    tooltipEl.textContent =
+      `Shadow zone: ${hit.start.toFixed(1)}°–${hit.end.toFixed(1)}° (${(hit.end - hit.start).toFixed(1)}° gap)`;
+  } else {
+    tooltipEl.style.display = 'none';
+  }
+});
+
+canvas.addEventListener('mouseleave', () => { tooltipEl.style.display = 'none'; });
+
+// ── Init ──────────────────────────────────────────────────────────────────────
+
+const state = initControls(doRender);
+doRender(state);
diff --git a/src/rayTracer.ts b/src/rayTracer.ts
new file mode 100644
index 0000000..ac47935
--- /dev/null
+++ b/src/rayTracer.ts
@@ -0,0 +1,190 @@
+import type { EarthModel } from './earth';
+import { R_EARTH } from './earth';
+
+export interface RayPoint {
+  r: number;
+  theta: number;
+}
+
+export interface RayPath {
+  points: RayPoint[];
+  rayParameter: number;
+  takeoffAngle: number;
+  epicentralDistance: number | null;
+  travelTimeSec: number | null; // total travel time in seconds; null if ray never resurfaces
+  wave: 'P' | 'S';
+  blocked: boolean;
+}
+
+const STEP = 5; // km
+const MAX_STEPS = 60000;
+
+export function traceRay(
+  model: EarthModel,
+  rayParameter: number,
+  wave: 'P' | 'S',
+  takeoffAngle: number,
+  sourceDepthKm = 0,
+): RayPath {
+  const p = rayParameter;
+  const points: RayPoint[] = [];
+  let blocked = false;
+  let travelTimeSec = 0;
+
+  // Start slightly inside the surface (or at source depth)
+  let r = R_EARTH - sourceDepthKm - 0.1;
+  let theta = 0;
+  let sign = -1; // -1 = going down
+
+  const v0 = model.vAt(r, wave);
+  if (v0 === 0) {
+    return { points, rayParameter: p, takeoffAngle, epicentralDistance: null, travelTimeSec: null, wave, blocked: false };
+  }
+  const sinI0 = p * v0 / r;
+  if (sinI0 > 1) {
+    return { points, rayParameter: p, takeoffAngle, epicentralDistance: null, travelTimeSec: null, wave, blocked: false };
+  }
+
+  // For downgoing ray from a subsurface source, we also need to trace the upgoing
+  // leg to the surface on the source side (theta = 0 side). We start downward only —
+  // the upgoing leg is symmetric and the full path from source to receiver is traced
+  // as one continuous arc.
+
+  let epicentralDistance: number | null = null;
+
+  for (let step = 0; step < MAX_STEPS; step++) {
+    const v = model.vAt(r, wave);
+
+    if (wave === 'S' && v === 0) {
+      blocked = true;
+      break;
+    }
+
+    const sinI = p * v / r;
+
+    if (sinI >= 1) {
+      sign = 1;
+    }
+
+    // cosI → 0 at turning point (sinI = 1). Without a minimum, dr = 0 forever.
+    // A tiny minimum upward velocity lets the ray escape the turning point.
+    const rawCosI = Math.sqrt(Math.max(0, 1 - sinI * sinI));
+    const cosI = sinI >= 1 ? Math.max(rawCosI, 0.001) : rawCosI;
+    const dr = sign * cosI * STEP;
+    const dtheta = (p * v / (r * r)) * STEP;
+
+    const rNext = r + dr;
+    const layerNow = model.layerAt(r);
+    const layerNext = model.layerAt(rNext);
+
+    let newR = rNext;
+    let newSign = sign;
+
+    if (layerNow !== layerNext) {
+      const bR = sign < 0 ? layerNow.rMin : layerNow.rMax;
+
+      const vOld = model.vAt(bR - 0.001 * sign, wave);
+      const vNew = model.vAt(bR + 0.001 * sign, wave);
+
+      const sinIBound = p * vOld / bR;
+      const sinINew = sinIBound * (vNew / vOld);
+
+      if (wave === 'S' && vNew === 0) {
+        const fracStep = Math.abs(bR - r) / (Math.abs(dr) + 1e-10);
+        travelTimeSec += fracStep * STEP / v;
+        points.push({ r: bR, theta: theta + dtheta * fracStep });
+        blocked = true;
+        break;
+      }
+
+      if (Math.abs(sinINew) > 1) {
+        newSign = -sign;
+        newR = r + newSign * cosI * STEP;
+      }
+    }
+
+    points.push({ r, theta });
+    travelTimeSec += STEP / v;
+    r = newR;
+    theta += dtheta;
+    sign = newSign;
+
+    if (r >= R_EARTH) {
+      r = R_EARTH;
+      points.push({ r, theta });
+      epicentralDistance = (theta * 180) / Math.PI;
+      break;
+    }
+
+    if (r <= 1) break;
+  }
+
+  return {
+    points,
+    rayParameter: p,
+    takeoffAngle,
+    epicentralDistance,
+    travelTimeSec: epicentralDistance !== null ? travelTimeSec : null,
+    wave,
+    blocked,
+  };
+}
+
+export function traceAllRays(
+  model: EarthModel,
+  numRays: number,
+  waveType: 'P' | 'S' | 'both',
+  sourceDepthKm = 0,
+): RayPath[] {
+  const results: RayPath[] = [];
+  const waves: Array<'P' | 'S'> = waveType === 'both' ? ['P', 'S'] : [waveType];
+  const sourceR = R_EARTH - sourceDepthKm;
+
+  for (const wave of waves) {
+    const vSource = model.vAt(sourceR - 0.1, wave);
+    if (vSource === 0) continue;
+
+    for (let i = 0; i < numRays; i++) {
+      // Non-linear distribution: t^0.6 biases toward larger takeoff angles
+      // (deeper, more diverse paths), reducing the dense cluster of near-identical
+      // shallow arcs near the epicenter.
+      const t = numRays > 1 ? i / (numRays - 1) : 0;
+      const angleDeg = 5 + Math.pow(t, 0.6) * 84; // 5° – 89°
+      const angleRad = (angleDeg * Math.PI) / 180;
+      const p = (sourceR * Math.sin(angleRad)) / vSource;
+      results.push(traceRay(model, p, wave, angleDeg, sourceDepthKm));
+    }
+  }
+
+  return results;
+}
+
+/**
+ * Given a model, trace enough rays to build a travel-time lookup:
+ * epicentral distance (degrees) → travel time (seconds).
+ * Used for validation against real earthquake observations.
+ */
+export function buildTravelTimeCurve(
+  model: EarthModel,
+  wave: 'P' | 'S',
+  sourceDepthKm: number,
+  numRays = 720,
+): Array<{ distanceDeg: number; travelTimeSec: number }> {
+  const curve: Array<{ distanceDeg: number; travelTimeSec: number }> = [];
+  const sourceR = R_EARTH - sourceDepthKm;
+  const vSource = model.vAt(sourceR - 0.1, wave);
+  if (vSource === 0) return curve;
+
+  for (let i = 0; i < numRays; i++) {
+    const angleDeg = 0.5 + (i / (numRays - 1)) * 88.5;
+    const angleRad = (angleDeg * Math.PI) / 180;
+    const p = (sourceR * Math.sin(angleRad)) / vSource;
+    const ray = traceRay(model, p, wave, angleDeg, sourceDepthKm);
+    if (ray.epicentralDistance !== null && ray.travelTimeSec !== null) {
+      curve.push({ distanceDeg: ray.epicentralDistance, travelTimeSec: ray.travelTimeSec });
+    }
+  }
+
+  curve.sort((a, b) => a.distanceDeg - b.distanceDeg);
+  return curve;
+}
diff --git a/src/renderer.ts b/src/renderer.ts
new file mode 100644
index 0000000..2aa4d7e
--- /dev/null
+++ b/src/renderer.ts
@@ -0,0 +1,186 @@
+import type { EarthModel } from './earth';
+import type { RayPath } from './rayTracer';
+import type { ShadowZoneResult } from './shadowZone';
+
+export class Renderer {
+  private ctx: CanvasRenderingContext2D;
+  private w: number;
+  private h: number;
+
+  constructor(private canvas: HTMLCanvasElement) {
+    this.ctx = canvas.getContext('2d')!;
+    this.w = canvas.width;
+    this.h = canvas.height;
+  }
+
+  // Subsample rays for display so near-duplicate paths are skipped.
+  // Sorts by representative angle and keeps rays with at least minSep° separation.
+  private subsampleRays(rays: RayPath[]): RayPath[] {
+    // Show small counts exactly as-is — user explicitly chose that number.
+    if (rays.length <= 50) return rays;
+    const norm = (d: number): number => { const n = d % 360; return n > 180 ? 360 - n : n; };
+    // Scale min separation inversely with ray count so screen density is proportional
+    // to the slider value (5× more rays → ~5× denser). Floor of 0.3° prevents
+    // drawing exact-duplicate paths that trace the same route.
+    const minSep = Math.max(0.3, 180 / rays.length);
+
+    const withAngle = rays
+      .map(r => {
+        if (r.epicentralDistance !== null && !r.blocked) {
+          return { ray: r, angle: norm(r.epicentralDistance) };
+        }
+        if (r.blocked && r.points.length > 0) {
+          return { ray: r, angle: r.points[r.points.length - 1].theta * 180 / Math.PI };
+        }
+        return null;
+      })
+      .filter((x): x is { ray: RayPath; angle: number } => x !== null)
+      .sort((a, b) => a.angle - b.angle);
+
+    const kept: RayPath[] = [];
+    let last = -Infinity;
+    for (const { ray, angle } of withAngle) {
+      if (angle - last >= minSep) {
+        kept.push(ray);
+        last = angle;
+      }
+    }
+    return kept;
+  }
+
+  render(model: EarthModel, rays: RayPath[], shadows: ShadowZoneResult[]): void {
+    this.w = this.canvas.width;
+    this.h = this.canvas.height;
+    const ctx = this.ctx;
+    const cx = this.w / 2;
+    const cy = this.h / 2;
+    const scale = Math.min(this.w, this.h) * 0.40;
+    const R = model.radius;
+
+    // Clear to transparent — page background shows through, no visible square
+    ctx.clearRect(0, 0, this.w, this.h);
+
+    // Earth layers (inner → outer)
+    const layersSorted = [...model.layers].sort((a, b) => b.rMax - a.rMax);
+    for (const layer of layersSorted) {
+      ctx.beginPath();
+      ctx.arc(cx, cy, (layer.rMax / R) * scale, 0, Math.PI * 2);
+      ctx.fillStyle = layer.color;
+      ctx.fill();
+    }
+
+    // Rays — drawn on both sides (rays radiate symmetrically from the epicenter)
+    for (const ray of this.subsampleRays(rays)) {
+      if (ray.points.length < 2) continue;
+      let strokeStyle: string;
+      if (ray.blocked) {
+        strokeStyle = 'rgba(255,100,100,0.45)';
+      } else if (ray.wave === 'S') {
+        strokeStyle = 'rgba(100,255,150,0.50)';
+      } else {
+        strokeStyle = 'rgba(100,150,255,0.50)';
+      }
+      ctx.strokeStyle = strokeStyle;
+      ctx.lineWidth = 2;
+      for (const mirror of [1, -1] as const) {
+        ctx.beginPath();
+        for (let i = 0; i < ray.points.length; i++) {
+          const { r, theta } = ray.points[i];
+          const px = cx + mirror * (r / R) * scale * Math.sin(theta);
+          const py = cy - (r / R) * scale * Math.cos(theta);
+          if (i === 0) ctx.moveTo(px, py);
+          else ctx.lineTo(px, py);
+        }
+        ctx.stroke();
+      }
+    }
+
+    // Thin surface ring
+    ctx.beginPath();
+    ctx.arc(cx, cy, scale, 0, Math.PI * 2);
+    ctx.strokeStyle = 'rgba(180,180,220,0.4)';
+    ctx.lineWidth = 1;
+    ctx.stroke();
+
+    // Shadow zone arcs — drawn on top of the surface ring, centered on the surface
+    if (shadows.length > 0) {
+      const arcW = scale * 0.05;
+      ctx.lineWidth = arcW;
+      ctx.strokeStyle = 'rgba(255,60,60,0.70)';
+      for (const shadow of shadows) {
+        for (const side of [1, -1]) {
+          const startAngle = -Math.PI / 2 + side * (shadow.start * Math.PI) / 180;
+          const endAngle   = -Math.PI / 2 + side * (shadow.end   * Math.PI) / 180;
+          ctx.beginPath();
+          ctx.arc(cx, cy, scale, Math.min(startAngle, endAngle), Math.max(startAngle, endAngle));
+          ctx.stroke();
+        }
+      }
+    }
+
+    // Angle labels
+    ctx.font = '11px system-ui';
+    ctx.textAlign = 'center';
+    ctx.textBaseline = 'middle';
+    const labelAngles = [0, 30, 60, 90, 120, 150, 180];
+    for (const deg of labelAngles) {
+      for (const side of [1, -1]) {
+        if (deg === 0 || deg === 180) {
+          if (side === -1) continue; // only draw once
+        }
+        const rad = (deg * Math.PI) / 180 * side;
+        const labelR = scale + 18;
+        const lx = cx + labelR * Math.sin(rad);
+        const ly = cy - labelR * Math.cos(rad);
+        ctx.fillStyle = '#8888aa';
+        ctx.fillText(`${deg}°`, lx, ly);
+      }
+    }
+
+    // Earthquake marker at top
+    const eqX = cx;
+    const eqY = cy - scale;
+    ctx.font = '16px system-ui';
+    ctx.textAlign = 'center';
+    ctx.textBaseline = 'bottom';
+    ctx.fillText('⚡', eqX, eqY - 4);
+
+    // Layer name labels
+    ctx.textBaseline = 'middle';
+    ctx.font = '11px system-ui';
+    ctx.fillStyle = 'rgba(255,255,255,0.55)';
+    for (const layer of model.layers) {
+      const midR = ((layer.rMin + layer.rMax) / 2 / R) * scale;
+      // Only label if the ring is wide enough
+      if ((layer.rMax - layer.rMin) / R * scale < 14) continue;
+      ctx.textAlign = 'center';
+      ctx.fillText(layer.name, cx, cy + midR);
+    }
+
+    // Legend — top-left corner of the canvas
+    const legendItems = [
+      { color: 'rgba(100,150,255,0.90)', lineH: 2, label: 'P-waves'     },
+      { color: 'rgba(100,255,150,0.85)', lineH: 2, label: 'S-waves'     },
+      { color: 'rgba(255,60,60,0.80)',   lineH: 6, label: 'Shadow zone' },
+    ];
+    const itemH   = 15;
+    const swatchW = 18;
+    const lx0     = 12;
+    ctx.font = '11px system-ui';
+    ctx.textAlign = 'left';
+    ctx.textBaseline = 'middle';
+    for (let i = 0; i < legendItems.length; i++) {
+      const item = legendItems[i];
+      const ly = 12 + i * itemH;
+      ctx.strokeStyle = item.color;
+      ctx.lineWidth = item.lineH;
+      ctx.beginPath();
+      ctx.moveTo(lx0, ly);
+      ctx.lineTo(lx0 + swatchW, ly);
+      ctx.stroke();
+      ctx.fillStyle = 'rgba(200,200,220,0.85)';
+      ctx.fillText(item.label, lx0 + swatchW + 6, ly);
+    }
+
+  }
+}
diff --git a/src/shadowZone.ts b/src/shadowZone.ts
new file mode 100644
index 0000000..3d3c125
--- /dev/null
+++ b/src/shadowZone.ts
@@ -0,0 +1,75 @@
+import type { EarthModel } from './earth';
+import { traceRay } from './rayTracer';
+import { R_EARTH } from './earth';
+
+export interface ShadowZoneResult {
+  start: number; // degrees
+  end: number;   // degrees
+}
+
+export function findShadowZone(
+  model: EarthModel,
+  wave: 'P' | 'S',
+): ShadowZoneResult[] {
+  const N = 360;
+  const vSurf = model.vAt(R_EARTH - 0.1, wave);
+  if (vSurf === 0) return [];
+
+  const distances: number[] = [];
+
+  for (let i = 0; i < N; i++) {
+    const angleDeg = 1 + (i / (N - 1)) * 88;
+    const angleRad = (angleDeg * Math.PI) / 180;
+    const p = (R_EARTH * Math.sin(angleRad)) / vSurf;
+    const ray = traceRay(model, p, wave, angleDeg);
+    if (ray.epicentralDistance !== null && !ray.blocked) {
+      // Normalize to [0°, 180°]: a ray arriving at >180° has wrapped past the
+      // antipode; the receiver sits at 360°−dist on the near arc.
+      let d = ray.epicentralDistance % 360;
+      if (d > 180) d = 360 - d;
+      distances.push(d);
+    }
+  }
+
+  if (distances.length === 0) return [];
+
+  distances.sort((a, b) => a - b);
+
+  // S-waves are blocked by the liquid outer core and never arrive beyond ~105°.
+  // Without an endpoint, the gap-finder never sees the 105°→180° shadow zone.
+  if (wave === 'S') distances.push(180);
+
+  // Collect ALL gaps ≥ 3°.
+  const MIN_GAP = 3;
+  const zones: ShadowZoneResult[] = [];
+
+  for (let i = 1; i < distances.length; i++) {
+    const gap = distances[i] - distances[i - 1];
+    if (gap >= MIN_GAP) {
+      zones.push({ start: distances[i - 1], end: distances[i] });
+    }
+  }
+
+  // Merge zones whose inter-zone gap is ≤ MERGE_THRESH so that physically
+  // contiguous shadow regions (e.g. the many small gaps a water core creates)
+  // appear as one arc instead of many overlapping ones.
+  return mergeZones(zones, 5);
+}
+
+function mergeZones(zones: ShadowZoneResult[], threshDeg: number): ShadowZoneResult[] {
+  if (zones.length <= 1) return zones;
+  const sorted = [...zones].sort((a, b) => a.start - b.start);
+  const merged: ShadowZoneResult[] = [];
+  let cur = { ...sorted[0] };
+  for (let i = 1; i < sorted.length; i++) {
+    const next = sorted[i];
+    if (next.start - cur.end <= threshDeg) {
+      cur.end = Math.max(cur.end, next.end);
+    } else {
+      merged.push(cur);
+      cur = { ...next };
+    }
+  }
+  merged.push(cur);
+  return merged;
+}
diff --git a/src/validator.ts b/src/validator.ts
new file mode 100644
index 0000000..d188e20
--- /dev/null
+++ b/src/validator.ts
@@ -0,0 +1,183 @@
+import type { EarthquakeDataset, PhaseArrival } from './earthquakeData';
+import type { EarthModel } from './earth';
+import { buildTravelTimeCurve } from './rayTracer';
+
+export interface StationResidual {
+  station: string;
+  network: string;
+  distanceDeg: number;
+  observedSec: number;
+  predictedSec: number;
+  residualSec: number; // predicted − observed
+}
+
+export interface ValidationResult {
+  datasetId: string;
+  datasetName: string;
+  stationCount: number;
+  /** Root-mean-square of residuals in seconds. Lower = better fit to real Earth. */
+  rmsSec: number;
+  meanResidualSec: number;
+  /** Fraction of arrivals within ±5s of observed (rough "hit rate"). */
+  hitRate5s: number;
+  perStation: StationResidual[];
+  /** True if the dataset has no arrivals (fetch script not yet run). */
+  noData: boolean;
+}
+
+/**
+ * Interpolate predicted travel time from the curve at a given epicentral distance.
+ * Returns null if the distance is inside the model's shadow zone (no ray arrives there).
+ */
+function interpolateTravelTime(
+  curve: Array<{ distanceDeg: number; travelTimeSec: number }>,
+  distanceDeg: number,
+): number | null {
+  if (curve.length === 0) return null;
+
+  // Find bracketing points
+  let lo = 0;
+  let hi = curve.length - 1;
+
+  // Extrapolation guard
+  if (distanceDeg < curve[0].distanceDeg - 2 || distanceDeg > curve[hi].distanceDeg + 2) {
+    return null;
+  }
+
+  // Binary search for the closest bracketing interval
+  while (lo < hi - 1) {
+    const mid = (lo + hi) >> 1;
+    if (curve[mid].distanceDeg < distanceDeg) lo = mid;
+    else hi = mid;
+  }
+
+  // Check for gap (shadow zone): if the gap between lo and hi is large, no ray arrives
+  const gap = curve[hi].distanceDeg - curve[lo].distanceDeg;
+  if (gap > 5 && distanceDeg > curve[lo].distanceDeg + 0.5 && distanceDeg < curve[hi].distanceDeg - 0.5) {
+    return null; // in shadow zone
+  }
+
+  const t = (distanceDeg - curve[lo].distanceDeg) / (curve[hi].distanceDeg - curve[lo].distanceDeg + 1e-10);
+  return curve[lo].travelTimeSec + t * (curve[hi].travelTimeSec - curve[lo].travelTimeSec);
+}
+
+export function validateModel(
+  model: EarthModel,
+  dataset: EarthquakeDataset,
+): ValidationResult {
+  if (dataset.arrivals.length === 0) {
+    return {
+      datasetId: dataset.id,
+      datasetName: dataset.name,
+      stationCount: 0,
+      rmsSec: NaN,
+      meanResidualSec: NaN,
+      hitRate5s: NaN,
+      perStation: [],
+      noData: true,
+    };
+  }
+
+  const curve = buildTravelTimeCurve(model, 'P', dataset.depthKm);
+  const perStation: StationResidual[] = [];
+
+  for (const arrival of dataset.arrivals) {
+    if (arrival.pTravelTimeSec === null) continue;
+    const predicted = interpolateTravelTime(curve, arrival.distanceDeg);
+    if (predicted === null) continue; // model says shadow zone here
+
+    perStation.push({
+      station: arrival.station,
+      network: arrival.network,
+      distanceDeg: arrival.distanceDeg,
+      observedSec: arrival.pTravelTimeSec,
+      predictedSec: predicted,
+      residualSec: predicted - arrival.pTravelTimeSec,
+    });
+  }
+
+  if (perStation.length === 0) {
+    return {
+      datasetId: dataset.id,
+      datasetName: dataset.name,
+      stationCount: 0,
+      rmsSec: NaN,
+      meanResidualSec: NaN,
+      hitRate5s: NaN,
+      perStation: [],
+      noData: false,
+    };
+  }
+
+  const residuals = perStation.map(s => s.residualSec);
+  const mean = residuals.reduce((a, b) => a + b, 0) / residuals.length;
+  const rms = Math.sqrt(residuals.reduce((a, r) => a + r * r, 0) / residuals.length);
+  const hits = residuals.filter(r => Math.abs(r) <= 5).length;
+
+  return {
+    datasetId: dataset.id,
+    datasetName: dataset.name,
+    stationCount: perStation.length,
+    rmsSec: rms,
+    meanResidualSec: mean,
+    hitRate5s: hits / perStation.length,
+    perStation,
+    noData: false,
+  };
+}
+
+/**
+ * Classify a model fitness score as a human-readable label.
+ * Thresholds are generous — even PREM won't be perfect against raw ISC picks.
+ */
+export function fitnessLabel(result: ValidationResult): string {
+  if (result.noData) return '(no data — run fetch script)';
+  if (result.stationCount === 0) return 'No matched arrivals';
+  const rms = result.rmsSec;
+  if (rms < 3) return '🟢 Excellent fit';
+  if (rms < 8) return '🟡 Good fit';
+  if (rms < 20) return '🟠 Fair fit';
+  return '🔴 Poor fit';
+}
+
+/**
+ * Count observed arrivals that fall in the model's shadow zone — if the model
+ * is correct, this should be near zero. A water-core model would have many
+ * shadow-zone mismatches.
+ */
+export function countShadowZoneMismatches(
+  model: EarthModel,
+  dataset: EarthquakeDataset,
+): { inShadow: number; total: number } {
+  const curve = buildTravelTimeCurve(model, 'P', dataset.depthKm);
+  let inShadow = 0;
+  let total = 0;
+
+  for (const arrival of dataset.arrivals) {
+    if (arrival.pTravelTimeSec === null) continue;
+    total++;
+    const predicted = interpolateTravelTime(curve, arrival.distanceDeg);
+    if (predicted === null) inShadow++;
+  }
+
+  return { inShadow, total };
+}
+
+/**
+ * Build a distance → observed travel time map from dataset arrivals,
+ * for use in the renderer's scatter plot overlay.
+ */
+export function getObservedPoints(
+  dataset: EarthquakeDataset,
+  wave: 'P' | 'S',
+): Array<{ distanceDeg: number; travelTimeSec: number }> {
+  return dataset.arrivals
+    .filter((a: PhaseArrival) => {
+      const t = wave === 'P' ? a.pTravelTimeSec : a.sTravelTimeSec;
+      return t !== null;
+    })
+    .map((a: PhaseArrival) => ({
+      distanceDeg: a.distanceDeg,
+      travelTimeSec: (wave === 'P' ? a.pTravelTimeSec : a.sTravelTimeSec)!,
+    }));
+}
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..8f46035
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,12 @@
+{
+  "compilerOptions": {
+    "target": "ES2020",
+    "module": "ESNext",
+    "moduleResolution": "bundler",
+    "strict": true,
+    "noUnusedLocals": true,
+    "noUnusedParameters": true,
+    "lib": ["ES2020", "DOM"]
+  },
+  "include": ["src"]
+}
diff --git a/vite.config.ts b/vite.config.ts
new file mode 100644
index 0000000..14857fc
--- /dev/null
+++ b/vite.config.ts
@@ -0,0 +1,8 @@
+import { defineConfig } from 'vite';
+
+export default defineConfig({
+  base: '/shadow-zone/',
+  build: {
+    outDir: 'dist',
+  },
+});