diff --git a/CLAUDE.md b/CLAUDE.md index 68949b3..e5c71e8 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -30,6 +30,7 @@ Forked from [SceneryStackTemplate](https://github.com/OpenPhysics/SceneryStackTe | `src/common/data/hotspots.ts` | Hand-maintained hotspot list | | `src/common/data/generated/` | **Generated — do not edit.** `npm run build-data` owns it | | `src/common/data/generated/motionFrameData.ts` | Rotations belonging to boundaries rather than plates | +| `src/common/data/generated/seafloorAgeData.ts` | Isochrons of the ocean floor, and the ages they are drawn at | | `src/plate-tectonics/model/PlateTectonicsModel.ts` | All AXON state | | `src/plate-tectonics/model/EarthquakeDepthFilter.ts` | Depth bands and the filter predicate | | `src/plate-tectonics/view/PlateTectonicsScreenView.ts` | Layout, view switching, `pdomOrder` | @@ -42,7 +43,7 @@ Forked from [SceneryStackTemplate](https://github.com/OpenPhysics/SceneryStackTe | `src/plate-tectonics/view/CrossSectionNode.ts` | Section + localized annotations | | `src/plate-tectonics/view/LegendSwatches.ts` | Map symbols, shared by legend and checkboxes | | `scripts/build-data.ts` | Fetches and reshapes every dataset | -| `scripts/data/` | Fetch cache, GeoTIFF reader, geodesy, emitters | +| `scripts/data/` | Fetch cache, GeoTIFF and netCDF readers, geodesy, contouring, emitters | ## Working on this sim @@ -55,15 +56,16 @@ keyed by URL hash, so re-runs are fast and a changed query parameter re-fetches. `tests/geophysicalData.test.ts` guards the regeneration: it checks structural integrity and a few facts about the Earth (deep earthquakes cluster around the -Pacific; the Chile profile's deep events sit inland of its shallow ones). Run -`npm test` after any regeneration. +Pacific; the Chile profile's deep events sit inland of its shallow ones; the Atlantic +isochrons step out symmetrically from the ridge as they get older). Run `npm test` +after any regeneration. `npm run build-data` with no arguments rebuilds everything. Naming steps — -`plate-model`, `land`, `earthquakes`, `volcanoes`, `relief`, `cross-sections` — -rebuilds only those, which is how the PB2002 model can be regenerated without also -pulling a newer earthquake catalogue and a fresh DEM into an unrelated diff. -`plate-model` covers the plates, their boundaries and the motion frames together, -because those three index into each other. +`plate-model`, `land`, `earthquakes`, `volcanoes`, `seafloor-age`, `relief`, +`cross-sections` — rebuilds only those, which is how the PB2002 model can be +regenerated without also pulling a newer earthquake catalogue and a fresh DEM into an +unrelated diff. `plate-model` covers the plates, their boundaries and the motion frames +together, because those three index into each other. ### What moves when the clock runs @@ -126,6 +128,12 @@ Boundary colors (red / cyan / violet) and earthquake-depth colors (yellow → or magenta) have to stay mutually distinguishable *and* readable over the relief raster. Check both profiles after changing any of them. +`seafloorAgeRampColorProperties` is a five-stop red → blue ramp, interpolated by age +rather than indexed, so the number of isochron ages and the number of color stops are +independent. Its young end deliberately sits near the divergent-boundary red — the +youngest crust *is* the crust at the ridge — and the two are kept apart by line width +and draw order instead of by hue. + ## Common components ### PlateTectonicsPanel diff --git a/CREDITS.md b/CREDITS.md index 0f57e0f..42423e7 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -9,7 +9,7 @@ GNU Affero General Public License v3.0 or later — see [org LICENSE](https://gi ## Data sources -The simulation renders published observational data. Two of these sources ask for +The simulation renders published observational data. Three of these sources ask for attribution and all of them deserve it; they are credited on screen, in the About dialog, and here. @@ -52,6 +52,21 @@ Program holdings. Public domain. Public domain. The shaded relief raster shipped with the sim is rendered from it by `npm run build-data`. +### Seafloor age — EarthByte + +Seton, M., Müller, R. D., Zahirovic, S., Williams, S., Wright, N. M., Cannon, J., +Whittaker, J. M., Matthews, K. J., & McGirr, R. (2020). *A global data set of +present-day oceanic crustal age and seafloor spreading parameters.* Geochemistry, +Geophysics, Geosystems, 21, e2020GC009214. +[doi:10.1029/2020GC009214](https://doi.org/10.1029/2020GC009214) + +The 6-arc-minute present-day age grid (version 2020.1, GTS2012 timescale) published by +the [EarthByte group](https://www.earthbyte.org/category/resources/data-models/seafloor-age/) +at the University of Sydney, under the +[Creative Commons Attribution 4.0 licence](https://creativecommons.org/licenses/by/4.0/). +The isochrons shipped with the sim are contoured from it by `npm run build-data`; the +grid itself is not redistributed. + ## Acknowledgments Built with [SceneryStack](https://scenerystack.org/), from the diff --git a/README.md b/README.md index fee577d..48c2763 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,10 @@ fitted to the earthquakes that trace it. - **Volcanoes and hotspots**: ~1 600 Holocene volcanoes plus the major mantle plumes. - **Topography / bathymetry**: shaded relief rendered from the NOAA global DEM, so trenches, ridges and mountain belts are visible rather than implied. +- **Seafloor age (isochrons)**: lines of equal crustal age at 10, 20, 40 … 180 Ma, + contoured from the EarthByte age grid. The youngest crust hugs every spreading + ridge and the same ages appear at the same distance on both flanks, getting older + out to the continental margins — seafloor spreading, drawn from the measurements. **Cross-sections** — the Chile trench, the Mid-Atlantic Ridge, and the San Andreas fault. The surface profile comes from the DEM, the earthquakes and volcanoes are real @@ -82,6 +86,7 @@ and full Interactive Description support. | Earthquakes | [USGS ANSS ComCat](https://earthquake.usgs.gov/fdsnws/event/1/) | Public domain | | Volcanoes | [NOAA NCEI](https://www.ngdc.noaa.gov/hazel/) / Smithsonian GVP Holocene volcano list | Public domain | | Elevation and bathymetry | [NOAA NCEI global DEM mosaic](https://gis.ngdc.noaa.gov/arcgis/rest/services/DEM_mosaics/DEM_global_mosaic/ImageServer) | Public domain | +| Age of the ocean floor | [EarthByte](https://www.earthbyte.org/category/resources/data-models/seafloor-age/) / Seton et al. (2020), doi:10.1029/2020GC009214 | CC BY 4.0 | ## License diff --git a/doc/implementation-notes.md b/doc/implementation-notes.md index 5298c6a..3dd4300 100644 --- a/doc/implementation-notes.md +++ b/doc/implementation-notes.md @@ -40,7 +40,8 @@ src/ LegendSwatches.ts the symbols, shared by legend and checkboxes scripts/ build-data.ts fetches and reshapes every dataset - data/ fetch cache, GeoTIFF reader, geodesy, emitters + data/ fetch cache, GeoTIFF + netCDF readers, geodesy, + marching-squares contouring, emitters ``` ## Why the map is a canvas @@ -174,6 +175,16 @@ Notable pieces: - `scripts/data/dem.ts` contains a ~120-line GeoTIFF reader. NOAA's image service returns an uncompressed, tiled, signed-16-bit TIFF, which is little enough format to parse directly and saves a dependency. +- `scripts/data/netcdf.ts` reads the classic netCDF-3 format, for the same reason: the + EarthByte age grid is published as a header of big-endian counted fields followed by + the raw values, which is small enough to parse directly and saves the build a + dependency on the netCDF/HDF5 stack. +- `scripts/data/contour.ts` is marching squares, used once, to turn that age grid into + isochron polylines. Cells with a missing corner are skipped whole, so a contour stops + at the edge of the ocean instead of being interpolated onto land, and it works in + grid coordinates so that two neighbouring cells produce bit-identical crossings on + their shared edge — which is what lets the segments be strung together by exact key + match rather than by proximity. - Boundary segments are rebuilt from PB2002's *step* file rather than its boundary file, because only the steps carry the class (`OSR`, `SUB`, `CTF`, …) that the divergent / convergent / transform colouring needs. diff --git a/doc/model.md b/doc/model.md index fd0f146..b04a811 100644 --- a/doc/model.md +++ b/doc/model.md @@ -42,6 +42,7 @@ the map show, and it is why the Nazca arrow is long and the Antarctic arrow is a | Volcanoes | NOAA NCEI Holocene volcano list (Smithsonian GVP holdings) | ~1 600 volcanoes | | Hotspots | Hand-maintained list of the plumes named in introductory texts | `src/common/data/hotspots.ts` | | Topography and bathymetry | NOAA NCEI global DEM mosaic | rendered to a shaded relief raster, and sampled along each cross-section | +| Age of the ocean floor | EarthByte / Seton et al. (2020) present-day age grid, doi:10.1029/2020GC009214 | contoured into isochrons at 10, 20, 40 … 180 Ma | ### From PB2002's poles to absolute plate motion @@ -102,6 +103,37 @@ The outlines are subdivided until this stops showing: an edge whose ends ride mo far enough apart to stretch it by more than 200 km over the slider's range is split and reconsidered. `tests/PlateEvolution.test.ts` holds the whole scheme in place. +## Seafloor isochrons + +The **Seafloor age** layer draws the ocean floor's isochrons: the lines along which +the crust is all one age, at 10, 20, 40 … 180 Ma. They come from the EarthByte +present-day age grid, which is built by identifying marine magnetic anomalies — +stripes of alternating remanent magnetisation frozen into basalt as it cools through +the Curie point — and dating them against the geomagnetic polarity timescale, itself +calibrated on radiometrically dated rock. `scripts/build-data.ts` contours the +6-arc-minute grid with marching squares on a 0.3° mesh and simplifies what comes out. + +The picture is the argument for seafloor spreading, and it is worth reading in three +steps: + +1. **The youngest crust is at the ridges.** The 10 Ma line runs a degree or two either + side of every spreading axis and nowhere else. +2. **The pattern is symmetric.** The same age appears at about the same distance on + *both* flanks, because both plates take roughly half the new crust. Across the + Atlantic at 24° N the 40 Ma line sits about 5° west and 7° east of the axis, the + 80 Ma line about 12° and 13°; `tests/geophysicalData.test.ts` asserts that ordering + and that symmetry. +3. **It stops at about 180 Ma.** There is no older ocean floor to find, because it has + all been subducted, while the continents carry rock a *hundred* times older. The + sea floor is not old and permanent; it is a conveyor. + +An isochron is frozen into the crust, so unlike a plate boundary it rides its plate — +vertex by vertex, because one isochron can cross several. Two consequences follow when +the clock runs, and both are honest rather than cosmetic. The two flanks of a pair walk +back towards the ridge that made them. And crust younger than the reconstruction has +reached did not exist yet, so at 50 Myr ago the 10, 20 and 40 Ma isochrons are simply +not drawn. + ## Earthquake depth bands Hypocentres are grouped at **70 km** and **300 km**, the conventional shallow / @@ -156,7 +188,10 @@ distorting the picture silently. and watch the events step down along the slab from the trench to 600 km. 3. **Seafloor spreading.** Switch on boundaries and topography, and follow the ridges: a continuous mountain range down the middle of the Atlantic, marked by shallow - earthquakes and no deep ones at all. + earthquakes and no deep ones at all. Then add **Seafloor age** and turn the other + layers off: the isochrons fan out from that same mountain range, matched pair by + matched pair, red at the axis and blue at the margins. Run the clock back and watch + the young ones disappear into the ridge that had not yet made them. ## What this model is not @@ -186,6 +221,12 @@ distorting the picture silently. - **The relief raster is present-day.** It is hidden as soon as the reconstruction moves off the present day, because sea floor that has not been created yet cannot be shown. +- **Isochrons are carried rigidly, not un-made.** Hiding the ones younger than the + reconstruction is right, but the ones that remain are only *rotated* back with their + plates: the ocean between them should also be closing up, and here it is not, because + the model has no way to un-make crust. So running to 50 Myr ago narrows the Atlantic + isochron fan by rather less than it should. The 10 Ma pair walking together onto the + ridge is the honest part of that picture; the 160 Ma pair barely moving is not. - **Hotspots do not move.** That is deliberate, and it is the physics: a plume is anchored in the deep mantle while the plate slides over it, which is why the Hawaiian chain gets older to the north-west. diff --git a/scripts/build-data.ts b/scripts/build-data.ts index eef67a9..21986b4 100644 --- a/scripts/build-data.ts +++ b/scripts/build-data.ts @@ -20,11 +20,13 @@ * - USGS ANSS ComCat earthquake catalogue (public domain). * - NOAA NCEI Holocene volcano list (public domain). * - NOAA NCEI global elevation/bathymetry DEM mosaic (public domain). + * - EarthByte / Seton et al. (2020) present-day seafloor age grid (CC BY 4.0). */ +import { type ScalarGrid, traceContours } from "./data/contour.js"; import { fetchElevationGrid, sampleElevation } from "./data/dem.js"; import { numberArray, round, wrap, writeGeneratedModule } from "./data/emit.js"; -import { fetchJson, fetchText } from "./data/fetchCache.js"; +import { fetchBinary, fetchJson, fetchText } from "./data/fetchCache.js"; import { cross, dot, @@ -39,6 +41,7 @@ import { toLonLat, toUnitVector, } from "./data/geo.js"; +import { readNetCdf } from "./data/netcdf.js"; const GENERATED_DIR = "src/common/data/generated"; @@ -51,6 +54,8 @@ const POLES_URL = "http://peterbird.name/oldFTP/PB2002/PB2002_poles.dat.txt"; const LAND_URL = "https://raw.githubusercontent.com/nvkelso/natural-earth-vector/master/geojson/ne_110m_land.geojson"; const USGS_QUERY = "https://earthquake.usgs.gov/fdsnws/event/1/query"; const VOLCANO_QUERY = "https://www.ngdc.noaa.gov/hazel/hazard-service/api/v1/volcanolocs"; +/** Seton et al. (2020) present-day age of the ocean floor, 6-minute grid, netCDF-3. */ +const AGE_GRID_URL = "https://www.earthbyte.org/webdav/ftp/earthbyte/agegrid/2020/Grids/age.2020.1.GTS2012.6m.grd"; // ── Tuning ──────────────────────────────────────────────────────────────────── @@ -1052,6 +1057,136 @@ in recorded history; \`plateIndex\` is the plate the volcano rides.`, return volcanoes; } +// ── Seafloor age ────────────────────────────────────────────────────────────── + +/** + * Ages, in millions of years, that get an isochron. + * + * Twenty-Myr steps out to 180 Ma, which is about as old as the ocean floor gets — + * anything older has been subducted — plus a 10 Ma line, because the youngest crust + * is the point of the picture and on a slow ridge the 20 Ma line is already only two + * or three degrees from the axis. + */ +const ISOCHRON_AGES_MA: readonly number[] = [10, 20, 40, 60, 80, 100, 120, 140, 160, 180]; + +/** + * Every *n*th sample of the 6-minute age grid is contoured, giving a 0.3° mesh. The + * closest-spaced isochrons in the data — 20 Myr apart on the slowest ridges, in the + * Arctic and the south-west Indian Ocean — are still a couple of degrees apart, so + * this resolves them with room to spare while keeping the trace to a size worth + * committing. + */ +const AGE_GRID_STRIDE = 3; + +/** Douglas–Peucker tolerance for an isochron, in degrees. */ +const ISOCHRON_TOLERANCE = 0.15; + +/** + * Shortest isochron kept, in degrees of arc. Below this a line is a speckle — a + * cell or two of noise in the age grid around a fracture zone or a seamount — rather + * than a piece of the seafloor spreading record. + */ +const MIN_ISOCHRON_DEGREES = 4; + +interface IsochronBuild { + ageMa: number; + points: LonLat[]; +} + +/** Rough length of a polyline in degrees of arc, good enough to reject speckle. */ +function polylineDegrees(points: readonly LonLat[]): number { + let total = 0; + for (let i = 1; i < points.length; i++) { + total += separationDegrees(points[i - 1] as LonLat, points[i] as LonLat); + } + return total; +} + +/** + * Traces the isochrons of the ocean floor: the lines along which the crust is a + * given age, from the EarthByte grid of radiometric and magnetic-anomaly ages. + * + * The grid is NaN over continental crust, so the contours end at the edge of the + * ocean by themselves, and they close round the ridges without any help because the + * grid is gridline-registered and its first and last columns are the same meridian. + */ +async function buildSeafloorAge(plates: readonly PlateBuild[]): Promise { + const file = readNetCdf(await fetchBinary(AGE_GRID_URL, "earthbyte_age_6m.grd")); + const age = file.variables.get("z"); + const lonAxis = file.variables.get("lon"); + const latAxis = file.variables.get("lat"); + if (!(age && lonAxis && latAxis)) { + throw new Error("The age grid is missing one of its lon, lat and z variables"); + } + const [rows, columns] = age.shape as [number, number]; + + // Take every AGE_GRID_STRIDEth sample. Both axis lengths are one more than a + // multiple of the stride, so the last sample taken is the last one in the grid and + // the ±180° seam still lands on a column. + const width = Math.floor((columns - 1) / AGE_GRID_STRIDE) + 1; + const height = Math.floor((rows - 1) / AGE_GRID_STRIDE) + 1; + const values = new Float64Array(width * height); + for (let row = 0; row < height; row++) { + for (let column = 0; column < width; column++) { + values[row * width + column] = age.values[row * AGE_GRID_STRIDE * columns + column * AGE_GRID_STRIDE] as number; + } + } + const grid: ScalarGrid = { width, height, values }; + + // The axes are regular, so two samples give the whole mapping — and reading them + // rather than assuming −180…180 / −90…90 is what catches a grid published the + // other way up. + const lonOf = axisMapper(lonAxis.values, AGE_GRID_STRIDE); + const latOf = axisMapper(latAxis.values, AGE_GRID_STRIDE); + + const isochrons: IsochronBuild[] = []; + for (const ageMa of ISOCHRON_AGES_MA) { + for (const line of traceContours(grid, ageMa)) { + const points: LonLat[] = []; + for (let i = 0; i < line.length; i += 2) { + points.push([lonOf(line[i] as number), latOf(line[i + 1] as number)]); + } + const simplified = simplify(points, ISOCHRON_TOLERANCE); + if (simplified.length >= 2 && polylineDegrees(simplified) >= MIN_ISOCHRON_DEGREES) { + isochrons.push({ ageMa, points: simplified }); + } + } + } + + const entries = isochrons.map((isochron) => { + const coords = numberArray(isochron.points.flatMap(([lon, lat]) => [round(lon, 2), round(lat, 2)])); + const plateIndices = numberArray(isochron.points.map(([lon, lat]) => plateIndexAt(plates, lon, lat))); + return ` { ageMa: ${isochron.ageMa},\n coords: ${coords},\n plateIndices: ${plateIndices} },`; + }); + + writeGeneratedModule( + `${GENERATED_DIR}/seafloorAgeData.ts`, + `Isochrons of the ocean floor: the lines along which the crust is 10, 20, 40 … 180 +million years old, contoured from the EarthByte present-day age grid (Seton et al., +2020), which is built from marine magnetic anomalies calibrated against radiometric +dates of sea-floor basalt. + +Every vertex carries the index of the plate that carries it, because an isochron is +frozen into the crust: it rides the plate it is part of, and running the clock back +walks it into the ridge it was made at. There are no isochrons on continental crust — +the grid has no values there — which is the shape of the story: the ocean floor is +young and symmetric about the ridges, the continents are neither.`, + `import type { IsochronRecord } from "../dataTypes.js";\n\n/** The ages, in millions of years, that have an isochron in {@link ISOCHRONS}. */\nexport const ISOCHRON_AGES_MA: readonly number[] = ${numberArray( + ISOCHRON_AGES_MA, + )};\n\nexport const ISOCHRONS: readonly IsochronRecord[] = [\n${entries.join("\n")}\n];\n`, + ); + + const vertices = isochrons.reduce((total, isochron) => total + isochron.points.length, 0); + console.log(` ${isochrons.length} isochrons at ${ISOCHRON_AGES_MA.length} ages, ${vertices} vertices`); +} + +/** Maps a strided grid index back to its coordinate, from a regular netCDF axis. */ +function axisMapper(axis: Float64Array, stride: number): (index: number) => number { + const first = axis[0] as number; + const step = ((axis[axis.length - 1] as number) - first) / (axis.length - 1); + return (index: number) => first + index * stride * step; +} + // ── Relief raster ───────────────────────────────────────────────────────────── /** @@ -1365,7 +1500,7 @@ real events projected onto the profile from a corridor either side of it.`, * `plate-model` covers the plates, their boundaries and the motion frames together, * because those three index into each other and only mean anything as a set. */ -const STEPS = ["plate-model", "land", "earthquakes", "volcanoes", "relief", "cross-sections"] as const; +const STEPS = ["plate-model", "land", "earthquakes", "volcanoes", "seafloor-age", "relief", "cross-sections"] as const; type Step = (typeof STEPS)[number]; async function main(): Promise { @@ -1416,6 +1551,11 @@ async function main(): Promise { console.log(` ${volcanoes.length} volcanoes`); } + if (wanted("seafloor-age")) { + console.log("Building seafloor isochrons…"); + await buildSeafloorAge(plates); + } + if (wanted("relief")) { console.log("Building relief raster…"); await buildRelief(); diff --git a/scripts/data/contour.ts b/scripts/data/contour.ts new file mode 100644 index 0000000..9133a23 --- /dev/null +++ b/scripts/data/contour.ts @@ -0,0 +1,228 @@ +/** + * scripts/data/contour.ts + * + * Marching squares: turns a scalar grid into the lines along which it takes a given + * value. The build uses it once, to trace the isochrons of the seafloor age grid — + * the lines of equal age that record where the ridge used to be. + * + * Three things about the grid it is given matter here: + * + * - **Cells with no data are skipped whole.** The age grid is NaN over continental + * crust, so a cell with any missing corner contributes nothing and a contour + * simply stops at the edge of the ocean instead of being interpolated onto land. + * - **The seam takes care of itself.** The grid is gridline-registered from −180° + * to +180°, so its first and last columns are the same meridian and walking the + * cells between them covers the globe with no special case. + * - **Joining is exact.** Contours come back in grid coordinates — fractional + * column and row — and two neighbouring cells interpolate their shared edge from + * the same two corner values, so the crossing points they produce are identical + * to the last bit and match as map keys. + */ + +/** A scalar field sampled on a regular grid, row-major, NaN where there is no data. */ +export interface ScalarGrid { + readonly width: number; + readonly height: number; + readonly values: Float64Array; +} + +/** A traced contour, as a flat `[column, row, …]` array of grid coordinates. */ +export type ContourLine = number[]; + +/** + * Corner offsets from the cell's top-left grid node, `[column, row]`, numbered + * clockwise from the top left: 0 top-left, 1 top-right, 2 bottom-right, 3 + * bottom-left. Edge *i* then joins corner *i* to corner *(i + 1) mod 4*, so edge 0 + * is the top, 1 the right, 2 the bottom and 3 the left. + */ +const CORNER_OFFSETS: readonly (readonly [number, number])[] = [ + [0, 0], + [1, 0], + [1, 1], + [0, 1], +]; + +/** + * The two ways a saddle can be joined, as pairs of edge indices. A saddle is a cell + * whose contour crosses all four edges, which happens when the two corners above the + * level are diagonally opposite: the contour can either cut off the top-right and + * bottom-left corners, or the top-left and bottom-right ones. + */ +const SADDLE_PAIRINGS: readonly (readonly (readonly [number, number])[])[] = [ + [ + [0, 1], + [2, 3], + ], + [ + [1, 2], + [3, 0], + ], +]; + +/** Key for a crossing point, exact because the coordinates are computed identically. */ +function pointKey(column: number, row: number): string { + return `${column},${row}`; +} + +/** + * Traces every contour of `grid` at `level`. + * + * @returns one flat `[column, row, …]` array per traced line, in grid coordinates. + * A line that closes on itself repeats its first point at the end; one that ends + * where the data does, at a coast, does not. + */ +export function traceContours(grid: ScalarGrid, level: number): ContourLine[] { + const { width, height, values } = grid; + + // Every segment, and an index from each of its endpoints back to it, so the + // segments can be strung together into lines afterwards. + const segments: [number, number, number, number][] = []; + const atPoint = new Map(); + + const record = (index: number, column: number, row: number): void => { + const key = pointKey(column, row); + const existing = atPoint.get(key); + if (existing) { + existing.push(index); + } else { + atPoint.set(key, [index]); + } + }; + + const corner = new Float64Array(4); + + for (let row = 0; row < height - 1; row++) { + for (let column = 0; column < width - 1; column++) { + let missing = false; + for (let c = 0; c < 4; c++) { + const offset = CORNER_OFFSETS[c] as readonly [number, number]; + const value = values[(row + offset[1]) * width + column + offset[0]] as number; + corner[c] = value; + missing = missing || Number.isNaN(value); + } + if (missing) { + continue; + } + + for (const [fromEdge, toEdge] of cellEdgePairs(corner, level)) { + const [ax, ay] = edgeCrossing(corner, level, column, row, fromEdge); + const [bx, by] = edgeCrossing(corner, level, column, row, toEdge); + const index = segments.length; + segments.push([ax, ay, bx, by]); + record(index, ax, ay); + record(index, bx, by); + } + } + } + + return joinSegments(segments, atPoint); +} + +/** + * Which edges of one cell the contour runs between, as pairs of edge indices. + * + * An edge is crossed when its two corners sit either side of the level, which happens + * on none of the four edges, on two of them, or — at a saddle — on all four. There is + * no other possibility, so the only decision to make is how to pair up a saddle. + */ +function cellEdgePairs(corner: Float64Array, level: number): readonly (readonly [number, number])[] { + const crossed: number[] = []; + for (let edge = 0; edge < 4; edge++) { + if ((corner[edge] as number) >= level !== (corner[(edge + 1) % 4] as number) >= level) { + crossed.push(edge); + } + } + if (crossed.length === 0) { + return []; + } + if (crossed.length === 2) { + return [[crossed[0] as number, crossed[1] as number]]; + } + + // Saddle. Reading the middle of the cell as the mean of its corners says whether the + // two corners above the level are joined through the centre or cut off from each + // other; the contour goes round whichever diagonal pair is isolated. Without this the + // two branches can be paired the wrong way and cross each other. + const middle = ((corner[0] as number) + (corner[1] as number) + (corner[2] as number) + (corner[3] as number)) / 4; + const topLeftIsHigh = (corner[0] as number) >= level; + const centreJoinsHighCorners = middle >= level; + return SADDLE_PAIRINGS[topLeftIsHigh === centreJoinsHighCorners ? 0 : 1] as readonly (readonly [number, number])[]; +} + +/** Where the contour crosses one edge of a cell, in grid coordinates. */ +function edgeCrossing( + corner: Float64Array, + level: number, + column: number, + row: number, + edge: number, +): [number, number] { + const to = (edge + 1) % 4; + const fromValue = corner[edge] as number; + const t = (level - fromValue) / ((corner[to] as number) - fromValue); + const [fromColumn, fromRow] = CORNER_OFFSETS[edge] as readonly [number, number]; + const [toColumn, toRow] = CORNER_OFFSETS[to] as readonly [number, number]; + return [column + fromColumn + (toColumn - fromColumn) * t, row + fromRow + (toRow - fromRow) * t]; +} + +/** + * Strings the segments into as few polylines as possible. + * + * Each segment is followed from both of its ends until it runs into a point no other + * segment touches — the edge of the data — or back to where it started. A point where + * more than two segments meet is left to whichever line reaches it first, which costs + * at most one extra line. + */ +function joinSegments( + segments: readonly [number, number, number, number][], + atPoint: ReadonlyMap, +): ContourLine[] { + const used = new Uint8Array(segments.length); + const lines: ContourLine[] = []; + + /** The far end of a segment, given the end being arrived at. */ + const otherEnd = (index: number, column: number, row: number): [number, number] => { + const [ax, ay, bx, by] = segments[index] as [number, number, number, number]; + return ax === column && ay === row ? [bx, by] : [ax, ay]; + }; + + /** Walks on from a point until the chain ends, appending each point reached. */ + const walk = (fromColumn: number, fromRow: number, into: ContourLine): void => { + let column = fromColumn; + let row = fromRow; + for (;;) { + const candidates = atPoint.get(pointKey(column, row)); + const next = candidates?.find((index) => used[index] === 0); + if (next === undefined) { + return; + } + used[next] = 1; + [column, row] = otherEnd(next, column, row); + into.push(column, row); + } + }; + + for (let index = 0; index < segments.length; index++) { + if (used[index] === 1) { + continue; + } + used[index] = 1; + const [ax, ay, bx, by] = segments[index] as [number, number, number, number]; + + const forward: ContourLine = [bx, by]; + walk(bx, by, forward); + const backward: ContourLine = []; + walk(ax, ay, backward); + + // The backward half was traced away from the seed, so it goes on the front, in + // reverse; then the seed's own two points, then the forward half. + const line: ContourLine = []; + for (let i = backward.length - 2; i >= 0; i -= 2) { + line.push(backward[i] as number, backward[i + 1] as number); + } + line.push(ax, ay, ...forward); + lines.push(line); + } + + return lines; +} diff --git a/scripts/data/netcdf.ts b/scripts/data/netcdf.ts new file mode 100644 index 0000000..4557f13 --- /dev/null +++ b/scripts/data/netcdf.ts @@ -0,0 +1,190 @@ +/** + * scripts/data/netcdf.ts + * + * Reads the "classic" netCDF-3 files the seafloor age grid is published in. + * + * The format is a big-endian header — dimensions, attributes, variables — followed + * by each variable's values at the byte offset its header entry names, so a reader + * that only has to serve whole non-record variables is about as small as the TIFF + * reader next door in `dem.ts`, and saves the build a dependency on the netCDF / + * HDF5 stack. The specification is at + * https://docs.unidata.ucar.edu/nug/current/file_format_specifications.html. + * + * Only the classic format (magic `CDF\x01`) and non-record variables are handled, + * which is what `age.2020.1.GTS2012.6m.grd` is; anything else throws rather than + * being quietly misread. + */ + +/** Header tags that introduce each list. */ +const NC_DIMENSION = 0x0a; +const NC_VARIABLE = 0x0b; +const NC_ATTRIBUTE = 0x0c; + +/** netCDF external data types, and how many bytes each takes. */ +const TYPE_SIZES: Record = { 1: 1, 2: 1, 3: 2, 4: 4, 5: 4, 6: 8 }; + +/** One variable, with its values already decoded to doubles. */ +export interface NetCdfVariable { + /** Dimension names, slowest-varying first. */ + readonly dimensions: readonly string[]; + /** Length of each dimension, in the same order. */ + readonly shape: readonly number[]; + /** Values in row-major order, `_FillValue` and `missing_value` turned into NaN. */ + readonly values: Float64Array; +} + +/** A whole classic-format file: its dimensions and its variables, by name. */ +export interface NetCdfFile { + readonly dimensions: ReadonlyMap; + readonly variables: ReadonlyMap; +} + +/** Walks the header, tracking the read position. */ +class Cursor { + private readonly buffer: Buffer; + private offset = 0; + + public constructor(buffer: Buffer) { + this.buffer = buffer; + } + + public int32(): number { + const value = this.buffer.readInt32BE(this.offset); + this.offset += 4; + return value; + } + + /** A counted string, padded out to a multiple of four bytes. */ + public name(): string { + const length = this.int32(); + const text = this.buffer.toString("utf8", this.offset, this.offset + length); + this.offset += length + padding(length); + return text; + } + + /** Skips one attribute's values, whose length depends on its type. */ + public skipAttributeValues(type: number, count: number): void { + const bytes = (TYPE_SIZES[type] ?? 1) * count; + this.offset += bytes + padding(bytes); + } + + /** Reads one attribute value as a number, for `_FillValue` and friends. */ + public peekNumber(type: number): number { + return readValue(this.buffer, this.offset, type); + } +} + +/** Bytes of padding that follow `length` bytes, so the next field starts on a word. */ +function padding(length: number): number { + return (4 - (length % 4)) % 4; +} + +/** Reads one value of an external type as a double. */ +function readValue(buffer: Buffer, offset: number, type: number): number { + switch (type) { + case 1: + case 2: + return buffer.readInt8(offset); + case 3: + return buffer.readInt16BE(offset); + case 4: + return buffer.readInt32BE(offset); + case 5: + return buffer.readFloatBE(offset); + case 6: + return buffer.readDoubleBE(offset); + default: + throw new Error(`Unsupported netCDF type ${type}`); + } +} + +/** + * Reads the attribute list at the cursor, returning only the ones this reader acts + * on: the fill values, which mark cells that carry no measurement. + */ +function readFillValues(cursor: Cursor): number[] { + const fills: number[] = []; + const tag = cursor.int32(); + const count = cursor.int32(); + if (tag !== NC_ATTRIBUTE) { + // ABSENT is a zero tag followed by a zero count; both have now been consumed. + return fills; + } + for (let i = 0; i < count; i++) { + const name = cursor.name(); + const type = cursor.int32(); + const nelems = cursor.int32(); + if ((name === "_FillValue" || name === "missing_value") && nelems > 0) { + fills.push(cursor.peekNumber(type)); + } + cursor.skipAttributeValues(type, nelems); + } + return fills; +} + +/** Parses a classic-format netCDF file. */ +export function readNetCdf(buffer: Buffer): NetCdfFile { + if (buffer.toString("ascii", 0, 3) !== "CDF") { + throw new Error("Not a netCDF file"); + } + const version = buffer.readUInt8(3); + if (version !== 1) { + throw new Error(`Only the classic netCDF format is supported, got version ${version}`); + } + + const cursor = new Cursor(buffer); + cursor.int32(); // magic + cursor.int32(); // numrecs — there are no record variables in the grids read here + + // Dimensions, in the order the variables' dimension ids index them. + const dimensionNames: string[] = []; + const dimensions = new Map(); + const dimensionTag = cursor.int32(); + const dimensionCount = cursor.int32(); + if (dimensionTag === NC_DIMENSION) { + for (let i = 0; i < dimensionCount; i++) { + const name = cursor.name(); + dimensionNames.push(name); + dimensions.set(name, cursor.int32()); + } + } + + readFillValues(cursor); // global attributes + + const variables = new Map(); + const variableTag = cursor.int32(); + const variableCount = cursor.int32(); + if (variableTag !== NC_VARIABLE) { + return { dimensions, variables }; + } + + for (let i = 0; i < variableCount; i++) { + const name = cursor.name(); + const rank = cursor.int32(); + const dimensionIds: number[] = []; + for (let d = 0; d < rank; d++) { + dimensionIds.push(cursor.int32()); + } + const fills = readFillValues(cursor); + const type = cursor.int32(); + cursor.int32(); // vsize, which the shape gives anyway + const begin = cursor.int32(); + + const names = dimensionIds.map((id) => dimensionNames[id] as string); + const shape = names.map((dimension) => dimensions.get(dimension) as number); + const length = shape.reduce((product, extent) => product * extent, 1); + + const size = TYPE_SIZES[type] as number; + const values = new Float64Array(length); + for (let index = 0; index < length; index++) { + const value = readValue(buffer, begin + index * size, type); + // A fill value means "no measurement here", which is a different thing from a + // measurement of zero, so it is carried through as NaN. + values[index] = Number.isNaN(value) || fills.includes(value) ? Number.NaN : value; + } + + variables.set(name, { dimensions: names, shape, values }); + } + + return { dimensions, variables }; +} diff --git a/src/PlateTectonicsColors.ts b/src/PlateTectonicsColors.ts index e11ac3b..72b7879 100644 --- a/src/PlateTectonicsColors.ts +++ b/src/PlateTectonicsColors.ts @@ -131,6 +131,42 @@ const PlateTectonicsColors = { new ProfileColorProperty(PlateTectonicsNamespace, "plate8", { default: "#ff8080", projector: "#b83b3b" }), ], + /** + * Stops of the seafloor-age ramp, youngest first, evenly spaced from brand-new + * crust to {@link MAX_SEAFLOOR_AGE_MA}. An isochron is drawn in the colour its own + * age falls at, interpolated between the two stops either side of it. + * + * Red for the youngest and blue for the oldest is the convention every published + * age grid uses, and it is worth keeping even though it puts the young end of the + * ramp near the red of a divergent boundary: the youngest crust genuinely *is* the + * crust along the ridge, so the two agreeing is the point rather than a collision. + * They stay apart in the ways that matter — an isochron is drawn thinner than a + * boundary ({@link ISOCHRON_LINE_WIDTH}), underneath it, and never alone, since a + * lone red line is a ridge and a fan of them is the sea floor it made. + */ + seafloorAgeRampColorProperties: [ + new ProfileColorProperty(PlateTectonicsNamespace, "seafloorAgeYoungest", { + default: "#ff4b3e", + projector: "#c0271b", + }), + new ProfileColorProperty(PlateTectonicsNamespace, "seafloorAgeYoung", { + default: "#ffa33c", + projector: "#b56a00", + }), + new ProfileColorProperty(PlateTectonicsNamespace, "seafloorAgeMiddle", { + default: "#8ad46a", + projector: "#3f8b2f", + }), + new ProfileColorProperty(PlateTectonicsNamespace, "seafloorAgeOld", { + default: "#4aa8d8", + projector: "#1a6a92", + }), + new ProfileColorProperty(PlateTectonicsNamespace, "seafloorAgeOldest", { + default: "#4257c9", + projector: "#26307f", + }), + ], + /** Outline drawn around every plate polygon. */ plateOutlineColorProperty: new ProfileColorProperty(PlateTectonicsNamespace, "plateOutline", { default: "#dbe4f5", diff --git a/src/PlateTectonicsConstants.ts b/src/PlateTectonicsConstants.ts index b9b8f46..bf34388 100644 --- a/src/PlateTectonicsConstants.ts +++ b/src/PlateTectonicsConstants.ts @@ -52,6 +52,13 @@ export const VOLCANO_MARKER_SIZE = 3.4; /** Length in view pixels of a motion vector representing 100 mm/year. */ export const VELOCITY_VECTOR_SCALE = 26; +/** + * Line width of a seafloor isochron, in view pixels. Thinner than a plate boundary, + * because a hundred isochrons are drawn at once and they are a field to be read as a + * pattern rather than a symbol to be picked out one at a time. + */ +export const ISOCHRON_LINE_WIDTH = 1.1; + // ── Panning and zooming the flat map ────────────────────────────────────────── /** Zoom level at which the whole world fits the viewport; the map opens here. */ @@ -115,6 +122,15 @@ export const CONTINENTAL_CRUST_THICKNESS_KM = 35; /** Typical thickness of oceanic crust, km. */ export const OCEANIC_CRUST_THICKNESS_KM = 7; +/** + * Oldest ocean floor left on Earth, in millions of years, and the top of the + * isochron colour ramp. Older crust than this has been subducted — the sea floor is + * recycled on a timescale a hundred times shorter than the continents, which is the + * whole reason an isochron map looks the way it does. A few patches in the eastern + * Mediterranean and off Florida are older still, and sit at the end of the ramp. + */ +export const MAX_SEAFLOOR_AGE_MA = 180; + /** Typical thickness of the rigid lithosphere (crust + lithospheric mantle), km. */ export const LITHOSPHERE_THICKNESS_KM = 100; @@ -158,6 +174,7 @@ PlateTectonicsNamespace.register("PlateTectonicsConstants", { QUAKE_RADIUS_PER_MAGNITUDE, VOLCANO_MARKER_SIZE, VELOCITY_VECTOR_SCALE, + ISOCHRON_LINE_WIDTH, MAP_MIN_ZOOM_LEVEL, MAP_MAX_ZOOM_LEVEL, MAP_KEYBOARD_STEP_PIXELS, @@ -172,6 +189,7 @@ PlateTectonicsNamespace.register("PlateTectonicsConstants", { MAX_EARTHQUAKE_DEPTH_KM, CONTINENTAL_CRUST_THICKNESS_KM, OCEANIC_CRUST_THICKNESS_KM, + MAX_SEAFLOOR_AGE_MA, LITHOSPHERE_THICKNESS_KM, ASTHENOSPHERE_BASE_KM, TIME_RANGE_MYR, diff --git a/src/common/data/dataTypes.ts b/src/common/data/dataTypes.ts index 8b222c5..1b4d914 100644 --- a/src/common/data/dataTypes.ts +++ b/src/common/data/dataTypes.ts @@ -107,6 +107,22 @@ export interface EarthquakeCatalog { readonly description: string; } +/** + * One isochron of the ocean floor: a line along which the crust is all the same age. + * + * `plateIndices[i]` is the index (into `PLATES`) of the plate carrying vertex `i`. + * An isochron is frozen into the crust, so unlike a plate boundary it rides the plate + * it is part of — which is what makes running the clock backwards walk each isochron + * into the ridge it was made at, from both sides at once. + */ +export interface IsochronRecord { + /** Age of the crust along the line, millions of years. */ + readonly ageMa: number; + /** Flat `[lon, lat, …]` polyline in degrees. */ + readonly coords: readonly number[]; + readonly plateIndices: readonly number[]; +} + /** A Holocene volcano or an intraplate hotspot. */ export interface VolcanoRecord { readonly name: string; diff --git a/src/common/data/generated/seafloorAgeData.ts b/src/common/data/generated/seafloorAgeData.ts new file mode 100644 index 0000000..d1f1009 --- /dev/null +++ b/src/common/data/generated/seafloorAgeData.ts @@ -0,0 +1,712 @@ +/** + * seafloorAgeData.ts + * + * GENERATED FILE — DO NOT EDIT BY HAND. + * Regenerate with `npm run build-data` (see scripts/build-data.ts). + * + * Isochrons of the ocean floor: the lines along which the crust is 10, 20, 40 … 180 + * million years old, contoured from the EarthByte present-day age grid (Seton et al., + * 2020), which is built from marine magnetic anomalies calibrated against radiometric + * dates of sea-floor basalt. + * + * Every vertex carries the index of the plate that carries it, because an isochron is + * frozen into the crust: it rides the plate it is part of, and running the clock back + * walks it into the ridge it was made at. There are no isochrons on continental crust — + * the grid has no values there — which is the shape of the story: the ocean floor is + * young and symmetric about the ridges, the continents are neither. + */ + +import type { IsochronRecord } from "../dataTypes.js"; + +/** The ages, in millions of years, that have an isochron in {@link ISOCHRONS}. */ +export const ISOCHRON_AGES_MA: readonly number[] = [10,20,40,60,80,100,120,140,160,180]; + +export const ISOCHRONS: readonly IsochronRecord[] = [ + { ageMa: 10, + coords: [-76.87,-48,-77.1,-47.05,-78.9,-47.14,-80.4,-46.43,-82.85,-46.2,-83.1,-45.56,-86.69,-45.3,-86.97,-43.5,-88.21,-43.2,-88.43,-42,-92.4,-41.65,-94.6,-41.7,-94.94,-41.4,-96.53,-41.1,-96.56,-40.8,-95.65,-40.2,-95.68,-39.3,-97.43,-38.4,-97.53,-37.5,-98.88,-37.2,-99.13,-36.6,-100.8,-36.34,-101.4,-36.67,-101.7,-36.6,-101.67,-36.3,-102.3,-36.46,-102.9,-36.18,-103.2,-36.29,-103.5,-35.98,-103.8,-36.15,-105,-35.98,-105.68,-39.9,-104.49,-40.5,-105.82,-45,-107.82,-50.4,-111.46,-50.4,-112.75,-53.4,-112.39,-54,-112.93,-55.2,-113.9,-55.5,-114.6,-56.77,-120.11,-56.7,-120.6,-56.46,-122.1,-56.44,-129,-55.38,-129.6,-55.11,-130.5,-55.2,-132.9,-58.32,-133.2,-58.41,-140.32,-57.3,-141.9,-58.85,-143.03,-59.1,-144.9,-61.04,-146.35,-61.2,-146.96,-61.8,-146.4,-62.08,-146.53,-62.4,-149.61,-64.8,-156.9,-63.86,-158.7,-64.77,-162,-64.15,-165.42,-66,-167.7,-65.9,-170.44,-67.2,-172.5,-66.9,-173.7,-67.5,-176.39,-66.9,-180,-65.48], + plateIndices: [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,36] }, + { ageMa: 10, + coords: [52.8,15.41,54.3,15.24,55.8,15.95,57.3,15.45,58.33,14.4,58.53,13.5,58.26,12.3,57.22,10.5,57.3,10.3,60.09,8.7,60.9,7.46,63.3,5.4,65.7,4.09,66.3,4.12,67.64,3.3,67.89,1.8,67.78,0.6,68.4,0.05,69.13,-1.5,69.14,-2.1,69.45,-2.4,69.24,-3.3,69.32,-5.4,68.96,-6.3,69.13,-6.6,67.78,-8.7,67.94,-9,66.63,-11.4,66.9,-11.9,67.5,-12.26,67.22,-13.5,68.41,-15,67.8,-15.58,67.17,-16.5,67.32,-16.8,66.6,-17.54,68.4,-19.47,69.58,-19.5,70.81,-21,71.06,-21.9,70.93,-22.2,71.7,-23.75,75.9,-26.4,76.39,-27.3,77.1,-27.84,77.1,-28.51,78.3,-29.4,78.37,-30,80.03,-31.2,79.38,-32.4,80.4,-33.04,81.33,-34.2,80.86,-35.1,81.31,-35.7,79.76,-37.8,80.4,-38.31,82.5,-39.55,83.7,-39.16,86.1,-40.29,87.9,-38.94,90,-39.83,90.9,-39.43,98.7,-42.42,98.35,-44.1,101.4,-45.17,102.3,-44.64,108,-46.06,108.9,-45.91,115.5,-47.07,116.1,-46.61,117.6,-46.68,118.2,-46.12,121.2,-46.51,121.8,-46.4,122.4,-45.92,122.7,-46.36,123.6,-46.46,124.5,-46.39,125.1,-45.88,126.6,-46.32,127.5,-45.81,127.89,-45.9,128.1,-47.03,128.4,-47.15,139.5,-47.34,139.8,-48.8,140.1,-49.32,140.7,-49.5,141.3,-50.84,143.1,-50.76,143.7,-51.72,146.1,-51.79,147.3,-54.52,147.9,-54.68,150.3,-58.35,152.4,-58.12,154.5,-60.17,158.7,-59.4,160.5,-61.07,160.8,-61.67,161.42,-61.2,164.82,-63.6,161.7,-64.62,159.3,-65.11,157.5,-64.5,156.3,-63.58,153.9,-63.8,153,-63.46,150.37,-60.3,149.1,-59.79,147.6,-57.29,144.9,-57.51,144.3,-56.58,141.9,-56.54,141.3,-55.36,140.4,-55.13,139.8,-53.23,126.9,-53.09,126.6,-51.8,126,-51.76,125.1,-52.27,123.3,-51.84,122.7,-52.33,121.8,-52.38,120.9,-52.35,120.3,-51.82,119.1,-52.42,115.8,-52.01,114.9,-52.52,113.4,-52.39,112.5,-52.84,105.3,-51.49,104.4,-51.67,98.1,-49.97,96.9,-50.42,93.9,-49.29,93.69,-49.2,93.76,-48.9,94.5,-47.68,89.7,-45.63], + plateIndices: [4,4,4,4,20,20,20,44,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,44,7,7,7,7,7,7,7,44,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,2,36,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] }, + { ageMa: 10, + coords: [-111.93,23.4,-112.2,20.06,-112.29,19.8,-113.3,19.5,-113.93,16.5,-113.1,14.86,-110.4,14.9,-109.2,14.25,-108.56,15.3,-109.29,15.9,-109.24,16.2,-108.3,18.48,-108.2,17.7,-108.57,16.5,-107.99,15.3,-108.71,13.2,-108.25,11.7,-109.8,10.98,-110.4,10.96,-111,10.57,-111.6,10.68,-111.9,10.3,-112.49,10.2,-110.89,6.3,-110.08,5.7,-108.96,2.4,-108.31,2.1,-109.83,1.2,-110.61,-2.7,-110.87,-3,-115.19,-3.3,-116.12,-7.5,-116.52,-7.8,-116.91,-9.6,-117.89,-11.4,-118.83,-12.3,-122.1,-24.9,-120.87,-25.5,-120.74,-26.1,-121.37,-32.7,-120.31,-33.3,-115.01,-34.2,-115.67,-37.5,-114.86,-37.8,-115.26,-38.1,-114.9,-38.26,-114.61,-39,-116.28,-43.5,-118.74,-48.9,-122.16,-48.6,-123.69,-51.6,-123.37,-51.9,-123.92,-53.1,-124.1,-53.4,-125.06,-53.7,-125.76,-54.9,-129.3,-54.51,-130.8,-54.75,-132.9,-54.18,-138,-53.19,-138.3,-53.29,-139.2,-52.88,-139.5,-53.05,-140.72,-52.8,-143.4,-55.92,-148.8,-55.12,-149.4,-54.77,-150.29,-54.9,-151.52,-56.1,-152.67,-56.4,-154.4,-58.2,-155.91,-58.5,-156.33,-59.1,-155.91,-59.4,-156,-59.56,-159.16,-62.1,-165.6,-61.09,-167.4,-61.82,-170.4,-61.38,-173.4,-63.15,-175.44,-63,-177.6,-64.23,-179.92,-64.2], + plateIndices: [36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36] }, + { ageMa: 10, + coords: [20.7,-53.69,18.3,-53.31,15.6,-52.51,14.7,-52.84,14.1,-52.66,13.2,-52.94,12.3,-52.75,11.1,-53.56,9.6,-53.36,7.5,-54.78,6.6,-54.3,5.4,-54.9,3.9,-55,2.7,-54.57,1.8,-55.04,-2.34,-55.8,-2.95,-56.4,-4.33,-56.7,-4.37,-57,-6.9,-57.92,-10.5,-58.03,-13.8,-58.65,-14.1,-58.49,-14.25,-59.1,-16.46,-59.7,-16.48,-60,-17.53,-60.3,-17.63,-60.6,-18.3,-60.83,-20.4,-60.92,-20.97,-60.6,-20.7,-60.12,-19.5,-59.53], + plateIndices: [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,40,2,2,2,2,2,2,2,2,2,40,40,40] }, + { ageMa: 10, + coords: [-33.5,-59.7,-33.68,-58.5,-33.47,-57.9,-33.79,-57,-34.16,-56.7,-33.92,-56.4,-33.98,-55.8], + plateIndices: [42,42,42,42,42,42,42] }, + { ageMa: 10, + coords: [27.6,-52.43,26.7,-52.25,26.1,-52.39,25.5,-52.87,24.9,-52.83,20.04,-52.2,16.5,-51.27,15.6,-51.63,13.2,-51.57,12,-52.37,11.1,-52.15,9.9,-52.71,9,-53.56,7.8,-53.37,6.9,-53.77,5.4,-53.9,3.6,-53.64,3,-54.12,2.4,-53.84,1.5,-54.35,0.91,-54.3,-0.6,-52.51,-1.68,-52.2,-3.02,-50.1,-4.34,-49.8,-4.96,-49.2,-5.19,-48.6,-7.74,-48.6,-8.54,-46.8,-11.4,-46.81,-11.84,-45.3,-13.9,-45,-14.92,-40.2,-14.49,-39.9,-14.21,-39.3,-14.5,-38.4,-15.02,-37.8,-15.57,-35.7,-13.54,-34.8,-13.61,-34.2,-12.99,-33.6,-12.97,-33.3,-12.37,-33,-12.41,-32.1,-11.48,-31.5,-12,-29.1,-10.71,-28.5,-10.8,-28.12,-11.44,-27.6,-12.3,-25.61,-11.87,-25.2,-11.94,-24.6,-11.64,-24.3,-11.96,-22.8,-10,-21.6,-11.2,-17.4,-12.3,-17.35,-12.45,-17.1,-12.65,-16.2,-11.65,-15.6,-12.15,-13.8,-13.03,-13.5,-13.36,-11.7,-11.64,-11.1,-11.99,-9.3,-11.85,-8.7,-12.06,-7.2,-9.87,-6.3,-10.79,-2.4,-11.44,-0.9,-12.6,-0.76,-13.8,-0.94,-14.92,0,-16.8,0.06,-17.83,-0.3,-16.98,-1.5,-14.44,-1.5,-13.73,-3.3,-13.84,-3.6,-12.97,-6.9,-13.2,-7.25,-15.25,-8.1,-14.82,-11.7,-16.64,-12.6,-16.21,-14.4,-15.35,-14.7,-15,-16.2,-15,-16.5,-15.84,-16.8,-15.85,-17.7,-15.74,-18,-14.51,-18.3,-13.53,-22.2,-15.47,-23.4,-15.24,-24.9,-15.42,-25.8,-15.9,-26.4,-15.06,-28.5,-14.49,-28.8,-14.4,-29.1,-14.56,-29.4,-15.53,-29.7,-15.7,-30,-15.27,-32.4,-16.1,-32.7,-16.24,-33.6,-17.54,-34.8,-17.49,-35.4,-17.8,-35.7,-19.57,-36.3,-19.1,-38.4,-18.61,-39,-18.36,-39.9,-19.1,-40.8,-18.31,-45.6,-16.25,-45.9,-15.9,-47.4,-12.9,-47.7,-12.1,-49.5,-9.65,-49.5,-9.45,-50.1,-8.86,-50.7,-7.55,-51,-6.83,-52.5,-6,-53.34,-5.1,-53.64,-3.87,-55.2,-3.88,-55.5,-6.01,-55.8,-6.02,-56.1,-7.63,-56.7,-7.65,-57,-8.97,-57.3,-9,-57.6,-17.47,-58.5,-17.88,-59.1,-19.5,-59.53], + plateIndices: [0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40] }, + { ageMa: 10, + coords: [27.6,-52.43,27.9,-52.16,28.8,-52.02,29.4,-51.5,30,-51.6,30.09,-51.9,29.4,-52.85,28.5,-52.82,27.9,-53.42,27.3,-53.45,27,-53.73,25.5,-53.65,24.6,-54.18,20.7,-53.69], + plateIndices: [0,0,2,2,2,2,2,2,2,2,2,2,2,2] }, + { ageMa: 10, + coords: [41.4,-44.51,40.2,-44.37,39.6,-44.06,38.7,-44.89,36,-45.76,35.1,-45.83,34.5,-46.78,33.6,-46.8,33,-47.79,32.4,-47.89,32.23,-47.7,32.27,-47.4,33.3,-46.51,33.9,-45.58,34.2,-45.33,34.8,-45.39,35.7,-44.36,36.3,-44.39,39,-43.5,39.9,-42.7,41.4,-43.22,42,-42.44,42.47,-42.3,42.6,-41.87,42.68,-42.3,42,-43.81,41.4,-44.51], + plateIndices: [2,2,2,2,2,2,2,2,2,2,2,2,44,44,44,2,44,44,44,44,44,44,44,44,2,2,2] }, + { ageMa: 10, + coords: [89.7,-45.63,86.23,-44.1,85.2,-44.4,83.4,-43.49,82.8,-43.65,82.5,-43.48,82.5,-43.8,81.6,-44.4,81.3,-44.26,80.7,-44.54,78.6,-43.25,77.15,-43.5,75.38,-42.3,74.72,-41.7,74.68,-41.4,76.53,-39.6,76.14,-39,76.81,-38.1,75.9,-36.9,75,-36.26,75.6,-34.91,74.27,-33.9,74.35,-33.3,73.02,-32.1,73.13,-31.5,72.4,-30.9,72.34,-30.3,72,-29.91,69.3,-27.8,68.1,-27.17,66.6,-28.08,63.6,-28.66,60.9,-29.93,60.6,-31.09,59.4,-31.31,58.2,-32.42,57.15,-32.7,57,-34.06,55.8,-34.62,55.2,-35.34,54.3,-35.62,53.7,-36.13,53.4,-36.75,52.5,-36.87,52.25,-37.8,51.9,-38.05,49.5,-38.36,47.4,-38.95,47.1,-39.45,46.5,-39.5,45.6,-41,42.89,-41.7,42.84,-41.1,43.12,-40.5,45.9,-39.6,46.5,-38.18,47.1,-38.09,47.7,-37.5,52.23,-36.6,52.5,-35.56,53.4,-35.44,54.3,-34.26,55.2,-33.99,55.8,-33.25,56.71,-33,57.14,-32.4,57.3,-31.35,58.2,-31.11,58.5,-30.61,59.4,-29.98,60.3,-29.92,60.6,-29.62,60.9,-28.58,63.3,-27.46,66.6,-26.81,68.08,-25.8,67.55,-24.3,67.67,-23.4,67.5,-22.93,66.38,-21.3,65.1,-21.06,63.71,-18.9,65.25,-17.7,65.86,-16.8,64.85,-15,65.36,-14.1,64.52,-13.2,65.45,-11.7,65.7,-10.78,66.65,-9.6,66.51,-9.3,66.9,-9,66.88,-8.4,67.28,-7.8,67.19,-6.6,67.58,-4.8,67.18,-4.2,67.34,-3.6,66.18,-1.5,66.33,-0.3,65.96,0.6,66.06,1.2,64.8,2.08,64.2,2.09,62.1,3.36,59.66,5.7,58.8,7.07,57.3,8.23,56.28,8.7,56.1,9,56.9,10.5,57,11.65,57.34,11.7,57.38,12.3,57.36,12.6,56.7,13.01,56.44,13.5,54.9,14.1,53.4,13.47,51.9,13.81,50.9,12.9], + plateIndices: [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,44,44,44,44,44,44,44,44,44,44,44,44,2,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44] }, + { ageMa: 10, + coords: [-75.9,-44.19,-77.63,-44.1,-78.06,-42.6,-78.3,-42.31,-79.2,-42.28,-79.69,-41.1,-81,-40.89,-85.8,-40.89,-87.6,-40.6,-87.9,-40.27], + plateIndices: [33,33,33,33,33,33,33,33,33,33] }, + { ageMa: 10, + coords: [-87.9,-40.27,-87.07,-39.6,-87.21,-38.7,-89.12,-37.8,-89.4,-36.93,-90.85,-36.6,-90.9,-36.3,-98.4,-35.99,-103.82,-35.4,-104.17,-28.5,-104.38,-27.9,-105.76,-27.6,-104.25,-16.2,-103.8,-16.12,-104.07,-16.5,-103.8,-16.72,-101.4,-16.57,-95.06,-15,-94.2,-13.64,-93.39,-13.2,-92.86,-12.3,-92.4,-10.2,-93.33,-9.6,-93.57,-9,-95.01,-8.4,-95.23,-6.3,-95.85,-5.1,-94.98,0.9,-92.1,0.78,-91.8,0.43,-90.3,0.19,-88.8,-0.63,-85.2,-0.69,-84.9,-0.56,-84.6,0.08,-83.1,0.15,-82.8,0.75,-82.09,0.9,-82.5,1.23,-82.61,1.8,-82.2,4.26,-79.2,5.11,-78.3,5.02], + plateIndices: [33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33] }, + { ageMa: 10, + coords: [176.4,-16.9,175.28,-15,175.22,-12.9], + plateIndices: [7,9,36] }, + { ageMa: 10, + coords: [-104.1,-15.04,-105.13,-12.3,-105.43,-10.5,-105.2,-9.6,-104.21,-9.3,-103.97,-9,-103.8,-7.82,-102.6,-7.13,-100.5,-6.95,-100.22,-7.5,-98.7,-7.77,-98.04,-8.4,-97.28,-8.7,-97.11,-10.8,-97.5,-12,-98.04,-12.3,-98.41,-13.8,-99.9,-15.01,-102,-14.71,-104.1,-15.04], + plateIndices: [33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33] }, + { ageMa: 10, + coords: [-29.79,37.8,-30.51,37.2,-31.8,36.9,-33.6,35.02,-34.96,34.8,-35.05,34.5,-36.6,33.44,-38.22,33.3,-39.59,31.2,-40.76,30,-41.44,29.7,-42.46,28.5,-43.58,25.8,-45.09,24,-45.04,23.7,-44.4,23.56,-43.96,23.1,-44.11,21.9,-44.59,21,-44.49,20.1,-45.52,15.6,-45.3,15.3,-43.78,14.7,-43.58,12.6,-42.86,12.3,-42.47,11.7,-42.47,11.1,-39.81,10.5,-39.19,9,-38.6,8.4,-33.9,7.2,-33.6,6.8,-32.3,6.6,-32.06,6,-31.45,5.4,-31.33,4.2,-29.49,3.9,-29.16,1.8,-28.5,1.5,-28.42,1.2,-25.2,1.06,-23.42,0.6,-23.01,-0.9,-24.6,-1.1,-26.07,-0.9,-26.4,0.3,-27.9,0.76,-31.33,0.9,-32.07,1.8,-32.31,3.6,-33.83,3.9,-34.14,4.2,-34.24,5.4,-34.8,5.7,-34.91,6.3,-36.39,6.6,-38.1,7.5,-41.3,8.4,-41.86,9,-42.27,10.5,-45.02,11.1,-45.07,12,-46.22,12.9,-46.31,15,-48.06,15.6,-46.99,20.4,-47.1,21.3,-46.59,22.2,-46.45,23.4,-46.6,23.7,-47.47,24,-47.59,24.3,-46.44,25.5,-44.96,28.8,-43.91,30,-43.25,30.3,-42.07,31.5,-40.67,33.6,-38.79,33.9,-38.1,34.57,-37.49,34.8,-37.37,35.1,-35.89,35.4,-34.2,37.21,-32.35,37.8,-31.11,39.6,-30.7,41.1,-30.55,43.5,-29.27,45.6,-28.79,47.4,-30.1,50.1,-31.48,50.7,-32.1,52.25,-33.44,52.5,-33.3,52.57,-31.8,52.62,-30.6,52.06,-28.34,51.9,-28.06,50.4,-26.7,49.8,-25.58,47.4,-25.58,46.5,-26.05,45.3,-26.58,44.4,-27.37,43.8,-27.61,43.2,-27.82,40.8,-28.28,39.3,-28.99,39,-29.79,37.8], + plateIndices: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,0,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,17,17,17,28,17,17,17,17,17,17,17,17,17,17,17,0,0] }, + { ageMa: 10, + coords: [133.94,0.3,133.52,3.6,133.82,5.4,133.5,5.61], + plateIndices: [13,13,13,13] }, + { ageMa: 10, + coords: [131.24,0.6,131.71,3.6,132.54,5.1], + plateIndices: [38,38,38] }, + { ageMa: 10, + coords: [-78.3,6.05,-79.2,6.08,-81.9,5.23,-82.8,5.65,-84,5.52,-84.6,4.47,-87,3.88,-88.5,3.7,-89.1,4.25,-91.2,4.05,-91.8,4.41,-94.5,3.87,-95.42,3.9,-97.32,6.3,-100.7,9.3,-101.09,9.9,-98.92,12.3,-100.62,15,-102.2,16.8], + plateIndices: [33,33,33,33,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14] }, + { ageMa: 10, + coords: [122.17,9.6,119.1,6.28], + plateIndices: [46,46] }, + { ageMa: 10, + coords: [121.5,10.67,118.2,7.68], + plateIndices: [46,46] }, + { ageMa: 10, + coords: [50.7,12.49,49.2,12.36,47.4,11.65,45.9,11.38,43.8,11.31], + plateIndices: [44,44,44,44,44] }, + { ageMa: 10, + coords: [52.21,14.7,51.6,13.99,50.1,13.9,48,12.94,45.3,12.55], + plateIndices: [4,4,4,4,4] }, + { ageMa: 10, + coords: [-125.1,40.39,-130.67,40.5,-130.88,43.8,-131.62,44.7,-131.77,45.6,-132.43,45.9,-132.85,47.4,-132.86,49.5,-133.25,51.3,-132.9,53.07], + plateIndices: [21,36,36,36,36,36,36,36,36,36] }, + { ageMa: 10, + coords: [-36.9,52.8,-37.22,53.4,-36.98,55.2,-36.41,56.7,-35.33,57,-34.87,57.6,-26.1,63.55,-22.85,65.1,-20.77,65.7,-20.63,66,-20.87,67.2,-20.56,68.1,-18.3,69.84,-16.84,71.4,-12.21,71.4,-12.1,71.1,-13.8,69.57,-16.55,67.5,-16.84,66.6,-16.63,65.4,-18.9,64.71,-22.6,63,-31.39,57.3,-31.94,56.7,-32.94,56.4,-33.54,54.9,-33.88,52.8,-36.9,52.8], + plateIndices: [28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,17,17,17,17,28,17,17,17,17,17,17,28] }, + { ageMa: 10, + coords: [124.5,78,123.89,78.9,123,79.41,120.51,80.1,119.62,80.7,116.95,81.6,115.37,82.5,113.7,82.97,110.1,83.61,98.4,84.61,75.69,85.5,59.1,86.54,20.91,85.2,8.7,84.26,-0.86,83.1,-2.97,82.5,-1.35,81.6,1.73,80.7,2.17,80.4,1.78,80.1,4.2,79.66,5.46,79.2,5.7,78.6,6,78.85,6.3,78.59,8.59,78,8.86,77.7,8.55,77.4,9.46,76.8,8.96,75.9,9.16,75.3,9,74.56,9.63,74.4,10.71,73.5,9.9,73.13,6.9,72.54,-6.9,70.53,-8.52,71.1,-8.7,71.4,3.3,73.34,5.7,73.84,6.98,74.4,4.48,75.6,5.04,75.9,4.57,76.2,4.63,76.8,5.14,77.1,4.92,77.7,3.95,78,4.23,78.6,1.2,79.2,0.33,79.5,0.51,79.8,0.3,79.86,-4.2,80.7,-4,81,-4.5,81.39,-8.19,82.2,-10.89,83.1,-9,83.72,0.9,85.04,13.2,86.02,48.9,87.19,63.6,87.38,78.9,86.38,104.4,85.15,117.34,83.7,120.09,82.8,120.97,81.9,123,80.93,123.3,80.4,125.87,79.5,126.6,78.82,126.75,78], + plateIndices: [17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,28,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,17,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28] }, + { ageMa: 20, + coords: [-76.8,-51.97,-78.79,-48.9,-83.61,-49.2,-84.02,-48.3,-86.06,-48.3,-86.7,-46.5,-89.1,-46.59,-89.44,-46.5,-89.6,-45.9,-92.7,-45.68,-92.96,-43.8,-94.42,-43.5,-94.44,-43.2,-95.4,-43,-97.8,-42.97,-98.22,-42.6,-98.4,-41.85,-99.3,-41.61,-99.61,-41.7,-101.55,-47.4,-103.09,-51,-105,-51.17,-106.5,-51,-107.77,-53.7,-106.82,-54.3,-107.69,-56.1,-109.17,-56.1,-110.02,-57.6,-116.1,-57.37,-125.62,-56.1,-127.93,-59.4,-129,-59.41,-134.4,-58.49,-136.2,-58.5,-137.46,-59.7,-138.4,-60,-140.4,-61.82,-141.93,-62.1,-142.56,-62.7,-142.07,-63,-142.2,-63.26,-145.8,-65.71,-151.8,-64.94,-153.6,-65.03,-154.8,-65.64,-158.13,-65.1,-161.77,-66.9,-164.4,-66.82,-167.1,-68.09,-169.5,-67.82,-170.87,-68.4,-171.6,-68.41,-171.9,-68.15,-174.6,-67.53,-174.9,-67.26,-175.5,-67.24,-175.8,-66.96,-176.4,-66.95,-179.94,-65.7], + plateIndices: [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,36] }, + { ageMa: 20, + coords: [-75.6,-67.82,-72.48,-66.3,-72.05,-65.7,-70.36,-64.8,-70.51,-64.5,-68.36,-63.3,-68.23,-63,-69,-62.58,-69.14,-62.4,-68.92,-62.1,-69.46,-61.8,-69.17,-61.2,-69.69,-60.6,-69.28,-60.3,-72.92,-58.2,-71.98,-57,-72.54,-56.7,-72.52,-56.1], + plateIndices: [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] }, + { ageMa: 20, + coords: [57.5,16.8,58.79,14.7,58.71,12.6,58.07,11.4,58.2,11.1,60.6,9.9,61.2,9.13,64.8,6.11,66.9,5.15,67.5,5.2,68.4,4.52,67.94,4.2,68.4,3.98,68.76,3.3,68.8,1.8,70.8,-0.85,70.37,-1.8,70.81,-2.7,70.19,-3.9,69.92,-6,68.39,-8.1,68.71,-8.7,67.48,-10.2,68.16,-11.4,68.1,-12.09,69.5,-14.1,67.83,-16.2,69.6,-18.21,70.88,-18,72.24,-19.5,72,-20.1,72.3,-20.65,73.12,-21.6,74.86,-22.8,75,-23.49,75.6,-23.9,76.5,-23.97,78.72,-25.8,78.38,-26.7,78.57,-27,79.8,-27.88,79.8,-28.45,81.23,-29.4,81.05,-30.3,82.97,-31.8,83.02,-32.4,82.72,-33,82.87,-33.9,82.16,-34.8,82.04,-35.4,84.6,-36.9,85.8,-36.48,88.08,-37.5,89.4,-36.3,92.1,-37.29,92.7,-36.93,100.5,-40.02,100.19,-41.1,100.5,-41.31,103.2,-42.2,104.1,-41.96,109.2,-43.25,109.5,-43.27,110.1,-42.72,114.73,-43.5,115.2,-43.9,116.4,-44.1,117,-43.68,118.2,-43.83,118.8,-43.37,122.1,-43.47,122.4,-43.16,124.5,-43.3,125.1,-43.1,127.2,-43.29,127.8,-43.04,128.4,-43.66,131.1,-44.08,139.2,-44.3,139.5,-46.29,140.4,-46.69,140.7,-47.86,142.5,-47.83,142.8,-47.94,143.1,-48.63,145.2,-48.74,146.4,-51.83,147,-51.92,148.16,-54.3,148.8,-54.74,150.9,-54.72,152.1,-57.06,153,-57.46,156.3,-56.66,157.2,-56.75,157.69,-58.2,158.11,-58.5,158.02,-58.8,159.6,-59.88,160.8,-61.53,161.1,-61.06,161.73,-60.9,166.5,-63.53,170.1,-64.8,167.7,-65.83,166.5,-65.9,163.91,-66.9,162.3,-67.16,160.8,-66.55,160.5,-66.65,159.89,-66.3,159.9,-65.96,159.6,-66.12,159,-65.52,158.7,-65.58,157.8,-65.08,155.1,-65.29,152.7,-63.67,151.8,-62.7,150.9,-62.4,148.8,-59.7,146.1,-59.88,145.2,-59.06,142.5,-59.14,141.9,-58.03,141,-57.91,140.42,-56.4,139.8,-55.78,129.6,-55.9,126,-55.52,125.7,-54.93,125.4,-54.91,124.2,-55.18,118.8,-55.01,118.2,-55.33,114,-55.14,113.4,-55.57,111.9,-55.34,111,-55.8,109.36,-55.5,108.9,-55.12,103.2,-54.05,102,-54.53,95.89,-52.8,94.5,-52.86,91.32,-51.6,91.87,-50.7,91.8,-50.41,83.7,-46.6,82.62,-46.8,80.1,-45.56,78.9,-46.25,78,-46.4,75.9,-45.09,74.4,-45.36,72.3,-43.75,71.97,-43.2,73.54,-41.7,73.27,-41.4,74.04,-40.2,72.25,-38.4,72.61,-37.5,71.26,-36.3,71.4,-35.66,70.12,-34.5,70.79,-33.6,70.14,-33,69.9,-32.4,68.57,-31.2,67.98,-31.2,67.24,-30.6,67.32,-30,66,-28.94,63.3,-29.3,61.5,-30.26,61.2,-30.68,60.9,-30.7,60.6,-31.45,57.86,-33,57.3,-33.54,57,-34.5,53.7,-36.62,53.1,-37.82,52.5,-37.89,51.9,-38.6,47.4,-39.6,47.1,-40.21,46.2,-40.63,45.9,-41.25,42.9,-42.26,42.27,-43.5,42.37,-43.8,41.64,-45,41.1,-45.19,39.9,-44.74,39.3,-44.76,38.7,-45.76,37.5,-45.73,36.6,-46.5,34.8,-46.77,34.2,-47.65,33.9,-47.85,33.3,-47.79,32.7,-48.51,32.1,-48.65,31.45,-49.2,31.36,-48.9,31.68,-48.6,32.1,-47.38,32.45,-47.1,32.4,-46.79,32.7,-46.85,33.38,-46.2], + plateIndices: [4,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,36,36,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,44,44,44,44] }, + { ageMa: 20, + coords: [180,-65.67,175.79,-64.2,177.26,-63.3,179.1,-63.44,180,-63.06], + plateIndices: [2,2,36,36,36] }, + { ageMa: 20, + coords: [-21.3,-61.06,-25.5,-61.06,-26.16,-61.2,-26.7,-61.81,-30,-62.02,-30.93,-62.7,-35.7,-63.44,-39.9,-63.33,-41.1,-63.53], + plateIndices: [2,2,2,2,2,2,2,2,2] }, + { ageMa: 20, + coords: [-179.91,-63,-178.51,-62.1,-176.4,-62.24,-173.7,-60.6,-170.4,-60.91,-169.53,-60.3,-168.6,-60.23,-162.9,-60.99,-159.6,-58.51,-159.93,-58.2,-159.6,-57.6,-158.21,-57.3,-156.34,-55.5,-155.48,-55.2,-154.2,-53.93,-152.7,-53.95,-149.7,-54.64,-149.4,-54.42,-148.8,-54.82,-147,-54.94,-144.64,-51.9,-144,-52.14,-143.7,-51.95,-142.2,-52.17,-139.5,-52.8,-139.2,-52.66,-134.86,-53.7,-130.67,-54,-129.9,-52.74,-128.24,-52.5,-127.17,-50.7,-128,-50.1,-126.57,-47.7,-123.6,-47.96,-123.3,-47.74,-121.48,-44.4,-118.93,-38.7,-121.34,-38.1,-121.61,-37.8,-121.82,-33.6,-128.17,-31.8,-128.34,-22.2,-128.1,-21.86,-125.7,-21.6,-125.53,-20.1,-125.87,-11.7,-125.4,-11.4,-124.5,-11.66,-120.9,-11.57,-120.3,-10.88,-119.66,-4.5,-119.49,-4.2,-118.5,-3.7,-117.88,-2.1,-118.29,0.9,-119.51,1.2,-120.3,4.2,-121.11,4.2,-121.28,4.8,-122.03,5.1,-122.35,6.9,-121.17,7.5,-121.5,8.2,-121.2,7.85,-121.17,8.1,-120.6,8.5,-120,8.39,-119.4,8.9,-118.38,9.3], + plateIndices: [36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36] }, + { ageMa: 20, + coords: [22.8,-54.58,14.4,-53.19,10.5,-54.09,8.14,-54.9,3.3,-55.87,0.9,-55.73,-0.6,-55.93,-1.24,-56.1,-1.25,-56.4,-2.75,-56.7,-2.8,-57,-6,-58,-11.4,-58.48,-11.82,-59.1,-14.18,-59.7,-14.23,-60,-15.6,-60.63,-18.3,-61.06,-21.3,-61.06], + plateIndices: [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] }, + { ageMa: 20, + coords: [-59.56,-60.9,-59.31,-60.3,-57.72,-58.8,-55.95,-58.8,-55.11,-57.9,-53.8,-57.6,-53.58,-57.3,-45.37,-57.3,-44.72,-56.1,-43.33,-55.8,-42.35,-54], + plateIndices: [2,2,42,42,42,42,42,42,42,42,40] }, + { ageMa: 20, + coords: [-4.5,80.62,-1.47,80.1,-0.9,79.44,1.56,78.9,0.99,78.6,2.33,78,2.65,77.4,2.2,76.5,2.41,75.9,4.55,75,4.74,74.7,3.6,74.1,-5.66,72.6,-11.1,71.48,-15,71.75,-20.1,71.71,-19.84,71.1,-19.98,70.8,-23.17,68.4,-24,66.3,-24.3,66.05,-27.07,64.8,-35.01,59.1,-35.4,58.55,-36.17,58.2,-37.15,57.3,-38.8,56.7,-39.14,55.2,-38.78,52.8,-33.98,52.5,-33.67,51.6,-30.86,48.6,-30.54,47.4,-30.64,46.2,-32.08,43.5,-32.57,40.8,-32.96,40.2,-32.87,39,-33.69,37.8,-35.4,37.73,-35.93,36.9,-37.2,35.68,-38.49,35.4,-38.61,35.1,-39.33,34.8,-39.43,34.5,-40.5,34.05,-41.83,33.9,-42,33.21,-43.2,31.8,-44.1,31.5,-44.61,30.6,-45.27,30.3,-45.74,29.7,-48.78,24.3,-48.11,24,-48.01,23.7,-48.11,22.2,-48.55,18.9,-49.12,17.7,-49.45,15.9,-47.68,15,-47.73,13.2,-46.66,12.3,-46.35,11.4,-44.17,10.8,-43.82,10.5,-43.36,9,-42.92,8.7,-42.87,8.4,-36.47,6.3,-36.44,5.7,-35.86,5.4,-35.83,4.2,-35.1,3.8,-33.91,3.6,-33.8,1.8,-33.05,1.2,-33.03,0.9,-29.51,0.6,-29.42,0.3,-28.07,0,-28.01,-0.3,-27.36,-0.6,-27.3,-0.92,-26.4,-0.96,-26.1,-1.23,-24.3,-1.26,-21,-0.81,-19.5,-0.9,-18.69,-1.8,-16.27,-1.8,-15.52,-3.9,-15.45,-4.2,-15.74,-4.5,-14.97,-7.5,-17.19,-8.7,-16.98,-9.9,-17.23,-10.5,-16.95,-12,-17.1,-12.32,-18.71,-12.9,-18.26,-14.7,-17.82,-15,-17.39,-18.3,-16.76,-18.6,-15.8,-22.8,-17.73,-23.7,-17.79,-25.5,-18.22,-25.8,-18.08,-27.3,-17.62,-27.6,-16.81,-29.7,-18,-29.96,-18.28,-30.3,-17.83,-32.7,-18.96,-33.3,-18.88,-33.9,-19.1,-34.2,-19.77,-34.5,-19.89,-34.8,-20.86,-35.1,-21.17,-36,-22.32,-36.3,-22.19,-38.7,-21,-39.07,-20.8,-40.2,-21.1,-40.8,-22.03,-41.1,-22.28,-41.4,-21.76,-45.9,-21.65,-46.2,-21.3,-46.26,-19.93,-46.2,-19.5,-47.75,-16.09,-48,-15.74,-49.8,-12.91,-50.1,-11.57,-51.9,-10.64,-54,-8.32,-54,-7.36,-55.8,-10.2,-56.61,-11.4,-57.25,-12.6,-57.32,-14.1,-57.83,-15.52,-57.9,-15.78,-58.2,-19.8,-58.4,-20.29,-59.1,-21.6,-59.09,-22.5,-59.39,-22.8,-59.87,-23.7,-59.98,-24,-60.46,-25.5,-60.48], + plateIndices: [28,28,28,28,28,28,28,28,28,28,28,28,28,17,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40] }, + { ageMa: 20, + coords: [-61.2,-56.23,-62.03,-57,-63.79,-57,-65,-57.9,-66.3,-57.89,-66.91,-57.6], + plateIndices: [42,42,42,42,2,2] }, + { ageMa: 20, + coords: [-48.9,-53.7,-49.76,-54.9,-51,-54.93,-51.81,-56.1,-59.4,-55.62,-60,-56.08,-61.2,-56.23], + plateIndices: [42,42,42,42,42,42,42] }, + { ageMa: 20, + coords: [2.1,-51.83,2.72,-51.9,3.6,-53.13,6,-53.44,7.8,-52.99,9,-53.1,11.1,-51.77,12.3,-51.93,14.1,-50.84,15,-51.03,15.6,-50.8,16.2,-51,16.8,-50.66,21,-51.47,25.8,-52.01,26.7,-51.37,27.9,-51.6,28.5,-51.24,29.1,-51.26,30,-50.23,30.6,-50.14,31.2,-49.25,31.33,-50.1,29.4,-52.97,28.8,-52.95,27.6,-54,26.4,-54.29,25.2,-54.17,24.3,-54.67,22.8,-54.58], + plateIndices: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2] }, + { ageMa: 20, + coords: [2.1,-51.83,0.38,-51.9,-0.86,-49.8,-2.13,-48.6,-2.44,-48,-5.12,-48,-5.72,-46.2,-9,-46.26,-9.47,-45,-10.2,-44.7,-11.42,-44.7,-12.23,-41.4,-12.56,-39.9,-11.45,-39.3,-11.24,-38.7,-11.48,-37.8,-12.7,-37.5,-13.07,-35.1,-11.75,-34.5,-11.82,-33.9,-11.6,-33.6,-10.78,-33.3,-10.78,-33,-10.2,-32.78,-9.95,-32.4,-10.08,-31.8,-9.02,-31.2,-9.66,-28.8,-9.51,-28.5,-8.27,-27.9,-8.78,-27.3,-9.22,-26.1,-9.67,-25.8,-10.02,-24.3,-9.61,-24,-9.67,-22.2,-8.1,-21.39,-7.86,-21,-9.04,-17.1,-9.69,-16.8,-10.36,-13.5,-10.83,-13.2,-11.4,-11.4,-9.92,-10.8,-9.69,-10.5,-10.14,-8.7,-9.86,-8.4,-10.22,-6.9,-8.07,-6,-8.96,-3,-8.74,-2.4,-9.62,-0.3,-12,-0.34,-12.74,0.3,-13.5,0.37,-13.8,0.06,-15.9,0.22,-20.1,-0.41,-21,-0.36,-21.29,-0.3,-21.62,0.9,-26.61,1.5,-26.66,1.8,-27.41,2.1,-27.65,3.9,-29.44,4.2,-29.75,5.7,-30.37,6,-30.42,6.6,-36.65,8.1,-37.77,9.3,-38.03,10.2,-40.89,11.1,-40.88,11.7,-42.12,12.6,-42.21,14.4,-43.84,15,-43.95,15.3,-43.69,16.8,-43.13,18,-42.62,22.8,-42.74,23.1,-43.41,23.4,-43.35,23.7,-42.9,24.6,-42.47,24.9,-40.84,28.2,-39.99,29.4,-39.34,29.7,-38.82,30.6,-37.96,30.9,-36.9,32.14,-36.63,33,-35.1,33.26,-34.83,33.6,-33.5,34.2,-33.36,34.5,-32.11,34.8,-30.61,36.3,-30.38,36.9,-28.8,36.98,-28.45,37.2,-27.64,38.4,-26.79,39,-26.63,40.2,-26.29,40.5,-25.72,42.9,-24.04,45.9,-23.91,47.1,-24.13,48,-24.55,48.3,-25.37,49.8,-26.81,51.3,-26.85,51.9,-30,52.09,-31.78,52.8,-31.76,54.9,-31.24,56.4,-29.38,57,-28.42,57.9,-27.52,58.2,-24,60.76,-18.97,63.9,-15.51,65.4,-14.29,67.5,-10.86,69.9,-10.8,70.86,-8.77,70.5], + plateIndices: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17] }, + { ageMa: 20, + coords: [33.38,-46.2,34.2,-45.01,34.8,-45.03,35.7,-43.92,37.5,-43.58,38.1,-42.9,39.3,-42.93,40.2,-41.95,41.7,-42.36,42.3,-42.13,42.9,-40.47,43.8,-39.29,45.9,-38.59,46.5,-37.73,47.4,-37.45,47.7,-36.87,52.2,-35.7,52.5,-35.14,53.4,-34.94,54,-33.8,56.7,-32.09,57.3,-30.88,57.9,-30.29,60.52,-28.8,60.9,-28.06,61.5,-27.6,63.3,-26.66,64.8,-26.61,66.03,-26.1,65.36,-24.6,65.73,-24,64.8,-22.37,64.5,-22.17,63.42,-22.2,62.06,-19.8,62.15,-19.5,64,-18,63.26,-15.9,63.47,-15.3,63.05,-14.1,63.77,-13.2,63.78,-12.3,65.16,-10.8,65.63,-9.3,65.95,-9,65.83,-8.4,66.58,-7.2,66.2,-6.6,66.7,-5.4,65.4,-3.65,65,-2.7,65.18,-1.2,64.93,0,63.94,0.9,63.3,0.89,61.3,2.1,58.15,5.4,57.83,6,55.49,7.5,55.5,7.97,56.87,10.8,56.78,12,56.1,12.85,55.2,13.38,54.3,13.46,53.82,13.2], + plateIndices: [44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44] }, + { ageMa: 20, + coords: [-75.3,-40.67,-77.63,-41.1,-78.03,-40.2,-78.3,-40.11,-81.9,-39.9,-83.63,-36.3,-84,-36.04,-89.1,-35.98,-89.7,-35.74,-90,-35.94,-90.89,-35.7,-94.11,-26.4,-91.59,-25.5,-91.84,-24,-94.43,-15.9,-93.9,-15.8,-93.3,-15.29,-92.7,-15.51,-92.2,-15,-91.5,-14.84,-89.7,-13.72,-89.26,-14.1,-89.17,-13.2,-90.16,-7.2,-88.44,-6.3,-88.8,-4.71,-86.7,-4.26,-81.6,-1.37], + plateIndices: [33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33] }, + { ageMa: 20, + coords: [134.71,0.6,134.3,3,134.8,4.8,134.46,6,134.1,6.13], + plateIndices: [13,13,13,13,13] }, + { ageMa: 20, + coords: [-85.5,9.07,-87.3,7.98,-89.7,10.28,-90.6,9.72,-93,11.6,-93.6,11.25,-94.2,11.54,-95.09,11.4,-96.39,12.6,-96.25,14.1,-95.7,14.92], + plateIndices: [14,14,14,14,14,14,14,14,14,14,14] }, + { ageMa: 20, + coords: [-118.38,9.3,-119.1,13.86,-119.3,18.3,-118.23,20.1,-118.56,25.2,-119.74,26.7,-120.9,27.05,-121.05,27.3,-121.11,30.9,-122.1,33.3,-121.98,34.5,-122.84,35.4,-122.78,36.3,-123.1,36.9], + plateIndices: [36,36,36,36,36,36,36,36,36,36,36,36,36,36] }, + { ageMa: 20, + coords: [114.57,12.3,116.4,14.14,119.4,14.29], + plateIndices: [46,46,46] }, + { ageMa: 20, + coords: [138.44,12.3,138.26,15.9,138.29,16.5,138.54,16.8,138.27,17.1,138.61,19.2,138.11,23.7,134.72,32.1], + plateIndices: [38,38,38,38,38,38,38,1] }, + { ageMa: 20, + coords: [119.1,16.06,115.5,15.65,114.6,14.25,113.4,13.55], + plateIndices: [46,46,46,46] }, + { ageMa: 20, + coords: [140.7,14.05,140.1,14.19,139.84,15.6,139.77,18.9,139.99,20.4,139.42,25.2,138.02,29.1,137.03,32.7], + plateIndices: [38,38,38,38,38,38,38,38] }, + { ageMa: 20, + coords: [141.67,14.1,142.28,14.7,142.28,18.6,142.01,21], + plateIndices: [38,38,38,38] }, + { ageMa: 20, + coords: [-124.8,39.31,-125.7,40.19,-132.6,40.24,-135.21,40.5,-135.66,43.2,-135.4,46.8,-135.86,48,-136.62,48.3,-137.32,50.7,-137.96,55.5,-137.85,55.8,-135.6,55.93], + plateIndices: [36,36,36,36,36,36,36,36,36,36,36,36] }, + { ageMa: 20, + coords: [138.9,42.93,137.4,42.07,134.4,41.5,134.02,41.7], + plateIndices: [34,1,1,1] }, + { ageMa: 20, + coords: [153,48.56,149.24,46.5,144.3,45.12], + plateIndices: [34,34,34] }, + { ageMa: 20, + coords: [167.83,55.5,168.3,56.1,168.27,56.4,167.83,56.7,168.59,58.2,168.17,58.5,169,59.4], + plateIndices: [28,28,28,28,28,28,28] }, + { ageMa: 20, + coords: [9.49,78,10.2,77.15,11.54,76.8,12,76.32,12.56,76.2,11.07,75.3,10.83,74.7,10.97,74.4,12.89,73.2,12.82,72.9,10.34,72.3,-1.8,70.4,-7.5,70.09], + plateIndices: [17,17,17,17,17,17,17,17,17,17,17,17,17] }, + { ageMa: 20, + coords: [127.83,78.3,127.74,79.2,125.12,80.4,122.45,82.2,121.61,83.1,121.74,83.4,117.3,84.31,105.4,85.5,68.1,87.74,48.8,87.6,9.9,86.47,3.31,86.1,-5.1,85.2,-11.69,84.3,-15.11,83.4,-13.5,83.26,-6.31,81.6,-5.49,81.3,-5.36,81], + plateIndices: [28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28] }, + { ageMa: 20, + coords: [117,80.96,112.25,82.5,111.9,82.81,105.3,83.67,95.4,84.35,75.6,85.21], + plateIndices: [17,17,17,17,17,17] }, + { ageMa: 20, + coords: [0.9,81.67,-0.03,81.9,0.3,82.17,2.4,82.7,6.6,83.25,18.6,84.44,25.8,84.85], + plateIndices: [17,17,17,17,17,17,17] }, + { ageMa: 20, + coords: [75.6,85.21,57.6,86.09,25.8,84.85], + plateIndices: [17,17,17] }, + { ageMa: 40, + coords: [180,-66.74,175.5,-69.82,175.66,-70.2,174.58,-70.2], + plateIndices: [2,2,2,2] }, + { ageMa: 40, + coords: [-86.1,-54.52,-86.4,-54.94,-86.7,-54.16,-87.21,-54,-87.01,-54.3,-87.37,-54.3,-87.3,-53.7,-87.6,-53.51,-88.2,-53.74,-87.99,-53.4,-88.2,-53.2,-88.5,-53.51,-89.35,-52.8,-90.9,-52.01,-92.4,-50.56,-92.7,-50.61,-94.17,-52.8,-96.51,-52.8,-98.62,-55.8,-98.1,-56.46,-97.59,-56.7,-98.4,-57.81,-100.5,-57.89,-102,-59.55,-103.8,-59.44,-107.4,-58.69,-108.39,-58.8,-109.2,-59.4,-112.8,-58.37,-117,-58.06,-122.1,-61.27,-123.16,-61.2,-126.6,-60.26,-127.9,-60.3,-133.32,-63.6,-135,-63.68,-135.6,-63.96,-136.01,-64.2,-135.69,-64.8,-135.9,-65.03,-141.3,-66.98,-143.1,-66.58,-143.4,-66.88,-144.9,-66.8,-145.8,-67.04,-147.6,-66.79,-150,-67.47,-151.8,-67.02,-156.9,-68.52,-159.4,-68.1,-161.7,-68.68,-161.74,-69,-163.8,-69.6,-167.1,-69.98,-167.7,-69.95,-169.2,-69.19,-170.1,-69.06,-174,-67.64,-174.6,-67.63,-174.9,-67.34,-175.5,-67.33,-175.8,-67.05,-178.5,-66.46,-179.1,-66.02,-180,-66.74], + plateIndices: [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,36,2] }, + { ageMa: 40, + coords: [-84.48,-69.6,-84.6,-69.06,-77.4,-65.87], + plateIndices: [2,2,2] }, + { ageMa: 40, + coords: [140.4,-60.2,140.1,-60.05,131.4,-60.71,123.3,-60.59,106.2,-61.2,104.18,-60.9,101.7,-59.9,96.3,-59.66,92.38,-58.5,86.93,-55.8,85.15,-54.6,84.17,-53.1,82.37,-52.2,78.55,-51,76.2,-49.56,70.8,-48.16,67.78,-45.3,68.05,-43.8,67.59,-43.5,67.31,-42.3,66.33,-41.7,66.65,-41.1,66.56,-40.8,65.39,-39.6,65.4,-39,64.78,-38.1,65.05,-37.2,63.99,-35.7,61.96,-33.9,61.78,-33.3,61.5,-33.23,59.29,-34.2,58.8,-34.79,57.3,-35.53,56.4,-37.34,55.5,-37.88,54.3,-38.16,53.7,-39.03,52.46,-39.6,51.9,-40.69,47.4,-41.71,46.8,-42.56,46.2,-42.63,45.3,-43.26,43.2,-43.81,42.3,-44.6,41.92,-45.3,41.95,-45.9,41.66,-46.2,41.76,-46.5,41.4,-46.66,40.8,-47.53,38.7,-47.63,37.2,-48.32,34.8,-48.44,33.6,-49.17,32.4,-49.95,29.59,-53.1,26.4,-55.61,24.9,-55.9,23.1,-55.88,20.7,-56.57,18.45,-56.4,13.8,-54.89,9.9,-54.85,8.4,-55.36,7.07,-55.5,6,-56.13,3.93,-56.7,2.7,-57.53,-1.24,-57.6,-1.36,-57.9,-1.8,-58.07,-3.53,-58.2,-3.7,-58.5,-5.1,-58.93,-8.1,-59.06,-8.77,-59.7,-9.91,-60,-10.8,-61.05,-15.9,-61.57,-17.1,-61.41,-20.4,-61.54,-23.7,-63,-26.75,-63,-27.67,-63.6,-28.5,-63.81,-35.4,-64.54,-43.2,-64.8,-48.07,-64.2], + plateIndices: [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] }, + { ageMa: 40, + coords: [150.6,-65.1,150,-64.52,146.1,-62.73,145.2,-62.8,144.9,-62.6,144.76,-63,143.98,-63,142.5,-61.74,141.23,-61.2,140.4,-60.2], + plateIndices: [2,2,2,2,2,2,2,2,2,2] }, + { ageMa: 40, + coords: [-86.1,-54.52,-85.8,-54.72,-85.5,-54.52,-85.2,-55.02,-84.75,-54.9,-84.9,-55.33,-82.8,-56.71,-77.1,-58.36,-76.08,-59.1,-74.44,-59.7,-74.7,-60.09,-73.73,-60.6,-73.92,-60.9,-77.7,-63.23], + plateIndices: [2,2,2,2,2,2,2,2,2,2,2,2,2,2] }, + { ageMa: 40, + coords: [178.8,-60.8,177,-60.58,175.57,-61.2,175.5,-61.62,174.3,-62.24,172.2,-62.8,170.7,-62.89,167.7,-62.36,161.5,-60,161.13,-59.7,160.83,-58.8,161.74,-57.6,161.95,-56.7,161.77,-55.8,162.5,-54.9,163.85,-54,165.3,-50.75], + plateIndices: [36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36] }, + { ageMa: 40, + coords: [-165.78,-55.8,-165.96,-56.1,-165.56,-56.4,-165.72,-56.7,-169.8,-58.8,-171.6,-58.26,-172.8,-58.82,-174.6,-58.78,-175.75,-59.4,-177.62,-59.1,-180,-60.35], + plateIndices: [36,36,36,36,36,36,36,36,36,36,36] }, + { ageMa: 40, + coords: [-45.2,-58.8,-44.4,-57.73,-43.5,-57.63,-43.2,-57.35,-42.9,-57.6,-42.62,-56.7,-42.76,-56.4,-41.98,-55.2,-41.96,-54.3], + plateIndices: [42,42,42,42,42,42,42,42,42] }, + { ageMa: 40, + coords: [-18,-54.81,-16.33,-55.2,-16.2,-55.52,-14.72,-56.1,-14.69,-56.4,-14.96,-56.7,-17.7,-56.6,-18.28,-56.7,-18.6,-57.03,-20.44,-57,-21,-57.56,-23.7,-57.71], + plateIndices: [40,40,40,40,40,40,40,40,40,40,40,40] }, + { ageMa: 40, + coords: [-165.78,-55.8,-165,-55.32,-164.1,-55.42,-163.8,-55.25,-159.3,-51.75,-155.1,-52.95,-150.17,-49.5,-149.34,-49.5], + plateIndices: [36,36,36,36,36,36,36,36] }, + { ageMa: 40, + coords: [165,-45.95,164.69,-45.9,164.4,-46.71,161.7,-47.39,160.2,-48.47,158.7,-48.82,157.5,-49.89,151.8,-51.86,151.2,-52.32,150.9,-52.35,150.6,-51.72,150.3,-51.93,150.26,-51.6,149.84,-51.3,150.06,-51,149.47,-50.7,149.79,-50.4,149.57,-49.8], + plateIndices: [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7] }, + { ageMa: 40, + coords: [-147.4,57.3,-147.45,57,-147.99,56.7,-148.15,55.8,-150.66,55.5,-151.53,52.2,-149.27,51.6,-149.66,48.6,-149.4,48.3,-146.84,47.4,-147.16,43.8,-149.09,43.5,-149.07,40.2,-143.1,40.05,-142.8,39.89,-138.6,39.94,-135.44,39.6,-135.3,38.63,-132.75,38.4,-132.43,38.1,-132.25,37.2,-131.57,36.3,-131.8,33.3,-134.77,32.7,-134.64,31.2,-134.81,30.9,-136.5,30.62,-137.74,30,-136.68,25.2,-130.98,25.2,-129.59,22.2,-127.98,19.8,-127.69,18.3,-127.74,18,-132.6,17.14,-134.16,16.5,-132.76,6.9,-135,6.27,-135.6,6.32,-137.1,5.7,-135.38,-1.8,-133.8,-1.92,-133.5,-1.72,-132.9,-1.9,-131.4,-1.5,-130.83,-1.8,-129.64,-9.6,-129.74,-9.9,-137.66,-11.7,-137.68,-17.4,-139.76,-18.3,-138.95,-20.7,-139.03,-21,-139.5,-21.38,-141.28,-21.9,-141.29,-22.2,-139.2,-33.47,-138.6,-33.63,-136.8,-33.24,-135.48,-33.3,-134.04,-39.3,-133.5,-39.49,-132.3,-39.53,-132,-39.32,-131.7,-39.47,-129.68,-44.1,-130.8,-45.66,-132.85,-45.6,-135.02,-48.3,-135.01,-48.6,-134.28,-49.2,-135.26,-50.4,-136.8,-50.22,-138.6,-51.96,-139.41,-51.9,-142.8,-50.62,-143.4,-50.65,-144.3,-51.33,-144.9,-51.32,-149.34,-49.5], + plateIndices: [36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36] }, + { ageMa: 40, + coords: [-19.5,-52.18,-20.18,-51.9,-20.43,-50.7,-22.22,-50.1,-22.67,-48.6,-26.41,-48,-26.45,-46.5,-27.77,-46.2,-27.98,-45.9,-28.03,-43.8,-28.86,-43.2,-28.92,-42,-28.9,-41.4,-27.34,-41.1,-27.15,-39.3,-27.62,-38.7,-27.64,-36.9,-26.41,-36.3,-26.22,-35.4,-25.54,-35.1,-25.45,-34.8,-24.33,-34.5,-24.02,-33.3,-23.7,-33.38,-22.8,-33,-22.67,-30.3,-22.18,-30,-22.16,-27.9,-23.32,-27.6,-23.08,-25.2,-22.32,-24.3,-20.36,-23.7,-20.4,-22.8], + plateIndices: [40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40] }, + { ageMa: 40, + coords: [54.45,13.2,55.5,13.05,56.1,12.64,56.61,11.7,56.65,10.8,54.94,6.9,55.5,6.11,56.86,5.1,57,4.58,57.69,3.9,60.01,2.1,59.97,1.5,60.3,0.96,62.4,-0.45,63.33,-0.6,62.62,-3.3,62.07,-4.5,62.12,-4.8,62.93,-5.4,62.7,-7.04,63.61,-7.8,63.06,-9.3,63.46,-9.9,60.6,-14.7,60.4,-15.3,61.06,-16.2,60.98,-18.6,60.34,-19.2,59.53,-20.7,59.81,-21.6,59.49,-21.9,59.7,-22.29,60.32,-22.5,60.46,-24.3,61.62,-25.5,61.67,-25.8,61.08,-26.7,58.17,-28.8,56.4,-30.62,54.9,-31.46,54.55,-32.1,53.4,-32.64,52.84,-33.6,51.9,-33.84,51.04,-34.5,48.3,-35.42,44.4,-37.26,43.49,-39,43.04,-39.3,43.22,-39.6,42.78,-39.9,42.6,-40.81,40.8,-40.75,39.6,-41.44,37.2,-41.72,35.37,-43.5,34.79,-43.8,35.1,-44.21,34.31,-44.1,33.9,-44.98,33,-45.41,31.5,-48.09,31.2,-47.96,31.26,-48.3,30.9,-48.25,30.42,-48.6,30.45,-48.9,29.79,-49.2,27.3,-49.49,25.8,-50.18,24,-50.22,19.5,-48.91,16.2,-48.99,14.1,-50.22,13.5,-50.33,12.9,-50.84,12,-50.97,11.7,-51.35,11.4,-51.12,9.99,-51.9,9.6,-51.38,8.4,-51.32,7.8,-50.93,6.9,-51.01,6.58,-50.7,5.7,-50.58,5.22,-49.8,4.5,-49.27,4.31,-48.6,3.4,-48,2.92,-47.1,1.12,-46.8,0.4,-45.6,-1.5,-45.78,-1.8,-45.44,-3.44,-45.3,-3.98,-43.8,-5.5,-43.5,-6.16,-41.4,-7.02,-41.1,-7.62,-39.3,-6.23,-38.7,-6.46,-36.9,-6.98,-36.6,-7.51,-34.5,-6.47,-33.9,-6.5,-33,-5.97,-32.7,-5.65,-32.1,-4.85,-31.8,-4.78,-30.6,-3.69,-30,-4.08,-27.3,-3.7,-27,-3.99,-25.2,-5.08,-24.9,-5.27,-24.6,-5.4,-22.2,-5.19,-21.6,-3.11,-20.7,-3.08,-20.4,-3.39,-18.9,-4.16,-18.6,-4.91,-16.2,-5.86,-15.9,-6.46,-12.9,-7.26,-12.3,-7.42,-10.5,-5.61,-9.9,-6.13,-6,-5.7,-5.66,-3.79,-5.1,-4.92,-2.1,-4.88,-1.5,-5.75,0.3,-8.1,0.39,-10.2,0.92,-12.6,0.51,-13.5,0.68,-14.1,0.19,-15.9,0.48,-17.57,0.3,-18,1.2,-22.8,1.77,-23.69,2.1,-24.05,3.9,-26.03,4.5,-26.17,5.4,-26.85,6.3,-29.66,7.2,-32.99,7.8,-34.09,8.4,-34.42,9.3,-34.97,9.9,-37.49,10.5,-37.59,11.1,-38.83,12,-38.98,13.8,-40.5,14.51,-40.58,15.3,-40.94,15.9,-40.61,17.7,-40.33,18,-40.04,19.2,-40.19,19.8,-39.89,22.5,-40.34,22.8,-40.32,23.1,-40.04,23.7,-39.57,24,-38.1,27.58,-37.35,28.8,-36.24,29.1,-35.18,30.9,-34.64,31.2,-33.81,32.4,-31.47,32.7,-30.9,34.11,-29.43,34.2,-28.94,35.1,-28.36,35.4,-28.02,36.6,-26.85,36.6,-25.2,37.55,-23.57,40.8,-22.65,43.5,-21.3,45.35,-21.28,47.4,-21.84,48.9,-22.6,49.8,-23.41,50.1,-24.15,51.9,-28.49,52.2,-29.18,52.5,-28.8,55.84,-25.2,57.7,-20.93,60.3,-17.4,62.03,-15.46,63.3,-11.83,64.5,-11.4,64.8,-11.19,65.4], + plateIndices: [44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17] }, + { ageMa: 40, + coords: [138.3,-38.36,133.2,-38.4,128.1,-38.05,122.52,-38.4,117.6,-39,116.4,-38.9,114.6,-38.09,110.7,-38.3,107.1,-37.17,103.8,-35.67,102.6,-35.01,100.8,-33.39,100.2,-33.37,99.9,-33.04,98.7,-32.71,96.6,-32.56,93.96,-31.5,89.7,-30.85,87.3,-29.92,86.43,-28.8,86.21,-27.3,85.19,-26.1,84.3,-25.74,83.92,-24.9,82.8,-24.02,82.55,-23.4,81.86,-22.8,81.39,-21.6,80.27,-20.7,77.99,-19.5,77.61,-18.9,76.5,-18.08,75.89,-18,75.83,-17.7,75.28,-17.4,72.45,-16.2,72,-15.52,71.68,-14.4,72,-12.3,71.39,-11.1,71.54,-10.2,72.01,-9.3,71.43,-9,71.4,-8.69,71.07,-8.7,72.6,-2.4,72.03,-2.1,72.31,-0.6,71.1,0.05,70.94,1.5,69.87,2.4,70.2,6.47,69.12,6.3,66.5,7.2,66.3,8.11,62.7,9.64,62.24,10.2,60.6,10.79,60.3,11.27,59.28,11.7,59.24,15,58.74,16.5,58.64,17.7,58.2,18.6], + plateIndices: [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,4,4,4,4] }, + { ageMa: 40, + coords: [-72.6,-30.82,-73.2,-29.93,-76.5,-31,-81.1,-21,-81.2,-20.7,-80.85,-20.4,-80.68,-19.8,-79.42,-18.9,-79.34,-18.6,-80.72,-16.2,-78.89,-15,-79.71,-11.4], + plateIndices: [33,33,33,33,33,33,33,33,33,33,33,33] }, + { ageMa: 40, + coords: [-20.4,-22.8,-20.58,-21.9,-21.17,-21.6,-21.51,-19.2,-22.43,-18.6,-22.53,-15.6,-23.24,-15,-23.15,-13.2,-21.6,-12.97,-21.13,-12.6,-21.14,-9,-20.83,-8.7,-18.73,-8.4,-19.39,-5.1,-19.2,-4.8,-19.84,-2.7,-22.27,-2.4,-23.1,-1.6,-26.1,-1.46,-26.4,-1.12,-27.3,-1.06,-27.9,-0.74,-28.5,-1.01,-28.8,-0.71,-30.3,-0.68,-30.6,-1.04,-31.57,-0.6,-31.8,0,-36.59,1.2,-36.65,1.5,-37.27,1.8,-37.44,3.9,-38.7,4.17,-39.04,4.5,-39.26,5.7,-39.73,6,-39.74,6.6,-46,9,-46.52,9.6,-46.95,11.1,-49.68,12.3,-49.64,12.9,-50.07,13.5,-50.65,13.8,-50.61,15.9,-51.73,16.5,-51.71,16.8,-52.1,17.1,-52,17.7,-52.39,18,-51.91,20.1,-51.6,20.4,-51.25,21.6,-51.36,22.2,-50.96,24.6,-51.43,25.2,-51,26.03,-50.5,26.4,-48.91,29.7,-48.08,30.9,-46.91,31.2,-45.68,33,-45.11,33.3,-44.09,34.5,-41.89,34.5,-41.21,36,-39.55,36,-39.02,36.9,-38.39,37.2,-38.12,38.1,-36.22,38.4,-35.1,41.27,-34.38,44.1,-33.2,46.2,-33.3,47.81,-33.6,48.61,-34.63,50.1,-36.25,51,-37.09,52.5,-41.91,52.8,-42.3,53.03,-42.58,56.4,-45,56.88,-48,56.76,-50.1,57.25,-51.9,57.25,-56.4,59.95,-60.6,61.28,-60.66,61.5,-60.6,61.77,-55.87,60.3,-51.3,57.7,-49.5,57.71,-47.4,57.24,-41.4,57.27,-35.13,61.8,-32.1,63.66,-30.41,65.1,-27.3,66.3,-26.55,66.9,-26.7,67.29,-27.3,67.55,-30.6,67.41], + plateIndices: [40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28] }, + { ageMa: 40, + coords: [162.32,-14.4,162.15,-14.1,162.42,-13.8,162.3,-13.59,161.4,-14.14,159.3,-16.35], + plateIndices: [7,7,7,7,7,7] }, + { ageMa: 40, + coords: [149.11,-0.3,148.83,0.3,148.81,1.5,148.52,1.8,148.5,2.79,147.3,6.02,145.81,6,141.9,5.25,140.7,5.84,139.8,7.13,138.3,6.77,136.04,6.9], + plateIndices: [13,13,13,13,13,36,13,13,13,13,13,13] }, + { ageMa: 40, + coords: [120.88,2.4,123.35,3.6,125.1,5.14], + plateIndices: [46,46,46] }, + { ageMa: 40, + coords: [134.1,13.26,130.2,14.53,128.1,16.17,126.6,16.49,124.2,18,123,18.26], + plateIndices: [38,38,38,38,38,38] }, + { ageMa: 40, + coords: [134.4,16.48,130.5,17.53,128.4,18.97,126.6,19.29,123.6,20.86,123,20.78,122.4,21.99], + plateIndices: [38,38,38,38,38,38,38] }, + { ageMa: 40, + coords: [15.6,71.59,7.15,70.5,0.6,69.37,-0.25,68.7,0.22,68.4,0.3,66.7,-0.9,66.15,-1.58,66.3,-1.39,66,-1.8,65.65,-3.6,64.88,-6.6,64.31,-10.2,64.3,-10.52,64.5,-10.87,65.4], + plateIndices: [17,17,17,17,17,17,17,17,17,17,17,17,17,17,17] }, + { ageMa: 40, + coords: [-7.5,69.37,-6.6,69.44,-4.17,68.7,-3.65,68.1,-3.85,67.2,-5.1,65.97,-6,65.39,-7.1,65.1,-10.75,65.4], + plateIndices: [17,17,17,17,17,17,17,17,17] }, + { ageMa: 40, + coords: [-58.8,66.79,-59.83,67.5,-60.3,68.81,-62.7,69.53,-63.71,70.2,-64.8,72.06,-65.7,72.45,-72.9,73.71,-74.7,74.91,-75,75.4,-74.46,75.3,-72.9,74.36,-65.4,73.13,-64.5,72.66,-63.9,71.31,-62.7,70.3,-60,69.53,-59.75,68.7,-58.8,67.59], + plateIndices: [28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28] }, + { ageMa: 40, + coords: [-2.4,76.85,-1.55,76.2,0.9,75.42,1.12,75.3,1.08,75,-7.28,73.8,-16.2,71.97,-20.4,72.35], + plateIndices: [28,28,28,28,28,28,28,28] }, + { ageMa: 40, + coords: [120.85,78,118.8,79.1,112.5,80.7,109.2,81.78,105.3,82.6,96,83.35,73.5,84.3,60.9,85.1,50.7,84.78,41.1,84.15,27.9,83.82,18.6,83.03], + plateIndices: [17,17,17,17,17,17,17,17,17,17,17,17] }, + { ageMa: 40, + coords: [129.78,78.6,129.9,79.2,129.58,79.8,126.85,81.6,126.71,82.2,126.87,82.5,126.22,83.7,121.8,84.76,108.3,86.27,80.1,88.45,74.4,88.62,43.5,88.4,1.5,87.26,-9,86.65,-14.17,85.8], + plateIndices: [28,28,28,28,28,28,28,28,28,28,28,28,28,28,28] }, + { ageMa: 60, + coords: [-87.3,-69.9,-89.7,-69,-89.22,-67.5,-84.01,-64.8,-83.96,-64.5,-86.54,-63.6,-86.51,-63.3,-86.02,-63,-86.9,-62.4,-86.86,-62.1,-84.78,-60.6,-85.8,-60.13,-86.15,-59.7,-86.7,-59.84,-87,-59.57,-89.1,-59.28,-89.4,-59.06,-92.84,-61.8,-93.3,-61.83,-98.1,-60.83,-99.6,-60.78,-99.9,-60.54,-100.48,-60.6,-101.59,-61.5,-102.3,-61.51,-109.94,-59.7,-113.53,-62.4,-113.15,-63,-114.22,-63.6,-117.3,-63.22,-120.44,-62.4,-127.15,-65.4,-131.1,-66.46,-131.4,-67.36,-135.3,-68.36,-138.9,-69.08,-140.1,-68.82,-143.1,-69.34,-146.7,-69.4,-151.8,-70.24,-152.1,-70.61,-154.5,-70.82,-155.7,-70.5,-158.4,-70.66,-159.6,-71.38,-167.4,-71.3,-167.51,-71.1,-167.06,-70.8,-167.29,-70.2,-168.9,-69.51,-173.1,-68.03,-173.7,-68,-174,-67.73,-174.6,-67.72,-174.9,-67.43,-175.5,-67.43,-175.8,-67.14,-178.2,-66.53,-178.44,-66.6,-178.36,-66.9], + plateIndices: [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] }, + { ageMa: 60, + coords: [25.2,-57.76,23.7,-57.83,20.7,-58.57,16.8,-58.09,13.2,-57.03,7.5,-57,5.4,-58.25,4.8,-58.28,3.9,-58.81,1.2,-59.66,0,-59.5,-4.2,-60.73,-6.3,-60.9,-8.42,-61.8,-9.9,-61.97,-12,-62.75,-14.7,-62.26,-16.5,-62.8,-18.6,-62.77,-21.9,-63.67,-27,-64.64,-34.2,-65.45,-41.4,-65.62,-49.07,-64.2], + plateIndices: [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] }, + { ageMa: 60, + coords: [110.1,-62.16,105.3,-62.34,101.4,-61.39,96.9,-61.06,95.4,-60.2,82.8,-55.23,78.6,-53.16,77.15,-52.2,76.91,-51.6,75,-49.94,72.6,-49.47,71.7,-49.75,69.9,-49.32,66.3,-45.98,65.1,-45.56,64.2,-46.51,63.3,-47,59.7,-45.53,59.1,-44.86,58.11,-44.4,58.5,-42.56,54.91,-40.2,53.4,-41.07,52.8,-41.73,52.48,-41.7,51.89,-42.3], + plateIndices: [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] }, + { ageMa: 60, + coords: [137.1,-62.01,122.4,-61.94,117.6,-62.19,112.5,-62.01,110.1,-62.16], + plateIndices: [2,2,2,2,2] }, + { ageMa: 60, + coords: [180,-57,177.6,-57.97,177,-58.52,175.8,-58.81,174.9,-58.63,173.4,-58.97,173.1,-59.75,170.1,-60.24,168.9,-60.34,168.3,-60.12,166.5,-60.39,166.12,-60.3,165.32,-59.1,164.74,-57.6,163.8,-56.09,163.8,-55.09], + plateIndices: [36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36] }, + { ageMa: 60, + coords: [-44.98,-58.8,-44.4,-57.9,-43.2,-57.42,-42.84,-57.6,-42.59,-56.4,-41.88,-55.2,-41.92,-54.3], + plateIndices: [42,42,42,42,42,42,42] }, + { ageMa: 60, + coords: [-92.1,-57.97,-93,-57.4,-94.2,-57.43,-95.47,-57,-93.82,-54.6,-93.33,-54.3,-89.99,-55.8,-91.47,-57.9,-92.1,-57.97], + plateIndices: [2,2,2,2,2,2,2,2,2] }, + { ageMa: 60, + coords: [51.89,-42.3,51,-42.93,47.16,-43.5,47.08,-43.8,46.21,-44.4,45.91,-45.6,45.13,-45.9,44.7,-46.51,42.75,-46.8,41.78,-48,41.25,-48.3,41.4,-48.61,37.8,-48.98,37.2,-49.21,36.6,-49.89,34.21,-50.4,32.4,-51.23,32.28,-52.2,31.2,-52.54,30.91,-53.4,29.82,-53.7,27.6,-56.26,26.7,-56.5,26.1,-57.51,25.2,-57.76], + plateIndices: [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] }, + { ageMa: 60, + coords: [-179.99,-57,-177.58,-56.7,-175.5,-56,-174.6,-56.14,-171.3,-54.78,-170.1,-54.2,-170.1,-53.38,-169.01,-52.8,-168.3,-52.72,-162.62,-49.2,-158.7,-50.68,-157.8,-50.04,-157.8,-49.27,-154.8,-46.72,-149.91,-48.9,-149.11,-48.9,-148.2,-48.14,-147.9,-48.13,-144,-49.8,-142.8,-49.81,-139.37,-47.1,-138.6,-44.7,-136.94,-43.2,-138,-41.21,-139.66,-41.1,-143.13,-35.1,-143.02,-34.5,-147.07,-23.7,-144.9,-22.82,-144.77,-22.5,-146.75,-16.5,-145.76,-15.9,-146.1,-13.8,-145.91,-13.5,-141.41,-12,-143.31,-4.5,-145.23,-4.5,-147.04,3.3,-146.97,3.6,-143.7,4.49,-142.99,4.8,-142.85,5.1,-144.32,11.7,-143.81,12.3,-144.36,14.7,-139.52,15.9,-138.59,16.2,-138.59,16.5,-139.87,22.2,-139.67,22.5,-139.95,24,-141.6,24.07,-145.8,23.36,-147.42,23.4,-148.9,30,-148.69,30.3,-142.1,31.8,-141.77,32.1,-142.58,37.8,-144.65,38.1,-145.2,39.56,-145.5,39.35,-145.8,39.63,-146.1,39.43,-146.4,39.66,-150.9,39.71,-155.4,39.26,-157.48,39.6,-158.69,42,-157.77,42.6,-155.73,43.2,-155.42,43.5,-158.82,50.7,-162.6,51.15,-169.2,51.45], + plateIndices: [36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36] }, + { ageMa: 60, + coords: [-26.4,-13.12,-26.96,-13.5,-27.04,-15,-26.91,-15.3,-25.89,-15.6,-25.57,-16.2,-25.54,-17.4,-25.75,-17.7,-25.61,-18.6,-25.06,-19.5,-24.76,-21.6,-24.29,-22.2,-24.57,-23.7,-25.96,-24.3,-26.11,-24.9,-26.47,-25.2,-26.58,-26.1,-27.23,-26.4,-27.75,-27,-27.33,-27.6,-25.76,-28.2,-25.7,-30,-26.39,-30.3,-26.23,-33,-27.8,-33.6,-28.5,-34.2,-28.55,-34.5,-29.47,-34.8,-29.79,-35.4,-30.71,-35.7,-30.9,-36.3,-31.85,-36.6,-32.02,-36.9,-32.04,-40.8,-32.23,-41.7,-32.73,-42.3,-32.79,-43.2,-32.31,-43.5,-32.11,-44.1,-32.72,-45.9,-31.07,-46.5,-30.84,-48.3,-27.88,-48.9,-26.35,-50.1,-25.07,-51.9,-25.19,-52.2,-24.6,-54.3,-24.18,-54.6,-20.47,-55.5,-20.1,-55.8,-20.72,-56.1,-24.6,-56.48], + plateIndices: [40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40] }, + { ageMa: 60, + coords: [154.68,-24,154.48,-24.9,155.15,-27,155.1,-27.6,155.4,-27.9,155.12,-29.1,154.72,-29.7,154.89,-31.5,154.06,-32.7,153.19,-34.8,154.61,-37.2,154.28,-38.1,156.74,-42,156.26,-42.6,156.57,-43.2,156.35,-43.8,154.81,-45,156.06,-47.1,155.98,-47.7,156.39,-48.3,150.6,-50.21,150.3,-50.59,150.24,-50.1,150.91,-49.8], + plateIndices: [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7] }, + { ageMa: 60, + coords: [36.3,-40.46,35.73,-40.8,35.73,-41.7,34.8,-42.14,34.67,-42.9,33.9,-43.27,33.3,-43.99,32.34,-45.9,31.5,-46.33,31.35,-47.1,27.3,-48.54,24.3,-48.4,21,-47.57,17.1,-47.85,16.2,-48.11,15.38,-48.9,13.8,-49.73,11.4,-50.02,10.8,-49.74,9.6,-49.67,8.1,-48.94,7.4,-47.7,6.3,-47.14,6.2,-46.8,5.1,-45.91,3.11,-45,0.51,-45,-0.41,-43.2,-1.8,-43.16,-2.08,-42.9,-2.04,-41.4,-2.34,-40.8,-3,-40.44,-3.25,-39.3,-2.92,-39,-3,-38.1,-4.11,-34.2,-3.41,-33.6,-3.02,-32.7,-2.44,-32.4,-2.29,-31.8,-1.47,-31.2,-1.5,-30.9,-0.83,-30,0,-29.75,0.36,-29.4,-0.36,-27,-0.39,-26.7,0.14,-26.4,-0.27,-24.6,-2.1,-24.23,-2.45,-23.7,-2.09,-23.1,-1.5,-22.8,-1.54,-21.6,-1.19,-21.3,-1.3,-20.7,-0.05,-20.1,-0.08,-18.6,-0.16,-18.3,-0.65,-18,-1.38,-15.9,-2.02,-15.3,-2.34,-14.4,-2.45,-12.9,-2.9,-12.3,-4.12,-12,-4.33,-10.5,-3.9,-9.97,-3,-9.75,-2.52,-9.3,-3.23,-5.4,-0.89,-4.5,-2.2,-1.2,-1.82,-0.9,-1.86,-0.6,-2.64,0.9,-3,1.12,-5.04,0.9,-6,1.61,-6.6,1.65,-9.9,1.08,-11.4,1.05,-12,0.8,-14.1,0.88,-14.4,0.6,-14.94,1.8,-16.07,1.8,-16.26,2.1,-17.1,2.15,-19.59,1.8,-20.05,2.4,-20.69,2.7,-21.05,4.5,-23.02,4.8,-23.22,6,-23.85,6.3,-23.92,6.9,-25.5,6.99,-26.7,7.57,-28.64,7.8,-29.1,8.05,-30.6,8.1,-30.62,8.4,-31.17,8.7,-31.9,10.5,-34.62,10.5,-34.71,11.4,-36.6,12.22,-36.87,14.1,-37.93,14.4,-37.02,19.5,-37.14,19.8,-36.51,22.5,-37.31,23.1,-37.18,23.7,-36.28,24.3,-35.43,26.7,-34.26,28.8,-32.6,29.4,-32.04,30.9,-31.26,31.8,-29.1,32.48,-28.35,33,-27.96,33.9,-26.88,34.5,-26.25,35.7,-24.54,36.6,-21.95,37.5,-20.83,39.6,-19.97,42.6,-19.2,43.19,-19.29,43.5,-18.32,44.4,-17.35,46.2,-17.65,48.6,-20.41,51.6,-21,51.91,-24.56,52.2,-24.7,52.5,-24.82,54,-25.31,55.2,-24.9,55.6,-22.5,56.41,-21.52,56.4], + plateIndices: [44,44,44,0,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17] }, + { ageMa: 60, + coords: [165.9,-45.04,164.1,-44.67,163.8,-45.3,162,-45.58,159.3,-46.85,158.82,-46.2,158.75,-45.6,157.43,-43.8,157.66,-43.2,159.03,-42,158.53,-41.1,159,-40.5,156.72,-37.8,156.19,-36.9,156.3,-35.81,154.75,-33.6,154.79,-33,155.45,-32.1,155.31,-31.5,156.06,-30.3,155.88,-28.5,156.41,-26.4,155.23,-23.4], + plateIndices: [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7] }, + { ageMa: 60, + coords: [54,-26.07,53.72,-26.7,54.37,-30,52.92,-30.9,52.59,-31.5,51.97,-31.8,51.97,-32.1,48.3,-32.76,47.4,-33.78,47.25,-34.5,46.8,-35.07,46.2,-35.25,45.6,-35.92,44.4,-36.02,43.2,-37.9,40.2,-38.3,39.46,-38.7,39.13,-39.3,37.2,-39.85,36.3,-40.46], + plateIndices: [44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44] }, + { ageMa: 60, + coords: [137.4,-37.59,127.2,-36.99,121.2,-37.3,117,-38.03,114.3,-37.4,111.6,-37.6,110.4,-36.86,104.1,-34.86,101.46,-33,99.6,-32.16,97.8,-31.84,95.1,-30.73,90,-30.14], + plateIndices: [7,7,7,7,7,7,7,7,7,7,7,7,7] }, + { ageMa: 60, + coords: [90,-30.14,89.29,-29.7,89.24,-27.3,89.7,-25.62,90.01,-25.5,90.3,-20.1,91.2,-19.93,91.5,-19.62,91.8,-14.24,92.7,-14.08,93,-11.53,95.7,-11.24,96.3,-9.55,97.5,-9.47,98.1,-4.06,99,-3.56], + plateIndices: [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7] }, + { ageMa: 60, + coords: [54.9,13.08,55.98,12.6,56.4,11.7,56.42,10.8,54.9,7.31,52.49,3.6,52.44,2.4,58.07,-1.5,58.22,-2.1,57.98,-2.7,58.79,-3.6,58.7,-4.5,59.2,-5.4,58.82,-6.9,59.48,-8.1,59.08,-10.8,59.89,-11.7,59.02,-13.5,59.71,-14.7,57.59,-18,58.53,-18.9,57.75,-19.5,57.91,-20.4,57.68,-21.3,54.32,-25.2,54,-26.07], + plateIndices: [44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44] }, + { ageMa: 60, + coords: [155.09,-22.2,155.1,-21,154.7,-19.8,154.8,-18.78,155.1,-18.9,155.4,-19.79], + plateIndices: [7,7,7,7,7,7] }, + { ageMa: 60, + coords: [155.4,-17.37,154.5,-17.86,153.62,-16.2,152.49,-15.3,152.46,-15,147.6,-13.27], + plateIndices: [7,7,7,7,7,7] }, + { ageMa: 60, + coords: [162.55,-16.5,161.7,-14.58,160.8,-15.11,159,-16.9], + plateIndices: [7,7,7,7] }, + { ageMa: 60, + coords: [155.1,-14.1,152.7,-12.66,149.84,-12], + plateIndices: [7,7,7] }, + { ageMa: 60, + coords: [-59.1,62.73,-60.35,62.7,-61.09,61.2,-61.2,60.48,-57,58.46,-56.1,58.33,-52.5,55.82,-50.4,55.97,-48.38,55.2,-47.16,54,-46.26,52.2,-44.4,52.12,-42.3,52.38,-41.7,52.13,-38.1,49.5,-37.17,47.4,-38.57,40.8,-39.42,38.7,-41.7,38.16,-43.21,37.5,-43.93,36.3,-44.95,36,-45.55,34.8,-47.1,34.08,-48.46,33.9,-48.8,33.3,-49.36,33,-50.01,31.5,-51.78,30.9,-52.92,29.1,-54.04,26.4,-54.97,25.8,-55.13,25.2,-54.27,24.9,-55.01,22.2,-54.96,21.6,-55.94,17.1,-55.35,16.8,-55.83,16.5,-54.42,16.5,-54.54,14.7,-52.81,13.5,-52.87,12.6,-50.11,12,-49.82,10.2,-49.33,9.9,-49.36,9.6,-45.43,8.1,-44.63,7.5,-43.27,7.2,-42.97,6.3,-42.51,6,-42.54,4.8,-40.66,4.2,-40.64,2.1,-39.96,1.8,-39.94,1.5,-37.8,1.31,-36.9,0.74,-35.24,0.3,-34.86,-0.9,-34.5,-1.03,-30.6,-1.35,-29.4,-1.23,-29.1,-1.58,-26.4,-1.75,-25.8,-2.12,-23.7,-2.42,-23.24,-2.7,-22.68,-4.5,-23.15,-5.1,-22.46,-8.1,-22.6,-8.4,-24.7,-8.7,-24.94,-9,-24.95,-12.9,-26.4,-13.12], + plateIndices: [28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40] }, + { ageMa: 60, + coords: [93.6,2.73,93,2.7,92.7,-0.94,92.4,-1.87,91.5,-1.87,90.97,-7.2,90.5,-8.4,90.3,-10.35,90.07,-10.2,90,-9.06,89.1,-9.3,86.1,-8.97,85.8,-9.32,85.5,-12.27,85.2,-12.83,84.9,-12.85,82.2,-12.54,81.6,-12.14,80.7,-12.04,80.4,-10.67,80.1,-10.26,75,-9.13,74.4,-8.77,74.1,-7.8,74.98,-0.3,74.4,1.18,73.5,1.48,73.52,5.7,72.6,6.25,72.6,8.12,71.62,8.7,70.8,11.4,69.65,12.3,69.6,13.55,68.4,14.32,68.1,15.12,67.2,15.29,66.9,16.27,66.6,16.34,66.3,17.06,60,17.9,60.01,21,59.7,21.11], + plateIndices: [20,20,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,4,4,4] }, + { ageMa: 60, + coords: [149.16,-0.3,148.5,2.97,147.3,6.09,146.1,6.16,141.9,5.64,141,6.11,139.8,7.3,137.1,7.24], + plateIndices: [13,13,36,36,13,13,13,13] }, + { ageMa: 60, + coords: [132.3,8.1,131.7,8.95,128.7,11.52,127.11,13.5,125.7,14.61,123.83,16.8,123.3,16.83], + plateIndices: [38,38,38,38,38,38,38] }, + { ageMa: 60, + coords: [135.6,19.25,133.5,20.18,130.5,22.12,130.2,22.53,127.2,24.14], + plateIndices: [38,38,38,38,38] }, + { ageMa: 60, + coords: [180,48.9,177.9,48.83,177.6,48.08,174.6,47.81,173.55,49.8,169.8,52.44,169.8,52.71], + plateIndices: [36,36,36,36,36,36,36] }, + { ageMa: 60, + coords: [-172.97,50.7,-173.1,49.4,-176.4,49.37,-177,49.08,-180,48.9], + plateIndices: [36,36,36,36,36] }, + { ageMa: 60, + coords: [-42.57,59.1,-43.28,58.8,-43.8,58.12,-46.5,58.22,-47.1,58.58,-47.4,58.31,-47.7,58.54,-48.6,58.51,-48.9,58.88,-49.8,59.14,-50.1,58.58,-50.4,58.95,-50.7,58.8,-51.2,59.1,-54.63,61.5,-55.8,61.69,-58.47,62.7], + plateIndices: [28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28] }, + { ageMa: 80, + coords: [-163.71,-75.6,-162.9,-75.34,-160.2,-75.43,-159.3,-75.2,-155.7,-75.44,-153.9,-75.32,-141.3,-73.51], + plateIndices: [2,2,2,2,2,2,2] }, + { ageMa: 80, + coords: [-175.48,-70.2,-177.3,-69.42,-177.65,-69,-177.64,-68.4,-169.2,-70.87,-169.12,-71.1,-170.1,-71.59,-172.2,-71.43,-175.48,-70.2], + plateIndices: [2,2,2,2,2,2,2,2,2] }, + { ageMa: 80, + coords: [-89.1,-70.23,-91.8,-69.56,-92.7,-69.12,-92.7,-68.67,-93.74,-68.4,-94.05,-66.6,-90.83,-65.7,-91.3,-65.1,-93,-64.45,-102.32,-66.6,-102.56,-66.9,-101.7,-67.87,-104.4,-68.41,-106.2,-68.61,-108,-67.99,-119.04,-69,-126.6,-69.43,-127.2,-69.65], + plateIndices: [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] }, + { ageMa: 80, + coords: [35.4,-52.83,34.8,-53.02,33.9,-52.81,33.3,-52.97,30.6,-54.85,30,-55.64,28.8,-56.34,26.4,-58.34,23.1,-60.3,20.1,-60.61,18.6,-61.16,13.8,-59.84,12.6,-59.93,11.86,-60.6,11.1,-60.59,9.6,-60.22,9.44,-60,10.22,-59.4,9.3,-59.12,8.37,-59.7,8.85,-60,6.6,-59.88,4.17,-60.6,2.1,-60.87,-2.1,-62.14,-2.21,-62.7,-5.7,-63.91,-6.9,-64.02,-7.91,-63.9,-8.7,-63.51,-9.6,-63.56,-10.8,-63.88,-15.6,-64.26,-19.5,-65.08,-25.5,-65.85,-36.3,-66.61,-41.1,-66.34,-46.02,-65.1,-48.3,-64.77,-50.98,-63.9], + plateIndices: [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] }, + { ageMa: 80, + coords: [132.9,-62.66,107.7,-62.99], + plateIndices: [2,2] }, + { ageMa: 80, + coords: [107.7,-62.99,105.9,-62.8,103.8,-62.08,96.6,-61.47,96.3,-61.24,96.34,-60.9,81.3,-54.6,77.1,-52.3,76.5,-51.47,73.8,-50.35,70.85,-50.4,71.33,-50.7,71.1,-50.94,70.8,-50.57,70.5,-50.96,69.58,-51,69,-51.74,68.1,-51.65,64.2,-50.39,62.4,-52.19,61.5,-51.68,60.9,-51.8,59.02,-53.1,59.04,-53.4,58.5,-53.47,58.2,-53.77,57.9,-53.55,57.3,-54.33,52.8,-57.29,50.65,-55.8,50.95,-55.2,50.32,-54.6,50.7,-53.5,49.7,-52.8,49.5,-52.2,48.3,-51.31,48.24,-51,46.8,-50.77,46.8,-50.38,46.5,-50.35,46.2,-50.76,45.6,-50.81,43.2,-50.23,41.1,-50.42,39,-51.44,37.8,-51.16,36.9,-51.34,35.4,-52.83], + plateIndices: [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] }, + { ageMa: 80, + coords: [-44.7,-58.74,-44.4,-57.98,-43.2,-57.5,-42.9,-57.73,-42.78,-57.6,-42.51,-56.4,-41.79,-55.2,-41.88,-54.3], + plateIndices: [42,42,42,42,42,42,42,42] }, + { ageMa: 80, + coords: [180,-50.83,176.4,-52.09,174.72,-53.4,174.3,-54.11,171.6,-54.81,171,-55.35,169.2,-55.66,169.15,-55.5], + plateIndices: [36,36,36,36,36,36,36,36] }, + { ageMa: 80, + coords: [-57.9,15.08,-56.66,14.7,-56.11,13.8,-56.18,13.2,-54.3,12.4,-53.49,12.3,-53.15,10.5,-52.74,9.9,-50.94,9.3,-48.96,8.4,-48.3,7.84,-46.54,7.2,-46.51,6.6,-46.03,6,-45.96,4.8,-44.47,4.5,-44.22,4.2,-44.28,2.4,-43.59,1.8,-43.58,1.5,-40.1,0.9,-40.04,0.6,-38.84,0.3,-38.59,-0.9,-37.94,-1.2,-30.9,-1.47,-30.15,-1.8,-29.4,-2.68,-28.5,-2.55,-27.04,-3,-26.8,-3.9,-27.58,-4.5,-27.45,-5.1,-27.69,-5.4,-27.01,-8.4,-27.14,-8.7,-29.32,-9.3,-29.5,-13.2,-30.81,-13.8,-30.84,-14.1,-30.66,-15.6,-30.21,-16.5,-29.29,-22.2,-28.85,-22.5,-28.72,-23.1,-29.72,-23.7,-29.86,-24.3,-30.6,-24.6,-30.76,-26.4,-31.12,-27,-33.16,-27.6,-32.69,-28.2,-30.38,-28.5,-30.43,-30,-31.63,-30.3,-33,-32.7,-34.31,-33,-35.26,-34.2,-35.99,-34.5,-36.9,-36.3,-37.45,-36.9,-37.07,-41.1,-37.23,-42,-37.74,-42.3,-37.7,-44.1,-38.09,-44.4,-38.41,-46.2,-37.31,-48.3,-32.7,-48.72,-30.79,-49.2,-30.67,-51.9,-30.94,-52.5,-30.56,-54.9,-30.9,-54.91], + plateIndices: [40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,42,42] }, + { ageMa: 80, + coords: [47.4,-49.21,44.1,-48.6,42.3,-48.76,42.18,-48.6,43.8,-47.95,47.1,-48.01,47.58,-48.6,47.4,-49.21], + plateIndices: [2,2,2,2,2,2,2,2] }, + { ageMa: 80, + coords: [-177.41,-48.9,-177,-48.54,-168.3,-45.64,-166.34,-45.9,-164.98,-45.3,-164.84,-45,-165.3,-43.97,-162.69,-42.6,-160.2,-41.57,-158.4,-42.12,-156.6,-41.24,-155.4,-41.47,-150.09,-38.7,-146.84,-36.6,-147.89,-35.4,-147.87,-34.8,-151.31,-24.9,-151.2,-24.54,-149.9,-24,-151.97,-15,-151.93,-14.7,-151.2,-14.34,-147.6,-13.51,-147.11,-13.2,-148.49,-5.7,-149.94,-5.4,-151.51,2.4,-151.5,2.7,-148.56,3.6,-148.45,3.9,-150.28,13.5,-147,15,-147.13,16.5,-148.5,16.8,-148.84,22.2,-149.05,22.5,-153.9,21.85,-155,21.9,-155.39,24,-156.11,24.6,-156.71,28.5,-156,28.63,-155.4,29.08,-154.8,28.97,-154.5,29.24,-152.4,29.63,-150.63,30.6,-150.84,32.4,-150.64,33.3,-151.04,36.3,-153,36.73,-153.38,38.1,-153.9,38.31,-164.7,37.34,-165.6,37.48,-165.9,37.8,-166.33,40.5,-165.68,41.1,-166.25,44.4], + plateIndices: [36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36] }, + { ageMa: 80, + coords: [55.5,12.83,55.84,12.6,56.2,11.7,56,10.2,54.9,7.56,52.15,3.9,51.62,0,50.4,-0.96,49.01,-3.9,49.61,-6,48.78,-7.8,50.1,-10.39,51.19,-11.7,51.79,-13.5,50.98,-14.7,51.48,-15.6,51.19,-17.1,51.37,-17.7,50.37,-19.2,51.12,-20.4,49.38,-22.2,49.96,-23.4,48,-24.89,47.62,-25.5,48.03,-26.4,48.4,-29.7,47.13,-31.2,46.8,-34.05,46.5,-34.22,43.8,-33.95,41.7,-35.49,40.2,-35.14,39.6,-35.37,38.7,-36.84,38.1,-37.15,37.2,-37.01,36,-38.21,31.2,-44.98,30.6,-45.38,29.1,-45.74,27.9,-46.52,27.3,-46.54,25.8,-45.96,24.9,-46.36,24.3,-46.23,22.2,-44.94,21.3,-44.87,20.07,-43.5,19.96,-42.9,20.27,-42.3,19.94,-41.7,20.01,-41.4,18.9,-39.68,14.4,-41.3,13.8,-41.29,10.33,-43.2,11.1,-46.2,10.62,-46.8,10.66,-47.4,11.45,-48.6,10.8,-48.82,10.06,-48.3,9.24,-46.8,9.5,-45.9,9.3,-44.93,5,-43.8,3.05,-42,2.55,-40.2,2.77,-39.9,2.09,-38.4,2.06,-38.1,2.36,-37.8,2.14,-36.9,0.27,-33,0.58,-32.4,0.79,-30.3,1.71,-29.4,1.8,-28.45,3.01,-27.9,2.98,-27.3,3.25,-27,3.59,-25.2,4.53,-24.6,4.18,-23.4,2.1,-23.48,1.44,-23.1,1.43,-22.8,3.12,-21.9,2.9,-19.5,3.38,-19.2,3.5,-18.3,4.22,-17.7,3.9,-17.13,3.38,-16.8,-0.1,-9.3,0.92,-8.4,0.99,-8.1,0.23,-4.5,1.75,-3.6,2.25,-3,0.92,-0.3,0.86,0.9,1.35,1.2,1.36,1.5,0.9,2.35,-0.6,2.03,-1.66,2.1,-2.7,3.22,-8.1,1.76,-10.5,1.42,-10.75,1.5,-11.1,2.4,-13.8,2.76,-15,2.59,-15.3,2.35,-15.6,2.65,-16.21,2.7,-17.09,3.3,-17.49,5.1,-19.49,5.4,-19.67,6.3,-20.45,7.2,-23.7,7.96,-26.87,8.4,-27.78,9,-28.43,10.5,-30.3,10.86,-31.31,10.8,-31.39,11.4,-31.85,12,-33.68,12.3,-33.96,12.6,-34.1,14.4,-34.49,14.7,-33.98,18], + plateIndices: [44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] }, + { ageMa: 80, + coords: [151.8,-43.48,152.34,-44.1,151.8,-44.48,151.71,-45.6,150.9,-46.09,151.19,-46.8,150,-46.94], + plateIndices: [7,7,7,7,7,7,7] }, + { ageMa: 80, + coords: [162.3,-38.33,161.1,-37.72,159.95,-36.6,159.33,-34.8], + plateIndices: [7,7,7,7] }, + { ageMa: 80, + coords: [134.1,-36.75,127.8,-36.37,120.6,-37.05], + plateIndices: [7,7,7] }, + { ageMa: 80, + coords: [110.7,-36.83,104.4,-34.45,99.9,-31.56,98.4,-31.15,95.7,-29.71,94.39,-29.4,94.36,-28.5,94.68,-27.3,95.1,-26.55,95.4,-26.51,95.7,-22.7,96,-22.66,96.3,-22,96.9,-21.86,97.02,-21.6,97.2,-18.61,98.1,-18.62,98.18,-16.2,97.94,-14.1,98.1,-11.39,99,-11.12,99.3,-10.48,100.5,-10.19,100.8,-9.53,102,-9.34,102.6,-8.97,102.8,-7.5], + plateIndices: [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7] }, + { ageMa: 80, + coords: [91.76,7.8,91.5,6.67,91.2,6.51,87.3,6.69,86.7,3.68,86.1,3.86,85.61,2.4,84.9,-3.57,83.1,-3.15,82.8,-2.46,82.2,-2.3,81.6,-1.29,77.91,0,75.98,3.9,75.9,5.59,75.52,6,74.68,6,74.51,7.2,74.69,8.1,74.28,8.7,73.86,11.1,72.83,12,72.68,13.8,72.2,14.4,71.62,15.9,69.9,17.55,69.35,19.8], + plateIndices: [20,20,20,20,20,20,20,7,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20] }, + { ageMa: 80, + coords: [149.22,-0.3,148.55,3,147.3,6.17,147,6.33,141.9,6.02,140.1,7.33,137.7,7.68], + plateIndices: [36,13,36,36,13,13,13] }, + { ageMa: 80, + coords: [-59.94,18,-58.82,22.5,-57.67,24.9,-57.77,25.2,-58.79,25.8,-58.68,26.1,-57.65,26.7,-55.33,30.6,-53.83,31.5,-52.69,33,-51.47,33.6,-51.04,34.2,-49.8,34.36,-48.75,34.8,-47.79,36,-46.29,36.9,-45.76,37.5,-44.4,38.19,-42.58,38.4,-41.1,41.97], + plateIndices: [40,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28] }, + { ageMa: 80, + coords: [-33.98,18,-33.79,19.8,-32.94,22.2,-33,22.51,-34.1,23.1,-33.96,23.7,-33.13,24,-31.26,28.2,-30.06,29.1,-28.95,30.9,-27.9,31.5,-27.61,32.1,-26.28,32.4,-25.43,33,-24.67,34.2,-24.11,34.5,-22.84,36,-21.94,36.6,-20.7,37.01,-19.09,37.2,-15.9,44.7,-14.5,45.6,-15.62,49.2,-17.15,51.3,-18,51.96,-19.2,52.44], + plateIndices: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,17,17,17,17,17] }, + { ageMa: 80, + coords: [136.41,22.2,130.5,27.31], + plateIndices: [38,38] }, + { ageMa: 80, + coords: [135.3,26.33,134.1,26.18,131.7,28.98], + plateIndices: [38,38,38] }, + { ageMa: 80, + coords: [-52.5,54.84,-51.6,54.78,-50.74,54.3,-49.5,52.6,-48.3,51.88,-45.13,51.9,-43.86,51.3,-41.44,49.2,-39.5,46.2,-41.1,41.97], + plateIndices: [28,28,28,28,28,28,28,28,28,28] }, + { ageMa: 80, + coords: [180,43.73,176.7,42.97,176.1,43.13,174.81,45.6,173.23,49.5,171.3,51.39,169.63,52.5,169.55,52.8], + plateIndices: [36,36,36,36,36,36,36,36] }, + { ageMa: 80, + coords: [-166.25,44.4,-166.8,45.91,-170.4,46.06,-171,45.7,-172.8,45.55,-173.4,44.39,-180,43.73], + plateIndices: [36,36,36,36,36,36,36] }, + { ageMa: 100, + coords: [-23.7,-67.34,-28.8,-67.72,-34.8,-67.84,-40.5,-67.47,-43.5,-67.01,-51,-64.07], + plateIndices: [2,2,2,2,2,2] }, + { ageMa: 100, + coords: [99.9,-62.1,95.7,-61.77,95.17,-61.2,91.5,-59.28,90.6,-58.47,87.3,-57.38,81.3,-54.77,77.1,-52.42,76.5,-51.71,72.9,-50.92,72.6,-51.02,71.7,-52.41,70.8,-52.85,67.8,-52.13,65.4,-51.26,64.73,-51.6,62.1,-54.11,60.9,-54.23,58.5,-53.69,58.2,-53.96,57.6,-53.98,57.3,-54.56,55.8,-55.7,51,-58.66,49.8,-59.03,47.1,-59.09,44.27,-57.6,42.6,-56.21,38.1,-55.93,36.3,-56.33,33.9,-56.09,32.4,-56.23,30.9,-57.09,29.7,-58.15,27.9,-58.2,27,-58.81,26.7,-58.73,26.26,-59.4,25.8,-59.39,24.3,-60.51,22.63,-60.9,21.9,-61.38,21,-61.4,17.7,-62.23,16.2,-62.43,13.5,-62.27,6.9,-61.27,-5.1,-64.69,-23.7,-67.34], + plateIndices: [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] }, + { ageMa: 100, + coords: [-44.65,-58.5,-44.4,-58.06,-43.2,-57.57,-42.9,-57.79,-42.71,-57.6,-42.44,-56.4,-41.69,-55.2,-41.83,-54.3], + plateIndices: [42,42,42,42,42,42,42,42] }, + { ageMa: 100, + coords: [-33.91,-54.3,-33.64,-50.4,-33.29,-50.1,-33.44,-48.9,-37.5,-48.48,-41.7,-49.01,-44.29,-48.9,-44.95,-48.6,-45.56,-47.7,-45.7,-45.9,-45.37,-44.4,-45.01,-44.1,-44.65,-42.3,-44.24,-42,-43.32,-37.2,-42.85,-36,-41.7,-34.92,-41.07,-34.8,-41.22,-28.5,-39.6,-28.23,-38.1,-28.33,-37.89,-28.5,-37.61,-33,-36.9,-33.05,-35.85,-32.4,-36.16,-28.2,-36.51,-27.6,-35.4,-27.36,-35.07,-27,-34.95,-25.2,-34.55,-24.9,-34.32,-24.3,-33.73,-24,-33.47,-23.4,-34.1,-18.6,-33.99,-17.1,-34.35,-14.4,-34.23,-14.1,-33.55,-13.8,-33.51,-12.6,-32.78,-10.2,-32.55,-9.9,-31.04,-9.3,-30.38,-8.4,-30.31,-7.8,-30.99,-5.4,-30.39,-4.8,-30.57,-3.9,-33,-3.45,-34.44,-1.8,-37.5,-1.78,-41.04,-1.2,-41.45,-0.3,-42.05,0.3,-43.03,0.6,-43.25,0.9,-45.52,1.5,-45.72,2.1,-46.9,3,-47.02,4.5,-48.26,5.1,-48.76,5.7,-49.17,7.5,-53.7,9.7,-54.52,11.4,-55.2,12.04,-57.3,12.75], + plateIndices: [40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40] }, + { ageMa: 100, + coords: [-51.15,-49.5,-45.9,-48.93,-45.64,-49.5], + plateIndices: [40,40,40] }, + { ageMa: 100, + coords: [-175.2,-26.43,-174.9,-26.47,-174.6,-27.09,-172.5,-27.34,-172.2,-29.83,-167.4,-30.04,-166.8,-30.6,-162.9,-30.61,-162.46,-31.5,-162.33,-32.1,-162.73,-33.9,-162.11,-35.4,-161.29,-36.3,-160.91,-37.5,-161.19,-37.8,-161.25,-39,-161.4,-39.29,-163.2,-40.14,-164.1,-41.74,-166.2,-42.4,-168.3,-42.61], + plateIndices: [36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36] }, + { ageMa: 100, + coords: [24.86,-36,24.6,-36.44,23.7,-37.07,23.4,-36.95,22.99,-37.5,23.1,-37.73,23.7,-37.42,24.3,-36.69,24.6,-36.93,24.77,-37.2,24.02,-37.8,24.21,-38.1,23.7,-38.6,23.05,-38.4,22.9,-37.8,21.9,-37.68,18.3,-39.76,11.84,-42,10.96,-42,10.3,-41.7,8.7,-39.97,7.98,-38.4,8.08,-38.1,7.44,-36.6,7.53,-36,5.73,-31.2,5.38,-28.8,5.78,-28.2,5.67,-27.3,6.63,-26.4,6.89,-24,7.61,-23.4,7.26,-21.9,5.7,-21.91,5.63,-21.3,6.92,-20.4,6.59,-19.2,6.99,-18.3,6.96,-17.7,7.81,-16.2,7.87,-15.6,6.23,-12,5.1,-8.55,4.16,-7.2,4.57,-6.3,4.17,-5.4,4.32,-4.2,4.13,-2.7,4.21,-2.4,5.41,-1.5,5.51,0.3,4.03,2.4,4.49,3,3.13,3.9,1.51,3.6,0.3,3.86,-0.6,4.39], + plateIndices: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] }, + { ageMa: 100, + coords: [26.7,-41.41,26.54,-41.1,26.84,-40.8,26.7,-40.57,26.1,-40.94,25.11,-40.2,26.07,-39.6,25.97,-39.3,26.3,-39,26.16,-38.7,26.68,-38.4,26.57,-38.1,27,-37.66,27,-38.13,27.6,-38.58,28.2,-38.15,29.77,-38.7,29.42,-39,29.89,-39.3,29.7,-39.79,28.97,-39.3,28.9,-39,28.2,-39.64,27.9,-39.1,27.65,-39.3,27.71,-39.6,27.43,-39.9,27.6,-40.08,27.9,-39.76,28.2,-40.12,28.5,-39.73,28.84,-39.9,26.7,-41.41], + plateIndices: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] }, + { ageMa: 100, + coords: [24.9,-39.82,24.74,-39.3,25.35,-38.7,25.8,-37.41,26.1,-37.41,26.4,-36.84,26.67,-37.2,26.23,-37.5,26.43,-37.8,25.59,-38.4,25.75,-38.7,25.59,-39.3,24.9,-39.82], + plateIndices: [0,0,0,0,0,0,0,0,0,0,0,0,0] }, + { ageMa: 100, + coords: [24.3,-38.75,24.57,-37.8,25.16,-37.2,25.01,-36.9,25.2,-36.7,25.71,-36.9,25.17,-37.8,25.08,-38.4,24.6,-38.88,24.3,-38.75], + plateIndices: [0,0,0,0,0,0,0,0,0,0] }, + { ageMa: 100, + coords: [47.21,-25.5,47.29,-26.4,46.2,-31.03,45.9,-31.24,43.2,-31.3,42.3,-31.85,40.5,-31.87,39.6,-32.18,39.3,-32.47,38.7,-34.22,37.2,-34.78,36.3,-36.95,34.5,-38.33,32.1,-38.82,30.9,-38.8,29.1,-37.88,25.8,-35.6,24.9,-35.96], + plateIndices: [44,44,44,44,44,44,44,44,44,44,44,0,0,0,0,0,0,0] }, + { ageMa: 100, + coords: [-151.5,-36.62,-151.76,-36.6,-151.92,-34.8,-150.6,-34.79,-151.19,-36.6,-151.5,-36.62], + plateIndices: [36,36,36,36,36,36] }, + { ageMa: 100, + coords: [110.4,-36.22,107.7,-35.37,104.41,-33.9,100.2,-30.97,97.56,-29.7,97.06,-29.1,97.08,-27.3,98.55,-26.4,99.09,-25.5,98.4,-14.61,100.5,-14.34,100.8,-13.57,102.9,-13.04,103.2,-9.26,104.7,-8.47], + plateIndices: [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7] }, + { ageMa: 100, + coords: [-152.4,-34.87,-153,-34.55,-154.2,-34.48,-154.51,-34.2,-153.6,-31.2,-152.9,-31.5,-153.08,-33,-152.4,-34.87], + plateIndices: [36,36,36,36,36,36,36,36] }, + { ageMa: 100, + coords: [-156.34,-12.6,-156.29,-13.2,-157.05,-13.5,-157.16,-13.8,-156.43,-18.6,-158.06,-19.2,-157.68,-21.6,-157.8,-22.31,-162.6,-23.24,-163.5,-22.73,-167.1,-22.68,-167.4,-22.13,-171.9,-21.94,-172.2,-19.41,-172.8,-19.28], + plateIndices: [36,36,36,36,36,36,36,36,36,36,36,36,36,36,36] }, + { ageMa: 100, + coords: [55.5,12.76,55.97,11.7,55.98,10.8,54.93,7.8,54.19,7.2,51.81,4.2,51.58,3.6,51.38,0.3,50.1,-1.05,49.2,-3.3,48.51,-4.2,48.96,-6,48.46,-7.8,50.38,-12,50.54,-12.6,50.4,-13.47], + plateIndices: [44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44] }, + { ageMa: 100, + coords: [-156.34,-12.6,-156.61,-9.9,-155.84,-9.3,-155.96,-7.8,-154.54,-7.2,-154.26,-3.6,-155.1,-3.34,-159,-3.24,-159.6,-3.45,-160.5,-4.64,-161.7,-5.03,-165.5,-5.1,-165.19,-3.6,-164.92,-3.3,-158.38,-2.7,-158.29,-0.6,-153.9,-0.11,-153.6,-0.5,-153.3,-0.15,-152.7,0,-152.7,2.33,-152.4,2.35,-152.1,2.96,-151.33,3.3,-155.06,12.6,-154.89,13.2,-155.47,14.7,-155.98,15.3,-156.69,17.1,-158.98,17.4,-159.92,20.1,-160.84,20.4,-161.12,21,-162.3,21.08,-165.17,20.7,-167.1,26.1,-166.5,26.69,-162.54,27.9,-163.89,33.6,-164.33,34.2,-164.73,35.7,-165.3,35.92,-166.8,35.77,-171.3,34.79,-172.5,35.13,-172.91,35.4,-175.38,43.2,-176.4,43.23,-176.7,42.98,-177.9,42.97,-180,42.47], + plateIndices: [36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36] }, + { ageMa: 100, + coords: [180,-4.41,177.56,-5.4,177.52,-5.7,176.68,-6.3,176.38,-7.5,174.64,-7.8,174.43,-8.1,172.8,-8.7,172.34,-9.9,171,-10.15], + plateIndices: [36,36,36,36,36,36,36,36,36,36] }, + { ageMa: 100, + coords: [-178.83,-9.6,-177.09,-9,-176.92,-7.8,-175.87,-7.5,-175.31,-7.2,-175.25,-6.9], + plateIndices: [36,36,36,36,36,36] }, + { ageMa: 100, + coords: [-175.25,-6.9,-173.55,-6.6,-173.08,-6,-173.13,-5.1,-172.36,-4.8,-172.34,-4.5,-177.6,-3.8,-178.5,-3.8,-180,-4.41], + plateIndices: [36,36,36,36,36,36,36,36,36] }, + { ageMa: 100, + coords: [149.28,-0.3,148.53,3.3,147.73,5.7,147.3,6.25,142.2,6.33,141,7.16,137.87,8.1], + plateIndices: [36,13,36,36,13,13,13] }, + { ageMa: 100, + coords: [92.1,13.82,90.3,13.62,88.8,12.1,88.72,10.8,88.31,9.9,86.4,9.67,86.07,9.3,85.68,7.2,84.44,4.2,84.3,2.7,83.59,1.5,82.8,0.98,82.2,1.25,81.6,0.86,80.93,1.2,79.89,2.4,77.62,6.6], + plateIndices: [20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20] }, + { ageMa: 100, + coords: [-3.18,3.3,-6.6,2.57,-7.2,2.62,-8,3.3,-8.4,3.38,-13.14,3.3,-13.23,3.6,-14.1,4.07,-14.99,5.7,-16.2,5.77,-17.74,7.5,-20.4,8.17,-22.91,8.4,-23.72,9.6,-26.7,10.7,-29.58,12.3,-29.66,13.2,-30.37,14.1,-29.48,21,-29.49,21.3,-30.25,21.9,-30.21,22.5,-29.74,22.8,-29.36,24.3,-28.15,27,-27.18,27.9,-25.69,30.3,-25.2,30.39,-24.3,31.35,-23.66,31.5,-23.17,32.1,-22.55,32.4,-21.86,33.6,-20.61,34.8,-19.5,36.32,-16.38,37.5,-14.99,42.3,-14.55,43.2,-13.5,44.4,-6,45.23], + plateIndices: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,17,17,17,17] }, + { ageMa: 100, + coords: [-63.84,20.4,-61.63,26.4,-62.22,27.3,-62.1,27.83,-61.45,28.2,-60.39,30,-58.63,32.1,-57.49,32.7,-55.5,34.51,-54.6,34.67,-53.72,35.4,-53.05,35.4,-51.58,36,-50.4,37.12,-48.9,37.92,-47.1,39.28,-45.9,39.25,-44.55,39.6,-42.91,42.9,-41.35,45,-40.8,46.2,-40.74,46.8,-41.73,47.7,-42.3,48.88], + plateIndices: [28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28] }, + { ageMa: 100, + coords: [180,42.47,177,41.87,176.4,41.95,174.93,44.1,174.12,46.8,172.73,49.5,171.23,51.3,169.2,52.8], + plateIndices: [36,36,36,36,36,36,36,36] }, + { ageMa: 100, + coords: [-6.3,45.47,-12,46.19,-13.65,46.2,-13.63,47.1,-14.73,49.2], + plateIndices: [17,17,17,17,17] }, + { ageMa: 100, + coords: [-42.95,49.5,-45.12,51,-47.12,51.6,-49.2,51.74], + plateIndices: [28,28,28,28] }, + { ageMa: 120, + coords: [-30,-68.63,-37.2,-68.54,-43.5,-67.69,-49.8,-64.78,-51,-64.38,-51.9,-64.43], + plateIndices: [2,2,2,2,2,2] }, + { ageMa: 120, + coords: [-16.8,-67.93,-30,-68.63], + plateIndices: [2,2] }, + { ageMa: 120, + coords: [64.5,-57.1,64.14,-57.6,64.25,-58.2,63.55,-58.8,64.45,-59.1,63,-59.27,62.19,-60,63.3,-60.53,63.43,-60.3,62.93,-60,63.3,-59.54,63.9,-60.43,64.2,-60.49,64.5,-60,65.1,-60.7,60.6,-60.73,55.8,-61.66,53.1,-61.65,52.8,-61.98,51.31,-62.1,50.4,-63.31,48.3,-63.44,45.6,-63.1,44.4,-62.77,43.8,-62.16,43.5,-62.53,42,-62.48,40.2,-63.03,36.6,-62.66,34.2,-62.36,33.9,-62.22,33.6,-61.46,32.1,-61.27,30.6,-62.13,28.5,-61.95,27.3,-62.2,25.8,-61.97,24,-62.65,22.2,-62.63,21,-63.32,20.7,-62.98,20.4,-63.61,18.3,-64.52,17.4,-64.67,11.88,-63,9,-62.43,7.64,-62.7,0.9,-65.03,-2.7,-65.88,-16.8,-67.93], + plateIndices: [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] }, + { ageMa: 120, + coords: [99.12,-62.4,94.96,-62.1,92.4,-60.7,90.41,-58.5,81.6,-56.26,80.1,-56.03,78.57,-57.3,77.82,-57.6], + plateIndices: [2,2,2,2,2,2,2,2] }, + { ageMa: 120, + coords: [65.4,-60.43,65.17,-59.1,65.4,-58.96,66,-59.73,66.3,-59.24,66.66,-59.4,66.4,-59.7,66.6,-59.85,67.5,-59.84,68.1,-60.27,68.81,-59.4,69,-58.58,69.35,-58.8,69.1,-59.1,69.22,-59.4,68.87,-59.7,69,-59.9,69.6,-59.79,69.85,-60,69.6,-60.24,69.3,-60.06,68.52,-60.3,65.4,-60.43], + plateIndices: [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] }, + { ageMa: 120, + coords: [74.7,-59.95,71.1,-60.16,70.8,-59.93,70.2,-60.17,69.99,-60,70.49,-59.7,70.12,-59.4,70.75,-58.8,70.8,-58.46,71.2,-58.8,70.68,-59.4,71.1,-59.88,72.9,-59.69], + plateIndices: [2,2,2,2,2,2,2,2,2,2,2,2,2] }, + { ageMa: 120, + coords: [-44.51,-58.5,-44.4,-58.13,-43.2,-57.73,-42.9,-57.85,-42.65,-57.6,-42.36,-56.4,-41.58,-55.2,-41.79,-54.3], + plateIndices: [42,42,42,42,42,42,42,42] }, + { ageMa: 120, + coords: [-36.25,-53.1,-36.1,-50.7,-35.6,-50.1,-35.68,-48.9,-37.5,-48.73,-40.71,-49.2], + plateIndices: [40,40,40,40,40,40] }, + { ageMa: 120, + coords: [-44.4,-27.6,-45.03,-28.2,-48.06,-35.7,-51.96,-42.3,-52.84,-45.3,-52.93,-47.4,-52.59,-48,-52.62,-48.6,-53.7,-48.75], + plateIndices: [40,40,40,40,40,40,40,40,40] }, + { ageMa: 120, + coords: [-169.24,-42,-168.72,-41.7,-168.3,-40.64,-168.14,-39.9,-168.3,-39.41,-168.9,-39.15,-168.98,-38.7,-170.4,-37.94,-170.4,-37.5,-171.6,-36.92,-171.9,-36.55,-173.4,-36.18,-176.4,-34.83,-176.29,-34.2], + plateIndices: [36,36,36,36,36,36,36,36,36,36,36,36,36,36] }, + { ageMa: 120, + coords: [21.81,-37.2,18.89,-39.3,16.8,-40.16,16.22,-39.6,15.6,-39.38,13.44,-36.9,12.36,-35.1,11.62,-32.1], + plateIndices: [0,0,0,0,0,0,0,0] }, + { ageMa: 120, + coords: [46.71,-25.8,46.5,-27,45.6,-27.39,45,-27.56,44.1,-26.91,42,-27.08,41.7,-28.27,40.5,-28.35,40.2,-28.84,39,-29,38.7,-30.02,38.1,-30.09,37.95,-30.9,36.9,-33.15,33.3,-33.17,33.27,-33.9,33.77,-34.8,33.74,-36,33.95,-36.3,33.6,-36.88,33.3,-36.92,33,-36.45,32.7,-36.45,30.9,-34.8,30.33,-34.2,30.3,-33.78,29.17,-32.7], + plateIndices: [44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,0,0,0,0,0,0,0,0,0,0,0,0] }, + { ageMa: 120, + coords: [109.5,-35,108.9,-35.21,108.42,-35.1,106.77,-34.5,106.52,-34.2,107.05,-33.3,106.68,-32.4,106.9,-31.8,108.1,-30.9,109.66,-28.5,108.71,-27.3,108.9,-27.05,109.2,-27.3,109.22,-27,108.6,-26.65,108.3,-26.77,108.3,-26.31,107.4,-26.23,106.5,-25.47,105.55,-25.2,103.8,-27.74,103.2,-27.93,102.3,-29,102.13,-29.4,102.47,-30.3,101.92,-31.2,99.47,-29.7,98.95,-29.1], + plateIndices: [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7] }, + { ageMa: 120, + coords: [11.62,-32.1,10.33,-26.7,9.85,-20.7,9.51,-20.4,9.37,-19.8,9.78,-19.2,9.71,-18.9,10.2,-18.93,10.41,-18.6,10.12,-17.1,10.5,-16.53], + plateIndices: [0,0,0,0,0,0,0,0,0,0,0] }, + { ageMa: 120, + coords: [-36.05,-10.8,-36.4,-12,-37.5,-13.2,-37.37,-14.1,-37.61,-14.7,-37.33,-17.4,-37.94,-18.9,-37.62,-20.4,-37.83,-22.2,-37.54,-22.8,-37.97,-24,-39.24,-25.8,-38.99,-27.3,-39.6,-27.52], + plateIndices: [40,40,40,40,40,40,40,40,40,40,40,40,40,40] }, + { ageMa: 120, + coords: [108.63,-10.5,106.5,-15.9,106.78,-16.8,105.23,-19.5,105.22,-19.8,106.15,-20.7,105.6,-21.02], + plateIndices: [7,7,7,7,7,7,7] }, + { ageMa: 120, + coords: [-162.9,-16.28,-163.2,-15.85,-164.42,-15.3,-164.86,-14.7,-165.9,-14.46,-166.35,-14.1,-166.8,-14.18,-168.05,-13.8,-168.03,-13.2,-168.3,-13.04,-171.9,-11.94,-173.15,-10.8,-173.18,-10.2,-172.39,-9.9,-171.9,-9.12,-170.7,-9.11,-170.1,-8.57,-168.9,-8.59,-167.79,-7.8,-160.8,-7.43,-159,-6.11,-158.99,-7.2,-159.65,-7.8,-159.89,-8.4,-159.74,-9.6,-160.49,-13.8,-161.1,-15,-161.63,-15.3,-162,-16.36,-162.9,-16.28], + plateIndices: [36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36] }, + { ageMa: 120, + coords: [10.52,-16.5,11.33,-13.8,11.05,-12.6,11.24,-11.7,10.1,-9.9,9.96,-8.4,9.27,-6.6,9.37,-6,8.08,-4.8,7.28,-3.6,7.28,-3,7.8,-2.13], + plateIndices: [0,0,0,0,0,0,0,0,0,0,0,0] }, + { ageMa: 120, + coords: [50.15,-12.6,48.16,-7.8,48.31,-6,48.01,-4.5,48.3,-3.8,49.2,-3.01,49.45,-1.8,49.96,-0.9,51.03,0.3,51.3,4.2,54.9,8.11,55.76,10.8,55.5,12.68], + plateIndices: [44,44,44,44,44,44,44,44,44,44,44,44,44] }, + { ageMa: 120, + coords: [-34.5,-4.61,-33.92,-4.8,-33.51,-7.5,-32.96,-8.4,-33.3,-9,-35.1,-10.18], + plateIndices: [40,40,40,40,40,40] }, + { ageMa: 120, + coords: [168.48,-8.1,169.2,-7.88,169.34,-7.5,170.7,-7.37,171.9,-6.75,172.2,-7.1,172.5,-7.08,180,-4.12], + plateIndices: [36,36,36,36,36,36,36,36] }, + { ageMa: 120, + coords: [-35.57,-4.5,-36.6,-3.9,-37.74,-2.7,-39.3,-2.29], + plateIndices: [40,40,40,40] }, + { ageMa: 120, + coords: [-176.72,32.4,-174.9,28.13,-174.3,27.69,-173.33,25.8,-176.48,24.3,-174.14,18.6,-173.7,18.15,-170.7,18.42,-168.42,16.5,-168.3,15.96,-167.71,15.3,-166.32,15,-166.3,14.7,-160.93,7.8,-157.36,2.7,-162.3,1.86,-164.7,0.44,-172.17,-0.3,-175.23,-1.8,-175.45,-2.1,-175.43,-3,-176.91,-3.3,-177.1,-3.6,-178.8,-3.66,-180,-4.12], + plateIndices: [36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36] }, + { ageMa: 120, + coords: [149.33,-0.3,148.62,3.3,147.83,5.7,147.3,6.35,142.2,6.66,141.3,7.31,139.8,7.65,138.3,8.44], + plateIndices: [36,36,36,36,13,13,13,13] }, + { ageMa: 120, + coords: [8.73,1.2,9.04,3,6.9,5.1,6,4.84,4.2,5.42,1.2,5.45], + plateIndices: [0,0,0,0,0,0] }, + { ageMa: 120, + coords: [-8.1,3.94,-10.36,4.2,-10.48,4.5,-12.2,5.4,-13.16,6.6], + plateIndices: [0,0,0,0,0] }, + { ageMa: 120, + coords: [-16.8,8.52,-20.1,9.1,-20.4,9.33,-20.7,9.19,-21.9,9.96,-22.8,10.02,-24.94,11.1,-24.97,12.3,-26.09,12.9,-25.96,13.5,-26.18,14.4,-25.83,18.9,-26.07,20.4,-26.42,21,-26.02,22.8,-26.22,23.1,-25.51,25.2,-24.87,26.1,-24.12,26.4,-23.67,27.6,-22.56,29.4,-21.89,29.7,-19.92,31.5,-17.01,36,-16.2,36.61,-14.06,37.2,-13.65,39.6,-13.69,40.8,-13.2,42.29], + plateIndices: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,17,17] }, + { ageMa: 120, + coords: [82.05,8.4,82.24,9.3,83.43,10.5,82.7,12,84.61,13.5,84.68,13.8,84.22,14.4,85.02,15.3,85.11,16.2,85.8,17.1,89.19,19.8,89.1,20.1,88.5,20.16], + plateIndices: [20,20,20,20,20,20,20,20,20,20,20,20,20] }, + { ageMa: 120, + coords: [-54.32,9.6,-54.43,10.2,-55.02,11.1,-57.3,12.29], + plateIndices: [40,40,40,40] }, + { ageMa: 120, + coords: [-67.22,21,-67.92,21.6,-67.96,21.9,-67.69,23.1,-65.63,27.6,-65.43,29.7,-64.56,30.9,-64.52,31.5,-62.9,33.3,-61.92,33.9,-61.09,33.9,-60,35,-58.2,36.24,-57.35,36.3,-54.9,37.21,-49.51,40.5,-48,40.9,-46.5,40.94,-45.16,42.6,-45,43.57,-42.3,45.7,-41.81,47.1,-42.3,47.54], + plateIndices: [28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28] }, + { ageMa: 120, + coords: [180,32.31,178.66,32.1,176.59,35.7,174.65,37.5,172.44,40.8,172.04,42,172.14,42.3,171.7,43.2,168.3,48.5,165.3,47.83,159.6,46.01,159.3,45.98,158.1,46.75,154.5,45.52,154.2,45.77,153.6,45.61], + plateIndices: [36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36] }, + { ageMa: 140, + coords: [30,-65.86,27.9,-65.7,26.1,-66.65,20.7,-66.04,19.8,-66.45,17.7,-66.78,15.6,-66.57,13.8,-67.33,12.6,-67.09,10.8,-67.73,3.9,-65.89,-4.5,-68.21,-8.4,-69.07,-10.2,-69.15,-12.3,-69.74,-17.7,-70.39,-27.3,-70.76,-37.2,-70.68,-42.6,-70.06,-45.9,-69.19,-52.2,-66.85], + plateIndices: [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] }, + { ageMa: 140, + coords: [86.28,-65.1,84.3,-64.43,78.3,-64.55,77.4,-64.14,76.5,-64.07], + plateIndices: [2,2,2,2,2] }, + { ageMa: 140, + coords: [-38.34,-55.2,-42,-56.78,-42,-56,-41.48,-55.2,-41.75,-54.3], + plateIndices: [42,42,42,42,42] }, + { ageMa: 140, + coords: [-41.39,-53.1,-40.5,-52.49,-38.62,-50.1,-39,-49.31,-39.6,-49.35], + plateIndices: [40,40,40,40,40] }, + { ageMa: 140, + coords: [32.69,-29.1,32.47,-31.5,32.79,-32.1,32.7,-32.94,31.2,-30.65,31.34,-30], + plateIndices: [44,44,44,44,44,44] }, + { ageMa: 140, + coords: [46.17,-26.1,45.97,-26.7,45.3,-26.99,44.7,-26.58,43.28,-24.9,42.3,-21.88,41.7,-22.01,41.1,-23.34,39,-23.83,38.4,-25.11,37.5,-25.33,37.2,-26.56,36.9,-26.65,36.6,-27.53,33,-27.97], + plateIndices: [44,44,44,44,44,44,44,44,44,44,44,44,44,44,44] }, + { ageMa: 140, + coords: [42.3,-20.82,42,-14.31,42.34,-16.5,42.3,-20.82], + plateIndices: [44,44,44,44] }, + { ageMa: 140, + coords: [112.73,-15.3,112.2,-15.04,111.67,-15.3,111.22,-17.1,110.12,-19.2,109.8,-20.31], + plateIndices: [7,7,7,7,7,7] }, + { ageMa: 140, + coords: [113.15,-15.3,114,-13.55,117.02,-12,116.76,-11.4], + plateIndices: [7,7,7,7] }, + { ageMa: 140, + coords: [49.68,-12.3,48.3,-9.52,47.81,-7.8,47.7,-6.38,47.21,-7.2,47.19,-8.7,46.88,-9,46.8,-9.7,45.6,-9.75,44.4,-10.46,44.1,-11.19,42.3,-11.63,41.99,-8.1,42.11,-5.7,42.3,-5.2,44.1,-4.89,44.4,-4.22,45.3,-3.61,46.8,-3.44,47.1,-0.35,50.4,0,50.77,0.6,50.87,1.5,50.83,4.2,51.33,5.1,52.5,6,54.9,8.48,55.53,10.8,55.5,12.61], + plateIndices: [44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44] }, + { ageMa: 140, + coords: [180,8.56,178.5,8.16,178.31,6.3,175.76,5.4,175.78,4.2,176.4,1.09,174,0.28,173.7,-0.18,171.3,-1.3,171.3,-2.71,171,-2.73,170.66,-2.1,169.8,0.17,164.7,-1.52,154.8,-4.18], + plateIndices: [36,36,36,36,36,36,36,36,36,36,36,36,36,36,36] }, + { ageMa: 140, + coords: [149.39,-0.3,148.35,4.5,147.95,5.7,147.3,6.47,142.2,7.04,141.3,7.62,139.8,7.79,138.3,8.91], + plateIndices: [36,36,36,36,13,13,13,13] }, + { ageMa: 140, + coords: [-180,13.66,-178.5,13.02,-176.36,11.1,-176.29,10.5,-176.4,9.41,-180,8.56], + plateIndices: [36,36,36,36,36,36] }, + { ageMa: 140, + coords: [-18,9.42,-19.8,9.26,-20.1,9.5,-20.7,9.51,-21.36,9.9,-21.75,11.4,-22.62,11.7,-22.73,12,-22.61,13.2,-22.96,13.5,-22.83,15.6,-23.31,21,-23.19,23.7,-22.14,25.5,-21.25,26.1,-21.08,27,-20.71,27.3,-20.12,28.8,-17.72,30.6,-16.31,33.3,-15.14,34.5,-14.17,36.3,-13.2,36.52], + plateIndices: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] }, + { ageMa: 140, + coords: [180,13.66,179.7,13.73,177.48,16.2,175.78,18.6,176.17,19.8,175.75,20.7,177.04,21.9,177.9,23.34,172.8,28.12,172.2,28.32,171.6,28.06,170.4,28.28,168.9,27.43,164.71,30.6,165.05,31.2,165,31.66,164.1,32.24,162.3,34.06,162.31,34.8,161.99,35.1,162.43,36.3,161.1,37.31,157.8,36.03,156.9,36.38,154.8,35.52,153.3,35.43,151.8,36.76,150.6,36.84,150,37.19,143.7,35.06,143.7,34.53,145.15,30.6,144.3,30.06,143.7,30.14,142.71,29.7], + plateIndices: [36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36] }, + { ageMa: 140, + coords: [85.5,18.62,85.77,18.6,85.65,18.3,81.6,15.35,80.7,14.33], + plateIndices: [20,20,20,20,20] }, + { ageMa: 140, + coords: [-86.1,24.96,-86.4,25.34,-88.2,26.02,-90.9,25.88,-92.1,24.97,-92.87,24.9,-92.96,24.3,-93.3,23.98,-94.2,23.83,-94.5,22.81,-94.9,22.5,-95.1,21.47], + plateIndices: [28,28,28,28,28,28,28,28,28,28,28,28] }, + { ageMa: 140, + coords: [-70.3,21.9,-70.3,22.2,-71.21,22.8,-70.67,24,-70.67,24.9,-69.76,26.7,-69.38,28.2,-67.98,31.2,-67.91,31.8,-66.49,34.2,-64.5,35.5,-63.3,35.67,-62.83,36.3,-60.6,37.78,-57.3,38.35,-55.07,39.9,-52.8,40.73,-50.54,42], + plateIndices: [28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28] }, + { ageMa: 140, + coords: [-85.94,25.2,-86.1,25.64,-87.6,26.44,-90.6,26.53,-91.8,25.79,-92.4,25.88,-93,25.04,-94.2,24.97,-95.1,23.13,-95.7,22.78], + plateIndices: [28,28,28,28,28,28,28,28,28,28] }, + { ageMa: 140, + coords: [-135.9,71.72,-138,72.9,-138.52,73.5,-138.61,74.1,-137.98,77.4,-137.1,78.55,-136.2,79.03], + plateIndices: [28,28,28,28,28,28,28] }, + { ageMa: 140, + coords: [-141.62,72,-144.86,73.2,-145.1,73.8,-146.32,74.7,-146.55,75.3,-147.51,75.9,-150.32,78.6,-152.7,79.12], + plateIndices: [28,28,28,28,28,28,28,28] }, + { ageMa: 160, + coords: [-39.7,-71.7,-44.1,-71.54,-46.8,-71.09,-52.5,-69.33,-53.7,-68.19], + plateIndices: [2,2,2,2,2] }, + { ageMa: 160, + coords: [-11.42,-70.5,-10.2,-70.07,-0.3,-68.44], + plateIndices: [2,2,2] }, + { ageMa: 160, + coords: [41.31,-15.9,41.66,-18,39.6,-18.86,39.3,-19.25,37.85,-20.1,37.68,-20.7,36.15,-21.6,36,-22.56], + plateIndices: [44,44,44,44,44,44,44,44] }, + { ageMa: 160, + coords: [43.2,-17.82,42.89,-16.5,42.95,-15.3,43.55,-15,45,-14.9,45.3,-13.78,45.59,-13.5,47.4,-12.72,47.7,-10.64,48.3,-10.5,49.19,-12], + plateIndices: [44,44,44,44,44,44,44,44,44,44,44] }, + { ageMa: 160, + coords: [41.26,-14.7,41.33,-12.3,41.08,-11.1,41.28,-10.5,41.57,-3.3,41.7,-3.03,43.5,-2.51,43.8,-1.22,44.1,-0.99,45.9,-0.42,46.5,1.53,50.1,2.56,50.4,5.62,51.3,6.16,51.48,7.2], + plateIndices: [44,44,44,44,44,44,44,44,44,44,44,44,44,44,44] }, + { ageMa: 160, + coords: [148.8,2.6,148.78,3.6,148.12,5.7,147.3,6.58,145.81,6.9,152.62,15.9,152.09,16.8,153.29,18.3,151.08,20.4,150.81,21,152.29,22.8,151.41,24,151.72,24.6,151.2,25.57,152.9,27.6,153.6,27.48,156,26.25,163.2,21.28,163.5,21.21,164.7,21.97,165,21.98,165.9,21.28,166.8,21.59,171.9,17.57,172,17.1,171.63,15.9,173.6,13.8,172.96,13.2,173.1,10.29,170.7,9.35,170.1,10.09,148.8,2.6], + plateIndices: [36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36] }, + { ageMa: 160, + coords: [-18,9.57,-18.77,9.6,-18.69,10.8,-19.91,11.4,-19.68,12.9,-20.19,13.2,-19.82,15.6,-20.11,15.9,-19.99,17.7,-20.14,20.4,-20.39,21,-20.12,24,-18.3,26.75,-17.7,27.21,-17.02,28.8,-14.61,30.6,-14.03,31.5,-13.27,33.6,-12.9,34.2,-12.3,34.27,-11.49,36], + plateIndices: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17] }, + { ageMa: 160, + coords: [-52.88,43.2,-54.9,42.26,-55.5,42.38,-56.4,42.06,-59.4,40.09,-63.27,39.3,-64.8,38.11,-66,37.84,-68.09,36.6,-68.7,36.57,-69.01,36.3,-70.88,33.6,-70.83,33,-71.99,30.3,-72.6,29.48,-72.69,28.5,-74.12,26.7,-73.88,25.8,-74.45,24.6,-73.5,23.33], + plateIndices: [28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28] }, + { ageMa: 180, + coords: [152.4,8.37,152.23,8.4,152.38,8.7,153.59,10.2,159.9,17.55,166.9,13.2,166.54,12.9,152.4,8.37], + plateIndices: [36,36,36,36,36,36,36,36] }, + { ageMa: 180, + coords: [-18,9.8,-18.2,9.9,-18.31,10.8,-18.66,11.1,-18.42,12.3,-18.74,12.9,-18.27,17.1,-18.72,22.2,-18.59,23.1,-17.54,24.9,-15.39,27.3,-15.07,28.2,-14.41,29.1,-12.34,30.6,-11.09,33.6,-10.06,35.1,-9.9,36.11], + plateIndices: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] }, + { ageMa: 180, + coords: [-77.03,26.1,-77.52,27.6,-77.61,29.1,-75.6,30.6,-74.4,32.34,-73.36,34.2,-73.25,35.7,-72.6,36.98,-71.76,37.8,-67.8,39.18,-66.3,39.27,-64.8,40.5,-63.52,41.1,-60,41.24,-57.71,42.9,-54.6,43.64], + plateIndices: [28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28] }, +]; diff --git a/src/i18n/strings_en.json b/src/i18n/strings_en.json index 83cb3d3..e84ed01 100644 --- a/src/i18n/strings_en.json +++ b/src/i18n/strings_en.json @@ -20,7 +20,8 @@ "motionVectors": "Motion vectors", "earthquakes": "Earthquakes", "volcanoes": "Volcanoes and hotspots", - "topography": "Topography / bathymetry" + "topography": "Topography / bathymetry", + "seafloorAge": "Seafloor age (isochrons)" }, "depthFilter": { "title": "Earthquake depth", @@ -47,7 +48,8 @@ "deep": "Deep quake", "volcano": "Volcano", "hotspot": "Hotspot", - "motion": "Plate motion" + "motion": "Plate motion", + "seafloorAge": "Seafloor age 0–180 Ma" }, "section": { "trench": "Trench", @@ -66,11 +68,11 @@ "verticalExaggeration": "Relief exaggerated ×{{value}} vertically", "relativeMotion": "{{value}} mm/yr" }, - "dataSources": "Plates: Bird (2003) · Earthquakes: USGS · Volcanoes: NOAA/GVP · Relief: NOAA", + "dataSources": "Plates: Bird (2003) · Earthquakes: USGS · Volcanoes: NOAA/GVP · Relief: NOAA · Seafloor age: EarthByte", "a11y": { "plateTectonics": { "screenSummary": { - "playArea": "The play area shows a map of the Earth's tectonic plates, or a cross-section through one plate boundary. Layers of real data can be drawn on top of it: plate boundaries coloured by type, plate motion arrows, earthquake epicentres, volcanoes and hotspots, and shaded relief of the land surface and sea floor.", + "playArea": "The play area shows a map of the Earth's tectonic plates, or a cross-section through one plate boundary. Layers of real data can be drawn on top of it: plate boundaries coloured by type, plate motion arrows, earthquake epicentres, volcanoes and hotspots, shaded relief of the land surface and sea floor, and isochrons of the ocean floor — lines of equal crustal age, which run parallel to the spreading ridges and get older away from them.", "controlArea": "The control area has a view selector, a checkbox for each data layer, an earthquake depth filter, controls that run plate motion forwards and backwards through geological time, and a Reset All button.", "interactionHint": "Switch on a pair of layers and look for where they line up — earthquakes and volcanoes around the Pacific, or ridges and shallow earthquakes down the middle of the Atlantic." }, @@ -113,6 +115,7 @@ "earthquakes": "Earthquakes", "volcanoes": "Volcanoes and hotspots", "topography": "Topography and bathymetry", + "seafloorAge": "Seafloor age isochrons", "depthFilter": "Earthquake depth", "depthFilterHelp": "Show earthquakes of every depth, or only one depth band.", "timeSlider": "Geological time", diff --git a/src/i18n/strings_es.json b/src/i18n/strings_es.json index 1ee2672..d41ee4e 100644 --- a/src/i18n/strings_es.json +++ b/src/i18n/strings_es.json @@ -20,7 +20,8 @@ "motionVectors": "Vectores de movimiento", "earthquakes": "Terremotos", "volcanoes": "Volcanes y puntos calientes", - "topography": "Topografía / batimetría" + "topography": "Topografía / batimetría", + "seafloorAge": "Edad del fondo oceánico (isócronas)" }, "depthFilter": { "title": "Profundidad de los terremotos", @@ -47,7 +48,8 @@ "deep": "Terremoto profundo", "volcano": "Volcán", "hotspot": "Punto caliente", - "motion": "Movimiento de placas" + "motion": "Movimiento de placas", + "seafloorAge": "Edad del fondo 0–180 Ma" }, "section": { "trench": "Fosa", @@ -66,11 +68,11 @@ "verticalExaggeration": "Relieve exagerado ×{{value}} verticalmente", "relativeMotion": "{{value}} mm/año" }, - "dataSources": "Placas: Bird (2003) · Terremotos: USGS · Volcanes: NOAA/GVP · Relieve: NOAA", + "dataSources": "Placas: Bird (2003) · Terremotos: USGS · Volcanes: NOAA/GVP · Relieve: NOAA · Edad del fondo: EarthByte", "a11y": { "plateTectonics": { "screenSummary": { - "playArea": "El área de juego muestra un mapa de las placas tectónicas de la Tierra, o un corte transversal a través de un límite de placas. Encima se pueden dibujar capas de datos reales: límites de placas coloreados por tipo, flechas del movimiento de las placas, epicentros de terremotos, volcanes y puntos calientes, y el relieve sombreado de la superficie terrestre y del fondo marino.", + "playArea": "El área de juego muestra un mapa de las placas tectónicas de la Tierra, o un corte transversal a través de un límite de placas. Encima se pueden dibujar capas de datos reales: límites de placas coloreados por tipo, flechas del movimiento de las placas, epicentros de terremotos, volcanes y puntos calientes, el relieve sombreado de la superficie terrestre y del fondo marino, e isócronas del fondo oceánico — líneas de igual edad de la corteza, paralelas a las dorsales y cada vez más antiguas al alejarse de ellas.", "controlArea": "El área de control tiene un selector de vista, una casilla para cada capa de datos, un filtro de profundidad de terremotos, controles que hacen avanzar y retroceder el movimiento de las placas en el tiempo geológico, y un botón de Restablecer todo.", "interactionHint": "Active un par de capas y busque dónde coinciden: terremotos y volcanes alrededor del Pacífico, o dorsales y terremotos superficiales en medio del Atlántico." }, @@ -113,6 +115,7 @@ "earthquakes": "Terremotos", "volcanoes": "Volcanes y puntos calientes", "topography": "Topografía y batimetría", + "seafloorAge": "Isócronas de edad del fondo oceánico", "depthFilter": "Profundidad de los terremotos", "depthFilterHelp": "Muestre terremotos de todas las profundidades, o solo de una banda de profundidad.", "timeSlider": "Tiempo geológico", diff --git a/src/i18n/strings_fr.json b/src/i18n/strings_fr.json index 3c02ff9..ce657db 100644 --- a/src/i18n/strings_fr.json +++ b/src/i18n/strings_fr.json @@ -20,7 +20,8 @@ "motionVectors": "Vecteurs de mouvement", "earthquakes": "Séismes", "volcanoes": "Volcans et points chauds", - "topography": "Topographie / bathymétrie" + "topography": "Topographie / bathymétrie", + "seafloorAge": "Âge du plancher océanique (isochrones)" }, "depthFilter": { "title": "Profondeur des séismes", @@ -47,7 +48,8 @@ "deep": "Séisme profond", "volcano": "Volcan", "hotspot": "Point chaud", - "motion": "Mouvement des plaques" + "motion": "Mouvement des plaques", + "seafloorAge": "Âge du plancher 0–180 Ma" }, "section": { "trench": "Fosse", @@ -66,11 +68,11 @@ "verticalExaggeration": "Relief exagéré ×{{value}} verticalement", "relativeMotion": "{{value}} mm/an" }, - "dataSources": "Plaques : Bird (2003) · Séismes : USGS · Volcans : NOAA/GVP · Relief : NOAA", + "dataSources": "Plaques : Bird (2003) · Séismes : USGS · Volcans : NOAA/GVP · Relief : NOAA · Âge du plancher : EarthByte", "a11y": { "plateTectonics": { "screenSummary": { - "playArea": "La zone de jeu affiche une carte des plaques tectoniques de la Terre, ou une coupe transversale à travers une limite de plaques. Des couches de données réelles peuvent y être superposées : limites de plaques colorées par type, flèches du mouvement des plaques, épicentres de séismes, volcans et points chauds, et relief ombré de la surface terrestre et du fond océanique.", + "playArea": "La zone de jeu affiche une carte des plaques tectoniques de la Terre, ou une coupe transversale à travers une limite de plaques. Des couches de données réelles peuvent y être superposées : limites de plaques colorées par type, flèches du mouvement des plaques, épicentres de séismes, volcans et points chauds, relief ombré de la surface terrestre et du fond océanique, et isochrones du plancher océanique — des lignes d'égal âge de la croûte, parallèles aux dorsales et de plus en plus anciennes en s'en éloignant.", "controlArea": "La zone de contrôle comporte un sélecteur de vue, une case à cocher pour chaque couche de données, un filtre de profondeur des séismes, des commandes qui font avancer et reculer le mouvement des plaques dans le temps géologique, et un bouton Tout réinitialiser.", "interactionHint": "Activez deux couches et cherchez où elles coïncident : séismes et volcans autour du Pacifique, ou dorsales et séismes superficiels au milieu de l'Atlantique." }, @@ -113,6 +115,7 @@ "earthquakes": "Séismes", "volcanoes": "Volcans et points chauds", "topography": "Topographie et bathymétrie", + "seafloorAge": "Isochrones d'âge du plancher océanique", "depthFilter": "Profondeur des séismes", "depthFilterHelp": "Affichez les séismes de toutes les profondeurs, ou d'une seule tranche de profondeur.", "timeSlider": "Temps géologique", diff --git a/src/plate-tectonics/model/PlateTectonicsModel.ts b/src/plate-tectonics/model/PlateTectonicsModel.ts index da1e60b..17e050c 100644 --- a/src/plate-tectonics/model/PlateTectonicsModel.ts +++ b/src/plate-tectonics/model/PlateTectonicsModel.ts @@ -64,6 +64,13 @@ export class PlateTectonicsModel implements TModel { /** The shaded relief raster: land topography and ocean-floor bathymetry. */ public readonly showTopographyProperty = new BooleanProperty(false); + /** + * Isochrons of the ocean floor — lines of equal crustal age, coloured young to old. + * Best read with the boundaries on and everything else off, which is when the + * isochrons and the ridges that made them are the only two things on the map. + */ + public readonly showSeafloorAgeProperty = new BooleanProperty(false); + // ── Filtering ─────────────────────────────────────────────────────────────── /** Which earthquake depth band to show. */ @@ -182,6 +189,7 @@ export class PlateTectonicsModel implements TModel { this.showEarthquakesProperty.reset(); this.showVolcanoesProperty.reset(); this.showTopographyProperty.reset(); + this.showSeafloorAgeProperty.reset(); this.earthquakeDepthFilterProperty.reset(); this.selectedViewProperty.reset(); this.timeSpeedProperty.reset(); diff --git a/src/plate-tectonics/view/EarthCanvasNode.ts b/src/plate-tectonics/view/EarthCanvasNode.ts index 84b3fc9..acea76b 100644 --- a/src/plate-tectonics/view/EarthCanvasNode.ts +++ b/src/plate-tectonics/view/EarthCanvasNode.ts @@ -25,12 +25,13 @@ */ import { Multilink } from "scenerystack/axon"; -import { CanvasNode, type CanvasNodeOptions, type Color } from "scenerystack/scenery"; +import { CanvasNode, type CanvasNodeOptions, Color } from "scenerystack/scenery"; import type { BoundaryType } from "../../common/data/dataTypes.js"; import { BOUNDARY_SEGMENTS } from "../../common/data/generated/boundaryData.js"; import { EARTHQUAKES } from "../../common/data/generated/earthquakeData.js"; import { LAND_RINGS } from "../../common/data/generated/landData.js"; import { PLATES } from "../../common/data/generated/plateData.js"; +import { ISOCHRON_AGES_MA, ISOCHRONS } from "../../common/data/generated/seafloorAgeData.js"; import { VOLCANOES } from "../../common/data/generated/volcanoData.js"; import { HOTSPOTS } from "../../common/data/hotspots.js"; import type { EarthProjection } from "../../common/EarthProjection.js"; @@ -38,6 +39,8 @@ import { PlateReconstruction } from "../../common/PlateReconstruction.js"; import PlateTectonicsColors from "../../PlateTectonicsColors.js"; import { BOUNDARY_LINE_WIDTH, + ISOCHRON_LINE_WIDTH, + MAX_SEAFLOOR_AGE_MA, PLATE_FILL_OPACITY, QUAKE_BASE_RADIUS, QUAKE_RADIUS_PER_MAGNITUDE, @@ -110,6 +113,7 @@ export abstract class EarthCanvasNode extends CanvasNode { model.showEarthquakesProperty, model.showVolcanoesProperty, model.showTopographyProperty, + model.showSeafloorAgeProperty, model.earthquakeDepthFilterProperty, model.timeMillionsOfYearsProperty, ...projection.cameraProperties, @@ -118,6 +122,7 @@ export abstract class EarthCanvasNode extends CanvasNode { PlateTectonicsColors.divergentBoundaryColorProperty, PlateTectonicsColors.shallowQuakeColorProperty, PlateTectonicsColors.volcanoColorProperty, + ...PlateTectonicsColors.seafloorAgeRampColorProperties, ], () => this.invalidatePaint(), ); @@ -157,6 +162,11 @@ export abstract class EarthCanvasNode extends CanvasNode { if (this.model.showPlatesProperty.value) { this.paintPlates(context); } + // Under the boundaries, because the youngest isochrons run alongside the ridge + // that made them and the ridge is the thing being pointed at. + if (this.model.showSeafloorAgeProperty.value) { + this.paintIsochrons(context); + } if (this.model.showBoundariesProperty.value) { this.paintBoundaries(context); } @@ -281,6 +291,52 @@ export abstract class EarthCanvasNode extends CanvasNode { } } + // ── Seafloor age ──────────────────────────────────────────────────────────── + + /** + * Draws the isochrons of the ocean floor, each in the colour of its own age. + * + * This is the seafloor spreading argument drawn out: the youngest crust lies in a + * thin red band along every spreading ridge, and the same ages appear at the same + * distance on *both* sides of it, getting older and bluer out to the continental + * margins. Nothing like it exists on land, because the sea floor is made at the + * ridges and destroyed at the trenches while the continents stay. + * + * An isochron is frozen into the crust, so it rides its plate — vertex by vertex, + * because a single isochron crosses several plates. Running the clock backwards + * therefore walks the two halves of each pair back together onto the ridge that + * made them, and crust younger than the reconstruction has reached had not been + * made yet, so those isochrons are not drawn at all. + */ + protected paintIsochrons(context: CanvasRenderingContext2D): void { + const timeMyr = this.model.timeMillionsOfYearsProperty.value; + const youngestExisting = timeMyr < 0 ? -timeMyr : 0; + + context.lineWidth = ISOCHRON_LINE_WIDTH; + context.lineCap = "round"; + context.lineJoin = "round"; + + // Oldest first, so the young lines stay legible where isochrons crowd together + // against a passive margin — the western Atlantic packs 100 Myr into a few degrees. + for (let index = ISOCHRON_AGES_MA.length - 1; index >= 0; index--) { + const ageMa = ISOCHRON_AGES_MA[index] as number; + if (ageMa < youngestExisting) { + continue; + } + context.strokeStyle = seafloorAgeColor(ageMa).toCSS(); + context.beginPath(); + for (const isochron of ISOCHRONS) { + if (isochron.ageMa === ageMa) { + // Torn where consecutive vertices ride different plates: an isochron really + // is cut and offset where a fracture zone crosses it, and once the clock has + // run the two pieces are hundreds of kilometres apart. + this.appendFeature(context, isochron.coords, isochron.plateIndices, "open", true); + } + } + context.stroke(); + } + } + // ── Earthquakes ───────────────────────────────────────────────────────────── /** @@ -372,6 +428,24 @@ function boundaryColor(type: BoundaryType): Color { : PlateTectonicsColors.transformBoundaryColorProperty.value; } +/** + * Colour for crust of a given age, interpolated along + * {@link PlateTectonicsColors.seafloorAgeRampColorProperties}. Ages beyond the ramp — + * the few patches of Jurassic sea floor older than {@link MAX_SEAFLOOR_AGE_MA} — take + * its last stop. + */ +function seafloorAgeColor(ageMa: number): Color { + const stops = PlateTectonicsColors.seafloorAgeRampColorProperties; + const position = Math.max(0, Math.min(1, ageMa / MAX_SEAFLOOR_AGE_MA)) * (stops.length - 1); + const lower = Math.min(stops.length - 1, Math.floor(position)); + const upper = Math.min(stops.length - 1, lower + 1); + return Color.interpolateRGBA( + (stops[lower] as (typeof stops)[number]).value, + (stops[upper] as (typeof stops)[number]).value, + position - lower, + ); +} + /** Colour property for an earthquake depth band. */ function quakeColor(band: DepthBand): Color { if (band === "shallow") { diff --git a/src/plate-tectonics/view/LayerControlPanel.ts b/src/plate-tectonics/view/LayerControlPanel.ts index e0dae5d..fc6a8b9 100644 --- a/src/plate-tectonics/view/LayerControlPanel.ts +++ b/src/plate-tectonics/view/LayerControlPanel.ts @@ -76,6 +76,12 @@ export class LayerControlPanel extends PlateTectonicsPanel { accessibleName: a11y.topographyStringProperty, swatch: createLegendSwatch("topography"), }, + { + property: model.showSeafloorAgeProperty, + label: layerStrings.seafloorAgeStringProperty, + accessibleName: a11y.seafloorAgeStringProperty, + swatch: createLegendSwatch("seafloorAge"), + }, ].map( (entry) => new Checkbox( @@ -110,7 +116,7 @@ export class LayerControlPanel extends PlateTectonicsPanel { { value: "deep", createNode: () => depthLabel(depthStrings.deepStringProperty, "deep") }, ], { - spacing: 5, + spacing: 4, radioButtonOptions: { radius: 7, selectedColor: PlateTectonicsColors.accentColorProperty, @@ -127,15 +133,18 @@ export class LayerControlPanel extends PlateTectonicsPanel { depthRadioButtons.enabled = showEarthquakes; }); + // Spacings are tight because the control column has to hold this panel, the view + // selector and the whole geological-time panel inside the ScreenView's height — + // every row of layers here comes out of the time controls below. const content = new VBox({ align: "left", - spacing: 9, + spacing: 7, children: [ new Text(layerStrings.titleStringProperty, { font: TITLE_FONT, fill: PlateTectonicsColors.textColorProperty, }), - new VBox({ align: "left", spacing: 7, children: checkboxes }), + new VBox({ align: "left", spacing: 5, children: checkboxes }), new Text(depthStrings.titleStringProperty, { font: TITLE_FONT, fill: PlateTectonicsColors.textColorProperty, @@ -145,7 +154,7 @@ export class LayerControlPanel extends PlateTectonicsPanel { }); const options = optionize()( - { minWidth: CONTROL_PANEL_WIDTH, align: "left" }, + { minWidth: CONTROL_PANEL_WIDTH, align: "left", yMargin: 8 }, providedOptions, ); super(content, options); diff --git a/src/plate-tectonics/view/LegendSwatches.ts b/src/plate-tectonics/view/LegendSwatches.ts index 5e67edd..471dcc7 100644 --- a/src/plate-tectonics/view/LegendSwatches.ts +++ b/src/plate-tectonics/view/LegendSwatches.ts @@ -28,7 +28,8 @@ export type SwatchKind = | "volcanoes" | "volcano" | "hotspot" - | "topography"; + | "topography" + | "seafloorAge"; const SWATCH_WIDTH = 18; const SWATCH_HEIGHT = 12; @@ -122,6 +123,18 @@ export function createLegendSwatch(kind: SwatchKind): Node { cornerRadius: 2, }); + case "seafloorAge": + // The age ramp itself, young at the left and old at the right — the layer draws + // a line rather than a block, but what it is saying is which end of this bar + // each line sits at. + return new Rectangle(0, 0, SWATCH_WIDTH, SWATCH_HEIGHT, { + fill: PlateTectonicsColors.seafloorAgeRampColorProperties.reduce( + (gradient, color, index, stops) => gradient.addColorStop(index / (stops.length - 1), color), + new LinearGradient(0, 0, SWATCH_WIDTH, 0), + ), + cornerRadius: 2, + }); + default: return new Node(); } diff --git a/src/plate-tectonics/view/MapLegendNode.ts b/src/plate-tectonics/view/MapLegendNode.ts index c45e821..a59bab8 100644 --- a/src/plate-tectonics/view/MapLegendNode.ts +++ b/src/plate-tectonics/view/MapLegendNode.ts @@ -38,6 +38,7 @@ export class MapLegendNode extends PlateTectonicsPanel { { swatch: "volcano", label: legendStrings.volcanoStringProperty }, { swatch: "hotspot", label: legendStrings.hotspotStringProperty }, { swatch: "motion", label: legendStrings.motionStringProperty }, + { swatch: "seafloorAge", label: legendStrings.seafloorAgeStringProperty }, ]; const items: Node[] = entries.map( diff --git a/src/plate-tectonics/view/PlateTectonicsScreenSummaryContent.ts b/src/plate-tectonics/view/PlateTectonicsScreenSummaryContent.ts index b6c0d1e..ec841e4 100644 --- a/src/plate-tectonics/view/PlateTectonicsScreenSummaryContent.ts +++ b/src/plate-tectonics/view/PlateTectonicsScreenSummaryContent.ts @@ -66,12 +66,14 @@ export class PlateTectonicsScreenSummaryContent extends ScreenSummaryContent { model.showEarthquakesProperty, model.showVolcanoesProperty, model.showTopographyProperty, + model.showSeafloorAgeProperty, layerStrings.platesStringProperty, layerStrings.plateBoundariesStringProperty, layerStrings.motionVectorsStringProperty, layerStrings.earthquakesStringProperty, layerStrings.volcanoesStringProperty, layerStrings.topographyStringProperty, + layerStrings.seafloorAgeStringProperty, ], ( plates: boolean, @@ -80,12 +82,14 @@ export class PlateTectonicsScreenSummaryContent extends ScreenSummaryContent { earthquakes: boolean, volcanoes: boolean, topography: boolean, + seafloorAge: boolean, platesName: string, boundariesName: string, vectorsName: string, earthquakesName: string, volcanoesName: string, topographyName: string, + seafloorAgeName: string, ) => [ plates ? platesName : null, @@ -94,6 +98,7 @@ export class PlateTectonicsScreenSummaryContent extends ScreenSummaryContent { earthquakes ? earthquakesName : null, volcanoes ? volcanoesName : null, topography ? topographyName : null, + seafloorAge ? seafloorAgeName : null, ] .filter((name): name is string => name !== null) .join(", "), diff --git a/tests/PlateTectonicsModel.test.ts b/tests/PlateTectonicsModel.test.ts index 9c946b8..d0f97b6 100644 --- a/tests/PlateTectonicsModel.test.ts +++ b/tests/PlateTectonicsModel.test.ts @@ -23,6 +23,7 @@ describe("PlateTectonicsModel", () => { expect(model.showEarthquakesProperty.value).toBe(false); expect(model.showVolcanoesProperty.value).toBe(false); expect(model.showTopographyProperty.value).toBe(false); + expect(model.showSeafloorAgeProperty.value).toBe(false); expect(model.earthquakeDepthFilterProperty.value).toBe("all"); expect(model.selectedViewProperty.value).toBe("global"); expect(model.timeMillionsOfYearsProperty.value).toBe(0); @@ -131,6 +132,7 @@ describe("PlateTectonicsModel", () => { model.showEarthquakesProperty.value = true; model.showVolcanoesProperty.value = true; model.showTopographyProperty.value = true; + model.showSeafloorAgeProperty.value = true; model.earthquakeDepthFilterProperty.value = "deep"; model.selectedViewProperty.value = "transform"; model.timeSpeedProperty.value = TimeSpeed.FAST; @@ -145,6 +147,7 @@ describe("PlateTectonicsModel", () => { expect(model.showEarthquakesProperty.value).toBe(false); expect(model.showVolcanoesProperty.value).toBe(false); expect(model.showTopographyProperty.value).toBe(false); + expect(model.showSeafloorAgeProperty.value).toBe(false); expect(model.earthquakeDepthFilterProperty.value).toBe("all"); expect(model.selectedViewProperty.value).toBe("global"); expect(model.timeSpeedProperty.value).toBe(TimeSpeed.NORMAL); diff --git a/tests/geophysicalData.test.ts b/tests/geophysicalData.test.ts index 2eaba7d..d5ff482 100644 --- a/tests/geophysicalData.test.ts +++ b/tests/geophysicalData.test.ts @@ -2,7 +2,7 @@ * geophysicalData.test.ts * * Integrity checks on the generated datasets. `npm run build-data` reaches out to - * five public services and reshapes what they return; these tests are what stands + * six public services and reshapes what they return; these tests are what stands * between a silently mangled regeneration and a sim that draws nonsense. * * They also encode a few facts about the Earth — the Ring of Fire really is where @@ -17,6 +17,7 @@ import { CROSS_SECTIONS } from "../src/common/data/generated/crossSectionData.js import { EARTHQUAKES } from "../src/common/data/generated/earthquakeData.js"; import { LAND_RINGS } from "../src/common/data/generated/landData.js"; import { PLATES } from "../src/common/data/generated/plateData.js"; +import { ISOCHRON_AGES_MA, ISOCHRONS } from "../src/common/data/generated/seafloorAgeData.js"; import { VOLCANOES } from "../src/common/data/generated/volcanoData.js"; import { HOTSPOTS } from "../src/common/data/hotspots.js"; import { MOTION_FRAMES, PlateReconstruction } from "../src/common/PlateReconstruction.js"; @@ -247,6 +248,96 @@ describe("volcanoes and hotspots", () => { }); }); +describe("seafloor isochrons", () => { + it("labels every line with one of the ages the ramp is built for", () => { + expect(ISOCHRON_AGES_MA.length).toBeGreaterThan(5); + expect(ISOCHRONS.length).toBeGreaterThan(100); + for (const isochron of ISOCHRONS) { + expect(ISOCHRON_AGES_MA).toContain(isochron.ageMa); + expect(isochron.coords.length).toBeGreaterThanOrEqual(4); + expectValidCoordinates(isochron.coords); + expect(isochron.plateIndices.length).toBe(isochron.coords.length / 2); + for (const index of isochron.plateIndices) { + expect(index).toBeGreaterThanOrEqual(0); + expect(index).toBeLessThan(PLATES.length); + } + } + for (const ageMa of ISOCHRON_AGES_MA) { + expect( + ISOCHRONS.filter((isochron) => isochron.ageMa === ageMa).length, + `no ${ageMa} Ma isochron`, + ).toBeGreaterThan(0); + } + }); + + /** + * The seafloor spreading argument, as an assertion. + * + * Across the Atlantic at 24° N the profile is as clean as it gets: no trench, no + * transform in the way, continental margins either side. Every isochron crosses that + * latitude exactly twice, and both crossings step away from the ridge as the age + * goes up — which is what "the sea floor is made at the ridge and carried away from + * it" looks like in the data. A latitude/longitude swap, a sign error in the contour + * levels, or a mangled age grid all break the ordering. + */ + it("steps out symmetrically from the Mid-Atlantic Ridge as the crust gets older", () => { + const crossingsAt24North = (ageMa: number): number[] => { + const longitudes: number[] = []; + for (const isochron of ISOCHRONS) { + if (isochron.ageMa !== ageMa) { + continue; + } + const coords = isochron.coords; + for (let i = 3; i < coords.length; i += 2) { + const from = coords[i - 2] as number; + const to = coords[i] as number; + if (from === to || from > 24 === to > 24) { + continue; + } + const t = (24 - from) / (to - from); + const lon = (coords[i - 3] as number) + t * ((coords[i - 1] as number) - (coords[i - 3] as number)); + // The Atlantic between the American and African margins, and nowhere else. + if (lon > -80 && lon < -5) { + longitudes.push(lon); + } + } + } + return longitudes; + }; + + // Everything from 10 Ma to 160 Ma reaches this latitude on both flanks; the 180 Ma + // line only survives on the African side, so it is left out of the comparison. + const ages = ISOCHRON_AGES_MA.filter((ageMa) => ageMa >= 10 && ageMa <= 160); + const flanks = ages.map((ageMa) => { + const longitudes = crossingsAt24North(ageMa); + expect(longitudes.length, `${ageMa} Ma does not cross 24° N in the Atlantic`).toBeGreaterThan(0); + return { ageMa, west: Math.min(...longitudes), east: Math.max(...longitudes) }; + }); + + // The ridge axis, read off the youngest pair rather than assumed. + const youngest = flanks[0] as (typeof flanks)[number]; + const axis = (youngest.west + youngest.east) / 2; + expect(axis).toBeGreaterThan(-50); + expect(axis).toBeLessThan(-42); + + for (let i = 1; i < flanks.length; i++) { + const older = flanks[i] as (typeof flanks)[number]; + const younger = flanks[i - 1] as (typeof flanks)[number]; + expect(older.west, `${older.ageMa} Ma should sit west of ${younger.ageMa} Ma`).toBeLessThan(younger.west); + expect(older.east, `${older.ageMa} Ma should sit east of ${younger.ageMa} Ma`).toBeGreaterThan(younger.east); + + // Accretion is symmetric to within a degree or two per flank; the tolerance here + // is loose enough for the real asymmetry and the 0.3° contouring mesh, and tight + // enough that one flank drifting would fail. + expect(Math.abs(axis - older.west - (older.east - axis)), `${older.ageMa} Ma is lopsided`).toBeLessThan(6); + } + + // Over 160 Myr the two flanks together have opened the whole ocean. + const oldest = flanks[flanks.length - 1] as (typeof flanks)[number]; + expect(oldest.east - oldest.west).toBeGreaterThan(40); + }); +}); + describe("cross-sections", () => { it("has one profile per boundary type", () => { expect(CROSS_SECTIONS.map((section) => section.key).sort()).toEqual(["divergent", "subduction", "transform"]);