From 31be7efd65b64b4f59caec22d2fc28078b64e09d Mon Sep 17 00:00:00 2001 From: David Ellis Date: Mon, 7 Oct 2024 09:48:21 -0500 Subject: [PATCH 01/16] H3 CLI Region Subcommands --- src/apps/filters/h3.c | 374 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 374 insertions(+) diff --git a/src/apps/filters/h3.c b/src/apps/filters/h3.c index a21c10f67..eadd9dc82 100644 --- a/src/apps/filters/h3.c +++ b/src/apps/filters/h3.c @@ -1189,6 +1189,375 @@ SUBCOMMAND(uncompactCells, return E_SUCCESS; } +/// Region subcommands + +H3Error polygonStringToGeoPolygon(FILE *fp, char *polygonString, + GeoPolygon *out) { + // There are two kinds of valid input, an array of arrays of lat, lng values + // defining a singular polygon loop, or an array of array of arrays of lat, + // lng values defining a polygon and zero or more holes. Which kind of input + // this is can be determined by the `[` depth reached before the first + // floating point number is found. This means either 2 or 3 `[`s at the + // beginning are valid, and nothing more than that. + int8_t maxDepth = 0; + int8_t curDepth = 0; + int64_t numVerts = 6; + int64_t curVert = 0; + int64_t curLoop = 0; + LatLng *verts = calloc(numVerts, sizeof(LatLng)); + int64_t strPos = 0; + while (polygonString[strPos] != 0) { + // Load more of the file if we've hit our buffer limit + if (strPos == 1500 && fp != 0) { + int res = fread(polygonString, 0, 1500, fp); + strPos = 0; + // If we didn't get any data from the file, we're done. + if (res == 0) { + break; + } + } + // Try to match `[` first + if (polygonString[strPos] == '[') { + curDepth++; + if (curDepth > maxDepth) { + maxDepth = curDepth; + } + strPos++; + continue; + } + // Similar matching for `]` + if (polygonString[strPos] == ']') { + curDepth--; + if (curDepth < 0) { + break; + } + strPos++; + // We may need to set upa new geoloop at this point. If the + // curDepth <= maxDepth - 2 then we increment the curLoop and get a + // new one set up. + if (curDepth <= maxDepth - 2) { + if (curLoop == 0) { + out->geoloop.verts = verts; + out->geoloop.numVerts = curVert; + } else { + GeoLoop *holes = calloc(++(out->numHoles), sizeof(GeoLoop)); + for (int i = 0; i < out->numHoles - 1; i++) { + holes[i].numVerts = out->holes[i].numVerts; + holes[i].verts = out->holes[i].verts; + } + free(out->holes); + out->holes = holes; + } + curLoop++; + curVert = 0; + numVerts = 6; + verts = calloc(numVerts, sizeof(LatLng)); + } + continue; + } + // Try to grab a floating point value followed by optional whitespace, a + // comma, and more optional whitespace, and a second floating point + // value, then store the lat, lng pair + double lat, lng; + int count; + int res = sscanf(polygonString + strPos, "%lf%*[, \n]%lf%n", &lat, &lng, + &count); + if (count > 0 && res != 0) { + verts[curVert].lat = H3_EXPORT(degsToRads)(lat); + verts[curVert].lng = H3_EXPORT(degsToRads)(lng); + curVert++; + // Create a new vert buffer, copy the old buffer, and free it, if + // necessary + if (curVert == numVerts) { + LatLng *newVerts = calloc(numVerts * 2, sizeof(LatLng)); + for (int i = 0; i < numVerts; i++) { + newVerts[i].lat = verts[i].lat; + newVerts[i].lng = verts[i].lng; + } + free(verts); + verts = newVerts; + numVerts *= 2; + } + strPos += count; + continue; + } + // Check for whitespace and skip it if we reach this point. + if (polygonString[strPos] == ',' || polygonString[strPos] == ' ' || + polygonString[strPos] == '\n') { + strPos++; + continue; + } else { + // TODO: We've encountered an unexpected character. This may mean we + // need to read more of the file and put the remainder of this + // buffer as part of the next buffer. Or it could mean that we + // should just skip forward a character and try again. + strPos++; + } + } + return E_SUCCESS; +} + +SUBCOMMAND( + polygonToCells, + "Converts a polygon (array of lat, lng points, or array of arrays of lat, " + "lng points) into a set of covering cells at the specified resolution") { + char filename[1024] = {0}; // More than Windows, lol + Arg filenameArg = { + .names = {"-f", "--file"}, + .scanFormat = "%1023c", + .valueName = "FILENAME", + .value = &filename, + .helpText = + "The file to load the cells from. Use -- to read from stdin."}; + char polygonStr[1501] = {0}; // Up to 100 cells with zero padding + Arg polygonStrArg = { + .names = {"-p", "--polygon"}, + .scanFormat = "%1500c", + .valueName = "POLYGON", + .value = &polygonStr, + .helpText = "The polygon to convert. Up to 1500 characters."}; + int res = 0; + Arg resArg = {.names = {"-r", "--resolution"}, + .required = true, + .scanFormat = "%d", + .valueName = "res", + .value = &res, + .helpText = + "Resolution, 0-15 inclusive, that the compacted set " + "should be uncompacted to. Must be greater than or equal " + "to the highest resolution within the compacted set."}; + Arg *args[] = {&polygonToCellsArg, &helpArg, &filenameArg, &polygonStrArg, + &resArg}; + PARSE_SUBCOMMAND(argc, argv, args); + if (!filenameArg.found && !polygonStrArg.found) { + fprintf(stderr, + "You must provide either a file to read from or a polygon " + "to cover to use polygonToCells"); + exit(1); + } + FILE *fp = 0; + bool isStdin = false; + if (filenameArg.found) { + if (strcmp(filename, "--") == 0) { + fp = stdin; + isStdin = true; + } else { + fp = fopen(filename, "r"); + } + if (fp == 0) { + fprintf(stderr, "The specified file does not exist."); + exit(1); + } + // Do the initial population of data from the file + if (fread(polygonStr, 1, 1500, fp) == 0) { + fprintf(stderr, "The specified file is empty."); + exit(1); + } + } + GeoPolygon polygon = {0}; + H3Error err = polygonStringToGeoPolygon(fp, polygonStr, &polygon); + if (err != E_SUCCESS) { + if (!isStdin) { + fclose(fp); + } + return err; + } + int64_t cellsSize = 0; + err = H3_EXPORT(maxPolygonToCellsSize)(&polygon, res, 0, &cellsSize); + if (err != E_SUCCESS) { + return err; + } + H3Index *cells = calloc(cellsSize, sizeof(H3Index)); + err = H3_EXPORT(polygonToCells)(&polygon, res, 0, cells); + if (err != E_SUCCESS) { + free(cells); + return err; + } + // We can print out the cells + for (int i = 0; i < cellsSize; i++) { + if (cells[i] == 0) { + continue; + } + h3Println(cells[i]); + } + free(cells); + return E_SUCCESS; +} + +SUBCOMMAND(maxPolygonToCellsSize, + "Returns the maximum number of cells that could be needed to cover " + "the polygon. Will always be more than actually necessary") { + char filename[1024] = {0}; // More than Windows, lol + Arg filenameArg = { + .names = {"-f", "--file"}, + .scanFormat = "%1023c", + .valueName = "FILENAME", + .value = &filename, + .helpText = + "The file to load the cells from. Use -- to read from stdin."}; + char polygonStr[1501] = {0}; // Up to 100 cells with zero padding + Arg polygonStrArg = { + .names = {"-p", "--polygon"}, + .scanFormat = "%1500c", + .valueName = "POLYGON", + .value = &polygonStr, + .helpText = "The polygon to convert. Up to 1500 characters."}; + int res = 0; + Arg resArg = {.names = {"-r", "--resolution"}, + .required = true, + .scanFormat = "%d", + .valueName = "res", + .value = &res, + .helpText = + "Resolution, 0-15 inclusive, that the compacted set " + "should be uncompacted to. Must be greater than or equal " + "to the highest resolution within the compacted set."}; + Arg *args[] = {&maxPolygonToCellsSizeArg, &helpArg, &filenameArg, + &polygonStrArg, &resArg}; + PARSE_SUBCOMMAND(argc, argv, args); + if (!filenameArg.found && !polygonStrArg.found) { + fprintf(stderr, + "You must provide either a file to read from or a polygon " + "to cover to use polygonToCells"); + exit(1); + } + FILE *fp = 0; + bool isStdin = false; + if (filenameArg.found) { + if (strcmp(filename, "--") == 0) { + fp = stdin; + isStdin = true; + } else { + fp = fopen(filename, "r"); + } + if (fp == 0) { + fprintf(stderr, "The specified file does not exist."); + exit(1); + } + // Do the initial population of data from the file + if (fread(polygonStr, 1, 1500, fp) == 0) { + fprintf(stderr, "The specified file is empty."); + exit(1); + } + } + GeoPolygon polygon = {0}; + H3Error err = polygonStringToGeoPolygon(fp, polygonStr, &polygon); + if (err != E_SUCCESS) { + if (!isStdin) { + fclose(fp); + } + return err; + } + int64_t cellsSize = 0; + err = H3_EXPORT(maxPolygonToCellsSize)(&polygon, res, 0, &cellsSize); + if (err != E_SUCCESS) { + return err; + } + printf("%ld\n", cellsSize); + return E_SUCCESS; +} + +SUBCOMMAND(cellsToMultiPolygon, + "Returns a polygon (array of lat, lng points, or array of arrays of " + "lat, lng points) for a set of cells") { + char filename[1024] = {0}; // More than Windows, lol + Arg filenameArg = { + .names = {"-f", "--file"}, + .scanFormat = "%1023c", + .valueName = "FILENAME", + .value = &filename, + .helpText = + "The file to load the cells from. Use -- to read from stdin."}; + char cellStrs[1501] = {0}; // Up to 100 cells with zero padding + Arg cellStrsArg = {.names = {"-c", "--cells"}, + .scanFormat = "%1500c", + .valueName = "CELLS", + .value = &cellStrs, + .helpText = + "The cells to compact. Up to 100 cells if provided " + "as hexadecimals with zero padding."}; + Arg *args[] = {&cellsToMultiPolygonArg, &helpArg, &filenameArg, + &cellStrsArg}; + PARSE_SUBCOMMAND(argc, argv, args); + if (!filenameArg.found && !cellStrsArg.found) { + fprintf(stderr, + "You must provide either a file to read from or a set of cells " + "to compact to use compactCells"); + exit(1); + } + FILE *fp = 0; + bool isStdin = false; + if (filenameArg.found) { + if (strcmp(filename, "--") == 0) { + fp = stdin; + isStdin = true; + } else { + fp = fopen(filename, "r"); + } + if (fp == 0) { + fprintf(stderr, "The specified file does not exist."); + exit(1); + } + // Do the initial population of data from the file + if (fread(cellStrs, 1, 1500, fp) == 0) { + fprintf(stderr, "The specified file is empty."); + exit(1); + } + } + size_t cellsOffset = 0; + H3Index *cells = readCellsFromFile(fp, cellStrs, &cellsOffset); + if (fp != 0 && !isStdin) { + fclose(fp); + } + if (cells == NULL) { + return E_FAILED; + } + LinkedGeoPolygon out = {0}; + H3Error err = + H3_EXPORT(cellsToLinkedMultiPolygon)(cells, cellsOffset, &out); + if (err) { + free(cells); + H3_EXPORT(destroyLinkedMultiPolygon)(&out); + return err; + } + printf("["); + LinkedGeoPolygon *currPoly = &out; + while (currPoly) { + printf("["); + LinkedGeoLoop *currLoop = currPoly->first; + while (currLoop) { + printf("["); + LinkedLatLng *currLatLng = currLoop->first; + while (currLatLng) { + printf("[%f, %f]", + H3_EXPORT(radsToDegs)(currLatLng->vertex.lat), + H3_EXPORT(radsToDegs)(currLatLng->vertex.lng)); + currLatLng = currLatLng->next; + if (currLatLng) { + printf(", "); + } + } + currLoop = currLoop->next; + if (currLoop) { + printf("], "); + } else { + printf("]"); + } + } + currPoly = currPoly->next; + if (currPoly) { + printf("], "); + } else { + printf("]"); + } + } + printf("]"); + printf("\n"); + free(cells); + H3_EXPORT(destroyLinkedMultiPolygon)(&out); + return E_SUCCESS; +} + // TODO: Is there any way to avoid this particular piece of duplication? SUBCOMMANDS_INDEX @@ -1226,6 +1595,11 @@ SUBCOMMAND_INDEX(childPosToCell) SUBCOMMAND_INDEX(compactCells) SUBCOMMAND_INDEX(uncompactCells) +/// Region subcommands +SUBCOMMAND_INDEX(polygonToCells) +SUBCOMMAND_INDEX(maxPolygonToCellsSize) +SUBCOMMAND_INDEX(cellsToMultiPolygon) + END_SUBCOMMANDS_INDEX int main(int argc, char *argv[]) { From 8a5fdeddee1a8b5174054dc5c2c45f4f51d957f6 Mon Sep 17 00:00:00 2001 From: David Ellis Date: Mon, 7 Oct 2024 10:49:54 -0500 Subject: [PATCH 02/16] Apply suggestions from code review Co-authored-by: Isaac Brodsky --- src/apps/filters/h3.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/filters/h3.c b/src/apps/filters/h3.c index eadd9dc82..19474d840 100644 --- a/src/apps/filters/h3.c +++ b/src/apps/filters/h3.c @@ -1308,7 +1308,7 @@ SUBCOMMAND( .valueName = "FILENAME", .value = &filename, .helpText = - "The file to load the cells from. Use -- to read from stdin."}; + "The file to load the polygon from. Use -- to read from stdin."}; char polygonStr[1501] = {0}; // Up to 100 cells with zero padding Arg polygonStrArg = { .names = {"-p", "--polygon"}, @@ -1394,7 +1394,7 @@ SUBCOMMAND(maxPolygonToCellsSize, .valueName = "FILENAME", .value = &filename, .helpText = - "The file to load the cells from. Use -- to read from stdin."}; + "The file to load the polygon from. Use -- to read from stdin."}; char polygonStr[1501] = {0}; // Up to 100 cells with zero padding Arg polygonStrArg = { .names = {"-p", "--polygon"}, From 7cb910fcb14d223d990b82da0cff2b0654f4637a Mon Sep 17 00:00:00 2001 From: David Ellis Date: Mon, 7 Oct 2024 13:22:20 -0500 Subject: [PATCH 03/16] Add multipolygon tests --- tests/cli/cellsToMultiPolygon.txt | 14 +++ tests/inputfiles/multipolygon_test1.txt | 1 + tests/inputfiles/multipolygon_test2.txt | 1 + tests/inputfiles/multipolygon_test3.txt | 8 ++ tests/inputfiles/multipolygon_test4.txt | 9 ++ tests/inputfiles/multipolygon_test5.txt | 129 ++++++++++++++++++++++++ 6 files changed, 162 insertions(+) create mode 100644 tests/cli/cellsToMultiPolygon.txt create mode 100644 tests/inputfiles/multipolygon_test1.txt create mode 100644 tests/inputfiles/multipolygon_test2.txt create mode 100644 tests/inputfiles/multipolygon_test3.txt create mode 100644 tests/inputfiles/multipolygon_test4.txt create mode 100644 tests/inputfiles/multipolygon_test5.txt diff --git a/tests/cli/cellsToMultiPolygon.txt b/tests/cli/cellsToMultiPolygon.txt new file mode 100644 index 000000000..705114069 --- /dev/null +++ b/tests/cli/cellsToMultiPolygon.txt @@ -0,0 +1,14 @@ +add_h3_cli_test(testCliCellsToMultiPolygonFile1 "cellsToMultiPolygon -f ${PROJECT_SOURCE_DIR}/tests/inputfiles/multipolygon_test1.txt" "[[[[37.784046, -122.427089], [37.772267, -122.434586], [37.761736, -122.425769], [37.762982, -122.409455], [37.752446, -122.400640], [37.753689, -122.384324], [37.765468, -122.376819], [37.776004, -122.385635], [37.774761, -122.401954], [37.785293, -122.410771]]]]") +add_h3_cli_test(testCliCellsToMultiPolygonFile2 "cellsToMultiPolygon -f ${PROJECT_SOURCE_DIR}/tests/inputfiles/multipolygon_test2.txt" "[[[[37.784046, -122.427089], [37.772267, -122.434586], [37.761736, -122.425769], [37.762982, -122.409455], [37.752446, -122.400640], [37.753689, -122.384324], [37.765468, -122.376819], [37.776004, -122.385635], [37.774761, -122.401954], [37.785293, -122.410771]]], [[[38.231228, -123.642760], [38.229797, -123.658996], [38.218020, -123.666324], [38.207675, -123.657418], [38.209105, -123.641184], [38.220882, -123.633853]]]]") +add_h3_cli_test(testCliCellsToMultiPolygonFile3 "cellsToMultiPolygon -f ${PROJECT_SOURCE_DIR}/tests/inputfiles/multipolygon_test3.txt" "[[[[37.106073, -122.020493], [37.114176, -121.906636], [37.196816, -121.853848], [37.204791, -121.739761], [37.287359, -121.686742], [37.361955, -121.747972], [37.444452, -121.694882], [37.518923, -121.756207], [37.510841, -121.870623], [37.585130, -121.932045], [37.576863, -122.046394], [37.494361, -122.099157], [37.485965, -122.213273], [37.403391, -122.265803], [37.329215, -122.204381], [37.246571, -122.256843], [37.172270, -122.195515], [37.180556, -122.081726]], [[37.428341, -121.923550], [37.353926, -121.862223], [37.271356, -121.915080], [37.263198, -122.029101], [37.337556, -122.090429], [37.420129, -122.037735]]]]") +add_h3_cli_test(testCliCellsToMultiPolygonFile4 "cellsToMultiPolygon -f ${PROJECT_SOURCE_DIR}/tests/inputfiles/multipolygon_test4.txt" "[[[[37.114176, -121.906636], [37.196816, -121.853848], [37.204791, -121.739761], [37.287359, -121.686742], [37.361955, -121.747972], [37.444452, -121.694882], [37.518923, -121.756207], [37.510841, -121.870623], [37.585130, -121.932045], [37.576863, -122.046394], [37.494361, -122.099157], [37.485965, -122.213273], [37.403391, -122.265803], [37.329215, -122.204381], [37.246571, -122.256843], [37.172270, -122.195515], [37.180556, -122.081726], [37.106073, -122.020493]], [[37.337556, -122.090429], [37.420129, -122.037735], [37.428341, -121.923550], [37.353926, -121.862223], [37.271356, -121.915080], [37.263198, -122.029101]]], [[[43.431278, -115.975237], [43.508096, -115.912429], [43.581386, -115.974912], [43.577810, -116.100258], [43.500970, -116.162919], [43.427727, -116.100382]]]]") +add_h3_cli_test(testCliCellsToMultiPolygonFile5 "cellsToMultiPolygon -f ${PROJECT_SOURCE_DIR}/tests/inputfiles/multipolygon_test5.txt" "[[[[37.893933, -120.851267], [37.968684, -120.912560], [37.961273, -121.028117], [38.035842, -121.089514], [38.028243, -121.205013], [38.102628, -121.266514], [38.094842, -121.381953], [38.169044, -121.443555], [38.161070, -121.558932], [38.235088, -121.620634], [38.226927, -121.735948], [38.300760, -121.797749], [38.292411, -121.912997], [38.366059, -121.974896], [38.357522, -122.090075], [38.275391, -122.143187], [38.266721, -122.258129], [38.184513, -122.311004], [38.175712, -122.425707], [38.093428, -122.478345], [38.084496, -122.592809], [38.002138, -122.645211], [37.993077, -122.759435], [37.910647, -122.811600], [37.901458, -122.925582], [37.818957, -122.977512], [37.809642, -123.091252], [37.727072, -123.142946], [37.653813, -123.081070], [37.571172, -123.132698], [37.497785, -123.070917], [37.415075, -123.122480], [37.341561, -123.060795], [37.258782, -123.112292], [37.185142, -123.050702], [37.102296, -123.102134], [37.028530, -123.040638], [36.945618, -123.092005], [36.871727, -123.030604], [36.788751, -123.081906], [36.714736, -123.020599], [36.723641, -122.907984], [36.649445, -122.846765], [36.658170, -122.734072], [36.583794, -122.672942], [36.592340, -122.560174], [36.517784, -122.499133], [36.526150, -122.386293], [36.451416, -122.325343], [36.459602, -122.212431], [36.384689, -122.151573], [36.392695, -122.038593], [36.317605, -121.977827], [36.325432, -121.864780], [36.408404, -121.812338], [36.416106, -121.699065], [36.499012, -121.646395], [36.506587, -121.532897], [36.589424, -121.479999], [36.596872, -121.366277], [36.679638, -121.313150], [36.686957, -121.199205], [36.769651, -121.145849], [36.776840, -121.031683], [36.859460, -120.978099], [36.866518, -120.863712], [36.949062, -120.809899], [37.024556, -120.870629], [37.107030, -120.816743], [37.182402, -120.877566], [37.264805, -120.823607], [37.340054, -120.884523], [37.422384, -120.830491], [37.497511, -120.891502], [37.579767, -120.837396], [37.654769, -120.898500], [37.736951, -120.844321], [37.811828, -120.905520]]], [[[37.490250, -121.006554], [37.565196, -121.067667], [37.647458, -121.013720], [37.722279, -121.074928], [37.804467, -121.020908], [37.879162, -121.082210], [37.871614, -121.197541], [37.789422, -121.251401], [37.714782, -121.190091], [37.632515, -121.243878], [37.557750, -121.182663], [37.475409, -121.236378], [37.400519, -121.175257], [37.318106, -121.228899], [37.243092, -121.167872], [37.160607, -121.221443], [37.085470, -121.160510], [37.002914, -121.214009], [36.995490, -121.328282], [36.912860, -121.381551], [36.905305, -121.495600], [36.822602, -121.548639], [36.814919, -121.662463], [36.732145, -121.715272], [36.724333, -121.828869], [36.799241, -121.889820], [36.791248, -122.003352], [36.865977, -122.064397], [36.857802, -122.177861], [36.932351, -122.239000], [36.923995, -122.352395], [36.998363, -122.413626], [36.989826, -122.526949], [37.064013, -122.588271], [37.055294, -122.701520], [36.972446, -122.753285], [36.898316, -122.691966], [36.906977, -122.578878], [36.832666, -122.517650], [36.841147, -122.404488], [36.766655, -122.343351], [36.774955, -122.230118], [36.700284, -122.169073], [36.708403, -122.055771], [36.633553, -121.994819], [36.641490, -121.881449], [36.566462, -121.820592], [36.574218, -121.707157], [36.657058, -121.654417], [36.664688, -121.540757], [36.747458, -121.487788], [36.754960, -121.373903], [36.837659, -121.320705], [36.845030, -121.206596], [36.927656, -121.153169], [36.934897, -121.038838], [37.017447, -120.985181], [37.092763, -121.046013], [37.175243, -120.992284], [37.250436, -121.053210], [37.332844, -120.999409], [37.407914, -121.060428]]]]") +add_h3_cli_test(testCliCellsToMultiPolygonStdin1 "cellsToMultiPolygon -f -- < ${PROJECT_SOURCE_DIR}/tests/inputfiles/multipolygon_test1.txt" "[[[[37.784046, -122.427089], [37.772267, -122.434586], [37.761736, -122.425769], [37.762982, -122.409455], [37.752446, -122.400640], [37.753689, -122.384324], [37.765468, -122.376819], [37.776004, -122.385635], [37.774761, -122.401954], [37.785293, -122.410771]]]]") +add_h3_cli_test(testCliCellsToMultiPolygonStdin2 "cellsToMultiPolygon -f -- < ${PROJECT_SOURCE_DIR}/tests/inputfiles/multipolygon_test2.txt" "[[[[37.784046, -122.427089], [37.772267, -122.434586], [37.761736, -122.425769], [37.762982, -122.409455], [37.752446, -122.400640], [37.753689, -122.384324], [37.765468, -122.376819], [37.776004, -122.385635], [37.774761, -122.401954], [37.785293, -122.410771]]], [[[38.231228, -123.642760], [38.229797, -123.658996], [38.218020, -123.666324], [38.207675, -123.657418], [38.209105, -123.641184], [38.220882, -123.633853]]]]") +add_h3_cli_test(testCliCellsToMultiPolygonStdin3 "cellsToMultiPolygon -f -- < ${PROJECT_SOURCE_DIR}/tests/inputfiles/multipolygon_test3.txt" "[[[[37.106073, -122.020493], [37.114176, -121.906636], [37.196816, -121.853848], [37.204791, -121.739761], [37.287359, -121.686742], [37.361955, -121.747972], [37.444452, -121.694882], [37.518923, -121.756207], [37.510841, -121.870623], [37.585130, -121.932045], [37.576863, -122.046394], [37.494361, -122.099157], [37.485965, -122.213273], [37.403391, -122.265803], [37.329215, -122.204381], [37.246571, -122.256843], [37.172270, -122.195515], [37.180556, -122.081726]], [[37.428341, -121.923550], [37.353926, -121.862223], [37.271356, -121.915080], [37.263198, -122.029101], [37.337556, -122.090429], [37.420129, -122.037735]]]]") +add_h3_cli_test(testCliCellsToMultiPolygonStdin4 "cellsToMultiPolygon -f -- < ${PROJECT_SOURCE_DIR}/tests/inputfiles/multipolygon_test4.txt" "[[[[37.114176, -121.906636], [37.196816, -121.853848], [37.204791, -121.739761], [37.287359, -121.686742], [37.361955, -121.747972], [37.444452, -121.694882], [37.518923, -121.756207], [37.510841, -121.870623], [37.585130, -121.932045], [37.576863, -122.046394], [37.494361, -122.099157], [37.485965, -122.213273], [37.403391, -122.265803], [37.329215, -122.204381], [37.246571, -122.256843], [37.172270, -122.195515], [37.180556, -122.081726], [37.106073, -122.020493]], [[37.337556, -122.090429], [37.420129, -122.037735], [37.428341, -121.923550], [37.353926, -121.862223], [37.271356, -121.915080], [37.263198, -122.029101]]], [[[43.431278, -115.975237], [43.508096, -115.912429], [43.581386, -115.974912], [43.577810, -116.100258], [43.500970, -116.162919], [43.427727, -116.100382]]]]") +add_h3_cli_test(testCliCellsToMultiPolygonStdin5 "cellsToMultiPolygon -f -- < ${PROJECT_SOURCE_DIR}/tests/inputfiles/multipolygon_test5.txt" "[[[[37.893933, -120.851267], [37.968684, -120.912560], [37.961273, -121.028117], [38.035842, -121.089514], [38.028243, -121.205013], [38.102628, -121.266514], [38.094842, -121.381953], [38.169044, -121.443555], [38.161070, -121.558932], [38.235088, -121.620634], [38.226927, -121.735948], [38.300760, -121.797749], [38.292411, -121.912997], [38.366059, -121.974896], [38.357522, -122.090075], [38.275391, -122.143187], [38.266721, -122.258129], [38.184513, -122.311004], [38.175712, -122.425707], [38.093428, -122.478345], [38.084496, -122.592809], [38.002138, -122.645211], [37.993077, -122.759435], [37.910647, -122.811600], [37.901458, -122.925582], [37.818957, -122.977512], [37.809642, -123.091252], [37.727072, -123.142946], [37.653813, -123.081070], [37.571172, -123.132698], [37.497785, -123.070917], [37.415075, -123.122480], [37.341561, -123.060795], [37.258782, -123.112292], [37.185142, -123.050702], [37.102296, -123.102134], [37.028530, -123.040638], [36.945618, -123.092005], [36.871727, -123.030604], [36.788751, -123.081906], [36.714736, -123.020599], [36.723641, -122.907984], [36.649445, -122.846765], [36.658170, -122.734072], [36.583794, -122.672942], [36.592340, -122.560174], [36.517784, -122.499133], [36.526150, -122.386293], [36.451416, -122.325343], [36.459602, -122.212431], [36.384689, -122.151573], [36.392695, -122.038593], [36.317605, -121.977827], [36.325432, -121.864780], [36.408404, -121.812338], [36.416106, -121.699065], [36.499012, -121.646395], [36.506587, -121.532897], [36.589424, -121.479999], [36.596872, -121.366277], [36.679638, -121.313150], [36.686957, -121.199205], [36.769651, -121.145849], [36.776840, -121.031683], [36.859460, -120.978099], [36.866518, -120.863712], [36.949062, -120.809899], [37.024556, -120.870629], [37.107030, -120.816743], [37.182402, -120.877566], [37.264805, -120.823607], [37.340054, -120.884523], [37.422384, -120.830491], [37.497511, -120.891502], [37.579767, -120.837396], [37.654769, -120.898500], [37.736951, -120.844321], [37.811828, -120.905520]]], [[[37.490250, -121.006554], [37.565196, -121.067667], [37.647458, -121.013720], [37.722279, -121.074928], [37.804467, -121.020908], [37.879162, -121.082210], [37.871614, -121.197541], [37.789422, -121.251401], [37.714782, -121.190091], [37.632515, -121.243878], [37.557750, -121.182663], [37.475409, -121.236378], [37.400519, -121.175257], [37.318106, -121.228899], [37.243092, -121.167872], [37.160607, -121.221443], [37.085470, -121.160510], [37.002914, -121.214009], [36.995490, -121.328282], [36.912860, -121.381551], [36.905305, -121.495600], [36.822602, -121.548639], [36.814919, -121.662463], [36.732145, -121.715272], [36.724333, -121.828869], [36.799241, -121.889820], [36.791248, -122.003352], [36.865977, -122.064397], [36.857802, -122.177861], [36.932351, -122.239000], [36.923995, -122.352395], [36.998363, -122.413626], [36.989826, -122.526949], [37.064013, -122.588271], [37.055294, -122.701520], [36.972446, -122.753285], [36.898316, -122.691966], [36.906977, -122.578878], [36.832666, -122.517650], [36.841147, -122.404488], [36.766655, -122.343351], [36.774955, -122.230118], [36.700284, -122.169073], [36.708403, -122.055771], [36.633553, -121.994819], [36.641490, -121.881449], [36.566462, -121.820592], [36.574218, -121.707157], [36.657058, -121.654417], [36.664688, -121.540757], [36.747458, -121.487788], [36.754960, -121.373903], [36.837659, -121.320705], [36.845030, -121.206596], [36.927656, -121.153169], [36.934897, -121.038838], [37.017447, -120.985181], [37.092763, -121.046013], [37.175243, -120.992284], [37.250436, -121.053210], [37.332844, -120.999409], [37.407914, -121.060428]]]]") +add_h3_cli_test(testCliCellsToMultiPolygonArg1 "cellsToMultiPolygon -c \"\\\\`cat ${PROJECT_SOURCE_DIR}/tests/inputfiles/multipolygon_test1.txt\\\\`\"" "[[[[37.784046, -122.427089], [37.772267, -122.434586], [37.761736, -122.425769], [37.762982, -122.409455], [37.752446, -122.400640], [37.753689, -122.384324], [37.765468, -122.376819], [37.776004, -122.385635], [37.774761, -122.401954], [37.785293, -122.410771]]]]") +add_h3_cli_test(testCliCellsToMultiPolygonArg2 "cellsToMultiPolygon -c \"\\\\`cat ${PROJECT_SOURCE_DIR}/tests/inputfiles/multipolygon_test2.txt\\\\`\"" "[[[[37.784046, -122.427089], [37.772267, -122.434586], [37.761736, -122.425769], [37.762982, -122.409455], [37.752446, -122.400640], [37.753689, -122.384324], [37.765468, -122.376819], [37.776004, -122.385635], [37.774761, -122.401954], [37.785293, -122.410771]]], [[[38.231228, -123.642760], [38.229797, -123.658996], [38.218020, -123.666324], [38.207675, -123.657418], [38.209105, -123.641184], [38.220882, -123.633853]]]]") +add_h3_cli_test(testCliCellsToMultiPolygonArg3 "cellsToMultiPolygon -c \"\\\\`cat ${PROJECT_SOURCE_DIR}/tests/inputfiles/multipolygon_test3.txt\\\\`\"" "[[[[37.106073, -122.020493], [37.114176, -121.906636], [37.196816, -121.853848], [37.204791, -121.739761], [37.287359, -121.686742], [37.361955, -121.747972], [37.444452, -121.694882], [37.518923, -121.756207], [37.510841, -121.870623], [37.585130, -121.932045], [37.576863, -122.046394], [37.494361, -122.099157], [37.485965, -122.213273], [37.403391, -122.265803], [37.329215, -122.204381], [37.246571, -122.256843], [37.172270, -122.195515], [37.180556, -122.081726]], [[37.428341, -121.923550], [37.353926, -121.862223], [37.271356, -121.915080], [37.263198, -122.029101], [37.337556, -122.090429], [37.420129, -122.037735]]]]") +add_h3_cli_test(testCliCellsToMultiPolygonArg4 "cellsToMultiPolygon -c \"\\\\`cat ${PROJECT_SOURCE_DIR}/tests/inputfiles/multipolygon_test4.txt\\\\`\"" "[[[[37.114176, -121.906636], [37.196816, -121.853848], [37.204791, -121.739761], [37.287359, -121.686742], [37.361955, -121.747972], [37.444452, -121.694882], [37.518923, -121.756207], [37.510841, -121.870623], [37.585130, -121.932045], [37.576863, -122.046394], [37.494361, -122.099157], [37.485965, -122.213273], [37.403391, -122.265803], [37.329215, -122.204381], [37.246571, -122.256843], [37.172270, -122.195515], [37.180556, -122.081726], [37.106073, -122.020493]], [[37.337556, -122.090429], [37.420129, -122.037735], [37.428341, -121.923550], [37.353926, -121.862223], [37.271356, -121.915080], [37.263198, -122.029101]]], [[[43.431278, -115.975237], [43.508096, -115.912429], [43.581386, -115.974912], [43.577810, -116.100258], [43.500970, -116.162919], [43.427727, -116.100382]]]]") \ No newline at end of file diff --git a/tests/inputfiles/multipolygon_test1.txt b/tests/inputfiles/multipolygon_test1.txt new file mode 100644 index 000000000..e1fd89ca0 --- /dev/null +++ b/tests/inputfiles/multipolygon_test1.txt @@ -0,0 +1 @@ +872830828ffffff,87283082effffff diff --git a/tests/inputfiles/multipolygon_test2.txt b/tests/inputfiles/multipolygon_test2.txt new file mode 100644 index 000000000..88796cfc8 --- /dev/null +++ b/tests/inputfiles/multipolygon_test2.txt @@ -0,0 +1 @@ +872830828ffffff,87283082effffff,872831828ffffff diff --git a/tests/inputfiles/multipolygon_test3.txt b/tests/inputfiles/multipolygon_test3.txt new file mode 100644 index 000000000..b95aff5d9 --- /dev/null +++ b/tests/inputfiles/multipolygon_test3.txt @@ -0,0 +1,8 @@ +[ + "8528340bfffffff", + "85283447fffffff", + "8528347bfffffff", + "85283463fffffff", + "85283477fffffff", + "8528340ffffffff" +] diff --git a/tests/inputfiles/multipolygon_test4.txt b/tests/inputfiles/multipolygon_test4.txt new file mode 100644 index 000000000..5419066a5 --- /dev/null +++ b/tests/inputfiles/multipolygon_test4.txt @@ -0,0 +1,9 @@ +[ + "8528340bfffffff", + "85283447fffffff", + "8528347bfffffff", + "85283463fffffff", + "85283477fffffff", + "8528340ffffffff", + "8528840ffffffff" +] diff --git a/tests/inputfiles/multipolygon_test5.txt b/tests/inputfiles/multipolygon_test5.txt new file mode 100644 index 000000000..90e826f73 --- /dev/null +++ b/tests/inputfiles/multipolygon_test5.txt @@ -0,0 +1,129 @@ +[ + "85283473fffffff", + "85283447fffffff", + "8528347bfffffff", + "85283463fffffff", + "85283477fffffff", + "8528340ffffffff", + "8528340bfffffff", + "85283457fffffff", + "85283443fffffff", + "8528344ffffffff", + "852836b7fffffff", + "8528346bfffffff", + "8528346ffffffff", + "85283467fffffff", + "8528342bfffffff", + "8528343bfffffff", + "85283407fffffff", + "85283403fffffff", + "8528341bfffffff", + "852834cffffffff", + "85283453fffffff", + "8528345bfffffff", + "8528344bfffffff", + "852836b3fffffff", + "852836a3fffffff", + "852836a7fffffff", + "852830d3fffffff", + "852830d7fffffff", + "8528309bfffffff", + "85283093fffffff", + "8528342ffffffff", + "85283423fffffff", + "85283433fffffff", + "852834abfffffff", + "85283417fffffff", + "85283413fffffff", + "852834c7fffffff", + "852834c3fffffff", + "852834cbfffffff", + "8529a927fffffff", + "8529a92ffffffff", + "85283697fffffff", + "85283687fffffff", + "852836bbfffffff", + "852836abfffffff", + "852836affffffff", + "852830dbfffffff", + "852830c3fffffff", + "852830c7fffffff", + "8528308bfffffff", + "85283083fffffff", + "85283097fffffff", + "8528355bfffffff", + "85283427fffffff", + "85283437fffffff", + "852834affffffff", + "852834a3fffffff", + "852834bbfffffff", + "8528348ffffffff", + "8528348bfffffff", + "852834d7fffffff", + "852834d3fffffff", + "852834dbfffffff", + "8529a937fffffff", + "8529a923fffffff", + "8529a92bfffffff", + "85283693fffffff", + "85283683fffffff", + "8528368ffffffff", + "85283617fffffff", + "85283607fffffff", + "85283633fffffff", + "85283637fffffff", + "852830cbfffffff", + "852830cffffffff", + "8528301bfffffff", + "85283013fffffff", + "8528308ffffffff", + "85283087fffffff", + "8528354bfffffff", + "85283543fffffff", + "85283553fffffff", + "852835cbfffffff", + "852835dbfffffff", + "852834a7fffffff", + "852834b7fffffff", + "852834b3fffffff", + "85283487fffffff", + "85283483fffffff", + "8528349bfffffff", + "85291a6ffffffff", + "85291a6bfffffff", + "8529a9a7fffffff", + "8529a9affffffff", + "8529a933fffffff", + "8529a93bfffffff", + "8529a977fffffff", + "8529a967fffffff", + "8528369bfffffff", + "8528368bfffffff", + "85283613fffffff", + "85283603fffffff", + "8528360ffffffff", + "8528363bfffffff", + "85283623fffffff", + "85283627fffffff", + "85283053fffffff", + "85283057fffffff", + "8528300bfffffff", + "85283003fffffff", + "85283017fffffff", + "852830bbfffffff", + "852830b3fffffff", + "8528354ffffffff", + "85283547fffffff", + "85283557fffffff", + "852835cffffffff", + "852835c3fffffff", + "852835d3fffffff", + "85291b6bfffffff", + "85291b7bfffffff", + "85291b4ffffffff", + "85291b4bfffffff", + "85283497fffffff", + "85283493fffffff", + "85291a67fffffff", + "85291a63fffffff" +] \ No newline at end of file From 24b0c6e6b54ba6f3f52ad02f1ad8e59c19c49144 Mon Sep 17 00:00:00 2001 From: David Ellis Date: Mon, 7 Oct 2024 13:23:47 -0500 Subject: [PATCH 04/16] Improve polygon parsing across buffer length barrier --- src/apps/filters/h3.c | 50 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 43 insertions(+), 7 deletions(-) diff --git a/src/apps/filters/h3.c b/src/apps/filters/h3.c index 19474d840..384db05bc 100644 --- a/src/apps/filters/h3.c +++ b/src/apps/filters/h3.c @@ -1205,11 +1205,11 @@ H3Error polygonStringToGeoPolygon(FILE *fp, char *polygonString, int64_t curVert = 0; int64_t curLoop = 0; LatLng *verts = calloc(numVerts, sizeof(LatLng)); - int64_t strPos = 0; + int strPos = 0; while (polygonString[strPos] != 0) { // Load more of the file if we've hit our buffer limit if (strPos == 1500 && fp != 0) { - int res = fread(polygonString, 0, 1500, fp); + int res = fread(polygonString, 1, 1500, fp); strPos = 0; // If we didn't get any data from the file, we're done. if (res == 0) { @@ -1287,11 +1287,47 @@ H3Error polygonStringToGeoPolygon(FILE *fp, char *polygonString, strPos++; continue; } else { - // TODO: We've encountered an unexpected character. This may mean we - // need to read more of the file and put the remainder of this - // buffer as part of the next buffer. Or it could mean that we - // should just skip forward a character and try again. - strPos++; + if (strPos != 0 && fp != 0) { + // Scan the remaining of the current buffer for `0`. If not + // found, then we grab a new chunk and append to the remainder + // of the existing buffer. Otherwise, just skip unknown + // characters. + bool endOfFile = false; + for (int i = strPos; i <= 1500; i++) { + if (polygonString[strPos] == 0) { + endOfFile = true; + break; + } + } + if (endOfFile) { + strPos++; + } else { + // Move the end of this buffer to the beginning + for (int i = strPos; i <= 1500; i++) { + polygonString[i - strPos] = polygonString[strPos]; + } + // Set the string position to the end of the buffer + strPos = 1500 - strPos; + // Grab up to the remaining size of the buffer and fill it + // into the file + int res = + fread(polygonString + strPos, 1, 1500 - strPos, fp); + if (res == 0) { + // If we got nothing new from the file, just treat this + // as a character to skip over and write an explicit 0 + // to the old end. + polygonString[strPos] = 0; + strPos = 1; + continue; + } else { + // If we got something new, reset the position to 0 and + // try again. + strPos = 0; + } + } + } else { + strPos++; + } } } return E_SUCCESS; From c994043244511967d7e09b154e39769864750fbb Mon Sep 17 00:00:00 2001 From: David Ellis Date: Mon, 7 Oct 2024 17:50:23 -0500 Subject: [PATCH 05/16] Actually get polygon file reading working and add the polygon tests --- src/apps/filters/h3.c | 42 +++++++++++++++++------------ tests/cli/maxPolygonToCellsSize.txt | 8 ++++++ tests/cli/polygonToCells.txt | 8 ++++++ tests/inputfiles/polygon_test1.txt | 1 + tests/inputfiles/polygon_test2.txt | 1 + tests/inputfiles/polygon_test3.txt | 1 + 6 files changed, 44 insertions(+), 17 deletions(-) create mode 100644 tests/cli/maxPolygonToCellsSize.txt create mode 100644 tests/cli/polygonToCells.txt create mode 100644 tests/inputfiles/polygon_test1.txt create mode 100644 tests/inputfiles/polygon_test2.txt create mode 100644 tests/inputfiles/polygon_test3.txt diff --git a/src/apps/filters/h3.c b/src/apps/filters/h3.c index 384db05bc..cdab07b10 100644 --- a/src/apps/filters/h3.c +++ b/src/apps/filters/h3.c @@ -1208,7 +1208,7 @@ H3Error polygonStringToGeoPolygon(FILE *fp, char *polygonString, int strPos = 0; while (polygonString[strPos] != 0) { // Load more of the file if we've hit our buffer limit - if (strPos == 1500 && fp != 0) { + if (strPos >= 1500 && fp != 0) { int res = fread(polygonString, 1, 1500, fp); strPos = 0; // If we didn't get any data from the file, we're done. @@ -1260,9 +1260,12 @@ H3Error polygonStringToGeoPolygon(FILE *fp, char *polygonString, // value, then store the lat, lng pair double lat, lng; int count; - int res = sscanf(polygonString + strPos, "%lf%*[, \n]%lf%n", &lat, &lng, - &count); - if (count > 0 && res != 0) { + // Must grab the closing ] or we might accidentally parse a partial + // float across buffer boundaries + char closeBracket[2] = "]"; + int res = sscanf(polygonString + strPos, "%lf%*[, \n]%lf%1[]]%n", &lat, + &lng, &closeBracket[0], &count); + if (count > 0 && res == 3) { verts[curVert].lat = H3_EXPORT(degsToRads)(lat); verts[curVert].lng = H3_EXPORT(degsToRads)(lng); curVert++; @@ -1279,6 +1282,7 @@ H3Error polygonStringToGeoPolygon(FILE *fp, char *polygonString, numVerts *= 2; } strPos += count; + curDepth--; continue; } // Check for whitespace and skip it if we reach this point. @@ -1304,26 +1308,30 @@ H3Error polygonStringToGeoPolygon(FILE *fp, char *polygonString, } else { // Move the end of this buffer to the beginning for (int i = strPos; i <= 1500; i++) { - polygonString[i - strPos] = polygonString[strPos]; + polygonString[i - strPos] = polygonString[i]; } // Set the string position to the end of the buffer strPos = 1500 - strPos; // Grab up to the remaining size of the buffer and fill it // into the file - int res = - fread(polygonString + strPos, 1, 1500 - strPos, fp); + // Did you know that if the amount you want to read from + // the file buffer is larger than the buffer itself, + // fread can choose to give you squat and not the + // remainder of the file as you'd expect from the + // documentation? This was a surprise to me and a + // significant amount of wasted time to figure out how + // to tackle. C leaves *way* too much as undefined + // behavior to be nice to work with... + int64_t i = 0; + int res; + do { + res = fread(polygonString + strPos + i, 1, 1, fp); + i++; + } while (i < 1500 - strPos && res != 0); if (res == 0) { - // If we got nothing new from the file, just treat this - // as a character to skip over and write an explicit 0 - // to the old end. - polygonString[strPos] = 0; - strPos = 1; - continue; - } else { - // If we got something new, reset the position to 0 and - // try again. - strPos = 0; + polygonString[strPos + i - 1] = 0; } + strPos = 0; } } else { strPos++; diff --git a/tests/cli/maxPolygonToCellsSize.txt b/tests/cli/maxPolygonToCellsSize.txt new file mode 100644 index 000000000..f22d76b36 --- /dev/null +++ b/tests/cli/maxPolygonToCellsSize.txt @@ -0,0 +1,8 @@ +add_h3_cli_test(testCliMaxPolygonToCellsSizeFile1 "maxPolygonToCellsSize -r 7 -f ${PROJECT_SOURCE_DIR}/tests/inputfiles/polygon_test1.txt" "100") +add_h3_cli_test(testCliMaxPolygonToCellsSizeFile2 "maxPolygonToCellsSize -r 7 -f ${PROJECT_SOURCE_DIR}/tests/inputfiles/polygon_test2.txt" "23") +add_h3_cli_test(testCliMaxPolygonToCellsSizeFile3 "maxPolygonToCellsSize -r 4 -f ${PROJECT_SOURCE_DIR}/tests/inputfiles/polygon_test3.txt" "3484") +add_h3_cli_test(testCliMaxPolygonToCellsSizeStdin1 "maxPolygonToCellsSize -r 7 -f -- < ${PROJECT_SOURCE_DIR}/tests/inputfiles/polygon_test1.txt" "100") +add_h3_cli_test(testCliMaxPolygonToCellsSizeStdin2 "maxPolygonToCellsSize -r 7 -f -- < ${PROJECT_SOURCE_DIR}/tests/inputfiles/polygon_test2.txt" "23") +add_h3_cli_test(testCliMaxPolygonToCellsSizeStdin3 "maxPolygonToCellsSize -r 4 -f -- < ${PROJECT_SOURCE_DIR}/tests/inputfiles/polygon_test3.txt" "3484") +add_h3_cli_test(testCliMaxPolygonToCellsSizeArg1 "maxPolygonToCellsSize -r 7 -p \"\\\\`cat ${PROJECT_SOURCE_DIR}/tests/inputfiles/polygon_test1.txt\\\\`\"" "100") +add_h3_cli_test(testCliMaxPolygonToCellsSizeArg2 "maxPolygonToCellsSize -r 7 -p \"\\\\`cat ${PROJECT_SOURCE_DIR}/tests/inputfiles/polygon_test2.txt\\\\`\"" "23") \ No newline at end of file diff --git a/tests/cli/polygonToCells.txt b/tests/cli/polygonToCells.txt new file mode 100644 index 000000000..455e8953f --- /dev/null +++ b/tests/cli/polygonToCells.txt @@ -0,0 +1,8 @@ +add_h3_cli_test(testCliPolygonToCellsFile1 "polygonToCells -r 7 -f ${PROJECT_SOURCE_DIR}/tests/inputfiles/polygon_test1.txt | tr -s '\\\\r\\\\n' ',' | tr -s '\\\\n' ','" "87283082bffffff,872830870ffffff,872830820ffffff,87283082effffff,872830828ffffff,87283082affffff,872830876ffffff,") +add_h3_cli_test(testCliPolygonToCellsFile2 "polygonToCells -r 7 -f ${PROJECT_SOURCE_DIR}/tests/inputfiles/polygon_test2.txt | tr -s '\\\\r\\\\n' ',' | tr -s '\\\\n' ','" "872830828ffffff,87283082effffff,") +add_h3_cli_test(testCliPolygonToCellsFile3 "polygonToCells -r 4 -f ${PROJECT_SOURCE_DIR}/tests/inputfiles/polygon_test3.txt | tr -s '\\\\r\\\\n' ',' | tr -s '\\\\n' ','" "84f05a3ffffffff,84e720bffffffff,84e7257ffffffff,84e725bffffffff,") +add_h3_cli_test(testCliPolygonToCellsStdin1 "polygonToCells -r 7 -f -- < ${PROJECT_SOURCE_DIR}/tests/inputfiles/polygon_test1.txt | tr -s '\\\\r\\\\n' ',' | tr -s '\\\\n' ','" "87283082bffffff,872830870ffffff,872830820ffffff,87283082effffff,872830828ffffff,87283082affffff,872830876ffffff,") +add_h3_cli_test(testCliPolygonToCellsStdin2 "polygonToCells -r 7 -f -- < ${PROJECT_SOURCE_DIR}/tests/inputfiles/polygon_test2.txt | tr -s '\\\\r\\\\n' ',' | tr -s '\\\\n' ','" "872830828ffffff,87283082effffff,") +add_h3_cli_test(testCliPolygonToCellsStdin3 "polygonToCells -r 4 -f -- < ${PROJECT_SOURCE_DIR}/tests/inputfiles/polygon_test3.txt | tr -s '\\\\r\\\\n' ',' | tr -s '\\\\n' ','" "84f05a3ffffffff,84e720bffffffff,84e7257ffffffff,84e725bffffffff,") +add_h3_cli_test(testCliPolygonToCellsArg1 "polygonToCells -r 7 -p \"\\\\`cat ${PROJECT_SOURCE_DIR}/tests/inputfiles/polygon_test1.txt\\\\`\" | tr -s '\\\\r\\\\n' ',' | tr -s '\\\\n' ','" "87283082bffffff,872830870ffffff,872830820ffffff,87283082effffff,872830828ffffff,87283082affffff,872830876ffffff,") +add_h3_cli_test(testCliPolygonToCellsArg2 "polygonToCells -r 7 -p \"\\\\`cat ${PROJECT_SOURCE_DIR}/tests/inputfiles/polygon_test2.txt\\\\`\" | tr -s '\\\\r\\\\n' ',' | tr -s '\\\\n' ','" "872830828ffffff,87283082effffff,") \ No newline at end of file diff --git a/tests/inputfiles/polygon_test1.txt b/tests/inputfiles/polygon_test1.txt new file mode 100644 index 000000000..b501b0dbd --- /dev/null +++ b/tests/inputfiles/polygon_test1.txt @@ -0,0 +1 @@ +[[37.813318999983238, -122.4089866999972145],[37.7198061999978478, -122.3544736999993603],[37.8151571999998453, -122.4798767000009008]] diff --git a/tests/inputfiles/polygon_test2.txt b/tests/inputfiles/polygon_test2.txt new file mode 100644 index 000000000..0f6931856 --- /dev/null +++ b/tests/inputfiles/polygon_test2.txt @@ -0,0 +1 @@ +[[[[37.784046, -122.427089], [37.772267, -122.434586], [37.761736, -122.425769], [37.762982, -122.409455], [37.752446, -122.400640], [37.753689, -122.384324], [37.765468, -122.376819], [37.776004, -122.385635], [37.774761, -122.401954], [37.785293, -122.410771]]]] diff --git a/tests/inputfiles/polygon_test3.txt b/tests/inputfiles/polygon_test3.txt new file mode 100644 index 000000000..103c7b2b7 --- /dev/null +++ b/tests/inputfiles/polygon_test3.txt @@ -0,0 +1 @@ +[[[-72.10216675837141,42.02881055787289],[-72.10206675833835,42.02880455787487],[-72.09981175759619,42.02873155793174],[-72.09512675605,42.028505558035576],[-72.09498875600451,42.028499558038746],[-72.09040575449204,42.028279558140476],[-72.08966675424904,42.02825955815985],[-72.08940975416454,42.02825255816659],[-72.08915275407996,42.028244558173135],[-72.08914575407765,42.02824455817335],[-72.08913375407373,42.02824455817373],[-72.08603775305552,42.02815855825446],[-72.08583475298875,42.0281525582597],[-72.08477175263789,42.02810055828309],[-72.08453575256036,42.02809555828955],[-72.08176675165087,42.02803955836576],[-72.07342674889455,42.027570558537484],[-72.07204974844211,42.02754055857496],[-72.07183974837311,42.02753555858058],[-72.06698974677964,42.02743055871266],[-72.06349674563202,42.02735555880787],[-72.06246374529377,42.02735355883991],[-72.05975074440549,42.02734955892428],[-72.05944874430675,42.02735155893413],[-72.05313274224213,42.02740255914211],[-72.05287174215681,42.0274045591507],[-72.05283874214605,42.027405559151916],[-72.0479477405442,42.02739155930264],[-72.04677874016136,42.02738855933873],[-72.04655274008736,42.02738855934582],[-72.04632774001365,42.027387559352675],[-72.04486973953615,42.027383559397634],[-72.04477473950504,42.02738355940062],[-72.04247973875344,42.027377559471425],[-72.0408677382237,42.02734155951504],[-72.03954773778995,42.02731255955082],[-72.03481973623647,42.02721155967959],[-72.03464673617962,42.02720755968425],[-72.03464473617896,42.02720755968431],[-72.03276473556124,42.02716755973553],[-72.02980273458864,42.027115559818355],[-72.02965673454067,42.027112559822356],[-72.02951073449277,42.02711055982654],[-72.02808873402581,42.02708555986628],[-72.02802673400548,42.02708455986803],[-72.02374473259947,42.02701055998793],[-72.02261873223101,42.027013560023775],[-72.01325872916954,42.0270645603267],[-72.01044672824587,42.02701056040436],[-72.0103447282123,42.027007560406965],[-72.01011472813485,42.026969560406854],[-72.01003672810933,42.02696956040929],[-72.00598072677884,42.026924560527576],[-72.00596872677492,42.02692456052796],[-72.00142872529025,42.026955560675994],[-71.99951872466563,42.02696856073825],[-71.99833472427979,42.027000560781445],[-71.99310272256314,42.026936560932796],[-71.9921617222546,42.026928560960684],[-71.98893572119688,42.02690256105657],[-71.98768072078539,42.02689256109388],[-71.98764872077486,42.02689156109469],[-71.98682872050509,42.026868561115904],[-71.97878271785758,42.02663756132297],[-71.97862271780491,42.026632561327006],[-71.97647571710034,42.02660456138872],[-71.97596071693133,42.02659756140347],[-71.97509071664582,42.02658656142853],[-71.97422171636062,42.02657456145339],[-71.97399471628616,42.02657256146008],[-71.97376871621199,42.02656956146657],[-71.97226271571775,42.02654956150976],[-71.97135171541878,42.026537561535925],[-71.97123071537877,42.02653056153836],[-71.96743671412446,42.02631756161588],[-71.96739671411126,42.026315561616734],[-71.96672071388906,42.02630056163498],[-71.963021712674,42.026232561737416],[-71.96134371212213,42.026189561781536],[-71.95982971162417,42.026150561821304],[-71.95876571127418,42.02612256184914],[-71.95866971124264,42.02612056185174],[-71.95857171121042,42.02611856185442],[-71.95844671116933,42.02611556185774],[-71.95832171112824,42.02611256186107],[-71.95794971100597,42.02610456187114],[-71.95646671051888,42.02607856191244],[-71.95621871043745,42.026074561919415],[-71.9560937103964,42.02607256192292],[-71.95538871016521,42.02606656194378],[-71.95524971011963,42.02606556194793],[-71.95445970986056,42.02605856197124],[-71.95441570984615,42.02605856197261],[-71.95428470980313,42.026056561976326],[-71.9521997091126,42.025918562014844],[-71.95207870907272,42.02591356201765],[-71.94655170725838,42.02583456217492],[-71.94649170723861,42.025832562176426],[-71.94453270659254,42.02575156222195],[-71.94442370655656,42.025746562224384],[-71.94413670646192,42.02573456223103],[-71.93991770507233,42.0255925623353],[-71.93930270487037,42.02558256235256],[-71.93790070441005,42.025561562392255],[-71.93789470440811,42.02556156239245],[-71.93692570408804,42.025512562413226],[-71.92885670143522,42.02532856262941],[-71.92571870040358,42.02525756271357],[-71.92094369883367,42.0251485628414],[-71.92078169878037,42.02514456284566],[-71.91911069823074,42.02510156288947],[-71.91697069752674,42.02504556294535],[-71.91311569625859,42.0249455630462],[-71.90318069299035,42.02468856330612],[-71.90286069288507,42.02468056331454],[-71.90101269227816,42.0246505633663],[-71.90076569219686,42.024643563372635],[-71.89554769048004,42.024504563508295],[-71.89135668910112,42.024392563617155],[-71.89078068891155,42.02437656363199],[-71.89033368876571,42.024386563647816],[-71.89020468872361,42.02438956365242],[-71.89015668870795,42.024390563654094],[-71.89007668868186,42.02439256365698],[-71.88994868863992,42.02439256366097],[-71.8898276886003,42.02439256366473],[-71.88970668856066,42.02439256366849],[-71.88946868848271,42.0243925636759],[-71.88802368801154,42.02443056372817],[-71.88797968799722,42.02443156372972],[-71.88440768682035,42.02430856381717],[-71.88409468671938,42.024336563832286],[-71.88380468662575,42.024360563845924],[-71.88330668646023,42.02431756385313],[-71.88306868638111,42.02429656385649],[-71.88283568630557,42.02431056386643],[-71.88264868624528,42.02432756387553],[-71.88217368608947,42.02432356388953],[-71.87959368524322,42.02430256396571],[-71.87738268451801,42.024284564031014],[-71.87727468448291,42.02428956403532],[-71.87443968355174,42.02424356411461],[-71.8729726830778,42.02436156418294],[-71.8714096825588,42.02423556420727],[-71.87118068248276,42.024217564210915],[-71.86598068077409,42.024121564354054],[-71.86591768075347,42.02412156435601],[-71.86191967944387,42.02412156448024],[-71.86090667911203,42.02412156451171],[-71.86039867894564,42.02412156452748],[-71.85932367859351,42.024121564560886],[-71.85499067717213,42.024085564688555],[-71.853852676799,42.024079564722726],[-71.85335467663559,42.02407456473724],[-71.8525536763728,42.02406756476077],[-71.85077267578849,42.02405156481299],[-71.8507026757655,42.02405056481497],[-71.8498216754765,42.02404356484097],[-71.84572667413322,42.02401056496176],[-71.84571767413026,42.02401056496204],[-71.84561767409745,42.02400956496494],[-71.84559567409026,42.024009564965645],[-71.84430167366524,42.02398956500195],[-71.84413867361167,42.02398656500643],[-71.84397567355816,42.023984565011105],[-71.84284567318704,42.0239675650429],[-71.84256767309576,42.023963565050764],[-71.8416476727937,42.023951565077006],[-71.84164667279337,42.02395156507704],[-71.8403156723569,42.02394356511682],[-71.83928167201789,42.02393856514795],[-71.83925067200772,42.0239385651489],[-71.83786767155422,42.02393056519028],[-71.83761467147129,42.023929565197946],[-71.83760367146768,42.02392956519828],[-71.83746767142314,42.0239295652025],[-71.83575067086151,42.023945565258856],[-71.8357236708527,42.023945565259694],[-71.83535567073122,42.02392956526804],[-71.83458767047782,42.0238965652855],[-71.8345226704564,42.023894565287144],[-71.8334166700918,42.023853565313566],[-71.83340467008784,42.02385356531394],[-71.83332267006088,42.023851565316086],[-71.83230766972736,42.023833565344106],[-71.83229966972473,42.02383356534435],[-71.83223466970345,42.02383356534637],[-71.8308596692539,42.023849565392105],[-71.83063766918048,42.02383756539669],[-71.83056366915602,42.023833565398206],[-71.83055666915374,42.02383356539841],[-71.82848966847487,42.023803565456774],[-71.82732266809157,42.023785565489504],[-71.82721966805774,42.02378356549231],[-71.8238676669561,42.02372156558432],[-71.82324366675519,42.023784565615806],[-71.82121466608885,42.023755565673135],[-71.80865166196268,42.02357156602709],[-71.80466666065384,42.02351356613937],[-71.80258665997152,42.023498566200914],[-71.80255965996268,42.02349856620176],[-71.80254565995814,42.02349956620238],[-71.80064965934129,42.023577566276145],[-71.80028165913242,42.021992565982245],[-71.8002806591315,42.021981565980155],[-71.80028165913177,42.02198056597992],[-71.79989865864611,42.01551356474602],[-71.79989365864134,42.01545756473539],[-71.7998926586408,42.01545356473464],[-71.7998026585635,42.014594564571944],[-71.7997586585254,42.014169564491446],[-71.79956265835696,42.01229756413683],[-71.799242658017,42.00807356333288],[-71.79919565778751,42.00422656259301],[-71.7991936577828,42.00415356257901],[-71.79919265777723,42.004059562560926],[-71.7991086575297,42.00010556180152],[-71.7989966572586,41.99589156099279],[-71.79881565682193,41.989105559690266],[-71.7987636565853,41.98515555893034],[-71.7987636565839,41.985130558925505],[-71.79876365658217,41.98509955891954],[-71.7987366564565,41.98299755851508],[-71.79869265629337,41.98032155800044],[-71.79864665609247,41.97697755735703],[-71.7986466560893,41.97692055734605],[-71.7986466560868,41.976875557337365],[-71.79857965578893,41.971908556381514],[-71.79854965569727,41.97043555609834],[-71.79854865569517,41.970403556092194],[-71.79854565568704,41.970274556067395],[-71.79841065527879,41.96371955480715],[-71.79837965522617,41.96295455466052],[-71.7983596551914,41.96244655456316],[-71.79834265516169,41.96201155447976],[-71.79832965513928,41.96168455441707],[-71.79832865513791,41.96166555441344],[-71.79832865513708,41.96165055441055],[-71.79831365510972,41.96124655433306],[-71.79831265510806,41.96122255432848],[-71.79830565509512,41.961030554291646],[-71.79830365509167,41.96098055428206],[-71.79830265506959,41.96058855420646],[-71.79830265506754,41.96055155419932],[-71.79829965496687,41.95875555385292],[-71.79829965496654,41.95874955385174],[-71.79829865490397,41.957628553635494],[-71.79825165482742,41.95652655342432],[-71.79822265478074,41.95585655329595],[-71.79820065474624,41.9553645532017],[-71.79818865466012,41.953883552916295],[-71.79816865465295,41.953872552914795],[-71.79809965462758,41.953822552907276],[-71.79806865461279,41.953738552892034],[-71.79805865448384,41.95147355245527],[-71.79805565434063,41.94891055196075],[-71.79812665436144,41.948866551950076],[-71.79808965424935,41.94706455160345],[-71.79807565421659,41.94655655150583],[-71.79807465421406,41.946516551498156],[-71.79803865412299,41.94508755122346],[-71.79803865412228,41.94507455122094],[-71.798015653929,41.94172555057525],[-71.79801465392573,41.941672550565045],[-71.79801465392369,41.94163555055791],[-71.79801465391954,41.94156055054344],[-71.79800565388621,41.94101255043793],[-71.79793665360478,41.936344549538966],[-71.79793565360247,41.93630854953205],[-71.79793565360086,41.93627954952645],[-71.79792665356392,41.93566654940838],[-71.79792465355534,41.93552354938083],[-71.79792265354803,41.935403549357744],[-71.79791065347315,41.934123549111],[-71.79791065342333,41.93322454893745],[-71.79791065341871,41.93314154892142],[-71.79789765338586,41.93262554882221],[-71.79789465337086,41.932372548773444],[-71.79789365336232,41.932224548744884],[-71.79789365336188,41.93221654874335],[-71.797892653358,41.93215254873103],[-71.79789165334763,41.931971548696104],[-71.79788665331263,41.93136954858003],[-71.79788365329226,41.93101954851256],[-71.79777465312036,41.92856154804132],[-71.79773265305336,41.92760054785706],[-71.7977266530433,41.92745454782906],[-71.7977256530412,41.92742254782292],[-71.7975476527593,41.92338654704905],[-71.79746265258547,41.92075054654259],[-71.79735565236783,41.91745354590914],[-71.79730065232047,41.91692354580848],[-71.79729965231881,41.916899545803865],[-71.7972686522817,41.916412545710756],[-71.79726565227661,41.91633854569657],[-71.79726265227104,41.91625554568063],[-71.79726165226988,41.91624054567775],[-71.79711265200993,41.91242654494565],[-71.79710565199728,41.91223954490974],[-71.7971056519959,41.912214544904906],[-71.79702465185427,41.9101355445058],[-71.79690065163491,41.906905543885635],[-71.79682865147568,41.90445454341431],[-71.79675665131428,41.90196354293525],[-71.79671165121441,41.90042454263926],[-71.79669865118275,41.89992954254401],[-71.7966956511763,41.89983054252498],[-71.79668365114775,41.899385542439354],[-71.79657365099104,41.897203542021096],[-71.7965666509857,41.897148542010676],[-71.79655565097801,41.89707454199671],[-71.79656365097514,41.89697554197733],[-71.79652265086887,41.89529654165414],[-71.79652065086621,41.89526054164725],[-71.79643465064271,41.8917285409673],[-71.79619165025476,41.88615053989664],[-71.79595664987274,41.8806305388368],[-71.79586364968017,41.87769653827241],[-71.79574464949808,41.875105537775106],[-71.79542864903678,41.868626536531984],[-71.79540864900669,41.868200536450225],[-71.7954046490008,41.868117536434305],[-71.79535664893082,41.86713453624568],[-71.79535364892695,41.86708253623571],[-71.7953236488835,41.866473536118875],[-71.79531664887323,41.866328536091025],[-71.79528964883407,41.86577953598568],[-71.79528764883214,41.865756535981305],[-71.79528664882987,41.86572153597455],[-71.7949666484082,41.85998053487401],[-71.79494164837259,41.85948353477864],[-71.79493364836219,41.859342534751626],[-71.79491464833565,41.858974534681025],[-71.79491164833159,41.85891853467029],[-71.79490664832414,41.85881353465013],[-71.7946806480076,41.85441753380669],[-71.79452464773689,41.850436533041304],[-71.79448064766015,41.849306532824016],[-71.79447764765548,41.84923953281114],[-71.79447464765052,41.84916753279732],[-71.79447164764564,41.849096532783655],[-71.79446364763163,41.848890532744036],[-71.7942376472351,41.843041531619214],[-71.79422964722106,41.84283453157939],[-71.79417964713923,41.84164753135125],[-71.79417764713455,41.84157453133717],[-71.79417364712498,41.84142453130826],[-71.7941216470907,41.84111153124928],[-71.79411564708117,41.84097453122297],[-71.79412164706488,41.840643531158726],[-71.79413464703457,41.84001653103697],[-71.79411764702279,41.83990353101563],[-71.79407764697964,41.8393585309114],[-71.7937966465285,41.83284252965885],[-71.79379064651927,41.83271052963349],[-71.79368964637514,41.83069452924636],[-71.79361564626882,41.8292045289602],[-71.79353264615294,41.82759452865106],[-71.7934786460738,41.82647852843668],[-71.79344064601545,41.82564552827658],[-71.79334364583526,41.82295052775778],[-71.79331064576157,41.82180852753769],[-71.7933156457616,41.82177952753191],[-71.79330264574611,41.82157552749282],[-71.79329664573392,41.821389527456994],[-71.79328464572315,41.82126552743334],[-71.79326564568295,41.82064852731447],[-71.79316164545777,41.817177526645544],[-71.79316064545678,41.817165526643244],[-71.79314464540889,41.816390526493656],[-71.79314364540673,41.8163575264873],[-71.7931016453122,41.81489052620452],[-71.7930976453025,41.814737526175],[-71.79311464530413,41.81466652616073],[-71.79312764530536,41.81461152614967],[-71.7928946451145,41.81252952575363],[-71.79286764502095,41.810990525456404],[-71.79285564499875,41.81065852539247],[-71.79280064490608,41.80930152513134],[-71.7928046449027,41.80921652511475],[-71.79259364454794,41.804024524115555],[-71.792364644255,41.80006152335487],[-71.79236064425012,41.7999965233424],[-71.79213564393649,41.79563252250382],[-71.79212464392046,41.79540652246039],[-71.79207964388836,41.79509052240055],[-71.79207964388803,41.79508452239937],[-71.79207664388616,41.795068522396356],[-71.79207064387562,41.794912522366324],[-71.79205864385453,41.79460052230625],[-71.79200664376313,41.793247522045675],[-71.79191964359586,41.79072352155927],[-71.79191164358033,41.79048852151398],[-71.79193664354938,41.78977652137523],[-71.7919406435422,41.78962252134528],[-71.79192764352125,41.78931852128676],[-71.79192164350971,41.78914452125323],[-71.7915736429643,41.78129251974214],[-71.79147764282921,41.779405519379345],[-71.79137264268118,41.777336518981514],[-71.79137064267877,41.77730451897538],[-71.79125464248706,41.774505518436335],[-71.79106664218968,41.770210517609435],[-71.79106664218848,41.77018851760518],[-71.79064764115587,41.75387451445437],[-71.79063364112189,41.75333851435083],[-71.79055464091978,41.75012551373001],[-71.79032764072302,41.74789151330362],[-71.79032364071672,41.74780051328608],[-71.79031464070061,41.747560513239804],[-71.79019564048932,41.74441751263371],[-71.79015064041077,41.743253512409254],[-71.79013464038184,41.74282151232592],[-71.7901176403509,41.74235851223661],[-71.79007064033176,41.74228951222467],[-71.79008964026723,41.74099951197379],[-71.79009464024918,41.74064051190398],[-71.79007164021579,41.74016851181311],[-71.79005564018995,41.739792511740646],[-71.7900166401274,41.73888451156565],[-71.78990263991679,41.735722510955576],[-71.7898716398532,41.734747510767306],[-71.7898616398329,41.734436510707276],[-71.78976863964509,41.731564510152765],[-71.78972963940805,41.72747150935954],[-71.78971163939073,41.72726250931952],[-71.78970963935929,41.72670050921052],[-71.78970363924067,41.72457150879744],[-71.78967563918754,41.723768508642415],[-71.78959263902861,41.72136250817791],[-71.78956563897584,41.72056050802306],[-71.78956363897214,41.72050450801225],[-71.78955763896109,41.7203385079802],[-71.78953463891726,41.719675507852195],[-71.78952763890287,41.71945450780951],[-71.78947663880382,41.717950507519085],[-71.78932363850687,41.71344050664814],[-71.78927463841174,41.71199550636908],[-71.78927263840792,41.71193750635786],[-71.78924463835541,41.711145506204936],[-71.78916363819894,41.70877050574623],[-71.78913663814683,41.70797950559344],[-71.78912863813073,41.70773350554592],[-71.78912863813046,41.70772850554494],[-71.7890636381038,41.70762950552771],[-71.78907063810237,41.7075615055143],[-71.78907863810105,41.70748950550008],[-71.78911763810936,41.707408505483144],[-71.78906963801508,41.705972505205764],[-71.7890326379458,41.704927505003944],[-71.78892363773865,41.701792504398405],[-71.78888763766972,41.70074750419653],[-71.78880463751112,41.69834450373233],[-71.78871863733852,41.69570250322177],[-71.78871563733227,41.695606503203216],[-71.78871463732993,41.695569503196054],[-71.78869263728893,41.694951503076666],[-71.78868563727528,41.6947435030365],[-71.78866363723299,41.69410150291243],[-71.7885986371064,41.692175502540266],[-71.78857963706876,41.69160050242914],[-71.7885776370645,41.69153450241638],[-71.78857563706127,41.69148750240732],[-71.78854063699433,41.69047250221119],[-71.7884326367849,41.68728750159569],[-71.78839763671547,41.6862265013906],[-71.78838163668563,41.685776501303664],[-71.78834663661608,41.684713501098194],[-71.78833663659731,41.68442950104331],[-71.78832163656787,41.683980500956515],[-71.78822563638178,41.68114950040933],[-71.7879386358239,41.67265549876732],[-71.7878436356383,41.66982549822014],[-71.78784263563672,41.6698024982157],[-71.78781063558955,41.669130498086055],[-71.7877126354438,41.66704749768412],[-71.78768263539801,41.666388497556945],[-71.78768163539664,41.66636949755328],[-71.78768063539545,41.66635349755019],[-71.78764363533804,41.66552349738997],[-71.78753463516647,41.663033496909236],[-71.78749863510947,41.662204496749155],[-71.78744463502484,41.660977496512245],[-71.78743063500286,41.66065849645065],[-71.78728863477306,41.657298495801676],[-71.78723963469271,41.65611949557393],[-71.7872476346928,41.65607349556473],[-71.78730763458309,41.653703495102015],[-71.7874886342543,41.64659349371366],[-71.78754163415887,41.64452649330999],[-71.78754963414501,41.644224493251],[-71.78756163412083,41.643709493150446],[-71.78760163404975,41.64216649284907],[-71.78761463402596,41.6416524927487],[-71.78762163401332,41.641378492695175],[-71.78763863398288,41.64071849256627],[-71.78764263397534,41.64055649253462],[-71.7876496339627,41.640282492481106],[-71.78765163396035,41.640227492470345],[-71.78765163395941,41.64021049246703],[-71.78765663394944,41.63999749242545],[-71.78765863394621,41.63992649241158],[-71.78767163392892,41.63953149233433],[-71.78771263387782,41.638348492102935],[-71.7877266338609,41.63795449202585],[-71.78773163385327,41.637784491992626],[-71.78774863383106,41.637275491893064],[-71.78775563382413,41.637106491859974],[-71.78776063381699,41.63694549182851],[-71.78777763379632,41.636464491734394],[-71.78778363378954,41.636304491703086],[-71.78779563377333,41.635934491630735],[-71.78779863376904,41.63583849161197],[-71.78783463372571,41.63482749141416],[-71.78784363371561,41.63458849136739],[-71.7878466337095,41.634458491341995],[-71.7878646336786,41.633783491210124],[-71.78787363366264,41.63343749114253],[-71.78792263357985,41.631624490788255],[-71.78795663352288,41.63037549054419],[-71.78798463347643,41.629355490344835],[-71.78798663347338,41.62928749033154],[-71.78798863347038,41.629220490318446],[-71.78799063346682,41.629143490303406],[-71.78799363346367,41.62906749028853],[-71.78799763345712,41.628923490260384],[-71.7880366333926,41.62750548998325],[-71.78810863327243,41.62486848946786],[-71.78812763324206,41.62419748933671],[-71.78814463321304,41.62356248921259],[-71.78819563312601,41.62165948884066],[-71.78821363309734,41.621025488716704],[-71.7882166330961,41.62098448870863],[-71.78829163302515,41.61923248836534],[-71.78837663294719,41.617291487984915],[-71.78855463281825,41.61385648731081],[-71.7886476327511,41.612065486959295],[-71.78866663273567,41.611668486881435],[-71.78866963273448,41.611628486873556],[-71.78872363268954,41.61047948664821],[-71.7887426326742,41.61008348657053],[-71.78876163265808,41.609673486490124],[-71.78877663264593,41.609360486428734],[-71.78880363262269,41.60877148631322],[-71.78885363258186,41.60772148610727],[-71.78885663257994,41.607668486096856],[-71.78890263257624,41.60732448602848],[-71.78899463247107,41.60484048554201],[-71.78904463241604,41.60352948528519],[-71.78908463235646,41.60219448502401],[-71.78920663217835,41.59818948424037],[-71.78924763211916,41.59685548397931],[-71.7892916321061,41.596351483879815],[-71.78941763207015,41.59493448359998],[-71.78942463206732,41.59484048358146],[-71.7894626320523,41.59433648348213],[-71.78948063203404,41.5938924833951],[-71.78950163201472,41.593411483300784],[-71.78953663197997,41.59256248313435],[-71.78955563196207,41.592119483047476],[-71.78957563194267,41.591642482953965],[-71.78960263191678,41.59100448282886],[-71.78963563188442,41.59021148267338],[-71.7896566318654,41.589735482580025],[-71.78968863183532,41.58899048243393],[-71.7897066318201,41.58860248235781],[-71.78970863181873,41.58856548235053],[-71.78978863174648,41.586756481995685],[-71.7898216317168,41.58601248184974],[-71.78984563169423,41.5854534817401],[-71.78986763167534,41.58497348164593],[-71.78987963166402,41.584693481591025],[-71.78990563164031,41.58410148147488],[-71.78991963162737,41.58377948141174],[-71.78993763161122,41.58337448133228],[-71.7899446316052,41.58322148130225],[-71.78995263159818,41.583044481267535],[-71.78997563157694,41.58251548116376],[-71.7899846315703,41.582339481129196],[-71.78998663156813,41.582287481119],[-71.78999263156155,41.58213048108823],[-71.78999563155976,41.5820794810782],[-71.79000063155495,41.581960481054864],[-71.79004363151601,41.580986480863785],[-71.7901216314463,41.57923548052024],[-71.79018763138484,41.57770848022069],[-71.79021963135555,41.576977480077275],[-71.79022763134834,41.57679648004177],[-71.79023563134115,41.576616480006464],[-71.79027463130454,41.57570847982834],[-71.79030063128107,41.575120479712965],[-71.79036463122067,41.57362447941948],[-71.79039163119471,41.572984479293936],[-71.79039663119009,41.57286947927138],[-71.79042863115943,41.572113479123075],[-71.79043063115816,41.572077479116],[-71.79043063115724,41.57206047911268],[-71.79043163115483,41.57201047910291],[-71.79043263115429,41.57199447909976],[-71.79043263115287,41.57196847909469],[-71.79043463114934,41.57189147907963],[-71.79043663114865,41.5718664790747],[-71.79043763114755,41.5718404790696],[-71.79044263113985,41.57166847903592],[-71.79045263112637,41.571360478975606],[-71.7904606311136,41.57107747892021],[-71.79046763110517,41.570880478881605],[-71.79047263109585,41.570678478842076],[-71.79049063106895,41.570075478724014],[-71.7904956310625,41.56992647869482],[-71.7904986310607,41.56987547868478],[-71.79053763103454,41.56915947854405],[-71.79065663095675,41.567012478121974],[-71.79069663093097,41.56629747798138],[-71.79069163092679,41.56625047797239],[-71.79068263091878,41.566157477954526],[-71.79067763091471,41.56611247794591],[-71.79067263091058,41.56606647793711],[-71.79069363089721,41.56569447786397],[-71.79076063085851,41.56457947764459],[-71.79078363084588,41.56420847757157],[-71.79077763083703,41.564081477547],[-71.79079863082086,41.563657477463714],[-71.79081363081065,41.56337947740907],[-71.79088463078195,41.56242447722074],[-71.79093663077634,41.562008477138065],[-71.79095663077435,41.56185147710684],[-71.79097863076566,41.56155947704926],[-71.79097263075828,41.56145947702995],[-71.79098363070457,41.560404476823955],[-71.79102063054479,41.55723947620586],[-71.79103363049182,41.55618547599996],[-71.79104563047446,41.555793475923174],[-71.79108363042307,41.55461847569294],[-71.79109663040609,41.55422747561631],[-71.79110463039565,41.553987475569265],[-71.79111863037825,41.553582475489875],[-71.7911296303648,41.55326847542833],[-71.79113863035478,41.55302947538146],[-71.79114663034434,41.5527894753344],[-71.79117363031408,41.5520694751932],[-71.79118263030402,41.551830475146346],[-71.79118663029865,41.551707475122235],[-71.79119263029182,41.55154547509045],[-71.79119963028293,41.551339475050064],[-71.79120463027795,41.55121747502614],[-71.79122163025787,41.55074547493359],[-71.79127663019904,41.549330474655996],[-71.79129463017934,41.5488594745636],[-71.79131863015357,41.54824047444219],[-71.79139163007667,41.54638447407803],[-71.7914166300513,41.54576647395677],[-71.79142063004605,41.54564547393303],[-71.79143563003142,41.54528547386237],[-71.79144063002653,41.54516547383881],[-71.79158362987377,41.54148947311756],[-71.79165362980102,41.53972747277177],[-71.79193662954567,41.53331647151264],[-71.79205362942926,41.53046547095291],[-71.79220662928,41.526791470231466],[-71.79224862924454,41.52588447005322],[-71.79237362914283,41.523255469536444],[-71.7923756291386,41.52316546951884],[-71.7924056290993,41.522259469341144],[-71.79244562904466,41.521010469096204],[-71.79248562899106,41.51978046885496],[-71.79255062893911,41.51843046858955],[-71.79260662889443,41.517268468361074],[-71.79266762884676,41.51602146811588],[-71.79276162877261,41.51408646773536],[-71.79276662876737,41.51395946771042],[-71.79298962856598,41.50889846671583],[-71.79299462856149,41.50878546669361],[-71.7930466285236,41.507772466494295],[-71.7931506284483,41.505755466097405],[-71.79316062844924,41.50571246608871],[-71.79322262845513,41.50544746603508],[-71.79322462845327,41.50540146602603],[-71.79326662841316,41.504407465830724],[-71.79335862832689,41.50225946540858],[-71.79341662827579,41.500966465154384],[-71.79343962825655,41.50047246505725],[-71.79350262820614,41.49916146479937],[-71.79353362818124,41.4985144646721],[-71.79362862810727,41.496575464290615],[-71.79366062808276,41.495929464163495],[-71.7936986280524,41.4951394640081],[-71.79377562799237,41.493566463698585],[-71.79381462796209,41.49277146354216],[-71.79385362793211,41.491982463386904],[-71.7939636278468,41.48974246294612],[-71.79400762781137,41.488822462765114],[-71.79401862780263,41.48859446272025],[-71.79405262777671,41.48791046258564],[-71.79453862747204,41.479346460898114],[-71.79467962738376,41.476863460408794],[-71.79471762735965,41.47618846027576],[-71.79477862732078,41.47510146006155],[-71.79496362720494,41.47184245941922],[-71.79502562716647,41.47075645920514],[-71.79510362711828,41.46939445893665],[-71.79533762697379,41.46530845813111],[-71.79541562692562,41.4639464578626],[-71.7954616268979,41.46315545770661],[-71.79560062681502,41.460782457238636],[-71.79564762678767,41.45999245708281],[-71.79584062671415,41.45746645658325],[-71.79629662654195,41.451524455407906],[-71.79636362647545,41.44988845508607],[-71.79638862644985,41.44926345496312],[-71.79646862637308,41.44735845458829],[-71.79650362633845,41.44650545442046],[-71.7966096262349,41.44394645391693],[-71.79664562620063,41.44309445374926],[-71.79664962619552,41.44297545372587],[-71.79666462618124,41.44262045365599],[-71.79666962617651,41.442502453632784],[-71.79667062617575,41.44248245362882],[-71.79667162617399,41.442443453621166],[-71.79667862616682,41.442268453586756],[-71.79668162616466,41.44221045357531],[-71.79668462616095,41.44212345355822],[-71.79669562615065,41.44186645350763],[-71.79669962614733,41.4417804534907],[-71.79669962614598,41.44175545348582],[-71.7967026261429,41.441680453471065],[-71.79670362614192,41.44165645346633],[-71.79670862613672,41.44152945344135],[-71.79672462612159,41.44115245336715],[-71.79673062611674,41.44102645334233],[-71.79673062611616,41.44101545334017],[-71.79673162611469,41.44098245333369],[-71.79673262611446,41.44097245333172],[-71.7967376261093,41.44084645330691],[-71.79675262609402,41.44047245323334],[-71.79675862608923,41.44034745320872],[-71.79675962608717,41.44030345320008],[-71.79676562608232,41.44017745317526],[-71.79676562608216,41.44017445317467],[-71.79676762608057,41.440132453166406],[-71.79677862606883,41.439848453110514],[-71.79681362603425,41.438996452942874],[-71.79682562602291,41.438713452887164],[-71.79687262597788,41.43759545266712],[-71.79688062596469,41.437302452609586],[-71.79690262592815,41.43649245245052],[-71.7969106259128,41.436159452385155],[-71.79693862586814,41.43516245218933],[-71.79694862585349,41.4348304521241],[-71.79697162581432,41.433965451954265],[-71.79697962580323,41.43371145190435],[-71.79707662570867,41.43137245144394],[-71.7971126256738,41.43050845127389],[-71.79714762564092,41.42968745111225],[-71.79725362554282,41.42722745062787],[-71.79728662551281,41.42647145047899],[-71.79728762550967,41.42640745046644],[-71.79728762550843,41.426384450461946],[-71.79729662550183,41.42620745042704],[-71.79732662547941,41.425610450309364],[-71.79733762547228,41.4254114502701],[-71.79734962546237,41.42515545021966],[-71.79736062545366,41.42492745017472],[-71.79736162545271,41.42490345016999],[-71.79738062543818,41.424519450094316],[-71.79738662543319,41.424390450068906],[-71.79739862542336,41.42413545001865],[-71.79746262537175,41.4227914497538],[-71.79765562521729,41.41875944895915],[-71.79771662516974,41.417508448712546],[-71.7977206251661,41.41741644869442],[-71.79772362516317,41.417344448680254],[-71.79773862515093,41.417026448617584],[-71.79774262514825,41.41695244860299],[-71.79774462514706,41.41691844859626],[-71.79774762514394,41.416842448581306],[-71.79774562513752,41.41673544856042],[-71.79812062525691,41.41668244853861],[-71.79839162533302,41.41645544848591],[-71.79926862559324,41.415979448366],[-71.79951362566592,41.4158464483325],[-71.79985262577185,41.41576144830552],[-71.80023662589186,41.415665448275014],[-71.80073962604914,41.41554144823537],[-71.80143962627795,41.41555344821636],[-71.80169362636614,41.41565344822815],[-71.8017266263776,41.415666448229686],[-71.802065626504,41.415961448277045],[-71.80208362651796,41.416111448305834],[-71.80249762667232,41.41647144836363],[-71.80290762683201,41.41695444844559],[-71.80325362696426,41.41731544850565],[-71.80368462711127,41.417436448516156],[-71.80434862732129,41.41731744847259],[-71.80517762758208,41.41714244841303],[-71.80581062777424,41.41687944834223],[-71.80588162779577,41.41684944833419],[-71.80589562780006,41.416844448332775],[-71.80610862786739,41.41680544831865],[-71.8061856278918,41.41679244831375],[-71.80681262809019,41.41668144827288],[-71.80696062814144,41.416737448279314],[-71.80723762823742,41.41684244829138],[-71.807754628425,41.41719644834484],[-71.80805262853289,41.41739544837467],[-71.80857662871195,41.417548448388594],[-71.80908762889068,41.4177744484172],[-71.80921262893446,41.41783044842432],[-71.80979162914012,41.418144448468034],[-71.81050062939201,41.41852944852169],[-71.81073762947497,41.41863544853519],[-71.81145462972611,41.41895844857646],[-71.81215062996719,41.41922144860664],[-71.81290063022195,41.41941244862109],[-71.81379863051546,41.419427448596565],[-71.81400463058284,41.41943144859104],[-71.81486363086618,41.419493448576915],[-71.81488963087477,41.419495448576505],[-71.81495363089634,41.4195084485771],[-71.8152246309878,41.41956644858015],[-71.81527363100436,41.41957744858082],[-71.81531563101844,41.419584448580906],[-71.81612063128844,41.419725448583876],[-71.81641163138751,41.41980344859022],[-71.81690463155532,41.41993544860099],[-71.81808863193723,41.419860448550104],[-71.819389632348,41.4196144484622],[-71.81971663245038,41.41953644843695],[-71.82033063264265,41.41939044838962],[-71.82070663274841,41.419079448317284],[-71.82077363276724,41.41902344830428],[-71.82097463282369,41.41885544826527],[-71.82104263284288,41.41880044825243],[-71.8217656330492,41.41825644812391],[-71.82276763335484,41.41786844801737],[-71.82336963353272,41.41752844793244],[-71.823418633546,41.41747844792116],[-71.82373163363786,41.41729044787483],[-71.82387363367778,41.4171724478474],[-71.82398163370564,41.41703644781749],[-71.82414663374519,41.41677244776079],[-71.8242736337592,41.41626544765774],[-71.82430463374642,41.41584144757383],[-71.82438463375243,41.41546944749862],[-71.82457363380185,41.41524344744863],[-71.82492063390013,41.41496944738441],[-71.8253846340366,41.414695447316625],[-71.82593663421159,41.41460444728193],[-71.82612863427251,41.41457344726999],[-71.82721863462383,41.414500447222366],[-71.82790263483825,41.41434244717054],[-71.8292886352602,41.41379044702017],[-71.83062863566444,41.4131884468614],[-71.83141263589908,41.41280144676171],[-71.83184363603021,41.41262844671466],[-71.83341663650651,41.4119544465347],[-71.83410763671208,41.41159044644234],[-71.83456063686036,41.41160244643083],[-71.83465863689246,41.41160544642842],[-71.83498663701037,41.41180944645829],[-71.83523863710033,41.41195444647895],[-71.83567163725338,41.41217544650894],[-71.83579763729796,41.412240446517806],[-71.8363856374897,41.41224244650021],[-71.83688363765168,41.41223644648379],[-71.83789063799365,41.412491446502855],[-71.83925863843449,41.4123984464428],[-71.8393986384772,41.412344446427944],[-71.8396976385685,41.41223044639651],[-71.84038863875902,41.41158844624975],[-71.8404406387734,41.41154044623878],[-71.84054863880552,41.411483446224324],[-71.84106363895891,41.41121644615632],[-71.84123563901018,41.41112744613363],[-71.84163263912838,41.410920446081],[-71.84177163916974,41.41084744606246],[-71.84202963924665,41.41071444602855],[-71.84242663935196,41.41026844592914],[-71.84262763939029,41.40976544582458],[-71.84260763937557,41.409613445795465],[-71.84257663935288,41.40938044575082],[-71.8424996392954,41.408780445635784],[-71.84249663929376,41.40876844563352],[-71.84249063928992,41.40873344562687],[-71.84248863928867,41.40872244562477],[-71.84235263921033,41.40809244550567],[-71.84244663922725,41.407838445453095],[-71.84293563934996,41.40715944530528],[-71.84322963939339,41.40618944510649],[-71.84337663942559,41.40589844504506],[-71.84359163946549,41.405339444929105],[-71.84346063941386,41.40517444490082],[-71.84325663930933,41.40446944476911],[-71.84280063914302,41.404141444718896],[-71.84232763897194,41.403827444671926],[-71.8423266389715,41.403825444671575],[-71.84219663892087,41.40367244464562],[-71.84173963875051,41.40327544458191],[-71.84172663874486,41.40324944457723],[-71.84155363867796,41.403054444544345],[-71.84150663864241,41.40267944447241],[-71.84138063853487,41.40144744423518],[-71.84121963842652,41.40041244403756],[-71.84106863833705,41.3996664438962],[-71.84115063834068,41.39923844380995],[-71.84195663851732,41.397644443473325],[-71.84200463852541,41.39750444344446],[-71.8422446385703,41.39688744331636],[-71.84225763853587,41.39617044317565],[-71.84221163849979,41.39577944310053],[-71.84220963847804,41.39538844302405],[-71.84219863847352,41.39537144302107],[-71.8417226382786,41.39463344289119],[-71.84141463816906,41.39446344286734],[-71.84137263815413,41.39444044286413],[-71.84112463805914,41.39417744282023],[-71.8410426380281,41.39409744280709],[-71.84103463802505,41.394089442805765],[-71.84099163800798,41.394032442795925],[-71.84096863799941,41.39401244279272],[-71.8406086378615,41.39363044272896],[-71.83998763760862,41.392694442564746],[-71.83962363746208,41.3921764424745],[-71.83874963711719,41.391062442283186],[-71.83817063690374,41.39060344221105],[-71.8381186368846,41.390562442204605],[-71.83671663640489,41.390138442164485],[-71.83605763618034,41.389956442149014],[-71.83570863606143,41.3898604421409],[-71.83538463594564,41.38967144211382],[-71.8353486359328,41.38965044211079],[-71.83524063589421,41.38958744210177],[-71.83520463588133,41.38956644209877],[-71.83455763565019,41.38918944204475],[-71.83433263556608,41.38898944201248],[-71.83367563532045,41.38840444191805],[-71.83313063511284,41.38784744182569],[-71.83265563492124,41.38716444170649],[-71.832600634868,41.38650944157995],[-71.83259163485882,41.3863934415575],[-71.83266663486444,41.386044441486895],[-71.83287263490261,41.385507441375466],[-71.83288263490437,41.38547944136968],[-71.83291363491016,41.385399441353066],[-71.83292463491227,41.38537244134745],[-71.83295863491855,41.385283441328994],[-71.83295563491663,41.38526544132555],[-71.8329706349207,41.38525044132216],[-71.83316663495702,41.38473944121611],[-71.83339563498309,41.38383844103272],[-71.83344963497584,41.383377440940805],[-71.83346563497672,41.38329744092467],[-71.83348163497762,41.38321744090852],[-71.83349263497797,41.383157440896426],[-71.8335276349799,41.3829814408609],[-71.83353963498064,41.382922440849],[-71.8335506349811,41.382864440837295],[-71.83355363498153,41.382854440835246],[-71.8335456349701,41.38269044080338],[-71.83354363496629,41.38263244079208],[-71.83354063496188,41.38256844077966],[-71.8335316349486,41.382376440742334],[-71.83352963494454,41.38231344073005],[-71.83352763494169,41.38227244072208],[-71.83351763493735,41.38225244071848],[-71.83343163490021,41.382083440688035],[-71.83340363488807,41.38202744067792],[-71.83336063486954,41.38194344066278],[-71.83323563481557,41.381697440618446],[-71.83323263481441,41.38169444061795],[-71.83316863478996,41.381627440606785],[-71.8331036347651,41.381559440595446],[-71.83291063469123,41.381355440561414],[-71.83284663466677,41.38128844055025],[-71.83275163463041,41.38118844053358],[-71.83273663462468,41.3811724405309],[-71.8325286345391,41.38084244047264],[-71.83245663450938,41.38072644045214],[-71.83236963447361,41.38058844042776],[-71.83233963446136,41.38054244041969],[-71.83208263435634,41.38014744035021],[-71.8319526343073,41.38002344032989],[-71.83179663424843,41.37987444030549],[-71.83178363424351,41.37986144030334],[-71.83174463422884,41.379825440297495],[-71.83173163422397,41.379813440295536],[-71.83159163417113,41.37967944027356],[-71.83144363411529,41.37953844025049],[-71.83112963400211,41.37933644022055],[-71.83096763394373,41.37923244020513],[-71.83083163389473,41.379145440192254],[-71.8307326338525,41.37896044015905],[-71.83063763381185,41.37878044012671],[-71.830666633811,41.37858944008842],[-71.83079763384113,41.37835644003879],[-71.83109763392099,41.37802443996461],[-71.83129763397432,41.377804439915415],[-71.83135663399118,41.377760439905],[-71.83147063402379,41.377676439885064],[-71.83186263413143,41.37730343980005],[-71.83213463420734,41.37706743974552],[-71.83238863425883,41.376487439624185],[-71.83239763426086,41.37647043962058],[-71.8325896343043,41.376115439545195],[-71.83265663431229,41.375858439492816],[-71.8326746343058,41.37562943944743],[-71.83269963429714,41.375317439385576],[-71.83262363426385,41.37515943935694],[-71.83253163422377,41.374971439322955],[-71.83250863421249,41.374901439309944],[-71.83246863419272,41.37477643928669],[-71.83237463414638,41.374484439232376],[-71.83177963385296,41.37263643888867],[-71.83177563385097,41.37262343888624],[-71.83171263381976,41.372425438849405],[-71.83165263378991,41.37223443881382],[-71.83165363378284,41.37209643878677],[-71.83165663376198,41.37169143870736],[-71.83165763375095,41.371480438666005],[-71.8316606337404,41.371266438624],[-71.83166563374053,41.37123843861836],[-71.83168163374154,41.3711604386026],[-71.83184463375113,41.37035243843937],[-71.83195463377432,41.37011743838999],[-71.83199763378337,41.37002543837067],[-71.83206963379851,41.369871438338286],[-71.83249963391586,41.3694484382423],[-71.83254163392738,41.36940843823319],[-71.8327766339915,41.36917743818077],[-71.83317963410805,41.368903438114785],[-71.83386963430765,41.36843543800203],[-71.83433763444305,41.36811843792566],[-71.83437563445398,41.3680914379192],[-71.83501363463836,41.36765543781431],[-71.83573263484652,41.367171437697536],[-71.83653663507941,41.36663143756719],[-71.83697163520522,41.3663364374961],[-71.83703463522349,41.36629443748596],[-71.8375366353515,41.365634437341335],[-71.83763363537626,41.36550743731349],[-71.8376356353747,41.36546643730541],[-71.83766763535309,41.364871437187894],[-71.83767463534808,41.36473643716124],[-71.83768263534343,41.364601437134546],[-71.83768563534025,41.36452443711937],[-71.83769763533178,41.36429443707395],[-71.837701635329,41.36421843705895],[-71.8377116353224,41.3640354370228],[-71.8377226353158,41.36384643698544],[-71.83773163530978,41.36368043695265],[-71.83774163530259,41.36348643691434],[-71.83774463530165,41.3634504369072],[-71.83775163529604,41.363304436878394],[-71.83775263529505,41.363279436873455],[-71.83775463529417,41.36325143686791],[-71.83775663529237,41.363205436858856],[-71.8377586352917,41.36318143685408],[-71.83775963529004,41.3631444368468],[-71.83776663528647,41.36303543682524],[-71.83776863528517,41.36299943681813],[-71.83777763527905,41.362831436784944],[-71.83787363516615,41.36015343625741],[-71.83780763508267,41.359002436033954],[-71.83765463499675,41.35833243590738],[-71.83733263481574,41.356918435640196],[-71.83728663478986,41.35671643560203],[-71.83676863453472,41.35511143530342],[-71.83604463423886,41.35399643510709],[-71.83390163347521,41.352778434933924],[-71.83130363254952,41.35130343472427],[-71.83118663249033,41.35091143465103],[-71.83116063247729,41.35082643463517],[-71.8306096321994,41.3489974342936],[-71.83016963197738,41.34753443402035],[-71.82990263184253,41.346644433854095],[-71.82977963178057,41.346237433778114],[-71.8297676317708,41.346128433757116],[-71.82941863148481,41.34292443313984],[-71.8294046314734,41.3427964331152],[-71.82936563144155,41.342440433046605],[-71.8293846314467,41.34242143304232],[-71.82947963147298,41.34233443302235],[-71.82953663148864,41.34228043301003],[-71.82970963153633,41.34211943297319],[-71.82976763155237,41.34206643296103],[-71.8299396315998,41.341906432924425],[-71.83045563174208,41.341426432814586],[-71.8306276317895,41.341266432777964],[-71.83178163210759,41.34019143253204],[-71.83342763256147,41.338661432181894],[-71.83524563306267,41.33696943179471],[-71.83622763333342,41.33605643158575],[-71.83631363335707,41.335975431567256],[-71.83640063338112,41.33589543154892],[-71.83728063362369,41.3350764313615],[-71.83879763406952,41.33417843113914],[-71.84004463443598,41.33344043095638],[-71.84103563472718,41.33285343081104],[-71.84129263480278,41.33270243077358],[-71.84461163577815,41.330738430287184],[-71.84494063587886,41.330618430253594],[-71.84770963672658,41.32961242997179],[-71.84882963702073,41.32829942968016],[-71.85192363783331,41.32467242887452],[-71.85417763848243,41.323093428496044],[-71.85480763866383,41.32265142839013],[-71.85624863907894,41.32164442814865],[-71.85745863942742,41.320797427945585],[-71.85899563991337,41.32052642784548],[-71.8591756399702,41.3204934278335],[-71.8597156401409,41.32039742779818],[-71.85989664019817,41.32036642778656],[-71.86106764056831,41.320158427709984],[-71.86458264167959,41.31953842748096],[-71.86575464205016,41.319332427404724],[-71.86620064219109,41.3192524273754],[-71.86653864229797,41.3191934273535],[-71.86750264262932,41.319517427387545],[-71.86793264277713,41.319662427402825],[-71.86935364326558,41.320140427453104],[-71.87361864473162,41.321575427604],[-71.87451364503926,41.32187642763564],[-71.87501164521484,41.32212542766922],[-71.87643564571677,41.32283542776486],[-71.87828664636929,41.32376042788957],[-71.88070764722276,41.324969428052505],[-71.8821316477248,41.32568142814849],[-71.88392164835213,41.32650642825544],[-71.88929265023454,41.32898342857656],[-71.89108365086227,41.329809428683625],[-71.89118065089627,41.329854428689465],[-71.89147265099864,41.329989428706995],[-71.89157065103298,41.330034428712814],[-71.89200565118804,41.33028342874829],[-71.89206765119746,41.33008342870721],[-71.89283165132396,41.327814428239044],[-71.89310565138983,41.32738142814578],[-71.89365765152273,41.32651242795855],[-71.89432565168366,41.32546242773226],[-71.89880765276276,41.31840542621151],[-71.90030165312251,41.31605442570481],[-71.90129165331257,41.31359942519312],[-71.90165865338312,41.31269142500385],[-71.90558465435153,41.306941423756044],[-71.90707765471984,41.3047554232816],[-71.9071136547287,41.3047024232701],[-71.90722165475529,41.304543423235614],[-71.90725865476455,41.304491423224285],[-71.90966765558332,41.30513242327621],[-71.91689565803995,41.30705542343186],[-71.91930565885906,41.307696423483705],[-71.92337866024337,41.30877942357124],[-71.9294516623075,41.3103954237019],[-71.93567766426423,41.30909742325644],[-71.93980466556124,41.3082374229612],[-71.94767266803386,41.3065974223982],[-71.95674667088538,41.304707421749065],[-71.97127867545164,41.30167942070898],[-71.9736896762092,41.30117742053647],[-71.97641867706662,41.300608420341035],[-71.97914767792409,41.30004042014578],[-71.9865616802534,41.29849541961493],[-71.99948668431388,41.295802418689355],[-71.99951768432356,41.29579441868684],[-72.0077656868899,41.293620418006746],[-72.00868868717703,41.293376417930496],[-72.01601268945578,41.29144641732658],[-72.01739968988726,41.29108041721211],[-72.01921469045196,41.2906024170625],[-72.02142469111679,41.28960041679795],[-72.02273169151,41.289008416641614],[-72.02819669315397,41.28653041598733],[-72.04459269808584,41.279099414024714],[-72.05005869972982,41.27662241337038],[-72.0504786998561,41.27643141331996],[-72.05173970023532,41.27585941316889],[-72.05216070036198,41.27566941311865],[-72.05274370053728,41.27540441304869],[-72.05449370106358,41.27461141283918],[-72.05507770123926,41.27434741276939],[-72.057477701961,41.27325941248196],[-72.0646787041265,41.269995411619604],[-72.06707970484855,41.26890841133231],[-72.06877870535945,41.26813841112883],[-72.07001870573224,41.267575410980136],[-72.07047770587033,41.267368410925364],[-72.07612670756892,41.264808410248826],[-72.07883570838337,41.26357940992412],[-72.0817757092674,41.26224840957224],[-72.0817927092727,41.26224440957095],[-72.08184770928995,41.26223240956687],[-72.08186570929563,41.262229409565734],[-72.08205570935532,41.26219040955222],[-72.08262970953565,41.262073409511544],[-72.08282070959572,41.26203540949819],[-72.08414071001047,41.26176740940487],[-72.08546071042524,41.26149940931155],[-72.08736871102472,41.26111140917653],[-72.09551071358294,41.25945840860083],[-72.10101271531154,41.25834040821153],[-72.10556071674037,41.25741640788975],[-72.10628971696936,41.257267407837986],[-72.10847671765643,41.2568234076833],[-72.10920671788578,41.256675407631704],[-72.11567171991666,41.255360407173896],[-72.13506872600964,41.25141940580085],[-72.14153472804058,41.25010640534318],[-72.14373772873509,41.24970640519651],[-72.15034673081861,41.2485074047567],[-72.15255073151346,41.248108404610186],[-72.15901273355053,41.24693640418013],[-72.17840073966214,41.243424402890355],[-72.18486374169922,41.24225340246026],[-72.18508274176818,41.242212402445425],[-72.18574274197624,41.242093402401615],[-72.18596274204563,41.242054402387126],[-72.18605174207363,41.24203740238102],[-72.18632174215878,41.24198940236323],[-72.18641174218716,41.241973402357324],[-72.19320774432914,41.24074240190503],[-72.1953007449888,41.24036340176574],[-72.20418874778991,41.2387524011739],[-72.21229075034321,41.23728540063459],[-72.21359675075475,41.23704840054755],[-72.22039375289661,41.23581640009478],[-72.2260207546697,41.23479639971987],[-72.24290175998873,41.231738398595304],[-72.24852976176193,41.2307193982204],[-72.24873376182614,41.23068139820659],[-72.24934876201999,41.23057139816589],[-72.24955376208457,41.23053439815225],[-72.26593376723741,41.22742939703349],[-72.3150727826923,41.218116393675395],[-72.33145378784326,41.2150123925553],[-72.33145878784482,41.215011392554956],[-72.33147478784981,41.215007392553666],[-72.33148078785176,41.21500739255348],[-72.34448979194192,41.21254139166351],[-72.38351980421133,41.20514438899226],[-72.39652980830047,41.202679388101515],[-72.39769280866595,41.202458388021746],[-72.40118080976217,41.201797387782875],[-72.40234481012804,41.20157738770325],[-72.40551481112426,41.20097638748609],[-72.41502381411252,41.1991733868345],[-72.41819481510905,41.19857338661743],[-72.41889281532836,41.198440386569466],[-72.42098981598734,41.19804338642587],[-72.42168881620702,41.19791138637807],[-72.43124381920946,41.196100385723255],[-72.4599088282155,41.1906663837579],[-72.46946483121752,41.18885638310275],[-72.47085483165414,41.1885923830073],[-72.47502783296498,41.18780138272104],[-72.47641983340228,41.18753838262571],[-72.48671583663632,41.18558638191923],[-72.51760484633748,41.179732379799276],[-72.52790184957105,41.177782379092555],[-72.55156385699772,41.17324637745724],[-72.5518168570771,41.17319737743966],[-72.57522586442326,41.16871137582133],[-72.61135287575816,41.16178637332195],[-72.6235628795884,41.15944537247672],[-72.64747888708999,41.15486237082101],[-72.65618188981944,41.15319337021807],[-72.68229289800755,41.14818836840891],[-72.69099690073678,41.14652136780591],[-72.69174090097002,41.146378367754245],[-72.69397290166984,41.14595036759951],[-72.69471790190345,41.14580836754802],[-72.7029379044805,41.14423036697768],[-72.72759691221044,41.13949636526613],[-72.7358179147873,41.13791936469558],[-72.73853291563819,41.13739736450691],[-72.74667791819094,41.13583336394121],[-72.74939391904222,41.13531336375284],[-72.75851992190317,41.133578363122275],[-72.78589793048504,41.12837536123029],[-72.7950249333457,41.12664236059962],[-72.79664293385277,41.126334360487654],[-72.80149693537403,41.12541236015212],[-72.80311593588145,41.1251053600403],[-72.8033689359607,41.125056360022626],[-72.80362093603961,41.12500736000498],[-72.80805793742923,41.12414835969505],[-72.81572493983047,41.12266635915991],[-72.82288594207307,41.12128135865983],[-72.82782894362107,41.12032635831482],[-72.83145794475747,41.11962435806133],[-72.84234594816678,41.1175173573005],[-72.84597594930347,41.116816357047114],[-72.84663394950944,41.11668835700098],[-72.84860695012725,41.11630735686325],[-72.84926595033362,41.11618035681729],[-72.8514289510108,41.11576135666603],[-72.85791795304247,41.11450635621258],[-72.86008195372001,41.11408835606146],[-72.86060695388434,41.113986356024675],[-72.86218295437774,41.11368135591449],[-72.86270895454248,41.113580355877865],[-72.86290795460474,41.11354135586386],[-72.86350795479258,41.113425355821946],[-72.86370795485523,41.113387355808094],[-72.86748595603801,41.11265635554397],[-72.87882295958708,41.11046335475138],[-72.88260196077009,41.10973335448736],[-72.88339296101763,41.10957935443185],[-72.88576896176139,41.109119354265616],[-72.88656096200936,41.108967354210485],[-72.89130296349364,41.10804935387873],[-72.9055319679473,41.10529735288355],[-72.91027496943184,41.10438135255202],[-72.92408097375255,41.101711351586125],[-72.96549998671243,41.093700348686625],[-72.97930699103185,41.091031347719856],[-72.98335499229815,41.09024834743628],[-72.99549899609673,41.08789834658518],[-72.99954799736324,41.087116346301656],[-73.00454299891108,41.08589234590095],[-73.01952900355462,41.0822213446988],[-73.0245250051026,41.08099834429812],[-73.03000900680162,41.07965434385796],[-73.04646401189933,41.075623342537355],[-73.05194901359846,41.074280342097204],[-73.0652010177032,41.07103334103314],[-73.10495803001528,41.061293337839686],[-73.11821103411872,41.05804733677483],[-73.12405703592859,41.056614336304804],[-73.14159504135779,41.052317334894845],[-73.14744204316777,41.05088633442498],[-73.14979204389516,41.05031033423597],[-73.1568450460782,41.048582333668755],[-73.15919604680593,41.04800733347987],[-73.16232304777374,41.04724133322839],[-73.17170405067701,41.04494233247365],[-73.1748310516448,41.044177332222304],[-73.17536605181037,41.04404633217929],[-73.17697105230707,41.043653332050205],[-73.17750605247264,41.04352233200717],[-73.17765105251749,41.04348633199543],[-73.1780870526524,41.0433793319603],[-73.17823305269764,41.04334433194869],[-73.17928105302192,41.04308733186434],[-73.18242805399578,41.042316331611154],[-73.18347705432045,41.04206033152694],[-73.1910860566724,41.04015033090567],[-73.20203606005695,41.03740433001198],[-73.21391506372821,41.034423329041886],[-73.22059506579255,41.032747328496356],[-73.22106006593624,41.03263032845831],[-73.22152506607998,41.03251432842046],[-73.22304006654811,41.03213332829655],[-73.22758906795383,41.03099232792506],[-73.22910506842229,41.030612327801315],[-73.22964306859024,41.03050732776325],[-73.23125906909486,41.0301953276496],[-73.23179806926319,41.0300913276117],[-73.2330810696598,41.029772327507466],[-73.23693007084982,41.02881932719554],[-73.23821407124686,41.028502327091644],[-73.23884107144121,41.02835632704266],[-73.24072607202575,41.02792032689592],[-73.2413540722205,41.02777532684707],[-73.24259707260585,41.02748632675],[-73.24632907376301,41.02662232645931],[-73.2475730741487,41.02633432636239],[-73.24796907427142,41.02624132633128],[-73.24916107464102,41.02596532623843],[-73.24955807476415,41.02587432620767],[-73.2547250763801,41.024924325853505],[-73.26128907843294,41.023719325403896],[-73.27022608122773,41.02207732479138],[-73.27302008210144,41.02156432459994],[-73.27420708247264,41.02134632451859],[-73.27539308284348,41.021128324437264],[-73.27859508384131,41.020479324205844],[-73.28820408683582,41.01853632351216],[-73.29140708783392,41.01788832328085],[-73.29243808815515,41.01767932320631],[-73.2955330891196,41.0170533229828],[-73.29656508944123,41.0168453229084],[-73.29657108944305,41.01684332290783],[-73.29659108944927,41.016839322906385],[-73.29659808945148,41.01683832290596],[-73.31219009430966,41.0136833217795],[-73.35896810888178,41.00422231839886],[-73.37456111373818,41.00106831727125],[-73.37528311396035,41.00087531720981],[-73.3774501146273,41.000297317025634],[-73.37817311484983,41.00010531696435],[-73.37902011511416,40.99994331690491],[-73.38156111590726,40.99946131672739],[-73.382409116172,40.99930131666832],[-73.38268611625843,40.99924831664888],[-73.3835171165178,40.99909031659075],[-73.38379511660459,40.99903831657147],[-73.38495311696602,40.9988183164905],[-73.38843011805128,40.99815931624768],[-73.38958911841306,40.997940316166854],[-73.39805512104512,40.99615531554008],[-73.42345312894041,40.99080131365934],[-73.4319201315722,40.989017313032335],[-73.43247413174433,40.98889931299105],[-73.43413613226093,40.988549312868],[-73.43469113243349,40.98843331282707],[-73.43621813290802,40.98811031271373],[-73.44080213433278,40.98714531237437],[-73.44233013480768,40.98682331226121],[-73.4451561356859,40.98622631205155],[-73.45363413832067,40.98443931142336],[-73.45646113919923,40.98384431121403],[-73.46438114166034,40.98217431062693],[-73.48814114904296,40.97716630886555],[-73.49606215150386,40.9754973082783],[-73.49956615259214,40.97475330801735],[-73.50026015280787,40.97460930796634],[-73.51286615672633,40.97199530703977],[-73.51706815803243,40.97112430673092],[-73.51920715869717,40.97067930657339],[-73.52562716069257,40.96934830610143],[-73.52776716135772,40.96890530594422],[-73.53105216237813,40.968215305700944],[-73.54090716543944,40.966147304971365],[-73.54419316646015,40.96545830472821],[-73.54608916704902,40.96505930458759],[-73.55177916881641,40.96386630416648],[-73.55367616940562,40.963468304026],[-73.5551131698519,40.963166303919515],[-73.55942617119146,40.962261303600116],[-73.56086417163812,40.961960303493754],[-73.56114017172378,40.9619013034731],[-73.5619721719822,40.96172730341159],[-73.56224917206823,40.961669303391105],[-73.56385117256573,40.961332303272286],[-73.56866017405923,40.96032330291614],[-73.57026317455707,40.95998730279745],[-73.57369817562382,40.95926630254297],[-73.58400317882392,40.957104301779594],[-73.58743917989092,40.956384301525205],[-73.59007418070904,40.955830301329755],[-73.59067018089416,40.955706301285794],[-73.59797718316165,40.954149300739644],[-73.60061118397901,40.9535883005428],[-73.6015621842739,40.953382300471056],[-73.60251318456874,40.95317530039912],[-73.60306418473957,40.95305530035741],[-73.60833818637477,40.951909299958764],[-73.6104281870235,40.95146829980337],[-73.61288618778656,40.95095129962092],[-73.61289718779061,40.95096029962233],[-73.64621019999299,40.97643730353073],[-73.64802120065652,40.97782230374302],[-73.64983320132036,40.97920730395528],[-73.65636920371533,40.984209304721894],[-73.65638020371928,40.984216304722906],[-73.65641320373138,40.98424130472672],[-73.65642420373548,40.98425130472832],[-73.6567002038366,40.984462304760655],[-73.65677220386297,40.98451730476908],[-73.65691420391832,40.984683304796974],[-73.65739120410424,40.98524230489099],[-73.65761620419202,40.9855073049356],[-73.65938120488009,40.98757630528357],[-73.65967220499354,40.987917305340915],[-73.6595322049597,40.98811430538421],[-73.65947520494603,40.988196305402184],[-73.65929220490207,40.988458305459666],[-73.6589122048106,40.9889993055784],[-73.65887920480168,40.989029305585376],[-73.65877120477276,40.989132305609175],[-73.65863120473526,40.989265305639876],[-73.65780020452362,40.990246305859884],[-73.65722920437832,40.99092230601142],[-73.6579732046805,40.992005306199474],[-73.6590332050944,40.99325930641065],[-73.65904320509833,40.99327130641267],[-73.65910720512328,40.9933463064253],[-73.65963720534518,40.994233306581904],[-73.65964020534955,40.99429230659339],[-73.65965320536748,40.99453130663988],[-73.65958520537008,40.99495830672592],[-73.65951820537309,40.99538630681214],[-73.65950820537336,40.99544730682444],[-73.6594952053741,40.99553330684176],[-73.65938420539503,40.99652030703913],[-73.65931020540904,40.997179307170924],[-73.65941720546529,40.99755730724157],[-73.6597282056289,40.99865830744741],[-73.65973720563363,40.998690307453394],[-73.65994020574044,40.999409307587804],[-73.66005820580236,40.99982430766535],[-73.66013520584272,41.0000943077158],[-73.6602112058828,41.00036530776648],[-73.66024220589678,41.00043430777899],[-73.66026920590882,41.000492307789486],[-73.66017520588638,41.00062930781947],[-73.6601332058765,41.00069330783343],[-73.65969220578182,41.00152030801028],[-73.65855620555953,41.004026308539544],[-73.65808320544889,41.00475530869821],[-73.65802120543597,41.004878308724386],[-73.65796020542341,41.00500230875075],[-73.65791720541444,41.005087308768836],[-73.65787520540577,41.00517230878692],[-73.65778220538569,41.00534430882373],[-73.65769120536626,41.005517308860675],[-73.65721520526421,41.00641230905202],[-73.65684720519187,41.007218309222324],[-73.65606620503848,41.008931309584206],[-73.65527720494525,41.01173531016042],[-73.65524220494116,41.011860310186094],[-73.65525620496834,41.01225431026294],[-73.65532120499454,41.01234531027864],[-73.65541420503075,41.01245331029677],[-73.65565120512059,41.01268631033467],[-73.65611820529752,41.0131433104089],[-73.65620520533457,41.013299310436636],[-73.65629420537218,41.01345431046411],[-73.65690220563037,41.014533310655736],[-73.65737320581522,41.0151053107524],[-73.65787320601677,41.015805310873226],[-73.65814020612015,41.01610531092326],[-73.6586802063294,41.01671431102491],[-73.65877320636653,41.01683831104617],[-73.65899320645752,41.01718631110717],[-73.65907920649043,41.017276311122004],[-73.65944820663152,41.017659311184936],[-73.66045520700763,41.01855031132647],[-73.66173620748576,41.01967831150545],[-73.6618482075276,41.019777311521175],[-73.66267320783562,41.02050531163671],[-73.6627572078671,41.02058131164886],[-73.66351120816641,41.02155531181501],[-73.66352320817131,41.021573311818145],[-73.6636052082035,41.02167331183504],[-73.66385920830145,41.021951311881196],[-73.66407520838517,41.02219531192191],[-73.66418020842475,41.02229431193787],[-73.66467320862472,41.02300531206104],[-73.66519020882822,41.0236433121691],[-73.66524120884824,41.02370531217958],[-73.6652582088549,41.02372531218293],[-73.66560720899207,41.02415231225516],[-73.66654020935891,41.025296312448724],[-73.666716209428,41.02551031248487],[-73.66678320945434,41.02559231249873],[-73.66917321039313,41.02850531299107],[-73.66977321063852,41.029405313147734],[-73.67037821087183,41.03006731325758],[-73.67051221093978,41.030496313337274],[-73.67060721099011,41.0308383134012],[-73.67107521118126,41.031535313522404],[-73.67135121128901,41.03186031357703],[-73.6714122113129,41.03193331358932],[-73.6717682114519,41.03235231365971],[-73.6718332114773,41.03242931367265],[-73.67192721151409,41.03254131369151],[-73.67192821151447,41.032542313691685],[-73.67199921154118,41.032608313702276],[-73.67218821161482,41.03282831373918],[-73.67223821163567,41.03291031375359],[-73.67223921163605,41.03291131375374],[-73.67224121163687,41.03291431375428],[-73.67234821167716,41.03301431377035],[-73.67249921173594,41.033189313799674],[-73.67263221178865,41.03335931382862],[-73.6727192118237,41.03348031384946],[-73.67275721183854,41.033525313857034],[-73.67275821183887,41.033525313857005],[-73.67288921189042,41.03368631388423],[-73.67300421193599,41.03383331390927],[-73.67309821197126,41.03391931392302],[-73.67370821220989,41.0346453140452],[-73.67371221221147,41.03465031404607],[-73.6745182125282,41.03563431421235],[-73.67480521263894,41.03594931426464],[-73.67481021264085,41.03595431426543],[-73.6749232126853,41.03609331428896],[-73.67498821271084,41.0361723143023],[-73.67499121271203,41.03617631430298],[-73.67505921273923,41.03626731431858],[-73.67512421276435,41.03633931433055],[-73.67519221279066,41.03641531434319],[-73.67531221283708,41.03654931436551],[-73.67548821290441,41.03673231439557],[-73.67554721292696,41.03679331440558],[-73.675600212947,41.03684431441383],[-73.67565221296718,41.036903314423675],[-73.67574421300303,41.037010314441616],[-73.67591921307702,41.037314314495426],[-73.67600821311201,41.03742331451386],[-73.67611821315477,41.03754931453492],[-73.67618621318114,41.03762631454777],[-73.67625421320822,41.03771531456298],[-73.6763502132465,41.037842314584694],[-73.67637521325433,41.03783831458309],[-73.67638421325726,41.03783831458279],[-73.67641721327043,41.03788231459033],[-73.67658021333587,41.03810531462865],[-73.67705821352206,41.03866031472166],[-73.67744521367287,41.0391103147971],[-73.67746421368027,41.039132314800774],[-73.6775482137129,41.039228314816825],[-73.67776621379953,41.039511314865095],[-73.67778321380618,41.03953131486845],[-73.67787921384199,41.03961531488174],[-73.67788121384277,41.039617314882065],[-73.67805221390941,41.039816314915434],[-73.67853821409865,41.04037931500974],[-73.6785632141084,41.0404083150146],[-73.67856521410921,41.04041131501512],[-73.67856521410927,41.04041231501532],[-73.67877721419664,41.04074131507279],[-73.67890521424768,41.0409103151017],[-73.67927621439517,41.04139231518391],[-73.67951321448697,41.04165831522823],[-73.67975521458078,41.04193131527375],[-73.67977221458749,41.041952315277314],[-73.68184621537338,41.04397731560568],[-73.68247421561799,41.044705315727604],[-73.68294821580587,41.045311315830716],[-73.68296121581069,41.04532231583244],[-73.68571921690389,41.04884731643213],[-73.68676621731878,41.05018331665933],[-73.68683421734575,41.05027031667414],[-73.6869022173727,41.050357316688924],[-73.68695621739413,41.05042631670067],[-73.68701021741552,41.05049531671241],[-73.68717421748056,41.05070531674814],[-73.6879672177895,41.05162531690221],[-73.68953021840352,41.05352631722303],[-73.6898272185214,41.05390831728805],[-73.69071821887509,41.055055317483344],[-73.69101521899303,41.05543831754857],[-73.69125221908682,41.055738317599506],[-73.6914822191779,41.05603031764911],[-73.6918612193287,41.05652431773336],[-73.69195321936562,41.05664931775481],[-73.69218221945728,41.056957317807594],[-73.69226121948789,41.057046317822426],[-73.69227721949409,41.05706431782543],[-73.69234721952172,41.057151317840145],[-73.692505219582,41.05731231786646],[-73.69259021961439,41.057398317880505],[-73.6926692196445,41.05747831789355],[-73.69270821965985,41.057526317901676],[-73.69304121979079,41.057933317970395],[-73.6931532198348,41.058069317993336],[-73.69349121996763,41.058481318062896],[-73.69395322014738,41.05901231815163],[-73.69420722024822,41.05933931820731],[-73.69468222042798,41.0597983182815],[-73.6961742210137,41.061604318585964],[-73.6962532210448,41.06170131860234],[-73.6964162211089,41.061900318635935],[-73.70507422451537,41.07250332042622],[-73.70554522470223,41.07310632052872],[-73.70557522471411,41.073144320535164],[-73.70570622476615,41.07331332056393],[-73.70630522500373,41.074079320694096],[-73.71039422662584,41.07931132158322],[-73.71153722707928,41.080773321831614],[-73.71161422710985,41.08087232184844],[-73.71184722720221,41.08116932189889],[-73.71192522723318,41.08126932191589],[-73.71379722797467,41.08364332231867],[-73.71514922851237,41.08539532261687],[-73.71545122863218,41.08578132268244],[-73.71547922864333,41.085818322688745],[-73.71581122877501,41.08624232276075],[-73.71706422926952,41.08779932302403],[-73.71773822954563,41.08881132319982],[-73.71787622960133,41.08900432323301],[-73.71798922964602,41.089146323257054],[-73.71804722966893,41.08921832326923],[-73.71806122967442,41.089235323272106],[-73.7186762299174,41.090004323402255],[-73.71884022997911,41.090155323426366],[-73.71935523017285,41.09063132350247],[-73.71940123019014,41.09067332350917],[-73.72057723063246,41.091758323682555],[-73.72101923079869,41.09216532374756],[-73.72122523087668,41.09236432377969],[-73.72166723104382,41.09278732384784],[-73.72172723106652,41.09284532385718],[-73.72211023121135,41.093211323916115],[-73.72271123143848,41.09378432400836],[-73.72338323169363,41.09444532411543],[-73.72347223172966,41.09457132413717],[-73.72361723178838,41.09477732417266],[-73.72477823226134,41.0964733244661],[-73.72496123233594,41.096741324512486],[-73.72514323241002,41.0970063245583],[-73.72533523248822,41.097286324606735],[-73.72617323282954,41.0985093248183],[-73.72621323284581,41.09856732482832],[-73.72651623296758,41.09898132489929],[-73.72682223309064,41.09940032497114],[-73.7268462331003,41.0994333249768],[-73.72777623347412,41.10070432519468],[-73.71376622933265,41.107252326940895],[-73.71365022929794,41.10729932695393],[-73.71355122926848,41.10734232696564],[-73.71340422922505,41.107411326984],[-73.71296122909402,41.10761732703901],[-73.71227322888885,41.10790832711879],[-73.71222622887484,41.10792832712426],[-73.7060222270415,41.110842327900194],[-73.70590122700571,41.11089832791517],[-73.70587122699682,41.11091232791891],[-73.70581522698026,41.11093832792586],[-73.70567522693891,41.11100432794342],[-73.7055352268975,41.11106932796078],[-73.70362022632197,41.11180332816788],[-73.70354322629886,41.11183332817631],[-73.70344622627044,41.11188332818932],[-73.70330022622761,41.111957328208625],[-73.7031542261848,41.112031328227964],[-73.70284122609301,41.11219132826963],[-73.7027342260619,41.11225032828474],[-73.7007042254725,41.113385328574125],[-73.70000422526299,41.11366832865269],[-73.69605422408057,41.115264329095936],[-73.69595922405267,41.11531232910847],[-73.69500622377225,41.11578132923182],[-73.68947522214475,41.11850432994792],[-73.68607522113999,41.120104330373636],[-73.67902321905618,41.1234283312576],[-73.67677521839282,41.124504331542596],[-73.67641821828748,41.12467533158786],[-73.66993521636698,41.127651332384794],[-73.66980621632875,41.12771033240062],[-73.66968821629384,41.12776533241527],[-73.66802721580174,41.128527332619356],[-73.66780521573638,41.128636332648036],[-73.66721321556177,41.128921332723394],[-73.665932215184,41.1295393328867],[-73.6656482151003,41.1296773329231],[-73.66497421490165,41.130004333009396],[-73.66177021394871,41.131411333390716],[-73.66160821390054,41.13148233340996],[-73.66112221375589,41.13169433346752],[-73.66096121370809,41.13176633348694],[-73.6608742136822,41.131804333497264],[-73.66057421359693,41.13200433354633],[-73.65613721227852,41.133975334078755],[-73.6561232122743,41.13398033408019],[-73.65608521226301,41.133997334084775],[-73.65607321225947,41.134003334086344],[-73.65607221225913,41.13400333408639],[-73.65597121222856,41.13403833409657],[-73.65563421212624,41.134150334129636],[-73.6554742120777,41.134204334145494],[-73.65543721206693,41.13422433415064],[-73.65535421204278,41.13427033416239],[-73.6543742117573,41.134804334299275],[-73.65167421096079,41.136104334642916],[-73.65158221093347,41.13614533465399],[-73.64459720885907,41.13927133549659],[-73.64407520870431,41.13950933556041],[-73.63967320739835,41.14150433609627],[-73.63776620682975,41.142319336318764],[-73.63774920682465,41.1423263363207],[-73.63774820682438,41.14232733632093],[-73.63772720681848,41.142342336324546],[-73.63772420681768,41.14234533632524],[-73.63735420671522,41.14263933639497],[-73.63601520631745,41.14323733655623],[-73.63563720619868,41.14329433657988],[-73.63550220615868,41.143356336596476],[-73.63486020596663,41.14362033666936],[-73.63475020593344,41.14366033668081],[-73.63473720593069,41.14368533668613],[-73.63471620592398,41.14368633668702],[-73.63471620592402,41.14368733668722],[-73.63464920590296,41.14369733669139],[-73.63445720584507,41.14376833671163],[-73.63440520583164,41.1438263367247],[-73.63428620579403,41.14384033673136],[-73.63396720569929,41.143983336769885],[-73.6338592056669,41.14402633678186],[-73.63385820566657,41.14402633678189],[-73.63382820565758,41.14403833678526],[-73.6337012056193,41.14408533679864],[-73.63352820556835,41.14417033682099],[-73.63232920521537,41.14476133697623],[-73.63021120459153,41.145800337249476],[-73.62948720437613,41.146118337335615],[-73.62928220431571,41.14621833736195],[-73.62906120425014,41.14631833738883],[-73.62879720417176,41.14643733742083],[-73.6282692040148,41.14667133748405],[-73.62668620354431,41.147375337674085],[-73.62615920338779,41.147611337737665],[-73.62576420327034,41.14778633778496],[-73.62458220291913,41.148313337927114],[-73.6245722029162,41.14831833792842],[-73.62436220284599,41.14827733792733],[-73.62417520279052,41.14836233795015],[-73.6224902022905,41.14912533815508],[-73.62209020217185,41.14930733820391],[-73.61743520079045,41.15141533877005],[-73.61575020029045,41.152179338975166],[-73.61547320020809,41.152302339008365],[-73.61464419996166,41.15267033910775],[-73.61436819987969,41.152794339141124],[-73.61420719983207,41.1528703391613],[-73.61419719982908,41.1528743391624],[-73.61404619978441,41.152945339181294],[-73.61401219977436,41.152961339185545],[-73.61396019975896,41.15298533919195],[-73.61368419967728,41.153114339226306],[-73.6136201996584,41.153145339234484],[-73.61351319962655,41.153192339247205],[-73.61237519928846,41.15370133938436],[-73.60896219827445,41.15522833979576],[-73.60853319814707,41.155421339847685],[-73.60782519793678,41.15573933993328],[-73.60778719792543,41.15575533993764],[-73.60767619789249,41.1558053399511],[-73.60763919788153,41.15582233995564],[-73.60721619775582,41.15601134000659],[-73.60617919744779,41.15647634013179],[-73.60594819737908,41.156578340159356],[-73.60552619725375,41.156768340210455],[-73.6044591969367,41.157245340339],[-73.6012571959854,41.15867934072519],[-73.60019119566873,41.15915734085389],[-73.5998761955763,41.15931834089578],[-73.59977219554575,41.159371340909566],[-73.5985181951779,41.16001434107674],[-73.59833519512422,41.16010834110116],[-73.59815119507029,41.16020334112582],[-73.598099195055,41.160229341132606],[-73.5978951949951,41.1603333411597],[-73.59728419481591,41.16064734124128],[-73.5972461948048,41.16066734124644],[-73.59711119476853,41.16079434127574],[-73.59709919476472,41.16079534127631],[-73.59708919476257,41.160814341280386],[-73.59702319474479,41.16087534129447],[-73.5970021947392,41.160896341299285],[-73.5959671944293,41.16131834141598],[-73.59286319349997,41.16258634176645],[-73.59182919319048,41.163010341883506],[-73.59069419285352,41.1635233420213],[-73.58932219244622,41.16414434218804],[-73.58841119217564,41.164554342298295],[-73.58728819184225,41.1650623424347],[-73.58615419150563,41.16557634257264],[-73.58608719148573,41.165606342580716],[-73.58602019146586,41.165637342588994],[-73.58588019142428,41.16570034260594],[-73.58581319140438,41.16573034261401],[-73.58561319134503,41.16582134263841],[-73.5852421912349,41.16598934268352],[-73.58475119108905,41.16621034274293],[-73.5847121910775,41.16622834274774],[-73.58455019102945,41.16630234276756],[-73.58421019092852,41.16645634280891],[-73.58054318983979,41.168115343254335],[-73.57914118942358,41.16875034342476],[-73.57905718939858,41.168787343434786],[-73.5788051893237,41.1689003434652],[-73.57880018932227,41.16890334346595],[-73.57872218929909,41.168938343475354],[-73.57736018889514,41.169562343642326],[-73.57327718768427,41.17143434414309],[-73.57191618728069,41.172059344310206],[-73.57087618697227,41.17253634443778],[-73.57076518693928,41.17258634445122],[-73.5673131859155,41.17416934487462],[-73.56616318557451,41.17469834501598],[-73.56588118548976,41.17480834504681],[-73.56503618523593,41.17514034513958],[-73.56494318520804,41.1751773451499],[-73.56476018515386,41.17526334517274],[-73.5644791850706,41.17539334520743],[-73.56363718482122,41.175785345311844],[-73.56335718473836,41.17591734534688],[-73.56239518445344,41.1763653454662],[-73.55950918359879,41.177712345824766],[-73.55854818331423,41.17816134594423],[-73.55837118326178,41.17824334596611],[-73.55784218310511,41.17849034603184],[-73.55766618305304,41.17857334605387],[-73.55610818259164,41.179300346247366],[-73.55602818256794,41.179337346257235],[-73.55595518254631,41.179371346266294],[-73.55548918240828,41.179588346324095],[-73.55537518237456,41.17964234633841],[-73.55526018234046,41.179695346352574],[-73.5551601823109,41.17974234636505],[-73.55506018228128,41.17978934637754],[-73.55487518222641,41.17987434640026],[-73.55478418219948,41.17991734641168],[-73.55471218217814,41.17995034642049],[-73.5540101819703,41.18027934650796],[-73.55389118193504,41.18033434652264],[-73.5537731819001,41.180389346537275],[-73.55146918121784,41.18146634682379],[-73.54899918048383,41.18257634712223],[-73.54005117782496,41.18660334820444],[-73.54001317781331,41.18661434820785],[-73.53599717662114,41.18844334869774],[-73.53588517658807,41.18849734871199],[-73.52910817458185,41.19168234955786],[-73.52629017374768,41.19300834990991],[-73.52603017367001,41.19311834993995],[-73.52530417345298,41.193423350023494],[-73.52529417344998,41.1934273500246],[-73.52484117331467,41.193619350077064],[-73.52454317322783,41.193783350118935],[-73.52426117314575,41.1939403501589],[-73.52377117299697,41.19410635020749],[-73.52375117299079,41.19411135020912],[-73.5236761729685,41.19414535021824],[-73.52334317286967,41.19429735025894],[-73.5230831727928,41.19442135029173],[-73.52256417264117,41.194700350363355],[-73.52252417262943,41.19472135036878],[-73.52233817257522,41.194823350394856],[-73.52159817235511,41.195153350483714],[-73.52116517222638,41.195347350535904],[-73.52098117217157,41.19542835055779],[-73.51706917101717,41.19733335105896],[-73.51692817097552,41.197401351076905],[-73.51678717093394,41.197470351095035],[-73.51418017016464,41.198740351429116],[-73.51399417011156,41.19886235145907],[-73.5138641700722,41.19890835147234],[-73.51386417007225,41.19890935147254],[-73.51386317007191,41.198909351472565],[-73.51280416975699,41.19938335160009],[-73.51280416975706,41.19938435160028],[-73.51280316975678,41.19938535160052],[-73.51173116943535,41.19981935172063],[-73.51170516942855,41.199847351726966],[-73.51160916939989,41.199888351738146],[-73.51157716938954,41.1998883517392],[-73.5115771693896,41.199889351739394],[-73.51157616938927,41.19988935173942],[-73.51156916938709,41.19989035173984],[-73.51015016896426,41.20051135190795],[-73.51014916896395,41.20051135190797],[-73.51014816896368,41.20051235190819],[-73.50917516867378,41.20093835202349],[-73.50395916712523,41.203320352660725],[-73.49590216472097,41.20678935360389],[-73.49556616462066,41.20693335364308],[-73.49545316458695,41.206982353656386],[-73.49500316445268,41.207176353709094],[-73.49461416433662,41.20734435375473],[-73.49456016432043,41.207366353760804],[-73.49422516422057,41.20751235380036],[-73.49396316414234,41.20762435383087],[-73.49172916347558,41.208585354092186],[-73.48841316248604,41.21001435448055],[-73.48747516221414,41.210557354617514],[-73.48683816202933,41.210923354709976],[-73.48534416158256,41.21155135488185],[-73.48511016151319,41.21166035491084],[-73.48500316148136,41.21170835492374],[-73.48489916145053,41.21175635493655],[-73.48269616079737,41.21278035520911],[-73.48392616128396,41.21432035546947],[-73.48632816223433,41.21732935597815],[-73.48797816288713,41.21939535632736],[-73.48854116310896,41.220084356443394],[-73.49140816423885,41.223596357034864],[-73.49645316622755,41.22978135807645],[-73.49889116718879,41.23277135857988],[-73.50101316802532,41.23537135901756],[-73.5012341681125,41.23564335906337],[-73.50140116817832,41.2358473590977],[-73.50147416820717,41.235938359113064],[-73.50170016829624,41.236214359159476],[-73.50176516832188,41.23629435917296],[-73.50253316862471,41.237236359331526],[-73.50263716866569,41.23736335935291],[-73.50266016867508,41.23739735935878],[-73.50340416896883,41.238316359513654],[-73.50437516935207,41.2395133597153],[-73.50499016959485,41.24027235984318],[-73.5064921701878,41.242125360155356],[-73.50832317091063,41.24438436053589],[-73.50986317151863,41.246284360855896],[-73.5099631715581,41.246407360876624],[-73.51054917178958,41.24713236099879],[-73.51230917248483,41.249310361365765],[-73.51289617271672,41.25003636148808],[-73.51290617272072,41.25004936149028],[-73.51293817273336,41.250089361497025],[-73.51294917273773,41.2501033614994],[-73.51745717450608,41.25546336239653],[-73.51746517450924,41.25547336239823],[-73.51749717452208,41.255516362405565],[-73.51750717452613,41.25553036240796],[-73.51751017452733,41.255534362408646],[-73.52341917685321,41.26269236361005],[-73.52366317694872,41.26297836365778],[-73.5237461769814,41.26307936367474],[-73.5247641773776,41.26423436386644],[-73.52520917755074,41.26473836395005],[-73.52523117755983,41.26477236395596],[-73.52529817758544,41.26484036396703],[-73.52571317774958,41.26535636405396],[-73.52628417797565,41.26607036417437],[-73.5263171779886,41.266109364180885],[-73.52855517886601,41.268757364623454],[-73.536678182051,41.2783683662293],[-73.53670418206123,41.27839936623449],[-73.53688318213148,41.2786123662701],[-73.53838818272168,41.28039336656761],[-73.54059818358829,41.283007367004195],[-73.54071818363553,41.2831523670285],[-73.54355618475292,41.28658536760391],[-73.54811518654826,41.29210336852869],[-73.54884618683553,41.29297736867486],[-73.5488501868371,41.2929823686757],[-73.55096318766287,41.2954293690827],[-73.54988018766755,41.301530370307475],[-73.54986018768342,41.301914370382946],[-73.54968818783055,41.30539837106749],[-73.54960318790313,41.307117371405226],[-73.54948118842478,41.316754373286635],[-73.5492941885294,41.31958937384503],[-73.54908918878658,41.3251423749333],[-73.54897418881687,41.3263003751626],[-73.54897418881716,41.326305375163585],[-73.54861018891414,41.32999037589322],[-73.54824218899464,41.33341437657209],[-73.54823718899613,41.33346737658257],[-73.54814318902284,41.33444737677649],[-73.54805018904734,41.33538437696201],[-73.54790518906832,41.33654837719344],[-73.54712418918274,41.34284437844496],[-73.54709018918813,41.34312537850077],[-73.5469201892395,41.34494937886145],[-73.54628318943473,41.35182938022161],[-73.5462101894569,41.35261438037681],[-73.54597118951011,41.35485138082005],[-73.54596918951023,41.35486438082265],[-73.54565018958102,41.35784638141349],[-73.54529418968052,41.36152438214092],[-73.5452591896899,41.36187938221116],[-73.54515618971885,41.36294638242217],[-73.54512218972864,41.36330238249255],[-73.54504318973903,41.36391838261502],[-73.54480718977057,41.36576638298236],[-73.54472918978135,41.36638338310498],[-73.5445331898076,41.3679193834103],[-73.5439461898868,41.3725283843263],[-73.54375118991346,41.37406538463172],[-73.54374518991408,41.37410938464049],[-73.54372818991648,41.37424438466731],[-73.54372318991749,41.37428938467623],[-73.54366018992596,41.37478338477439],[-73.54362018993163,41.375102384837774],[-73.54347218995174,41.37626638506907],[-73.54342618995813,41.376630385141404],[-73.54341718996291,41.37676238516736],[-73.54326519005483,41.379177385642095],[-73.54281019033117,41.38642638706683],[-73.54265919042355,41.3888423875416],[-73.54265819042496,41.38887238754748],[-73.54262919043813,41.3892583876235],[-73.54262319044466,41.38940338765188],[-73.54262319044578,41.389422387655564],[-73.5426021904418,41.38947038766559],[-73.54257219044855,41.38975238772142],[-73.54256319047174,41.39019838780843],[-73.542587190483,41.3902583878193],[-73.54257319048976,41.39045138785728],[-73.5425611904971,41.390643387895025],[-73.54253719051009,41.390998387964835],[-73.54247019058218,41.392602388278895],[-73.54236319062134,41.39386438852781],[-73.54152019093,41.40380739048852],[-73.54147019094863,41.40440239060583],[-73.54134119095595,41.40524139077316],[-73.54132919095686,41.405323390789505],[-73.54114519095405,41.40629339098413],[-73.54112019095163,41.406390391003804],[-73.54110319095152,41.406482391022244],[-73.54046919104178,41.41153239202466],[-73.54044719104498,41.411708392059616],[-73.54042419104775,41.41188339209435],[-73.5404111910497,41.41198839211521],[-73.54008719109459,41.4145473926232],[-73.54007619109659,41.41464239264204],[-73.53994519111464,41.41567539284708],[-73.53975119114153,41.41720739315119],[-73.53888819126198,41.42403639450655],[-73.53838419132153,41.42783939526202],[-73.53840519132898,41.42785039526344],[-73.53812919136747,41.430033395696626],[-73.53806719137587,41.430519395793084],[-73.53788919139873,41.43189339606586],[-73.53774319143172,41.43326339633679],[-73.53773219143436,41.43336939635773],[-73.53767419144746,41.433913396465314],[-73.53763319145739,41.43430939654358],[-73.53751019148741,41.43550139677916],[-73.53747019149772,41.43589839685759],[-73.53726219154875,41.43791839725678],[-73.5370941915996,41.43971439761112],[-73.53702719162368,41.440495397765],[-73.53681419169186,41.442835398226435],[-73.53673419171163,41.443614398380355],[-73.5367331917113,41.44361439838039],[-73.53658519174041,41.444928398640435],[-73.53658419174008,41.44492839864047],[-73.53640719174996,41.446074398868845],[-73.53633519175983,41.446640398981124],[-73.53628819177868,41.44722139909548],[-73.53606519188101,41.45019839968084],[-73.53605619190577,41.45067039977279],[-73.5360471919214,41.45098639983441],[-73.53603719193927,41.451346399904644],[-73.53600119201354,41.452811400190235],[-73.53598719202408,41.45306840024058],[-73.53597719203357,41.453285400283036],[-73.53589319210947,41.45504340062708],[-73.53587219212737,41.4554644007095],[-73.53586319213436,41.45563340074261],[-73.53584319213998,41.45583940078324],[-73.53583719215206,41.45607840082985],[-73.53582319215931,41.45627940086933],[-73.53579919217238,41.45663440093903],[-73.53579119217697,41.45675740096317],[-73.53578419218177,41.4568774009867],[-73.53577019219425,41.45716740104344],[-73.5357321922159,41.45774640115709],[-73.5356071922839,41.45959540152012],[-73.53556919232656,41.46053240170324],[-73.53540919236511,41.462072402007436],[-73.53535519239162,41.46282240215479],[-73.53530519239298,41.463121402214476],[-73.535287192404,41.46340840227078],[-73.53527019240401,41.46350240228958],[-73.53527019243923,41.46410240240603],[-73.53526619243898,41.46412040240964],[-73.5352521924486,41.46436140245688],[-73.53522219244896,41.464533402491256],[-73.53521119244846,41.46458540250171],[-73.53517119245997,41.46500240258397],[-73.53512919247642,41.46551440268471],[-73.5350701924977,41.466202402820194],[-73.53507019249963,41.46623540282659],[-73.53507319253781,41.46686940294952],[-73.5350501925411,41.46705240298579],[-73.53497019255333,41.46770240311459],[-73.53497019255997,41.46781540313652],[-73.53497019257746,41.46811340319435],[-73.53497019259449,41.46840340325062],[-73.53490319260814,41.46900540336966],[-73.53487019261487,41.46930240342839],[-73.53485719262005,41.469462403459865],[-73.53480819264188,41.47010440358605],[-73.53475219265702,41.470671403697935],[-73.53467019267654,41.471456403852976],[-73.53461619270531,41.472244404007654],[-73.53457019272905,41.47290240413686],[-73.53453319274072,41.473305404216276],[-73.53436819280832,41.47536640462163],[-73.53432219281235,41.47568940468582],[-73.53429119281508,41.47590640472895],[-73.53420219282623,41.47658740486403],[-73.53412019283854,41.477249404995185],[-73.53406119285161,41.47779740510345],[-73.53404519285581,41.47795740513502],[-73.53397619289197,41.47895340533054],[-73.53396619289848,41.479119405363065],[-73.5339561929037,41.47926340539132],[-73.53395319291,41.4793874054155],[-73.53394819295163,41.48012340555844],[-73.5338581930188,41.48176340587957],[-73.53325119331076,41.490079407512695],[-73.53322319332473,41.49047140758964],[-73.53318619334453,41.491012407695806],[-73.53287719348978,41.4951864085155],[-73.5327361935572,41.49711040889327],[-73.53269319357554,41.49765940900115],[-73.53260719361106,41.498737409213035],[-73.53260419361153,41.49876240921799],[-73.53260319361276,41.49878840922305],[-73.53257019362769,41.499224409308695],[-73.53256319363054,41.499311409325806],[-73.53250519365633,41.50006940947468],[-73.53245219366559,41.500519409563694],[-73.5317781938909,41.50806341104866],[-73.53177819389096,41.50806441104884],[-73.53112919410799,41.51532741247823],[-73.53095919416506,41.51723341285329],[-73.5309051941831,41.517837412972135],[-73.53074319423726,41.51964941332869],[-73.53068919425532,41.520253413447534],[-73.53060919428226,41.52115141362422],[-73.53056919429595,41.52160441371333],[-73.53053519430748,41.521987413788686],[-73.5303671943626,41.52384841415491],[-73.53028719438959,41.524747414331756],[-73.53028419438974,41.524766414335545],[-73.53027919439165,41.52482641434734],[-73.5302781943925,41.524846414351245],[-73.53023519440629,41.52531741444394],[-73.53011019444898,41.52673041472188],[-73.53006819446318,41.52720241481473],[-73.52945519466839,41.53406041616378],[-73.52945019467018,41.5341184161752],[-73.52944519467198,41.534176416186604],[-73.52931419471558,41.53563741647398],[-73.52922919472451,41.53625641659672],[-73.52896219475049,41.53816641697559],[-73.52895119475087,41.53823341698892],[-73.52769319503419,41.54995941930181],[-73.52742519519346,41.55413442011916],[-73.52740619520063,41.55436042016355],[-73.52609819561357,41.56854942295393],[-73.52600219578176,41.571926423610726],[-73.5259951957914,41.57212842365006],[-73.52475219609249,41.58405442599923],[-73.52386619631491,41.5926834276981],[-73.52232519671108,41.607840430680795],[-73.52147919693309,41.616233432331704],[-73.5214591969382,41.61642943237024],[-73.52143619694203,41.61662043240793],[-73.52104219700126,41.619781433032124],[-73.52101919702267,41.620269433127234],[-73.52097219706495,41.62124143331668],[-73.52083319719242,41.62415743388495],[-73.52078819723368,41.62510143406892],[-73.52078619723476,41.625130434074585],[-73.52063419737313,41.62830143469252],[-73.52017919778885,41.63781543654617],[-73.52002819792774,41.64098743716406],[-73.5200251979293,41.641030437172475],[-73.52001919793513,41.64116143719797],[-73.5200181979374,41.641205437206516],[-73.51996319795967,41.64188243733914],[-73.51980119802768,41.6439174377377],[-73.51974719805031,41.644595437870464],[-73.51965319809369,41.6458424381145],[-73.51937519822536,41.64958643884698],[-73.51928319826946,41.650834439091106],[-73.51814619880763,41.66613344208351],[-73.51812219881386,41.66636944212987],[-73.5180981988206,41.66661444217797],[-73.51808119882202,41.66673144220111],[-73.5180721988226,41.66679044221282],[-73.51806519882395,41.66685144222483],[-73.51801219884999,41.66758044236734],[-73.51783119894242,41.67012844286532],[-73.51777119897338,41.67097844303141],[-73.51776819897454,41.67101444303846],[-73.51776219897917,41.67112544306009],[-73.51776019898072,41.67116244306732],[-73.51756419911203,41.67444744370798],[-73.51698019950751,41.684303445629816],[-73.51678619963967,41.68758944627042],[-73.51674019964997,41.68801444635396],[-73.51660619968233,41.68929144660485],[-73.51656219969334,41.68971744668853],[-73.51645219973575,41.69103244694593],[-73.51612619986427,41.69497744771798],[-73.5160591998904,41.69578344787572],[-73.51601819990739,41.696293447975485],[-73.51542920006797,41.702213449137204],[-73.51506820016665,41.705845449849846],[-73.51429020037924,41.713669451384774],[-73.51421120040563,41.71454445155615],[-73.51388920051491,41.71813945226014],[-73.51372320057064,41.71998245262104],[-73.51319120075053,41.72590945378152],[-73.51297220083497,41.72852345429275],[-73.51270820093792,41.73169345491264],[-73.51231820108944,41.73636645582637],[-73.51211520116863,41.73880345630282],[-73.51210020117438,41.738981456337626],[-73.51205920118767,41.739428456425145],[-73.5119372012279,41.740769456687644],[-73.51193120123054,41.740846456702684],[-73.51192220123377,41.74094945672284],[-73.51190820124515,41.74121745677495],[-73.51183920130262,41.74255845703568],[-73.51163320147552,41.74658445781834],[-73.51156520153336,41.74792645807919],[-73.51151420157531,41.7489084582701],[-73.5114542016269,41.75010145850196],[-73.51136420170212,41.7518544588427],[-73.51131420174447,41.75283745903375],[-73.5113032017478,41.752953459056464],[-73.51127320175871,41.75330045912431],[-73.51126320176245,41.753417459147194],[-73.51125020176752,41.75357345917767],[-73.51119920180524,41.75448445935489],[-73.51102120193839,41.757688459978056],[-73.51096220198293,41.75875746018593],[-73.51041720216483,41.76477746136364],[-73.50961620243254,41.77362846309489],[-73.50878120271084,41.78283846489597],[-73.50848220281134,41.786149465543325],[-73.50817820287399,41.78885346607395],[-73.50811620289387,41.78952346620498],[-73.5079312029537,41.79153246659786],[-73.50787020297396,41.792203466729035],[-73.50771320302523,41.79391646706395],[-73.50746220310798,41.796667467601765],[-73.50724120317899,41.79905846806927],[-73.50708920322823,41.800709468392036],[-73.50708420323038,41.80077246840432],[-73.50588220366278,41.81454347109385],[-73.50524620389183,41.82183047251666],[-73.50525020389476,41.82185847252191],[-73.50525820390588,41.82200047254895],[-73.5053162040405,41.823936472919314],[-73.50531320404023,41.82394847292173],[-73.50528820403834,41.824052472942554],[-73.50528120404168,41.82414647296088],[-73.50525720405045,41.824423473014946],[-73.50430820432226,41.8341214749114],[-73.50193820500213,41.858339479645316],[-73.5019542050153,41.85847247967034],[-73.50198520504053,41.85872547971792],[-73.50179320508406,41.86049348006402],[-73.50113720523433,41.86655848125113],[-73.50102120526145,41.86764048146287],[-73.50094520527877,41.86834148160006],[-73.50091820528435,41.86858048164688],[-73.50078220531357,41.86980548188673],[-73.50037320540106,41.873482482606676],[-73.50023820543069,41.87470848284667],[-73.50016120544666,41.8753924829806],[-73.49993320549575,41.877446483382705],[-73.49990520550193,41.877701483432624],[-73.499892205507,41.877856483462814],[-73.49986420551444,41.878132483516765],[-73.49978520553405,41.878887483664386],[-73.49955020559352,41.881152484107204],[-73.49947320561382,41.881908484254964],[-73.49944520561961,41.88215648430353],[-73.4993642056381,41.88290348444966],[-73.49933720564425,41.883152484498375],[-73.49918420567822,41.88454748477136],[-73.49872620578053,41.88873448559059],[-73.49857420581486,41.89013048586369],[-73.49857320581474,41.89013348586431],[-73.49857220581495,41.89014248586607],[-73.49857220581518,41.89014648586686],[-73.49851820582607,41.89062048595964],[-73.4983582058594,41.89204248623799],[-73.49830520587068,41.89251748633096],[-73.4982962058761,41.89265648635793],[-73.49732020639202,41.90653448905428],[-73.49731720639356,41.90657648906245],[-73.4970542065762,41.911040489927856],[-73.49705720657953,41.91107948993524],[-73.49705820658104,41.91109948993905],[-73.4970572065853,41.911175489953656],[-73.4967562069073,41.91816349130446],[-73.49667920699024,41.91995949165158],[-73.49660220707321,41.92175649199888],[-73.4966002070755,41.921805492008346],[-73.49659320707467,41.92182949201318],[-73.49653020708784,41.92238949212272],[-73.4965272070885,41.92241649212799],[-73.49600820724726,41.92786449319037],[-73.494592207681,41.94273049608853],[-73.49445120772414,41.9442094963768],[-73.49444820772545,41.9442474963842],[-73.49393820788171,41.949599497427286],[-73.49393120788297,41.94965849743882],[-73.49392920788274,41.94966549744023],[-73.49392720788342,41.94968749744451],[-73.49392620788358,41.94969549744607],[-73.49385020789263,41.95025649755616],[-73.49362620792115,41.95194049788647],[-73.4935512079306,41.95250249799671],[-73.49352820793322,41.95267049802968],[-73.49347020794133,41.9531184981175],[-73.49346220794209,41.9531744981285],[-73.49344020794511,41.95334349816163],[-73.49343320795224,41.95349949819177],[-73.49342720795885,41.95364149821919],[-73.4934162079699,41.95388449826613],[-73.49341220797369,41.953969498282554],[-73.49340520798087,41.95412649831289],[-73.49339920798555,41.95423649833416],[-73.49339620798891,41.95430849834806],[-73.49338820799728,41.95449049838322],[-73.4933842080006,41.9545674983981],[-73.49338120800324,41.95462749840972],[-73.49339320801009,41.9546764984187],[-73.4933832080119,41.95476049843513],[-73.49338220801206,41.954768498436714],[-73.49331420802643,41.95537449855514],[-73.49308020807659,41.95747149896487],[-73.49300220809337,41.958171499101645],[-73.49299820809382,41.95820049910734],[-73.49298920809632,41.95829049912489],[-73.49298920809662,41.958295499125846],[-73.4929882080978,41.95832049913068],[-73.49297620810667,41.95853249917171],[-73.49296420811078,41.95866549919758],[-73.4928742081439,41.95970149939915],[-73.49284520815529,41.96004749946642],[-73.49283520815825,41.96015049948651],[-73.49272220820045,41.96146149974153],[-73.49255820826234,41.963374500113595],[-73.49235620833707,41.965705500567054],[-73.4922422083792,41.96702050082282],[-73.4922362083822,41.96710250083873],[-73.49222720838434,41.96718650085514],[-73.49222420839311,41.967348500886274],[-73.49167620862929,41.97422550222219],[-73.49150320870373,41.976394502643494],[-73.49111520887179,41.981275503591434],[-73.49064120907627,41.98722350474649],[-73.49042220917087,41.98997350528047],[-73.48961620951971,42.00010050724648],[-73.48951820962743,42.00241350769256],[-73.48947220967838,42.003505507903135],[-73.4892242099509,42.0093555090312],[-73.48912721005908,42.01166950947733],[-73.48912321006327,42.01176050949489],[-73.48911921006753,42.01185250951261],[-73.48907821011295,42.012825509700214],[-73.48894521026098,42.01599251031073],[-73.48893221027504,42.01629551036916],[-73.4889082103021,42.01687251048038],[-73.48890121030132,42.01689751048539],[-73.48887321032568,42.017451510592345],[-73.48886021033667,42.017703510641],[-73.48882321037037,42.0184605107871],[-73.48881121038174,42.018713510835916],[-73.4887842104066,42.01927051094339],[-73.48870421048174,42.02094451126639],[-73.48868221050255,42.02140751135572],[-73.48868421050675,42.02146651136694],[-73.48868221050834,42.021503511374085],[-73.48866921051977,42.021762511424086],[-73.48863121055442,42.02254051157422],[-73.48862121056432,42.02275851161626],[-73.48861421056455,42.02279951162433],[-73.48854321062912,42.02425051190433],[-73.488333210824,42.02860551274454],[-73.48826321088899,42.03005751302466],[-73.48807321106399,42.03397451378029],[-73.48761721148665,42.04341651560137],[-73.48750421158974,42.04572851604726],[-73.48748921160374,42.046040516107425],[-73.48747321161973,42.04639051617488],[-73.48731521176532,42.04964651680277],[-73.48341921050313,42.049749516953426],[-73.48272521027832,42.04976851698038],[-73.47732720852335,42.04980951716964],[-73.47173020670819,42.04992751738027],[-73.46783520544503,42.05001051752698],[-73.4676552053866,42.05001351753359],[-73.46711820521249,42.05002551755393],[-73.46694020515477,42.050029517560674],[-73.465767204774,42.05004851760371],[-73.46225020363255,42.050109517733496],[-73.46107820325216,42.05012951777667],[-73.45842120238974,42.05017451787448],[-73.45045019980249,42.050310518168075],[-73.44779419894041,42.05035651826602],[-73.4459621983457,42.05038651833324],[-73.44046719656204,42.050480518535586],[-73.43863619596773,42.05051251860312],[-73.43826619584762,42.05051851861668],[-73.4371581954881,42.05053951865786],[-73.43678919536835,42.050546518671574],[-73.43678019536542,42.05054651867187],[-73.43675319535663,42.050546518672775],[-73.43674519535408,42.05054751867325],[-73.43511519482443,42.05056651873154],[-73.43281319407656,42.0505955188143],[-73.43022819323224,42.050553518892954],[-73.42860019270057,42.050528518942755],[-73.42859419269861,42.05052851894296],[-73.42857719269307,42.050528518943544],[-73.42857219269145,42.0505285189437],[-73.42638819197812,42.05049351901023],[-73.42622919192635,42.05049351901555],[-73.42616919190674,42.05049251901738],[-73.42605519186944,42.05048951902063],[-73.42262519074718,42.05040251911899],[-73.42248419070103,42.05039851912294],[-73.42072819012647,42.0503535191732],[-73.41504018826535,42.05020851933609],[-73.41314418764497,42.050160519390424],[-73.41153618711884,42.050119519436464],[-73.40671418554122,42.049999519575046],[-73.40510718501551,42.04996051962141],[-73.4008551836228,42.04982951973876],[-73.39166718061337,42.049547519992416],[-73.3881011794461,42.04945052009322],[-73.3838501780546,42.049335520213475],[-73.38213217749221,42.04928852026197],[-73.37697817580506,42.0491485204076],[-73.37526117524303,42.04910252045623],[-73.37517517521485,42.04909952045853],[-73.37502317516503,42.04909452046265],[-73.3749471751405,42.04909852046598],[-73.37491817513107,42.049098520466934],[-73.37483317510363,42.04910252047054],[-73.37456217501597,42.04911252048152],[-73.37293417448353,42.04907652052908],[-73.36723717262053,42.04895452069624],[-73.36533817199957,42.04891452075208],[-73.36139817071108,42.04882952086751],[-73.35637216906748,42.04872252101501],[-73.349583166843,42.048506521200515],[-73.34564516555274,42.04838252130833],[-73.34484616529161,42.04836852133234],[-73.34244916450837,42.04832852140474],[-73.34165016424731,42.04831552142894],[-73.34159716422998,42.04831452143053],[-73.34151916420451,42.04831352143294],[-73.34143916417833,42.048311521435224],[-73.3413871641614,42.04831152143694],[-73.3412831641274,42.048309521440046],[-73.34097316402611,42.048304521449445],[-73.3408701639925,42.04830352145268],[-73.3408281639787,42.048301521453716],[-73.34076516395811,42.048300521455616],[-73.34070216393752,42.04829952145753],[-73.34066016392386,42.04829952145893],[-73.34062516391239,42.048298521459905],[-73.3405751638961,42.04829852146158],[-73.34052316387911,42.04829752146313],[-73.34048916386801,42.04829752146426],[-73.34008316373553,42.048293521477056],[-73.33958316357149,42.048274521490114],[-73.33686816268123,42.04817752156221],[-73.33596416238481,42.04814552158626],[-73.32833815989056,42.04798052180924],[-73.32772915969144,42.04796852182725],[-73.32763015965897,42.0479645218298],[-73.3267451593692,42.04794052185474],[-73.32564815900979,42.04790652188483],[-73.32416615852433,42.04786252192587],[-73.31972015706796,42.047730522048944],[-73.31924715691302,42.047716522062046],[-73.31823915658283,42.04768652208992],[-73.31698815617307,42.047649522124566],[-73.31323615494401,42.04753852222847],[-73.31198615453455,42.04750152226307],[-73.31197015452928,42.04750052226342],[-73.31192515451455,42.047499522264715],[-73.31191015450966,42.04749952226521],[-73.31188915450277,42.04749852226573],[-73.31182715448244,42.047496522267416],[-73.31180715447591,42.0474965222681],[-73.31029015397924,42.04745552231081],[-73.30877415348286,42.04741452235351],[-73.30540115237794,42.04731452244683],[-73.30416515197301,42.04727752248096],[-73.29626614938556,42.04704652270001],[-73.29589414926365,42.0470345227101],[-73.29558914916264,42.04700752271511],[-73.29474614888366,42.046935522729406],[-73.29460914883806,42.046919522730924],[-73.29383114857913,42.046828522739425],[-73.29338714843267,42.046798522748475],[-73.28850114683722,42.046740522900144],[-73.2884721468277,42.046739522900914],[-73.288239146751,42.04672652290619],[-73.28820614674014,42.0467245229069],[-73.28812914671487,42.04672152290891],[-73.28785814662574,42.04670752291525],[-73.28754314652251,42.04669752292383],[-73.28731114644654,42.046691522930416],[-73.28715514639542,42.04668652293464],[-73.28699914634427,42.04668152293888],[-73.28659014621034,42.04667052295041],[-73.28618114607644,42.04665952296192],[-73.28615414606759,42.04665852296263],[-73.28607314604099,42.046655522964755],[-73.28604714603253,42.04665552296562],[-73.286021146024,42.04665452296628],[-73.28594414599874,42.04665152296828],[-73.28591914599059,42.046651522969114],[-73.28321114510356,42.04657352304438],[-73.27508614244216,42.046340523270295],[-73.2723791415555,42.04626352334567],[-73.27221914150313,42.04625952335022],[-73.27190714140086,42.046249523358696],[-73.27049414093793,42.0462075233977],[-73.2700231407836,42.046193523410686],[-73.26860514031897,42.04615052344965],[-73.26435313892584,42.04602352356681],[-73.26293613846158,42.045981523605924],[-73.26168013805004,42.04594352364043],[-73.25791413681608,42.04583052374408],[-73.25665913640489,42.04579352377875],[-73.25641913632674,42.045794523786924],[-73.25570013609286,42.045801523812166],[-73.2554611360151,42.045803523820496],[-73.25523713594163,42.04579552382642],[-73.25456513572121,42.045771523844174],[-73.25434213564806,42.045763523850056],[-73.25020213428836,42.04558652395385],[-73.24953313406868,42.045558523970726],[-73.24220813166923,42.04535152417459],[-73.23777913021473,42.04516552428618],[-73.23745413010806,42.0451525242945],[-73.23363712886065,42.04509452441022],[-73.23357612884072,42.045093524412046],[-73.23339512878157,42.04509052441749],[-73.233335128762,42.04509052441948],[-73.23325712873647,42.04508852442169],[-73.23302312865994,42.04508452442871],[-73.23294512863448,42.0450835244311],[-73.23256612850933,42.04505652443853],[-73.23143212813494,42.044975524460696],[-73.2313531281089,42.044970524462364],[-73.2310541280102,42.04494952446827],[-73.23080312792762,42.04493652447412],[-73.23005012767989,42.04489752449165],[-73.22979912759739,42.0448855244977],[-73.22933312744503,42.044877524511655],[-73.22863112721552,42.044865524532675],[-73.22682512662522,42.04483652458709],[-73.22513012607006,42.04479052463459],[-73.22396312568793,42.0447605246676],[-73.22026812447803,42.04466552477212],[-73.21951512423148,42.044646524793464],[-73.21098212143798,42.044438525036895],[-73.20918612084947,42.04438552508635],[-73.2054931196395,42.044279525188585],[-73.203573119011,42.04423452524368],[-73.20292611879923,42.044219525262264],[-73.19781611712568,42.04408552540611],[-73.19589811649756,42.04403552546015],[-73.19575211644975,42.04403152546424],[-73.195533116378,42.044025525470346],[-73.19531411630626,42.04401952547646],[-73.1951681162585,42.04401652548072],[-73.19511911624241,42.04401452548196],[-73.19504611621848,42.04401252548402],[-73.19497311619457,42.04401052548604],[-73.19492511617888,42.044009525487446],[-73.19482711614675,42.04400652549012],[-73.19468111609899,42.044003525494375],[-73.19453411605083,42.0439995254985],[-73.1944371160191,42.043997525501325],[-73.19416411592964,42.043989525508856],[-73.19375511579572,42.0439795255205],[-73.19334811566242,42.043968525531895],[-73.19307611557339,42.043962525539754],[-73.19288911551209,42.04395652554481],[-73.19114011493889,42.04390452559285],[-73.18533511303656,42.04373352575254],[-73.18340011240248,42.04367752580598],[-73.18116311166938,42.04361152586746],[-73.17780911057025,42.04351352595983],[-73.17445510947107,42.04341452605202],[-73.17221910873833,42.04334952611364],[-73.17175010858443,42.04333252612592],[-73.17034210812253,42.04328352616317],[-73.16987410796904,42.04326752617562],[-73.16928910777719,42.043248526191356],[-73.16901510768734,42.04323952619872],[-73.16644010684318,42.04315952626867],[-73.16558210656194,42.04313352629211],[-73.16325410579879,42.04306152635541],[-73.15864110428654,42.04291952648094],[-73.15627110351102,42.04287052655001],[-73.15394310274932,42.042823526618065],[-73.15019510152288,42.042746526727356],[-73.14817410086162,42.04270552678638],[-73.13895409783952,42.042431527038914],[-73.13594109685192,42.04234252712151],[-73.13572909678157,42.04232152712449],[-73.13520909661138,42.042310527139584],[-73.13512309658321,42.04230852714205],[-73.13486509649893,42.042305527150006],[-73.13477909647084,42.04230452715265],[-73.1339400961957,42.042277527175244],[-73.13259409575438,42.042235527211695],[-73.13142509537117,42.04220052724366],[-73.13058709509654,42.042176527266754],[-73.13036609502402,42.04216852727254],[-73.12970609480747,42.04214552728994],[-73.12948609473534,42.042138527295876],[-73.12903809458832,42.04212252730761],[-73.12836809436857,42.04210052732555],[-73.12769709414844,42.04207752734333],[-73.12725009400181,42.042062527355235],[-73.1257910935243,42.04203152739753],[-73.12455309311913,42.042005527433446],[-73.12141709208943,42.04188352751372],[-73.12022709169872,42.041837527544246],[-73.11996009161172,42.04183852755326],[-73.11973409153822,42.04184152756129],[-73.1177600908924,42.041804527619455],[-73.11675509056296,42.0417745276469],[-73.10714208741173,42.04148952790984],[-73.10393808636141,42.04139452799744],[-73.10320108611982,42.04137252801756],[-73.10209608575755,42.04133952804773],[-73.10099008539497,42.04130652807791],[-73.10025408515368,42.041284528098004],[-73.09634808387318,42.04116852820472],[-73.09551508360002,42.04114252822723],[-73.09345808292564,42.04108052828324],[-73.0870560808267,42.0408885284577],[-73.0812980789381,42.04070252861201],[-73.07656007738402,42.04054952873897],[-73.07644507734634,42.04054652874217],[-73.07440907667701,42.04045552879188],[-73.06795707455602,42.0401685289496],[-73.0676640744597,42.04015552895677],[-73.06580507385188,42.04012852901287],[-73.06383407320735,42.04009852907207],[-73.05940407175883,42.04003352920561],[-73.05792207127323,42.039994529246954],[-73.05595207062781,42.039944529302275],[-73.05579007057467,42.03993952930664],[-73.05530707041646,42.039927529320266],[-73.05514607036373,42.039923529324795],[-73.05333006976882,42.039878529376],[-73.05325506974384,42.03986952937674],[-73.05298906965527,42.03983852937956],[-73.05272406956712,42.03980952938273],[-73.05203806933872,42.039730529390205],[-73.05000806867407,42.03968652944863],[-73.04896306833203,42.039665529479024],[-73.04887006830158,42.03966352948169],[-73.04827806810776,42.03965052949871],[-73.04622606743594,42.03960652955784],[-73.04554206721203,42.039592529577675],[-73.04539806716484,42.03958852958166],[-73.04428806679994,42.0395395296088],[-73.04085606567591,42.039459529706484],[-73.03689106437727,42.03936652981917],[-73.03684406436193,42.03936652982071],[-73.03671306431903,42.03936352982445],[-73.0361430641323,42.03934952984053],[-73.03295806308905,42.039273529930774],[-73.03006406214115,42.03920553001298],[-73.02470706038983,42.0391355301758],[-73.02340505996418,42.03911853021537],[-73.02022105892325,42.03907753031223],[-73.01834505830897,42.03903653036605],[-73.01271905646666,42.03891353052746],[-73.01133405601314,42.038883530567254],[-73.01107905592986,42.038881530575246],[-73.01084405585308,42.038879530582584],[-73.01042405571587,42.03887553059563],[-73.00916505530462,42.03886553063511],[-73.00874605516776,42.03886253064831],[-73.0085530551047,42.03886053065426],[-73.00010505233902,42.038689530899106],[-72.99955005215634,42.03866153091196],[-72.99647905115309,42.03863553100788],[-72.99623705107405,42.038633531015435],[-72.98416604713042,42.0385305313921],[-72.98415604712716,42.03853053139243],[-72.98412804711802,42.038530531393334],[-72.98411904711509,42.03853053139365],[-72.97900804544523,42.038486531553],[-72.97779404504861,42.038476531590916],[-72.97759504498363,42.03847553159726],[-72.97740404492122,42.03847353160314],[-72.9747320440484,42.038453531687],[-72.96639304132424,42.03838953194834],[-72.96628304128829,42.03838853195174],[-72.94871603557247,42.03864653257719],[-72.9443220341428,42.038712532733825],[-72.94351303387573,42.03865953275019],[-72.94281803364329,42.038563532754566],[-72.94005403271949,42.03818953277342],[-72.93977603262866,42.03818753278215],[-72.93229503018452,42.038130533016265],[-72.93192003006197,42.03812753302796],[-72.92719602851811,42.03808453317442],[-72.92677202837955,42.03808053318753],[-72.9254190279375,42.03807053322991],[-72.92541802793717,42.03807053322994],[-72.92411102751014,42.0380605332708],[-72.92403902748663,42.03806053327317],[-72.92087102645155,42.03803653337228],[-72.91627902495124,42.038002533516035],[-72.90250302045013,42.03790053394714],[-72.89791201895001,42.037866534090746],[-72.89627001841345,42.03785353414192],[-72.89134401680379,42.03781653429587],[-72.89006501638589,42.03780753433593],[-72.8897030162676,42.037804534347195],[-72.88276601400084,42.037753534564104],[-72.88269901397891,42.0377525345661],[-72.8747710113863,42.03766053480744],[-72.87454501131359,42.03767853481827],[-72.87442901127585,42.037680534822435],[-72.8695640096897,42.037706534986285],[-72.86535700831725,42.03771553512536],[-72.8636200077505,42.03771753518245],[-72.86340900768145,42.03771453518876],[-72.86277800747499,42.03770553520763],[-72.86256800740628,42.03770253521392],[-72.86219600728487,42.03770253522606],[-72.86185000717194,42.037702535237344],[-72.86119400695576,42.03766653525186],[-72.86100900689479,42.03765653525599],[-72.85304900427148,42.03722353543269],[-72.84745300242723,42.03691953555694],[-72.84714300232505,42.03690253556378],[-72.84635300206652,42.036890535587254],[-72.84585200190253,42.03688253560206],[-72.84434900141068,42.03686053564686],[-72.84384900124708,42.03685353566182],[-72.84223800071987,42.036829535709764],[-72.83740699913888,42.036757535853454],[-72.83579699861197,42.03673353590133],[-72.83561599855271,42.036730535906656],[-72.83507299837503,42.03672253592283],[-72.83489199831583,42.036720535928346],[-72.83337599781967,42.03669753597335],[-72.82882799633133,42.036631536108914],[-72.82731299583554,42.03660953615405],[-72.82695299571768,42.036603536164634],[-72.82684199568139,42.03660253616806],[-72.82587299536509,42.03660253619964],[-72.8255129952476,42.03660253621136],[-72.82464799496526,42.03660253623954],[-72.82430399485287,42.036600536250376],[-72.82422699482773,42.036600536252884],[-72.8239759947458,42.03660053626107],[-72.81702899247435,42.03653453647469],[-72.8168929924299,42.036533536478935],[-72.81675799238577,42.036532536483136],[-72.81662299234158,42.036530536487156],[-72.81648899229779,42.03652953649134],[-72.81576099205981,42.03652353651388],[-72.81354199133426,42.03650253658211],[-72.81566799051467,42.01065553155384],[-72.81600699038412,42.006533530751625],[-72.8161539903276,42.00474753040403],[-72.81659499015811,41.999389529361125],[-72.81674199010163,41.99760352901344],[-72.81599098986126,41.99768352905324],[-72.8137379891403,41.99792652917319],[-72.81298798890036,41.99800852921335],[-72.8086069874935,41.998397529430534],[-72.80854198747264,41.998403529433794],[-72.79492398311515,41.999883530160744],[-72.79482998308505,41.99989353016573],[-72.79454898299517,41.99992453018082],[-72.79445598296546,41.99993553018595],[-72.79384098276874,42.00000353021899],[-72.79051198170464,42.00038553040054],[-72.78972998145474,42.000476530443414],[-72.78490397991224,42.001032530706986],[-72.7799209783195,42.001606530979075],[-72.77868297792375,42.00174853104656],[-72.77473997666343,42.00220353126199],[-72.77109897549812,42.00259853145607],[-72.77052297531044,42.00260353147573],[-72.77025797522394,42.00260353148434],[-72.77025697522362,42.00260353148437],[-72.77023897521774,42.002603531484944],[-72.76673897409874,42.00300353167539],[-72.76668397410343,42.00339153175167],[-72.76625497413889,42.00639853234292],[-72.7661399741484,42.0072045325014],[-72.76613997418792,42.00788153263135],[-72.76609797417431,42.007883532633116],[-72.76587497410755,42.00798653266012],[-72.76569097405583,42.008129532693545],[-72.765522974008,42.00824953272204],[-72.76523897392028,42.00833453274759],[-72.76473297376077,42.00843153278262],[-72.76468197374423,42.008433532784665],[-72.76350597336324,42.00848253283226],[-72.76303897321378,42.0085335328572],[-72.7625559730605,42.008608532887266],[-72.7622029729533,42.00874553292505],[-72.76177397282756,42.008990532986],[-72.76159697277812,42.0091335330192],[-72.76147397274866,42.00931653305833],[-72.76137497272866,42.00952753310204],[-72.76132097272502,42.00976753314987],[-72.7613669727471,42.00988853317161],[-72.76152797280562,42.00999053318595],[-72.7618189729073,42.01010553319858],[-72.76194897295674,42.0102255332174],[-72.76196097296179,42.01024453322066],[-72.76206397300462,42.01040253324765],[-72.76207897301688,42.01052853327137],[-72.76206397301833,42.010637533292766],[-72.7621399730541,42.0108255333264],[-72.7624159731749,42.011351533418406],[-72.76265697326986,42.01163053346414],[-72.76276797331357,42.01175853348511],[-72.76286797335054,42.011832533496055],[-72.76295497338516,42.01193953351379],[-72.76307397343248,42.01208453353775],[-72.76315097346725,42.01224953356692],[-72.76324297351765,42.012598533630914],[-72.7632199735175,42.012724533655856],[-72.7631119735036,42.013090533729624],[-72.76307997349602,42.01313953374007],[-72.76284897344198,42.013505533817835],[-72.76278997342816,42.013598533837595],[-72.76268997340152,42.01370153386059],[-72.76237497331405,42.01396453392131],[-72.76204497321434,42.014101533958325],[-72.76192997317848,42.01413053396763],[-72.76155497306534,42.01428953401032],[-72.76144397303509,42.014391534033514],[-72.76097897290839,42.01482153413112],[-72.76087897288876,42.01504453417719],[-72.7607949728837,42.01542753425343],[-72.76066397285162,42.015610534292804],[-72.76057997282781,42.01567253430744],[-72.75985997264557,42.0165765345043],[-72.75986697264898,42.01659553450776],[-72.75987397265213,42.0166105345104],[-72.75974297262367,42.016855534561685],[-72.75971997262683,42.017038534597546],[-72.75975797264661,42.0171645346205],[-72.75988097270047,42.0173995346616],[-72.76009597277633,42.01749653467324],[-72.76050997290413,42.01737053463562],[-72.76058497292702,42.017343534628004],[-72.76065497294847,42.01731953462112],[-72.76079197299154,42.01729153461132],[-72.76099897305977,42.0173025346067],[-72.76153597324644,42.01749753462669],[-72.76193397338903,42.01771453465542],[-72.76230997353582,42.01812653472229],[-72.76238597357197,42.01832053475703],[-72.7626009737009,42.01932653494314],[-72.76280797379322,42.0197505350178],[-72.76296097384684,42.019813535024916],[-72.76365097407951,42.01994053502688],[-72.76407997422417,42.020019535028126],[-72.76443997434401,42.02005953502411],[-72.76466297441384,42.02000853500708],[-72.76487797447767,42.019899534979174],[-72.7652919745964,42.01961853491181],[-72.76553897467917,42.01965553491088],[-72.76554097469106,42.019847534947665],[-72.76556997470408,42.019908534958425],[-72.76554397469938,42.01997353497175],[-72.76548297468787,42.02011753500137],[-72.76539097466217,42.02019153501856],[-72.76527597463733,42.02040853506395],[-72.76515297460283,42.02050553508655],[-72.76481597449983,42.020625535120516],[-72.76460897443756,42.02071653514472],[-72.76452397441918,42.02087653517818],[-72.7644469744234,42.0213795352772],[-72.76447797444257,42.021534535305946],[-72.76453097446453,42.02161453531957],[-72.76462297449892,42.0216885353308],[-72.7647609745463,42.02172853533398],[-72.7648609745798,42.02174353533361],[-72.76498397462113,42.021763535333456],[-72.76515997468292,42.02183753534195],[-72.7652519747203,42.02196353536315],[-72.76525897473194,42.02212353539362],[-72.76522097472922,42.02228953542671],[-72.76513597470884,42.02241553545365],[-72.76503697467915,42.02246053546551],[-72.7648529746154,42.0223975354594],[-72.76466897454436,42.02220953542929],[-72.764377974441,42.02206653541129],[-72.76408597434265,42.022014535410804],[-72.76394097429129,42.02194553540227],[-72.76387897426707,42.021877535391226],[-72.76377197421444,42.02157453533656],[-72.76374897419589,42.02138553530103],[-72.7636649741558,42.021168535262106],[-72.76354297411528,42.02115653526377],[-72.76340497407325,42.02120853527823],[-72.76285197391172,42.02153353535856],[-72.76233797376462,42.02188753544319],[-72.76230797375713,42.021927535451844],[-72.76182397362088,42.022299535538934],[-72.7616939735894,42.02248753557925],[-72.76167997358543,42.02249753558162],[-72.76155597355108,42.02260253560579],[-72.76131797348039,42.02272253563656],[-72.76127797346756,42.022726535638625],[-72.76109897341036,42.02274753564848],[-72.76098097337268,42.022761535654986],[-72.76073497329027,42.02272553565606],[-72.76062797325446,42.02271053565666],[-72.75995297301938,42.02245853563021],[-72.7597049729307,42.02232653561293],[-72.75958597288819,42.0222635356047],[-72.75940897282075,42.022098535578785],[-72.75920297272981,42.021692535507555],[-72.75917197270667,42.02146953546576],[-72.75917997269626,42.021246535422705],[-72.75911097266439,42.02108653539423],[-72.75893497260023,42.02097153537788],[-72.75872797252761,42.02088553536811],[-72.75851297245545,42.02085153536856],[-72.75805297230661,42.020874535387904],[-72.75791397226214,42.020889535395305],[-72.7576949721921,42.020914535407194],[-72.75750397213301,42.02097053542415],[-72.75737097209193,42.021010535436154],[-72.75707197200133,42.021130535468885],[-72.75687197194672,42.0213135355105],[-72.75684897194189,42.02135953552007],[-72.75672597191675,42.021616535573386],[-72.75658097187713,42.021748535603436],[-72.75642697183781,42.021936535644514],[-72.75638897183413,42.02208553567433],[-72.75641897185191,42.022222535699655],[-72.75660297193068,42.02254253575511],[-72.75667197196621,42.022765535795656],[-72.75664097196308,42.0228855358197],[-72.75656397194666,42.02303453585078],[-72.75655197194374,42.023051535854435],[-72.75620397186184,42.02359453596993],[-72.75614397184768,42.02368753598973],[-72.75597297180745,42.02395453604652],[-72.75596597180592,42.02396753604923],[-72.75591897179648,42.02406853607014],[-72.75588097178874,42.024148536086734],[-72.75582697178706,42.02442153614086],[-72.75578797178612,42.024623536180904],[-72.75570397176868,42.02479453621645],[-72.75537397168061,42.025131536291845],[-72.75519097162959,42.02528053632637],[-72.75506697159511,42.02538353635017],[-72.75489597154606,42.02549953637796],[-72.75479297151647,42.02556853639455],[-72.75471397149389,42.02562353640768],[-72.75452997143977,42.02572553643323],[-72.75449097143009,42.02577753644447],[-72.75446797142455,42.02581153645174],[-72.75442997141647,42.025885536467165],[-72.75431497139697,42.0261945365302],[-72.75420797137214,42.02636753656687],[-72.7539849713206,42.02673153664397],[-72.75396897132238,42.02685153666751],[-72.75389997130954,42.0270175367016],[-72.75377697128071,42.027211536742826],[-72.75356997122282,42.02737753678141],[-72.75326197113482,42.02759253683266],[-72.75293297104092,42.02782353688767],[-72.75284397101747,42.02791953690898],[-72.75269897097913,42.02807353694324],[-72.75253397093566,42.028251536982744],[-72.75232397088654,42.02858453705344],[-72.75226497087287,42.0286805370738],[-72.75221397086119,42.028765537091765],[-72.75212597084092,42.028910537122435],[-72.75202697081818,42.02907453715713],[-72.75191897080033,42.02937253721781],[-72.75186197079105,42.029532537250354],[-72.75178097077774,42.029757537296156],[-72.75176597077537,42.0298005373049],[-72.75185697083714,42.0303495374073],[-72.75192897086595,42.0304405374224],[-72.75195697087713,42.03047553742822],[-72.7520409709149,42.03065253745944],[-72.752277971008,42.03092153750336],[-72.75245497107313,42.03104753752181],[-72.75252997110195,42.03112153753355],[-72.7528379712202,42.03142453758171],[-72.7530229712892,42.03157153760391],[-72.75323597136855,42.031739537629235],[-72.75370297154039,42.03207153767777],[-72.75414797170035,42.03232253771149],[-72.75416797170735,42.032330537712355],[-72.75479497192782,42.032600537743804],[-72.75512097204243,42.032740537760084],[-72.75514697205146,42.03274953776097],[-72.75587997230559,42.033003537785895],[-72.75623897242819,42.03309553779189],[-72.75660997255494,42.033191537798274],[-72.7570839727168,42.03331353780628],[-72.75717597274918,42.03335353781096],[-72.75717597275188,42.03339953781978],[-72.7570759727247,42.03349353784108],[-72.75696097269365,42.0336045378661],[-72.75685297268579,42.034073537959586],[-72.75679197267253,42.03418753798344],[-72.75659197262125,42.03442753803599],[-72.7562239725198,42.0347475381093],[-72.75616197250324,42.03481053812342],[-72.75600897247163,42.035124538188626],[-72.7559399724615,42.03533653823154],[-72.75594797246913,42.035422538247786],[-72.75597797249594,42.03571353830263],[-72.75599497252959,42.036194538394376],[-72.75585097248305,42.03620253840056],[-72.75583897247918,42.03620353840116],[-72.75541897234328,42.03622453841882],[-72.75527497229675,42.03623253842503],[-72.75503997222071,42.03624453843496],[-72.7543349719927,42.036281538464955],[-72.75410097191705,42.03629453847505],[-72.75393897186468,42.03630353848203],[-72.7516059710977,42.036213538540515],[-72.7513409710106,42.036203538547205],[-72.74784396987128,42.03624553866878],[-72.74555996912724,42.03627453874847],[-72.74509396897544,42.03628053876476],[-72.74149896780413,42.036323538889675],[-72.724254962186,42.0365365394899],[-72.72217996150994,42.036562539562155],[-72.7218979614181,42.036566539572085],[-72.71916496052764,42.036600539667205],[-72.71893796045369,42.036603539675134],[-72.71591195946019,42.03651153975556],[-72.71589295945394,42.03651053975599],[-72.71563795937027,42.036503539762904],[-72.71552395933348,42.036511539768135],[-72.71436495896023,42.03660053982278],[-72.71433795895159,42.03660353982423],[-72.71413795890375,42.036903539888286],[-72.71339695866179,42.03690353991229],[-72.71231595830879,42.03690353994732],[-72.71190395817426,42.036903539960676],[-72.71100895788199,42.03690353998967],[-72.70887595718544,42.03690354005878],[-72.70398395558792,42.036903540217274],[-72.70247895509644,42.036903540266024],[-72.70034695440022,42.03690354033507],[-72.7002449543669,42.03690354033838],[-72.70003695429897,42.036903540345115],[-72.69994095426645,42.036883540344384],[-72.69984095423268,42.036864540344],[-72.69953695412984,42.03680354034211],[-72.69945295410241,42.03680354034485],[-72.69661795317688,42.03680854043761],[-72.69638895310216,42.03680954044521],[-72.69629195307013,42.03680354044721],[-72.68775595025323,42.03630154062723],[-72.6862409497531,42.036209540658604],[-72.68613694971879,42.03620354066082],[-72.68602094968038,42.036194540662855],[-72.68288294864129,42.035949540717375],[-72.68288194864097,42.03594954071741],[-72.67843494716847,42.0356035407949],[-72.67833194713425,42.035593540796306],[-72.67554794621006,42.03533654083705],[-72.67303494537578,42.035103540873614],[-72.67301594536944,42.035101540873846],[-72.66328894214115,42.03421754101872],[-72.66320494211325,42.0342095410199],[-72.6574839402213,42.033806541127475],[-72.65743594020543,42.03380354112844],[-72.64718593679899,42.032795541266154],[-72.64345693556004,42.032434541317286],[-72.64314893545794,42.032408541322255],[-72.64299093540562,42.03239654132505],[-72.6416509349626,42.03230454135066],[-72.64163393495699,42.03230354135102],[-72.63982493436029,42.032203541390246],[-72.63925493417186,42.03216454140116],[-72.63754493360669,42.03205054143449],[-72.63697593341863,42.03201254144556],[-72.63683393337173,42.03200354144842],[-72.63319993217456,42.03182854153213],[-72.62187492844366,42.03128354179297],[-72.61813492721154,42.03110354187906],[-72.6180999272001,42.0311035418802],[-72.6178629271227,42.03110354188784],[-72.61715192689043,42.031103541910774],[-72.6169479268238,42.03110354191735],[-72.61691492681302,42.03110354191842],[-72.61683392678655,42.03110354192103],[-72.61675292675997,42.03110154192325],[-72.61626792660104,42.03109254193716],[-72.61610692654833,42.03109054194198],[-72.61523292626195,42.03107554196727],[-72.61261092540298,42.03103254204358],[-72.61173792511697,42.03101854206905],[-72.61159092506877,42.03101554207319],[-72.61115292492529,42.03100854208598],[-72.6110069248775,42.0310065420903],[-72.6108339248208,42.03100354209531],[-72.61051892471663,42.03098154210125],[-72.60905592423286,42.03088054212902],[-72.60856892407185,42.0308475421384],[-72.60844092402952,42.03083854214078],[-72.6082509239667,42.03082554214443],[-72.60805992390348,42.030811542147894],[-72.60793392386188,42.030803542150416],[-72.60777492375685,42.02988854197987],[-72.6075389236002,42.02851654172405],[-72.60730192344315,42.027143541468085],[-72.60714492333881,42.026228541297456],[-72.60713592333303,42.02617954128836],[-72.60712392332488,42.026106541274714],[-72.60711092331634,42.02603254126092],[-72.6071029233109,42.025983541251776],[-72.60706892328837,42.02578654121504],[-72.60701892325505,42.025493541160394],[-72.60696692322095,42.02519854110542],[-72.60693392319887,42.02500354106905],[-72.60641692302998,42.02500354108572],[-72.60486692252368,42.025003541135675],[-72.60435092235512,42.0250035411523],[-72.60433392234957,42.02500354115284],[-72.60404592225538,42.02500154116175],[-72.60313292195679,42.024995541190016],[-72.60285492186593,42.024994541198794],[-72.60282892185742,42.02499454119963],[-72.60244792173279,42.02499154121132],[-72.60130592135934,42.02498454124678],[-72.60095192124365,42.024983541257996],[-72.60092592123516,42.02498354125883],[-72.60040692106584,42.024987541276325],[-72.59885192055853,42.02499854132854],[-72.5983339203896,42.025003541346194],[-72.59830792038105,42.02500254134685],[-72.59822892035507,42.02499954134881],[-72.59820392034685,42.02499854134942],[-72.59662191982665,42.02493954138906],[-72.59187891826706,42.02476354150806],[-72.59029791774724,42.024705541547824],[-72.59023291772588,42.02470354154956],[-72.59020891771804,42.02470354155032],[-72.58994391763146,42.02470354155885],[-72.58985591760273,42.0247035415617],[-72.58984991760076,42.0247035415619],[-72.58983491759587,42.02470354156237],[-72.58982991759423,42.02470354156253],[-72.58959491751746,42.0247035415701],[-72.5893109174247,42.024703541579235],[-72.58910291735675,42.02470354158595],[-72.58775591691672,42.02470354162933],[-72.5872379167475,42.02470354164601],[-72.58659191653645,42.02470354166681],[-72.58465591590401,42.024703541729146],[-72.5840109156933,42.024703541749915],[-72.58393291566782,42.02470354175242],[-72.58387391564855,42.02470354175432],[-72.5834639155146,42.02470354176752],[-72.58282391530553,42.02470354178813],[-72.58279091529477,42.02470354178918],[-72.58233291514513,42.02470354180394],[-72.58163291494542,42.025203541922465],[-72.581549914921,42.025250541934184],[-72.58085491471661,42.025641542031636],[-72.57951891432376,42.026394542219236],[-72.57612591332592,42.02830554269542],[-72.57590691326267,42.02844854272992],[-72.5750809130232,42.02897354285733],[-72.57426891278787,42.029490542982735],[-72.57417091275948,42.02955354299799],[-72.57323591248846,42.03014854314233],[-72.56812891085028,42.030672543407285],[-72.56177690881707,42.031400543751424],[-72.5613869086926,42.03145154377376],[-72.56135690868292,42.03145354377513],[-72.56099590856613,42.03147354379056],[-72.55995190822779,42.03152154383337],[-72.55943490806195,42.03157454386018],[-72.55323090607126,42.032203544180476],[-72.55301090600042,42.032221544190996],[-72.54124790221377,42.033205544758076],[-72.54105890215287,42.03322054476703],[-72.54087090209232,42.033235544775955],[-72.54087090209238,42.03323654477613],[-72.53930390158797,42.03336854485185],[-72.53665090073379,42.03358854497934],[-72.53594090050531,42.03364954501386],[-72.53157589910008,42.03401454522417],[-72.5308898988792,42.03407154525716],[-72.5288318982167,42.034244545356486],[-72.52814689799618,42.034302545389615],[-72.52813089799102,42.03430354539033],[-72.52743989776522,42.03430354541252],[-72.52532089707276,42.034303545480576],[-72.52461489684207,42.03430354550324],[-72.52370389654438,42.034303545532495],[-72.52097389565223,42.034303545620155],[-72.52023289541009,42.03430354564394],[-72.52006389535521,42.03430954565052],[-72.51947889516518,42.03432954567314],[-72.51772389459515,42.034389545741],[-72.51733089446752,42.0344035457563],[-72.51713989440476,42.03439754576128],[-72.51554989388227,42.03434754580272],[-72.51078189231548,42.03419854592712],[-72.50919289179339,42.03414954596871],[-72.49958888864884,42.034047546257206],[-72.49284388644213,42.03400754646582],[-72.49274588641005,42.034006546468774],[-72.49207088618904,42.03399954648907],[-72.49203888617859,42.0339995464901],[-72.48469488377513,42.03394354671474],[-72.47985688219177,42.033906546862674],[-72.46958987884166,42.03400354721018],[-72.46957787883774,42.034003547210574],[-72.46012187574905,42.03403954752026],[-72.45973387562256,42.03404554753383],[-72.45972887562094,42.034045547533985],[-72.45818587511808,42.034071547588375],[-72.45668087462248,42.034007547624256],[-72.45637687452309,42.03400754763398],[-72.45635387451551,42.034006547634526],[-72.45608887442803,42.03399154764013],[-72.45583887434603,42.03398654764716],[-72.4494478722499,42.03386354782805],[-72.4445998706606,42.033783547967765],[-72.44226386989423,42.03373554803326],[-72.44174286972392,42.03373554804993],[-72.44165386969485,42.03373554805277],[-72.44144786962744,42.033734548059165],[-72.43786486844887,42.03360754814934],[-72.43639286796679,42.033591548193336],[-72.43576886776373,42.03360754821636],[-72.43550486767725,42.03360454822423],[-72.43544886765896,42.03360454822602],[-72.4341468672326,42.033591548265164],[-72.43274386677321,42.0335785483075],[-72.42813186526303,42.03353454844647],[-72.41880986221035,42.03344354872686],[-72.41878786220317,42.03344354872756],[-72.41687386157585,42.03341554878333],[-72.41635086140435,42.0334065487983],[-72.415803861225,42.03339754881405],[-72.41553286113619,42.033393548821934],[-72.39743185520135,42.03309554934257],[-72.39307985377575,42.03304754947222],[-72.39303385376058,42.03304554947331],[-72.39203985343296,42.03299954949618],[-72.39192285339466,42.03299854949972],[-72.3895758526264,42.03298254957152],[-72.38925785252174,42.03297054957935],[-72.38925485252075,42.03297054957945],[-72.38599185144633,42.032838549658166],[-72.38595685143495,42.032839549659485],[-72.37452684769335,42.03276155000894],[-72.36774184547278,42.03272555021827],[-72.36771884546525,42.03272555021901],[-72.36707084525285,42.03271655023793],[-72.36699184522686,42.032713550239876],[-72.36573084481248,42.03267755027313],[-72.36559684476853,42.032675550277006],[-72.36557384476103,42.03267555027774],[-72.3550308413044,42.03251455058265],[-72.35367084085799,42.03248455062019],[-72.35356084082191,42.0324825506233],[-72.34840883913331,42.03241455077428],[-72.3389268360161,42.03212455102034],[-72.33888183600138,42.03212455102177],[-72.33885683599324,42.032125551022766],[-72.33725483546984,42.03213355107526],[-72.33371083431209,42.03215455119205],[-72.3248018313914,42.032027551451],[-72.32196083046003,42.03198755153364],[-72.32182183041463,42.031988551538255],[-72.32125783023065,42.03199655155772],[-72.32124983022803,42.03199655155798],[-72.32104383016085,42.03199955156511],[-72.31714882888224,42.03191555167277],[-72.31708582886162,42.03191555167477],[-72.30846382603858,42.03185755193764],[-72.30572482514177,42.0318395520212],[-72.29992882324406,42.03180255219819],[-72.2999218232417,42.03180155219821],[-72.29963882314904,42.03179955220683],[-72.29155982050544,42.031777552459126],[-72.2915438205002,42.03177755245964],[-72.28743481915565,42.031766552587946],[-72.28028281681527,42.031746552811065],[-72.27984581667228,42.03174555282474],[-72.27894381637714,42.03174355285297],[-72.27163481398537,42.03172455308117],[-72.27157781396673,42.031724553082974],[-72.27067581366964,42.03168855310466],[-72.27059981364461,42.031685553106485],[-72.26212981087292,42.03166455337101],[-72.24952380674763,42.03163455376473],[-72.24897180655927,42.03149755375587],[-72.24881380650535,42.03145855375339],[-72.24722780598563,42.03144255380055],[-72.24129280404074,42.03138255397699],[-72.24128680403878,42.03138255397718],[-72.24098180393894,42.03138155398664],[-72.23978580354706,42.03137055402241],[-72.23947680344583,42.03136755403161],[-72.23226880108459,42.03131055424883],[-72.22858279987715,42.03128255436014],[-72.22830779978707,42.03128055436846],[-72.22830679978676,42.03128055436849],[-72.22688679932158,42.03126955441131],[-72.22687579931792,42.031268554411454],[-72.22677979928645,42.0312675544143],[-72.2125787946323,42.03112255483565],[-72.21257079462968,42.0311225548359],[-72.21240179457433,42.03112155484106],[-72.21088979407914,42.03111255488714],[-72.20508179217697,42.03107755506403],[-72.20461179202303,42.031074555078305],[-72.19892079015887,42.031035555250675],[-72.19889579015067,42.03103555525146],[-72.19882779012838,42.03103455525343],[-72.19876579010808,42.03103455525539],[-72.19519278893765,42.03100955536348],[-72.18802278658809,42.03094555557767],[-72.18668678615033,42.030934555617755],[-72.18464878548265,42.03091955567921],[-72.17850378346964,42.03087755586515],[-72.17548978248225,42.03085655595626],[-72.1754357824645,42.030855555957785],[-72.17543378246386,42.03085555595784],[-72.17406478201558,42.0308495559999],[-72.17100378101291,42.03083055609285],[-72.17059878088027,42.03082855610524],[-72.16875678027459,42.03077655615337],[-72.16839678015623,42.0307665561628],[-72.16833378013554,42.0307655561646],[-72.16610177940339,42.030733556228874],[-72.16562377924664,42.0307275562428],[-72.16295777837216,42.03069055631978],[-72.15783077669091,42.03062755646938],[-72.15112777449363,42.03055955666765],[-72.1500807741505,42.03055055669893],[-72.15007177414756,42.03055055669921],[-72.14866477368643,42.03053855674125],[-72.14837477359187,42.03054455675155],[-72.14742477328203,42.030562556784965],[-72.14731177324522,42.03056555678909],[-72.14652077298744,42.03058455681768],[-72.14572877272941,42.03060455684649],[-72.14502877250143,42.0306235568722],[-72.14480077242715,42.03062955688055],[-72.14479877242648,42.03062955688061],[-72.14400877216694,42.03061155690205],[-72.143238771914,42.03059455692304],[-72.14319177189857,42.03059355692433],[-72.14310477187016,42.03059455692726],[-72.14229677160353,42.030555556945224],[-72.14197777149829,42.0305405569524],[-72.14010777088119,42.03044955699381],[-72.13681776979618,42.03030255706919],[-72.13681376979484,42.03030155706914],[-72.13621376959684,42.030272557082455],[-72.13621176959613,42.03027155708232],[-72.13571576943284,42.03025455709467],[-72.1356877694236,42.03025355709537],[-72.13507476922148,42.030226557109486],[-72.13503176920723,42.03022355711026],[-72.13111576791698,42.030069557203994],[-72.12617676628658,42.02982155731181],[-72.12612776627037,42.02981855731279],[-72.12452076574162,42.02976855735377],[-72.12446776572445,42.02977155735601],[-72.12400976557531,42.02978455737293],[-72.12258876510798,42.02974455740997],[-72.12237376503728,42.02973855741559],[-72.1198597642105,42.029667557481055],[-72.11861676380173,42.02963255751347],[-72.11856776378563,42.02963155751482],[-72.11184376156679,42.02930955766446],[-72.10949876079373,42.0292105577192],[-72.1063897597687,42.02907855779162],[-72.10369675887766,42.028907557843425],[-72.10360375884687,42.0289015578452],[-72.10339575877806,42.028888557849235],[-72.10309475867848,42.02886955785505],[-72.10277875857393,42.028849557861136],[-72.10274075856138,42.02884755786194],[-72.10246175846905,42.028829557867255],[-72.10216675837141,42.02881055787289]]] \ No newline at end of file From 026e969a67d8f6412901df5a113c51a7416a051b Mon Sep 17 00:00:00 2001 From: David Ellis Date: Mon, 7 Oct 2024 18:16:34 -0500 Subject: [PATCH 06/16] Fix compiler warning-as-error on Windows --- src/apps/filters/h3.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/filters/h3.c b/src/apps/filters/h3.c index cdab07b10..32a85cc1f 100644 --- a/src/apps/filters/h3.c +++ b/src/apps/filters/h3.c @@ -1497,7 +1497,7 @@ SUBCOMMAND(maxPolygonToCellsSize, if (err != E_SUCCESS) { return err; } - printf("%ld\n", cellsSize); + printf("%" PRId64 "\n", cellsSize); return E_SUCCESS; } From 8201d0f431efb5fea25cc4de08ae83d1837c67bc Mon Sep 17 00:00:00 2001 From: David Ellis Date: Mon, 7 Oct 2024 22:20:30 -0500 Subject: [PATCH 07/16] I totally get the memory leak pedantry for the library, but the CLI is just going to quit milliseconds after it's finished processing the data and printing to the screen, so it's kinda painful here. --- src/apps/filters/h3.c | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/apps/filters/h3.c b/src/apps/filters/h3.c index 32a85cc1f..91d9c07d9 100644 --- a/src/apps/filters/h3.c +++ b/src/apps/filters/h3.c @@ -1240,13 +1240,16 @@ H3Error polygonStringToGeoPolygon(FILE *fp, char *polygonString, out->geoloop.verts = verts; out->geoloop.numVerts = curVert; } else { - GeoLoop *holes = calloc(++(out->numHoles), sizeof(GeoLoop)); - for (int i = 0; i < out->numHoles - 1; i++) { + GeoLoop *holes = calloc(out->numHoles + 1, sizeof(GeoLoop)); + for (int i = 0; i < out->numHoles; i++) { holes[i].numVerts = out->holes[i].numVerts; holes[i].verts = out->holes[i].verts; } free(out->holes); + holes[out->numHoles].verts = verts; + holes[out->numHoles].numVerts = curVert; out->holes = holes; + out->numHoles++; } curLoop++; curVert = 0; @@ -1338,6 +1341,7 @@ H3Error polygonStringToGeoPolygon(FILE *fp, char *polygonString, } } } + free(verts); return E_SUCCESS; } @@ -1400,10 +1404,10 @@ SUBCOMMAND( } GeoPolygon polygon = {0}; H3Error err = polygonStringToGeoPolygon(fp, polygonStr, &polygon); + if (fp != 0 && !isStdin) { + fclose(fp); + } if (err != E_SUCCESS) { - if (!isStdin) { - fclose(fp); - } return err; } int64_t cellsSize = 0; @@ -1413,6 +1417,11 @@ SUBCOMMAND( } H3Index *cells = calloc(cellsSize, sizeof(H3Index)); err = H3_EXPORT(polygonToCells)(&polygon, res, 0, cells); + for (int i = 0; i < polygon.numHoles; i++) { + free(polygon.holes[i].verts); + } + free(polygon.holes); + free(polygon.geoloop.verts); if (err != E_SUCCESS) { free(cells); return err; @@ -1486,14 +1495,19 @@ SUBCOMMAND(maxPolygonToCellsSize, } GeoPolygon polygon = {0}; H3Error err = polygonStringToGeoPolygon(fp, polygonStr, &polygon); + if (fp != 0 && !isStdin) { + fclose(fp); + } if (err != E_SUCCESS) { - if (!isStdin) { - fclose(fp); - } return err; } int64_t cellsSize = 0; err = H3_EXPORT(maxPolygonToCellsSize)(&polygon, res, 0, &cellsSize); + for (int i = 0; i < polygon.numHoles; i++) { + free(polygon.holes[i].verts); + } + free(polygon.holes); + free(polygon.geoloop.verts); if (err != E_SUCCESS) { return err; } From 0c4903b898b2e913f1fc356e5e6bacd1ccd6019d Mon Sep 17 00:00:00 2001 From: David Ellis Date: Tue, 8 Oct 2024 07:58:59 -0500 Subject: [PATCH 08/16] Update src/apps/filters/h3.c --- src/apps/filters/h3.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/filters/h3.c b/src/apps/filters/h3.c index 91d9c07d9..ded15942d 100644 --- a/src/apps/filters/h3.c +++ b/src/apps/filters/h3.c @@ -1232,7 +1232,7 @@ H3Error polygonStringToGeoPolygon(FILE *fp, char *polygonString, break; } strPos++; - // We may need to set upa new geoloop at this point. If the + // We may need to set up a new geoloop at this point. If the // curDepth <= maxDepth - 2 then we increment the curLoop and get a // new one set up. if (curDepth <= maxDepth - 2) { From 4a8ca4033f4e6cfc113693a6b3836b6cabd5343b Mon Sep 17 00:00:00 2001 From: David Ellis Date: Tue, 8 Oct 2024 08:11:50 -0500 Subject: [PATCH 09/16] Update src/apps/filters/h3.c --- src/apps/filters/h3.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/filters/h3.c b/src/apps/filters/h3.c index ded15942d..6b35d0b3e 100644 --- a/src/apps/filters/h3.c +++ b/src/apps/filters/h3.c @@ -1290,7 +1290,7 @@ H3Error polygonStringToGeoPolygon(FILE *fp, char *polygonString, } // Check for whitespace and skip it if we reach this point. if (polygonString[strPos] == ',' || polygonString[strPos] == ' ' || - polygonString[strPos] == '\n') { + polygonString[strPos] == '\n' || polygonString[strPos] == '\t') { strPos++; continue; } else { From 0d6dc71ae0f6e390367dee23ba16e6a0dc2d0467 Mon Sep 17 00:00:00 2001 From: David Ellis Date: Wed, 9 Oct 2024 11:50:16 -0500 Subject: [PATCH 10/16] git clean -ffdx is my friend --- src/apps/filters/h3.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/filters/h3.c b/src/apps/filters/h3.c index 6b35d0b3e..f7ad1af42 100644 --- a/src/apps/filters/h3.c +++ b/src/apps/filters/h3.c @@ -1262,7 +1262,7 @@ H3Error polygonStringToGeoPolygon(FILE *fp, char *polygonString, // comma, and more optional whitespace, and a second floating point // value, then store the lat, lng pair double lat, lng; - int count; + int count = 0; // Must grab the closing ] or we might accidentally parse a partial // float across buffer boundaries char closeBracket[2] = "]"; From 6d2fab5f8d1812ea41c7a2a6d78390f62c98a3ff Mon Sep 17 00:00:00 2001 From: David Ellis Date: Sun, 13 Oct 2024 15:21:17 -0500 Subject: [PATCH 11/16] Apply suggestions from code review Co-authored-by: Isaac Brodsky --- src/apps/filters/h3.c | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/apps/filters/h3.c b/src/apps/filters/h3.c index f7ad1af42..26d377ea3 100644 --- a/src/apps/filters/h3.c +++ b/src/apps/filters/h3.c @@ -1290,7 +1290,8 @@ H3Error polygonStringToGeoPolygon(FILE *fp, char *polygonString, } // Check for whitespace and skip it if we reach this point. if (polygonString[strPos] == ',' || polygonString[strPos] == ' ' || - polygonString[strPos] == '\n' || polygonString[strPos] == '\t') { + polygonString[strPos] == '\n' || polygonString[strPos] == '\t' || + polygonString[strPos] == '\r') { strPos++; continue; } else { @@ -1371,9 +1372,8 @@ SUBCOMMAND( .valueName = "res", .value = &res, .helpText = - "Resolution, 0-15 inclusive, that the compacted set " - "should be uncompacted to. Must be greater than or equal " - "to the highest resolution within the compacted set."}; + "Resolution, 0-15 inclusive, that the polygon " + "should be converted to."}; Arg *args[] = {&polygonToCellsArg, &helpArg, &filenameArg, &polygonStrArg, &resArg}; PARSE_SUBCOMMAND(argc, argv, args); @@ -1439,7 +1439,7 @@ SUBCOMMAND( SUBCOMMAND(maxPolygonToCellsSize, "Returns the maximum number of cells that could be needed to cover " - "the polygon. Will always be more than actually necessary") { + "the polygon. Will always be equal or more than actually necessary") { char filename[1024] = {0}; // More than Windows, lol Arg filenameArg = { .names = {"-f", "--file"}, @@ -1462,16 +1462,15 @@ SUBCOMMAND(maxPolygonToCellsSize, .valueName = "res", .value = &res, .helpText = - "Resolution, 0-15 inclusive, that the compacted set " - "should be uncompacted to. Must be greater than or equal " - "to the highest resolution within the compacted set."}; + "Resolution, 0-15 inclusive, that the polygon " + "should be converted to."}; Arg *args[] = {&maxPolygonToCellsSizeArg, &helpArg, &filenameArg, &polygonStrArg, &resArg}; PARSE_SUBCOMMAND(argc, argv, args); if (!filenameArg.found && !polygonStrArg.found) { fprintf(stderr, "You must provide either a file to read from or a polygon " - "to cover to use polygonToCells"); + "to cover to use maxPolygonToCellsSize"); exit(1); } FILE *fp = 0; @@ -1516,7 +1515,7 @@ SUBCOMMAND(maxPolygonToCellsSize, } SUBCOMMAND(cellsToMultiPolygon, - "Returns a polygon (array of lat, lng points, or array of arrays of " + "Returns a polygon (array of arrays of " "lat, lng points) for a set of cells") { char filename[1024] = {0}; // More than Windows, lol Arg filenameArg = { @@ -1532,7 +1531,7 @@ SUBCOMMAND(cellsToMultiPolygon, .valueName = "CELLS", .value = &cellStrs, .helpText = - "The cells to compact. Up to 100 cells if provided " + "The cells to convert. Up to 100 cells if provided " "as hexadecimals with zero padding."}; Arg *args[] = {&cellsToMultiPolygonArg, &helpArg, &filenameArg, &cellStrsArg}; @@ -1540,7 +1539,7 @@ SUBCOMMAND(cellsToMultiPolygon, if (!filenameArg.found && !cellStrsArg.found) { fprintf(stderr, "You must provide either a file to read from or a set of cells " - "to compact to use compactCells"); + "to convert to use cellsToMultiPolygon"); exit(1); } FILE *fp = 0; From ad7dddc4ba0790efca887472a3a802ec81f147ea Mon Sep 17 00:00:00 2001 From: David Ellis Date: Sun, 13 Oct 2024 16:03:07 -0500 Subject: [PATCH 12/16] Fix formatting --- src/apps/filters/h3.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/apps/filters/h3.c b/src/apps/filters/h3.c index 26d377ea3..ad5be9a6b 100644 --- a/src/apps/filters/h3.c +++ b/src/apps/filters/h3.c @@ -1437,9 +1437,10 @@ SUBCOMMAND( return E_SUCCESS; } -SUBCOMMAND(maxPolygonToCellsSize, - "Returns the maximum number of cells that could be needed to cover " - "the polygon. Will always be equal or more than actually necessary") { +SUBCOMMAND( + maxPolygonToCellsSize, + "Returns the maximum number of cells that could be needed to cover " + "the polygon. Will always be equal or more than actually necessary") { char filename[1024] = {0}; // More than Windows, lol Arg filenameArg = { .names = {"-f", "--file"}, From d3a5a778da8d28bbc16c128440b87ebe4dba18cb Mon Sep 17 00:00:00 2001 From: David Ellis Date: Sun, 13 Oct 2024 16:47:24 -0500 Subject: [PATCH 13/16] Abort polygon parsing early if we know the input is invalid --- src/apps/filters/h3.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/apps/filters/h3.c b/src/apps/filters/h3.c index ad5be9a6b..a9a10d039 100644 --- a/src/apps/filters/h3.c +++ b/src/apps/filters/h3.c @@ -1222,6 +1222,10 @@ H3Error polygonStringToGeoPolygon(FILE *fp, char *polygonString, if (curDepth > maxDepth) { maxDepth = curDepth; } + if (curDepth > 4) { + // This is beyond the depth for a valid input, so we abort early + return E_FAILED; + } strPos++; continue; } From bcaac46fb200a3f21f385bc52ba118628379ad0b Mon Sep 17 00:00:00 2001 From: David Ellis Date: Sun, 13 Oct 2024 19:50:02 -0500 Subject: [PATCH 14/16] Apply suggestions from code review Co-authored-by: Isaac Brodsky --- src/apps/filters/h3.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/filters/h3.c b/src/apps/filters/h3.c index a9a10d039..4be0ddd34 100644 --- a/src/apps/filters/h3.c +++ b/src/apps/filters/h3.c @@ -1381,7 +1381,7 @@ SUBCOMMAND( Arg *args[] = {&polygonToCellsArg, &helpArg, &filenameArg, &polygonStrArg, &resArg}; PARSE_SUBCOMMAND(argc, argv, args); - if (!filenameArg.found && !polygonStrArg.found) { + if (filenameArg.found == polygonStrArg.found) { fprintf(stderr, "You must provide either a file to read from or a polygon " "to cover to use polygonToCells"); @@ -1472,7 +1472,7 @@ SUBCOMMAND( Arg *args[] = {&maxPolygonToCellsSizeArg, &helpArg, &filenameArg, &polygonStrArg, &resArg}; PARSE_SUBCOMMAND(argc, argv, args); - if (!filenameArg.found && !polygonStrArg.found) { + if (filenameArg.found == polygonStrArg.found) { fprintf(stderr, "You must provide either a file to read from or a polygon " "to cover to use maxPolygonToCellsSize"); @@ -1541,7 +1541,7 @@ SUBCOMMAND(cellsToMultiPolygon, Arg *args[] = {&cellsToMultiPolygonArg, &helpArg, &filenameArg, &cellStrsArg}; PARSE_SUBCOMMAND(argc, argv, args); - if (!filenameArg.found && !cellStrsArg.found) { + if (filenameArg.found == polygonStrArg.found) { fprintf(stderr, "You must provide either a file to read from or a set of cells " "to convert to use cellsToMultiPolygon"); From 8446f87f04b544403e05c05aa1363f397a35b941 Mon Sep 17 00:00:00 2001 From: David Ellis Date: Sun, 13 Oct 2024 19:53:19 -0500 Subject: [PATCH 15/16] Update src/apps/filters/h3.c Co-authored-by: Isaac Brodsky --- src/apps/filters/h3.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/filters/h3.c b/src/apps/filters/h3.c index 4be0ddd34..7c76aadb6 100644 --- a/src/apps/filters/h3.c +++ b/src/apps/filters/h3.c @@ -1541,7 +1541,7 @@ SUBCOMMAND(cellsToMultiPolygon, Arg *args[] = {&cellsToMultiPolygonArg, &helpArg, &filenameArg, &cellStrsArg}; PARSE_SUBCOMMAND(argc, argv, args); - if (filenameArg.found == polygonStrArg.found) { + if (filenameArg.found == cellStrsArg.found) { fprintf(stderr, "You must provide either a file to read from or a set of cells " "to convert to use cellsToMultiPolygon"); From 03b8c979c683af18249750983aa0e44eaaa3ff14 Mon Sep 17 00:00:00 2001 From: David Ellis Date: Mon, 14 Oct 2024 15:03:54 -0500 Subject: [PATCH 16/16] Address comments by @nrabinowitz --- src/apps/filters/h3.c | 146 +++++++++++++++++++++++------------------- 1 file changed, 79 insertions(+), 67 deletions(-) diff --git a/src/apps/filters/h3.c b/src/apps/filters/h3.c index 7c76aadb6..3f061a093 100644 --- a/src/apps/filters/h3.c +++ b/src/apps/filters/h3.c @@ -37,6 +37,10 @@ #include "h3Index.h" #include "utility.h" +#define BUFFER_SIZE 1500 +#define BUFFER_SIZE_LESS_CELL 1485 +#define BUFFER_SIZE_WITH_NULL 1501 + #define PARSE_SUBCOMMAND(argc, argv, args) \ if (parseArgs(argc, argv, sizeof(args) / sizeof(Arg *), args, &helpArg, \ args[0]->helpText)) { \ @@ -947,7 +951,8 @@ H3Index *readCellsFromFile(FILE *fp, char *buffer, size_t *totalCells) { bufferOffset = 0; int lastGoodOffset = 0; H3Index cell = 0; - while (bufferOffset < 1485) { // Keep consuming as much as possible + while (bufferOffset < + BUFFER_SIZE_LESS_CELL) { // Keep consuming as much as possible // A valid H3 cell is exactly 15 hexadecomical characters. // Determine if we have a match, otherwise increment int scanlen = 0; @@ -961,7 +966,7 @@ H3Index *readCellsFromFile(FILE *fp, char *buffer, size_t *totalCells) { } // If we still don't have a cell and we've reached the end, we reset // the offset and `continue` to trigger another read - if (cell == 0 && bufferOffset == 1500) { + if (cell == 0 && bufferOffset == BUFFER_SIZE) { bufferOffset = 0; continue; } else if (cell != 0) { @@ -989,15 +994,15 @@ H3Index *readCellsFromFile(FILE *fp, char *buffer, size_t *totalCells) { // end, so if lastGoodOffset is 1485 or less, we force it to 1485 and // then move the chunk as specified to the beginning and adjust the // cellStrsOffset. - if (lastGoodOffset < 1485) { - lastGoodOffset = 1485; + if (lastGoodOffset < BUFFER_SIZE_LESS_CELL) { + lastGoodOffset = BUFFER_SIZE_LESS_CELL; } - for (int i = 0; i < 1500 - lastGoodOffset; i++) { + for (int i = 0; i < BUFFER_SIZE - lastGoodOffset; i++) { buffer[i] = buffer[i + lastGoodOffset]; } - bufferOffset = 1500 - lastGoodOffset; - } while (fp != 0 && - fread(buffer + bufferOffset, 1, 1500 - bufferOffset, fp) != 0); + bufferOffset = BUFFER_SIZE - lastGoodOffset; + } while (fp != 0 && fread(buffer + bufferOffset, 1, + BUFFER_SIZE - bufferOffset, fp) != 0); *totalCells = cellsOffset; return cells; } @@ -1014,8 +1019,10 @@ SUBCOMMAND(compactCells, .value = &filename, .helpText = "The file to load the cells from. Use -- to read from stdin."}; - char cellStrs[1501] = {0}; // Up to 100 cells with zero padding + char cellStrs[BUFFER_SIZE_WITH_NULL] = { + 0}; // Up to 100 cells with zero padding Arg cellStrsArg = {.names = {"-c", "--cells"}, + // TODO: Can I use `BUFFER_SIZE` here somehow? .scanFormat = "%1500c", .valueName = "CELLS", .value = &cellStrs, @@ -1044,7 +1051,7 @@ SUBCOMMAND(compactCells, exit(1); } // Do the initial population of data from the file - if (fread(cellStrs, 1, 1500, fp) == 0) { + if (fread(cellStrs, 1, BUFFER_SIZE, fp) == 0) { fprintf(stderr, "The specified file is empty."); exit(1); } @@ -1092,7 +1099,7 @@ SUBCOMMAND(uncompactCells, .value = &filename, .helpText = "The file to load the cells from. Use -- to read from stdin."}; - char cellStrs[1501] = { + char cellStrs[BUFFER_SIZE_WITH_NULL] = { 0}; // Supports up to 100 cells at a time with zero padding Arg cellStrsArg = { .names = {"-c", "--cells"}, @@ -1147,7 +1154,7 @@ SUBCOMMAND(uncompactCells, exit(1); } // Do the initial population of data from the file - if (fread(cellStrs, 1, 1500, fp) == 0) { + if (fread(cellStrs, 1, BUFFER_SIZE, fp) == 0) { fprintf(stderr, "The specified file is empty."); exit(1); } @@ -1208,11 +1215,11 @@ H3Error polygonStringToGeoPolygon(FILE *fp, char *polygonString, int strPos = 0; while (polygonString[strPos] != 0) { // Load more of the file if we've hit our buffer limit - if (strPos >= 1500 && fp != 0) { - int res = fread(polygonString, 1, 1500, fp); + if (strPos >= BUFFER_SIZE && fp != 0) { + int result = fread(polygonString, 1, BUFFER_SIZE, fp); strPos = 0; // If we didn't get any data from the file, we're done. - if (res == 0) { + if (result == 0) { break; } } @@ -1245,6 +1252,9 @@ H3Error polygonStringToGeoPolygon(FILE *fp, char *polygonString, out->geoloop.numVerts = curVert; } else { GeoLoop *holes = calloc(out->numHoles + 1, sizeof(GeoLoop)); + if (holes == 0) { + return E_MEMORY_ALLOC; + } for (int i = 0; i < out->numHoles; i++) { holes[i].numVerts = out->holes[i].numVerts; holes[i].verts = out->holes[i].verts; @@ -1270,9 +1280,9 @@ H3Error polygonStringToGeoPolygon(FILE *fp, char *polygonString, // Must grab the closing ] or we might accidentally parse a partial // float across buffer boundaries char closeBracket[2] = "]"; - int res = sscanf(polygonString + strPos, "%lf%*[, \n]%lf%1[]]%n", &lat, - &lng, &closeBracket[0], &count); - if (count > 0 && res == 3) { + int result = sscanf(polygonString + strPos, "%lf%*[, \n]%lf%1[]]%n", + &lat, &lng, &closeBracket[0], &count); + if (count > 0 && result == 3) { verts[curVert].lat = H3_EXPORT(degsToRads)(lat); verts[curVert].lng = H3_EXPORT(degsToRads)(lng); curVert++; @@ -1298,52 +1308,51 @@ H3Error polygonStringToGeoPolygon(FILE *fp, char *polygonString, polygonString[strPos] == '\r') { strPos++; continue; - } else { - if (strPos != 0 && fp != 0) { - // Scan the remaining of the current buffer for `0`. If not - // found, then we grab a new chunk and append to the remainder - // of the existing buffer. Otherwise, just skip unknown - // characters. - bool endOfFile = false; - for (int i = strPos; i <= 1500; i++) { - if (polygonString[strPos] == 0) { - endOfFile = true; - break; - } - } - if (endOfFile) { - strPos++; - } else { - // Move the end of this buffer to the beginning - for (int i = strPos; i <= 1500; i++) { - polygonString[i - strPos] = polygonString[i]; - } - // Set the string position to the end of the buffer - strPos = 1500 - strPos; - // Grab up to the remaining size of the buffer and fill it - // into the file - // Did you know that if the amount you want to read from - // the file buffer is larger than the buffer itself, - // fread can choose to give you squat and not the - // remainder of the file as you'd expect from the - // documentation? This was a surprise to me and a - // significant amount of wasted time to figure out how - // to tackle. C leaves *way* too much as undefined - // behavior to be nice to work with... - int64_t i = 0; - int res; - do { - res = fread(polygonString + strPos + i, 1, 1, fp); - i++; - } while (i < 1500 - strPos && res != 0); - if (res == 0) { - polygonString[strPos + i - 1] = 0; - } - strPos = 0; + } + if (strPos != 0 && fp != 0) { + // Scan the remaining of the current buffer for `0`. If not + // found, then we grab a new chunk and append to the remainder + // of the existing buffer. Otherwise, just skip unknown + // characters. + bool endOfFile = false; + for (int i = strPos; i <= BUFFER_SIZE; i++) { + if (polygonString[strPos] == 0) { + endOfFile = true; + break; } - } else { + } + if (endOfFile) { strPos++; + } else { + // Move the end of this buffer to the beginning + for (int i = strPos; i <= BUFFER_SIZE; i++) { + polygonString[i - strPos] = polygonString[i]; + } + // Set the string position to the end of the buffer + strPos = BUFFER_SIZE - strPos; + // Grab up to the remaining size of the buffer and fill it + // into the file + // Did you know that if the amount you want to read from + // the file buffer is larger than the buffer itself, + // fread can choose to give you squat and not the + // remainder of the file as you'd expect from the + // documentation? This was a surprise to me and a + // significant amount of wasted time to figure out how + // to tackle. C leaves *way* too much as undefined + // behavior to be nice to work with... + int64_t i = 0; + int result; + do { + result = fread(polygonString + strPos + i, 1, 1, fp); + i++; + } while (i < BUFFER_SIZE - strPos && result != 0); + if (result == 0) { + polygonString[strPos + i - 1] = 0; + } + strPos = 0; } + } else { + strPos++; } } free(verts); @@ -1362,7 +1371,8 @@ SUBCOMMAND( .value = &filename, .helpText = "The file to load the polygon from. Use -- to read from stdin."}; - char polygonStr[1501] = {0}; // Up to 100 cells with zero padding + char polygonStr[BUFFER_SIZE_WITH_NULL] = { + 0}; // Up to 100 cells with zero padding Arg polygonStrArg = { .names = {"-p", "--polygon"}, .scanFormat = "%1500c", @@ -1401,7 +1411,7 @@ SUBCOMMAND( exit(1); } // Do the initial population of data from the file - if (fread(polygonStr, 1, 1500, fp) == 0) { + if (fread(polygonStr, 1, BUFFER_SIZE, fp) == 0) { fprintf(stderr, "The specified file is empty."); exit(1); } @@ -1453,7 +1463,8 @@ SUBCOMMAND( .value = &filename, .helpText = "The file to load the polygon from. Use -- to read from stdin."}; - char polygonStr[1501] = {0}; // Up to 100 cells with zero padding + char polygonStr[BUFFER_SIZE_WITH_NULL] = { + 0}; // Up to 100 cells with zero padding Arg polygonStrArg = { .names = {"-p", "--polygon"}, .scanFormat = "%1500c", @@ -1492,7 +1503,7 @@ SUBCOMMAND( exit(1); } // Do the initial population of data from the file - if (fread(polygonStr, 1, 1500, fp) == 0) { + if (fread(polygonStr, 1, BUFFER_SIZE, fp) == 0) { fprintf(stderr, "The specified file is empty."); exit(1); } @@ -1530,7 +1541,8 @@ SUBCOMMAND(cellsToMultiPolygon, .value = &filename, .helpText = "The file to load the cells from. Use -- to read from stdin."}; - char cellStrs[1501] = {0}; // Up to 100 cells with zero padding + char cellStrs[BUFFER_SIZE_WITH_NULL] = { + 0}; // Up to 100 cells with zero padding Arg cellStrsArg = {.names = {"-c", "--cells"}, .scanFormat = "%1500c", .valueName = "CELLS", @@ -1561,7 +1573,7 @@ SUBCOMMAND(cellsToMultiPolygon, exit(1); } // Do the initial population of data from the file - if (fread(cellStrs, 1, 1500, fp) == 0) { + if (fread(cellStrs, 1, BUFFER_SIZE, fp) == 0) { fprintf(stderr, "The specified file is empty."); exit(1); }