├── .babelrc ├── .editorconfig ├── .env-cmdrc ├── .gitignore ├── .travis.yml ├── LICENSE ├── config └── test │ ├── polyfills.js │ └── setupTest.js ├── fake-server ├── db.json └── routes.json ├── next.config.js ├── package.json ├── readme.md ├── server.js ├── src ├── common │ ├── components │ │ └── map │ │ │ ├── d3Components │ │ │ ├── constants.ts │ │ │ ├── index.ts │ │ │ ├── map.business.ts │ │ │ ├── map.scss │ │ │ ├── map.state.ts │ │ │ ├── map.ts │ │ │ └── shadowDefinitions.ts │ │ │ ├── index.ts │ │ │ ├── map.scss │ │ │ ├── map.tsx │ │ │ └── viewModel.ts │ ├── constants │ │ └── routes.ts │ ├── d3Components │ │ ├── tooltip │ │ │ ├── index.ts │ │ │ ├── tooltip.business.ts │ │ │ ├── tooltip.scss │ │ │ ├── tooltip.state.ts │ │ │ └── tooltip.ts │ │ └── zoom │ │ │ ├── index.ts │ │ │ ├── zoom.business.ts │ │ │ ├── zoom.state.ts │ │ │ └── zoom.ts │ ├── geo │ │ └── spain │ │ │ ├── business.ts │ │ │ ├── geoAreaTypes.ts │ │ │ ├── index.ts │ │ │ ├── model.ts │ │ │ └── resources │ │ │ ├── Spain-02-Communities.MIN.topo.json │ │ │ ├── Spain-03-Provinces.MIN.topo.json │ │ │ └── Spain-04-Municipalities.MIN.topo.json │ ├── helpers │ │ └── classname.ts │ └── types │ │ ├── d3Types.ts │ │ └── index.ts ├── components │ ├── home │ │ ├── home.scss │ │ ├── home.tsx │ │ ├── homeContainer.tsx │ │ ├── index.ts │ │ ├── mappers.spec.ts │ │ ├── mappers.ts │ │ └── viewModel.ts │ └── spainMunicipalitiesElectoralMap2016 │ │ ├── electoralMap.scss │ │ ├── electoralMap.tsx │ │ ├── electoralMapContainer.tsx │ │ ├── index.ts │ │ ├── mapper.spec.ts │ │ ├── mapper.ts │ │ └── viewModel.ts ├── content │ └── styles │ │ └── styles.scss ├── map-data │ └── spain │ │ └── 0001_spain2016MunicipalitiesElectoralVotes.json ├── pages │ ├── _app.js │ ├── _document.js │ ├── index.ts │ └── mapa-electoral-municipios-espana-2016.ts └── rest-api │ ├── api │ ├── config.ts │ ├── createRequest │ │ ├── constants.ts │ │ ├── createRequest.ts │ │ ├── defaultOptions.ts │ │ ├── index.ts │ │ ├── methods.ts │ │ └── responseHandler.ts │ └── map │ │ ├── api.ts │ │ ├── contract.ts │ │ ├── double.ts │ │ ├── index.ts │ │ ├── mockData.ts │ │ └── urls.ts │ └── model │ ├── electoralVote.ts │ ├── index.ts │ └── map.ts ├── tsconfig.json └── tslint.json /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | "next/babel", 4 | "@zeit/next-typescript/babel" 5 | ], 6 | "plugins": [ 7 | ] 8 | } -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_size = 2 5 | indent_style = space 6 | insert_final_newline = true 7 | end_of_line = crlf 8 | charset = utf-8 9 | trim_trailing_whitespace = true -------------------------------------------------------------------------------- /.env-cmdrc: -------------------------------------------------------------------------------- 1 | { 2 | "development": { 3 | "NODE_ENV": "development", 4 | "REST_ENV": "mock", 5 | "BASE_API_URL": "http://localhost:3000/api" 6 | }, 7 | "production": { 8 | "NODE_ENV": "production", 9 | "REST_ENV": "api", 10 | "BASE_API_URL": "http://localhost:3000/api" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | dist/ 4 | *.orig 5 | .idea/ 6 | bundle.js 7 | package-lock.json 8 | .awcache 9 | .next 10 | /coverage/ -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | dist: trusty 2 | language: node_js 3 | node_js: 4 | - "8.9.4" 5 | 6 | script: 7 | - npm install && npm test 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Lemoncode 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /config/test/polyfills.js: -------------------------------------------------------------------------------- 1 | // Polyfill requestAnimationFrame required by React >=16.0.0 2 | require('raf/polyfill'); 3 | -------------------------------------------------------------------------------- /config/test/setupTest.js: -------------------------------------------------------------------------------- 1 | const enzyme = require('enzyme'); 2 | const Adapter = require('enzyme-adapter-react-16'); 3 | 4 | // Setup enzyme's react adapter 5 | enzyme.configure({ adapter: new Adapter() }); 6 | -------------------------------------------------------------------------------- /fake-server/db.json: -------------------------------------------------------------------------------- 1 | { 2 | "maps": [ 3 | { 4 | "id": 1, 5 | "title": "Elecciones Generales 2016", 6 | "type": 1, 7 | "description": "Resultados de las Elecciones Generales de 2016, por municipios", 8 | "tags": [ 9 | "elecciones", 10 | "nacionales", 11 | "2016", 12 | "municipios" 13 | ], 14 | "url": "/mapa-electoral-municipios-espana-2016" 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /fake-server/routes.json: -------------------------------------------------------------------------------- 1 | { 2 | "/api/*": "/$1", 3 | "/maps\\?id=:id": "/maps/:id" 4 | } 5 | -------------------------------------------------------------------------------- /next.config.js: -------------------------------------------------------------------------------- 1 | const withTypescript = require('@zeit/next-typescript'); 2 | const withSass = require('@zeit/next-sass'); 3 | const webpack = require('webpack'); 4 | 5 | module.exports = withSass(withTypescript({ 6 | cssModules: true, 7 | cssLoaderOptions: { 8 | importLoaders: 1, 9 | camelCase: true, 10 | localIdentName: '[local]___[hash:base64:5]', 11 | }, 12 | webpack: (config) => { 13 | const originalEntry = config.entry; 14 | config.entry = () => originalEntry() 15 | .then((entry) => ({ 16 | ...entry, 17 | 'appStyles': './content/styles/styles.scss', 18 | })); 19 | 20 | config.plugins.push( 21 | new webpack.EnvironmentPlugin(process.env) 22 | ); 23 | 24 | return config; 25 | }, 26 | })); 27 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "simplechart", 3 | "version": "1.0.0", 4 | "description": "Visualization of existing map based stats", 5 | "main": "index.js", 6 | "scripts": { 7 | "build": "env-cmd production next build src", 8 | "start": "if-env NODE_ENV=production && npm run start:prod || npm run start:dev", 9 | "start:dev": "env-cmd development node server.js", 10 | "start:prod": "env-cmd production node server.js", 11 | "lint": "tslint -c ./tslint.json --force src/**/*.ts src/**/*.tsx", 12 | "test": "jest --verbose", 13 | "test:watch": "jest --watchAll --verbose -i", 14 | "test:coverage": "jest --verbose --coverage", 15 | "json-server": "json-server --watch ./fake-server/db.json --routes ./fake-server/routes.json" 16 | }, 17 | "repository": { 18 | "type": "git", 19 | "url": "git+https://github.com/Lemoncode/simplechart.git" 20 | }, 21 | "author": "Lemoncode", 22 | "license": "MIT", 23 | "bugs": { 24 | "url": "https://github.com/Lemoncode/simplechart" 25 | }, 26 | "homepage": "https://github.com/Lemoncode/simplechart#readme", 27 | "dependencies": { 28 | "@babel/polyfill": "^7.0.0", 29 | "@material-ui/core": "^3.0.1", 30 | "@zeit/next-sass": "^1.0.1", 31 | "@zeit/next-typescript": "^1.1.1", 32 | "d3": "^5.6.0", 33 | "d3-composite-projections": "^1.2.0", 34 | "express": "^4.16.3", 35 | "isomorphic-unfetch": "^2.1.1", 36 | "next": "^7.0.2", 37 | "qs": "^6.5.2", 38 | "react": "^16.2.0", 39 | "react-dom": "^16.2.0", 40 | "topojson-client": "^3.0.0", 41 | "topojson-simplify": "^3.0.2", 42 | "whatwg-fetch": "^2.0.3" 43 | }, 44 | "devDependencies": { 45 | "@babel/cli": "^7.1.5", 46 | "@babel/core": "^7.1.5", 47 | "@babel/preset-env": "^7.1.5", 48 | "@types/d3": "^5.0.0", 49 | "@types/deep-freeze": "^0.1.1", 50 | "@types/enzyme": "^3.1.9", 51 | "@types/geojson": "^7946.0.4", 52 | "@types/jest": "^22.2.0", 53 | "@types/next": "^7.0.4", 54 | "@types/node": "^9.4.6", 55 | "@types/react": "^16.0.38", 56 | "@types/react-dom": "^16.0.4", 57 | "@types/redux-mock-store": "0.0.13", 58 | "@types/topojson-client": "^3.0.0", 59 | "@types/topojson-simplify": "^3.0.0", 60 | "@types/topojson-specification": "^1.0.0", 61 | "deep-freeze": "0.0.1", 62 | "env-cmd": "^8.0.2", 63 | "enzyme": "^3.3.0", 64 | "enzyme-adapter-react-16": "^1.1.1", 65 | "enzyme-to-json": "^3.3.1", 66 | "identity-obj-proxy": "^3.0.0", 67 | "if-env": "^1.0.4", 68 | "jest": "^22.4.2", 69 | "json-server": "^0.14.0", 70 | "node-sass": "^4.9.3", 71 | "raf": "^3.4.0", 72 | "redux-mock-store": "1.4.0", 73 | "rimraf": "^2.6.2", 74 | "ts-jest": "^22.4.1", 75 | "tslint": "^5.9.1", 76 | "tslint-react": "^3.5.1", 77 | "typescript": "^3.1.6" 78 | }, 79 | "jest": { 80 | "testRegex": "\\.spec\\.tsx?$", 81 | "testURL": "http://localhost/", 82 | "moduleFileExtensions": [ 83 | "js", 84 | "jsx", 85 | "json", 86 | "ts", 87 | "tsx" 88 | ], 89 | "setupFiles": [ 90 | "/config/test/polyfills.js", 91 | "/config/test/setupTest.js" 92 | ], 93 | "transform": { 94 | ".tsx?": "/node_modules/ts-jest/preprocessor.js" 95 | }, 96 | "snapshotSerializers": [ 97 | "enzyme-to-json/serializer" 98 | ], 99 | "moduleNameMapper": { 100 | "^.+\\.s?css$": "identity-obj-proxy" 101 | }, 102 | "restoreMocks": true 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # SimpleChart 2 | 3 | The idea of this project is to provide a simple portal to visualize existing map based stats (focused on the Spanish territory) and create new ones. 4 | 5 | ## Steps to build it 6 | 7 | ### Prerequisites 8 | 9 | Install [Node.js and npm](https://nodejs.org/en/) (v6.x or higher) if they are not already installed on your computer. 10 | 11 | ### Instructions to run the project 12 | 13 | To run this project, firstly, it is necessary to install dependencies: 14 | 15 | ```bash 16 | npm install 17 | ``` 18 | 19 | Secondly, next command will run the app: 20 | 21 | ```bash 22 | npm start 23 | ``` 24 | 25 | Finally, open your browser in http://localhost:8080 and you will see the project running. 26 | 27 | ### Instructions to launch Production mode 28 | 29 | First we need to build app: 30 | 31 | ```bash 32 | npm run build 33 | ``` 34 | 35 | Run app in `production` mode: 36 | 37 | ```bash 38 | npm run start:prod 39 | ``` 40 | 41 | In order to launch the fake back-end server, just run the following command: 42 | 43 | ```bash 44 | npm run json-server 45 | ``` 46 | 47 | Once it starts, you can open your browser in http://localhost:8080 and get the available results. 48 | 49 | # About Basefactor + Lemoncode 50 | 51 | We are an innovating team of Javascript experts, passionate about turning your ideas into robust products. 52 | 53 | [Basefactor, consultancy by Lemoncode](http://www.basefactor.com) provides consultancy and coaching services. 54 | 55 | [Lemoncode](http://lemoncode.net/services/en/#en-home) provides training services. 56 | 57 | For the LATAM/Spanish audience we are running an Online Front End Master degree, more info: http://lemoncode.net/master-frontend 58 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const next = require('next'); 3 | 4 | const dev = process.env.NODE_ENV !== 'production'; 5 | const app = next({ dir: './src', dev }); 6 | const handle = app.getRequestHandler(); 7 | 8 | app 9 | .prepare() 10 | .then(() => { 11 | const server = express(); 12 | 13 | server.get('/home', (req, res) => { 14 | const actualPage = '/'; 15 | app.render(req, res, actualPage); 16 | }); 17 | 18 | server.get('*', (req, res) => { 19 | return handle(req, res); 20 | }); 21 | 22 | server.listen(8080, err => { 23 | if (err) throw err; 24 | console.log('> Ready on http://localhost:8080'); 25 | }); 26 | }) 27 | .catch(ex => { 28 | console.error(ex.stack); 29 | process.exit(1); 30 | }); 31 | -------------------------------------------------------------------------------- /src/common/components/map/d3Components/constants.ts: -------------------------------------------------------------------------------- 1 | export const SVG_SHADOW_ID = 'svgshadow'; 2 | -------------------------------------------------------------------------------- /src/common/components/map/d3Components/index.ts: -------------------------------------------------------------------------------- 1 | export * from './map'; 2 | -------------------------------------------------------------------------------- /src/common/components/map/d3Components/map.business.ts: -------------------------------------------------------------------------------- 1 | import { select, BaseType } from 'd3'; 2 | import { geoPath } from 'd3-geo'; 3 | import { Extension } from '../../../types'; 4 | import { SVG_SHADOW_ID } from './constants'; 5 | import { Props, State } from './map.state'; 6 | const styles = require('./map.scss'); 7 | 8 | // Useful for rendering strokes in complicated objects efficiently 9 | // https://github.com/topojson/topojson-client/blob/master/README.md#mesh 10 | export const renderMesh = (props: Props, state: State) => { 11 | state.map 12 | .append('g') 13 | .append('path') 14 | // Assign mesh to a single path 15 | .datum(props.mesh) 16 | .attr('class', styles.mesh) 17 | .attr('d', state.geoPathGenerator); 18 | }; 19 | 20 | export const calculateMapExtension = ({ width, height, padding }: Props): Extension => ([ 21 | [padding, padding], 22 | [width - padding, height - padding], 23 | ]); 24 | 25 | export const getGeoPathGenerator = (props: Props, state: State) => ( 26 | geoPath( 27 | props.projection 28 | .fitExtent(state.mapExtension, props.geoEntities), 29 | ) 30 | ); 31 | 32 | export const addHighlight = (geoAreaElement: BaseType, highlightColor = 'yellow') => { 33 | if (geoAreaElement) { 34 | select(geoAreaElement) 35 | .attr('filter', `url(#${SVG_SHADOW_ID})`) 36 | .attr('stroke', highlightColor) 37 | .attr('stroke-width', '0.5px'); 38 | } 39 | }; 40 | 41 | export const removeHighlight = (geoAreaElement: BaseType) => { 42 | if (geoAreaElement) { 43 | select(geoAreaElement) 44 | .attr('filter', `none`) 45 | .attr('stroke', 'none'); 46 | } 47 | }; 48 | -------------------------------------------------------------------------------- /src/common/components/map/d3Components/map.scss: -------------------------------------------------------------------------------- 1 | .geo-area { 2 | cursor: pointer; 3 | } 4 | 5 | .mesh { 6 | fill: none; 7 | stroke: white; 8 | stroke-width: 0.1px; 9 | } 10 | -------------------------------------------------------------------------------- /src/common/components/map/d3Components/map.state.ts: -------------------------------------------------------------------------------- 1 | import { D3Selection, Extension } from '../../../types'; 2 | import { GeoPath, GeoPermissibleObjects, GeoProjection } from 'd3-geo'; 3 | import { GeometryObject, FeatureCollection, MultiLineString } from 'geojson'; 4 | import { GeoArea } from '../viewModel'; 5 | 6 | export interface Props { 7 | root: D3Selection; 8 | svg: D3Selection; 9 | geoAreas: GeoArea[]; 10 | geoEntities: FeatureCollection; 11 | mesh: MultiLineString; 12 | projection: GeoProjection; 13 | width: number; 14 | height: number; 15 | padding: number; 16 | defaultfillColor: string; 17 | maxZoomScale: number; 18 | clickZoomFitScale: number; 19 | highlightColor?: string; 20 | } 21 | 22 | export interface State { 23 | map: D3Selection; 24 | mapExtension: Extension; 25 | geoPathGenerator: GeoPath; 26 | onShowTooltip: (message: string) => void; 27 | onHideTooltip: () => void; 28 | onUpdateTooltipPosition: () => void; 29 | } 30 | 31 | export const createEmptyState = (): State => ({ 32 | map: null, 33 | mapExtension: null, 34 | geoPathGenerator: null, 35 | onShowTooltip: null, 36 | onHideTooltip: null, 37 | onUpdateTooltipPosition: null, 38 | }); 39 | -------------------------------------------------------------------------------- /src/common/components/map/d3Components/map.ts: -------------------------------------------------------------------------------- 1 | import { GeoArea } from '../viewModel'; 2 | import { createEmptyState, State, Props } from './map.state'; 3 | import { shadowDefinitions } from './shadowDefinitions'; 4 | import { tooltipD3Component } from '../../../d3Components/tooltip'; 5 | import { zoomD3Component } from '../../../d3Components/zoom'; 6 | import { calculateMapExtension, getGeoPathGenerator, renderMesh, addHighlight, removeHighlight } from './map.business'; 7 | const styles = require('./map.scss'); 8 | 9 | export const mapD3Component = (props: Props) => { 10 | const state = createEmptyState(); 11 | shadowDefinitions({ 12 | svg: props.svg, 13 | }); 14 | 15 | state.map = renderMap(props); 16 | state.mapExtension = calculateMapExtension(props); 17 | state.geoPathGenerator = getGeoPathGenerator(props, state); 18 | 19 | enter(props, state); 20 | renderMesh(props, state); 21 | 22 | zoomD3Component({ 23 | svg: props.svg, 24 | node: state.map, 25 | zoomAreas: props.geoAreas, 26 | nodeExtension: state.mapExtension, 27 | nodeSelectionElement: 'path', 28 | getZoomAreaExension: (geoArea: GeoArea) => ( 29 | state.geoPathGenerator.bounds(geoArea.geoEntity) 30 | ), 31 | maxZoomScale: props.maxZoomScale, 32 | clickZoomFitScale: props.clickZoomFitScale, 33 | width: props.width, 34 | height: props.height, 35 | }); 36 | 37 | const { onShowTooltip, onHideTooltip, onUpdateTooltipPosition } = tooltipD3Component({ 38 | node: props.root, 39 | }); 40 | state.onShowTooltip = onShowTooltip; 41 | state.onHideTooltip = onHideTooltip; 42 | state.onUpdateTooltipPosition = onUpdateTooltipPosition; 43 | }; 44 | 45 | const renderMap = (props: Props) => props.svg.append('g'); 46 | 47 | const enter = (props: Props, state: State) => { 48 | state.map 49 | .append('g') 50 | .selectAll('path') 51 | .data(props.geoAreas, (geoArea: GeoArea) => geoArea.id) 52 | .enter() 53 | .append('path') 54 | .attr('class', styles.geoArea) 55 | .attr('d', (geoArea: GeoArea) => state.geoPathGenerator(geoArea.geoEntity)) 56 | .attr('fill', (geoArea: GeoArea) => ( 57 | Boolean(geoArea.color) ? 58 | geoArea.color : 59 | props.defaultfillColor 60 | )) 61 | .on('mouseenter', function(geoArea: GeoArea) { 62 | addHighlight(this, props.highlightColor); 63 | state.onShowTooltip(geoArea.tooltipMessage); 64 | }) 65 | .on('mousemove', () => state.onUpdateTooltipPosition) 66 | .on('mouseleave', function() { 67 | removeHighlight(this); 68 | state.onHideTooltip(); 69 | }); 70 | }; 71 | -------------------------------------------------------------------------------- /src/common/components/map/d3Components/shadowDefinitions.ts: -------------------------------------------------------------------------------- 1 | import { D3Selection } from '../../../types'; 2 | import { SVG_SHADOW_ID } from './constants'; 3 | 4 | interface Props { 5 | svg: D3Selection; 6 | } 7 | 8 | export const shadowDefinitions = (props: Props) => { 9 | render(props); 10 | }; 11 | 12 | const render = ({ svg }: Props) => { 13 | const defs = svg.append('defs'); 14 | 15 | const filter = defs 16 | .append('filter') 17 | .attr('id', SVG_SHADOW_ID) 18 | .attr('filterUnits', 'userSpaceOnUse'); 19 | 20 | filter.append('feGaussianBlur') 21 | .attr('in', 'SourceAlpha') 22 | .attr('stdDeviation', 3); 23 | 24 | filter.append('feOffset') 25 | .attr('dx', 0) 26 | .attr('dy', 0); 27 | 28 | filter.append('feComponentTransfer') 29 | .append('feFuncA') 30 | .attr('type', 'linear') 31 | .attr('slope', 0.2); 32 | 33 | const feMerge = filter.append('feMerge'); 34 | feMerge.append('feMergeNode'); 35 | feMerge.append('feMergeNode') 36 | .attr('in', 'SourceGraphic'); 37 | }; 38 | -------------------------------------------------------------------------------- /src/common/components/map/index.ts: -------------------------------------------------------------------------------- 1 | export * from './map'; 2 | export * from './viewModel'; 3 | -------------------------------------------------------------------------------- /src/common/components/map/map.scss: -------------------------------------------------------------------------------- 1 | .container { 2 | flex-grow: 1; 3 | flex-shrink: 1; 4 | width: 100%; 5 | display: flex; 6 | flex-direction: column; 7 | justify-content: center; 8 | align-items: center; 9 | } 10 | -------------------------------------------------------------------------------- /src/common/components/map/map.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import { select } from 'd3-selection'; 3 | import { GeoProjection, geoMercator } from 'd3-geo'; 4 | import { FeatureCollection, GeometryObject, MultiLineString } from 'geojson'; 5 | import { mapD3Component } from './d3Components'; 6 | import { GeoArea } from './viewModel'; 7 | import { cnc } from '../../helpers/classname'; 8 | const styles = require('./map.scss'); 9 | 10 | export interface Props { 11 | geoAreas: GeoArea[]; 12 | geoEntities: FeatureCollection; 13 | mesh: MultiLineString; 14 | projection?: GeoProjection; 15 | width?: number; 16 | height?: number; 17 | padding?: number; 18 | defaultfillColor?: string; 19 | maxZoomScale?: number; 20 | clickZoomFitScale?: number; 21 | className?: string; 22 | } 23 | 24 | export class MapComponent extends React.PureComponent { 25 | private nodes = { 26 | root: React.createRef(), 27 | svg: React.createRef(), 28 | }; 29 | 30 | static defaultProps: Partial = { 31 | width: 700, 32 | height: 500, 33 | padding: 20, 34 | projection: geoMercator(), 35 | defaultfillColor: 'lightgrey', 36 | maxZoomScale: 30, 37 | clickZoomFitScale: 0.65, 38 | }; 39 | 40 | public componentDidMount() { 41 | if (this.areThereGeoAreas()) { 42 | this.renderMapD3Component(); 43 | } 44 | } 45 | 46 | componentDidUpdate() { 47 | this.renderMapD3Component(); 48 | } 49 | 50 | private areThereGeoAreas = () => ( 51 | Array.isArray(this.props.geoAreas) && 52 | this.props.geoAreas.length > 0 53 | ); 54 | 55 | private renderMapD3Component = () => { 56 | mapD3Component({ 57 | root: select(this.nodes.root.current), 58 | svg: select(this.nodes.svg.current), 59 | geoAreas: this.props.geoAreas, 60 | geoEntities: this.props.geoEntities, 61 | mesh: this.props.mesh, 62 | projection: this.props.projection, 63 | width: this.props.width, 64 | height: this.props.height, 65 | padding: this.props.padding, 66 | defaultfillColor: this.props.defaultfillColor, 67 | maxZoomScale: this.props.maxZoomScale, 68 | clickZoomFitScale: this.props.clickZoomFitScale, 69 | }); 70 | } 71 | 72 | public render() { 73 | return ( 74 |
78 | 82 |
83 | ); 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /src/common/components/map/viewModel.ts: -------------------------------------------------------------------------------- 1 | import { Feature, GeometryObject } from 'geojson'; 2 | 3 | export interface GeoArea { 4 | id: string; 5 | geoEntity: Feature; 6 | color: string; 7 | tooltipMessage: string; 8 | } 9 | 10 | export const createEmptyGeoArea = (): GeoArea => ({ 11 | id: '', 12 | geoEntity: null, 13 | color: '', 14 | tooltipMessage: '', 15 | }); 16 | -------------------------------------------------------------------------------- /src/common/constants/routes.ts: -------------------------------------------------------------------------------- 1 | const baseUrl = '/'; 2 | 3 | export const routes = { 4 | default: `${baseUrl}`, 5 | home: `${baseUrl}home`, 6 | spainMunicipalitiesElectoralMap2016: `${baseUrl}mapa-electoral-municipios-espana-2016`, 7 | }; 8 | -------------------------------------------------------------------------------- /src/common/d3Components/tooltip/index.ts: -------------------------------------------------------------------------------- 1 | export * from './tooltip'; 2 | -------------------------------------------------------------------------------- /src/common/d3Components/tooltip/tooltip.business.ts: -------------------------------------------------------------------------------- 1 | import { State, Props } from './tooltip.state'; 2 | import { mouse } from 'd3'; 3 | const styles = require('./tooltip.scss'); 4 | 5 | export const showTooltip = (props: Props, state: State, message: string) => { 6 | state.tooltip 7 | .html(message); 8 | updateTooltipPosition(props, state); 9 | state.tooltip 10 | .classed(styles.hidden, false); 11 | }; 12 | 13 | export const updateTooltipPosition = ({ xOffset = 25, yOffset = 40 }: Props, state: State) => { 14 | const [x, y] = mouse(document.body); 15 | 16 | state.tooltip 17 | .style('left', `${x + xOffset}px`) 18 | .style('top', `${y + yOffset}px`); 19 | }; 20 | 21 | export const hideTooltip = (state: State) => state.tooltip 22 | .classed(styles.hidden, true); 23 | -------------------------------------------------------------------------------- /src/common/d3Components/tooltip/tooltip.scss: -------------------------------------------------------------------------------- 1 | .tooltip { 2 | position: fixed; 3 | pointer-events: none; 4 | color: white; 5 | background-color: #3a3a3a; 6 | padding: 0.5rem; 7 | border-radius: 0.5rem; 8 | opacity: 1; 9 | 10 | &.hidden { 11 | opacity: 0; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/common/d3Components/tooltip/tooltip.state.ts: -------------------------------------------------------------------------------- 1 | import { D3Selection } from '../../types'; 2 | 3 | export interface Props { 4 | node: D3Selection; 5 | xOffset?: number; 6 | yOffset?: number; 7 | } 8 | 9 | export interface State { 10 | tooltip: D3Selection; 11 | } 12 | 13 | export const createEmptyState = (): State => ({ 14 | tooltip: null, 15 | }); 16 | -------------------------------------------------------------------------------- /src/common/d3Components/tooltip/tooltip.ts: -------------------------------------------------------------------------------- 1 | import { cnc } from '../../helpers/classname'; 2 | import { createEmptyState, State, Props } from './tooltip.state'; 3 | import { showTooltip, updateTooltipPosition, hideTooltip } from './tooltip.business'; 4 | const styles = require('./tooltip.scss'); 5 | 6 | export const tooltipD3Component = (props: Props) => { 7 | const state = createEmptyState(); 8 | state.tooltip = render(props); 9 | 10 | return { 11 | onShowTooltip: onShowTooltip(props, state), 12 | onHideTooltip: onHideTooltip(state), 13 | onUpdateTooltipPosition: onUpdateTooltipPosition(props, state), 14 | }; 15 | }; 16 | 17 | const render = (props: Props) => props.node 18 | .append('div') 19 | .attr('class', cnc(styles.tooltip, styles.hidden)); 20 | 21 | const onShowTooltip = (props: Props, state: State) => (message: string) => showTooltip(props, state, message); 22 | 23 | const onUpdateTooltipPosition = (props: Props, state: State) => () => updateTooltipPosition(props, state); 24 | 25 | const onHideTooltip = (state: State) => () => hideTooltip(state); 26 | -------------------------------------------------------------------------------- /src/common/d3Components/zoom/index.ts: -------------------------------------------------------------------------------- 1 | export * from './zoom'; 2 | -------------------------------------------------------------------------------- /src/common/d3Components/zoom/zoom.business.ts: -------------------------------------------------------------------------------- 1 | import { event as d3Event } from 'd3-selection'; 2 | import { zoom, zoomIdentity } from 'd3-zoom'; 3 | import { State, Props, ZoomArea } from './zoom.state'; 4 | 5 | const getZoomHandler = ({ node, nodeExtension, maxZoomScale }: Props) => zoom() 6 | .extent(nodeExtension) 7 | .scaleExtent([1, maxZoomScale]) 8 | .translateExtent(nodeExtension) 9 | .on('zoom', () => { 10 | node.attr('transform', d3Event.transform); 11 | }); 12 | 13 | export const enableZoomOnSvg = (props: Props) => { 14 | props.svg.call(getZoomHandler(props)); 15 | }; 16 | 17 | export const applyZoom = (zoomArea: ZoomArea, props: Props, state: State) => { 18 | const zoomAreaExtension = props.getZoomAreaExension(zoomArea); 19 | 20 | const dx = zoomAreaExtension[1][0] - zoomAreaExtension[0][0]; 21 | const dy = zoomAreaExtension[1][1] - zoomAreaExtension[0][1]; 22 | const x = (zoomAreaExtension[0][0] + zoomAreaExtension[1][0]) / 2; 23 | const y = (zoomAreaExtension[0][1] + zoomAreaExtension[1][1]) / 2; 24 | const scale = Math.max(1, Math.min(props.maxZoomScale, 25 | props.clickZoomFitScale / Math.max(dx / props.width, dy / props.height))); 26 | const translate = [props.width / 2 - scale * x, props.height / 2 - scale * y]; 27 | 28 | props.svg 29 | .transition() 30 | .duration(750) 31 | .call( 32 | getZoomHandler(props).transform, 33 | zoomIdentity 34 | .translate(translate[0], translate[1]) 35 | .scale(scale), 36 | ); 37 | 38 | state.currentZoomAreaId = zoomArea.id; 39 | }; 40 | 41 | export const resetZoom = (props: Props, state: State) => { 42 | props.svg.transition() 43 | .duration(750) 44 | .call(getZoomHandler(props).transform, zoomIdentity); 45 | state.currentZoomAreaId = null; 46 | }; 47 | -------------------------------------------------------------------------------- /src/common/d3Components/zoom/zoom.state.ts: -------------------------------------------------------------------------------- 1 | import { D3Selection, Extension } from '../../../common/types'; 2 | 3 | export interface ZoomArea { 4 | id: any; 5 | } 6 | 7 | export interface Props { 8 | svg: D3Selection; 9 | node: D3Selection; 10 | zoomAreas: ZoomArea[]; 11 | nodeExtension: Extension; 12 | nodeSelectionElement: string; 13 | getZoomAreaExension: (zoomArea: ZoomArea) => Extension; 14 | maxZoomScale: number; 15 | clickZoomFitScale: number; 16 | width: number; 17 | height: number; 18 | } 19 | 20 | export interface State { 21 | currentZoomAreaId: any; 22 | } 23 | 24 | export const createEmptyState = (): State => ({ 25 | currentZoomAreaId: null, 26 | }); 27 | -------------------------------------------------------------------------------- /src/common/d3Components/zoom/zoom.ts: -------------------------------------------------------------------------------- 1 | import { createEmptyState, State, Props, ZoomArea } from './zoom.state'; 2 | import { enableZoomOnSvg, resetZoom, applyZoom } from './zoom.business'; 3 | 4 | export const zoomD3Component = (props: Props) => { 5 | const state = createEmptyState(); 6 | data(props, state); 7 | enableZoomOnSvg(props); 8 | }; 9 | 10 | const data = (props: Props, state: State) => { 11 | props.node 12 | .selectAll(props.nodeSelectionElement) 13 | .data(props.zoomAreas, (zoomArea: ZoomArea) => zoomArea.id) 14 | .on('click', (zoomArea: ZoomArea) => { 15 | state.currentZoomAreaId === zoomArea.id ? 16 | resetZoom(props, state) : 17 | applyZoom(zoomArea, props, state); 18 | }); 19 | }; 20 | -------------------------------------------------------------------------------- /src/common/geo/spain/business.ts: -------------------------------------------------------------------------------- 1 | import { Topology, GeometryObject } from 'topojson-specification'; 2 | import { presimplify, simplify } from 'topojson-simplify'; 3 | import { feature, mesh } from 'topojson-client'; 4 | import { geoConicConformalSpain } from 'd3-composite-projections'; 5 | import { GeoAreaType } from './model'; 6 | import { Feature, FeatureCollection, MultiLineString } from 'geojson'; 7 | 8 | export const getGeoEntities = (geoAreaType: GeoAreaType): FeatureCollection => { 9 | const geoJSON = getGeoJSONSimplyfied(geoAreaType); 10 | 11 | return feature( 12 | geoJSON, 13 | geoJSON.objects[geoAreaType.name], 14 | ) as FeatureCollection; 15 | }; 16 | 17 | export const getMesh = (geoAreaType: GeoAreaType): MultiLineString => { 18 | const geoJSON = getGeoJSONSimplyfied(geoAreaType); 19 | 20 | return mesh( 21 | geoJSON, 22 | geoJSON.objects[geoAreaType.name], 23 | ); 24 | }; 25 | 26 | const getGeoJSONSimplyfied = ({ geoJSON, simplificationFactor }: GeoAreaType): Topology => ( 27 | Boolean(simplificationFactor) ? 28 | simplify( 29 | presimplify(geoJSON), 30 | simplificationFactor, 31 | ) : 32 | geoJSON 33 | ); 34 | 35 | export const getProjection = () => geoConicConformalSpain(); 36 | 37 | export const getId = (geoEntity: Feature): string => geoEntity.properties.NATCODE; 38 | 39 | export const getName = (geoEntity: Feature): string => geoEntity.properties.NAMEUNIT; 40 | -------------------------------------------------------------------------------- /src/common/geo/spain/geoAreaTypes.ts: -------------------------------------------------------------------------------- 1 | import { GeoAreaType } from './model'; 2 | 3 | const communitiesGeoJSON = require('./resources/Spain-02-Communities.MIN.topo.json'); 4 | const provincesGeoJSON = require('./resources/Spain-03-Provinces.MIN.topo.json'); 5 | const municipalitiesGeoJSON = require('./resources/Spain-04-Municipalities.MIN.topo.json'); 6 | 7 | const communities: GeoAreaType = { 8 | name: 'communities', 9 | geoJSON: communitiesGeoJSON, 10 | }; 11 | 12 | const provinces: GeoAreaType = { 13 | name: 'provinces', 14 | geoJSON: provincesGeoJSON, 15 | }; 16 | 17 | const municipalities: GeoAreaType = { 18 | name: 'municipalities', 19 | geoJSON: municipalitiesGeoJSON, 20 | simplificationFactor: 0.001, 21 | }; 22 | 23 | export const geoAreaTypes = { 24 | communities, 25 | provinces, 26 | municipalities, 27 | }; 28 | -------------------------------------------------------------------------------- /src/common/geo/spain/index.ts: -------------------------------------------------------------------------------- 1 | export * from './geoAreaTypes'; 2 | export * from './business'; 3 | -------------------------------------------------------------------------------- /src/common/geo/spain/model.ts: -------------------------------------------------------------------------------- 1 | import { Topology } from 'topojson-specification'; 2 | 3 | export interface GeoAreaType { 4 | name: string; 5 | geoJSON: Topology; 6 | simplificationFactor?: number; // Simplify threshold. 0 = no simplification. 7 | } 8 | -------------------------------------------------------------------------------- /src/common/geo/spain/resources/Spain-02-Communities.MIN.topo.json: -------------------------------------------------------------------------------- 1 | {"type":"Topology","bbox":[-18.16118085,27.63772315,4.32778473,43.79237957],"objects":{"communities":{"type":"GeometryCollection","geometries":[{"type":"MultiPolygon","arcs":[[[0]]],"properties":{"INSPIREID":"ES.IGN.SIGLIM34190000000","COUNTRY":"ES","NATCODE":"34190000000","NAMEUNIT":"Ciudad Autónoma de Melilla","CODNUT1":"ES6","CODNUT2":"ES64","CODNUT3":null}},{"type":"MultiPolygon","arcs":[[[1]]],"properties":{"INSPIREID":"ES.IGN.SIGLIM34180000000","COUNTRY":"ES","NATCODE":"34180000000","NAMEUNIT":"Ciudad Autónoma de Ceuta","CODNUT1":"ES6","CODNUT2":"ES63","CODNUT3":null}},{"type":"MultiPolygon","arcs":[[[2,3,4,5],[6],[7]]],"properties":{"INSPIREID":"ES.IGN.SIGLIM34170000000","COUNTRY":"ES","NATCODE":"34170000000","NAMEUNIT":"La Rioja","CODNUT1":"ES2","CODNUT2":"ES23","CODNUT3":null}},{"type":"MultiPolygon","arcs":[[[8,9,10,-3,11],[12],[13]]],"properties":{"INSPIREID":"ES.IGN.SIGLIM34160000000","COUNTRY":"ES","NATCODE":"34160000000","NAMEUNIT":"País Vasco/Euskadi","CODNUT1":"ES2","CODNUT2":"ES21","CODNUT3":null}},{"type":"MultiPolygon","arcs":[[[14]],[[15]],[[-11,16,17,-4]]],"properties":{"INSPIREID":"ES.IGN.SIGLIM34150000000","COUNTRY":"ES","NATCODE":"34150000000","NAMEUNIT":"Comunidad Foral de Navarra","CODNUT1":"ES2","CODNUT2":"ES22","CODNUT3":null}},{"type":"MultiPolygon","arcs":[[[18,19,20,21]]],"properties":{"INSPIREID":"ES.IGN.SIGLIM34140000000","COUNTRY":"ES","NATCODE":"34140000000","NAMEUNIT":"Región de Murcia","CODNUT1":"ES6","CODNUT2":"ES62","CODNUT3":null}},{"type":"MultiPolygon","arcs":[[[22]],[[23,24],[25]]],"properties":{"INSPIREID":"ES.IGN.SIGLIM34130000000","COUNTRY":"ES","NATCODE":"34130000000","NAMEUNIT":"Comunidad de Madrid","CODNUT1":"ES3","CODNUT2":"ES30","CODNUT3":null}},{"type":"MultiPolygon","arcs":[[[26]],[[27]],[[28]],[[29]],[[30,31,32]],[[33]]],"properties":{"INSPIREID":"ES.IGN.SIGLIM34120000000","COUNTRY":"ES","NATCODE":"34120000000","NAMEUNIT":"Galicia","CODNUT1":"ES1","CODNUT2":"ES11","CODNUT3":null}},{"type":"MultiPolygon","arcs":[[[34,35,36,37]]],"properties":{"INSPIREID":"ES.IGN.SIGLIM34110000000","COUNTRY":"ES","NATCODE":"34110000000","NAMEUNIT":"Extremadura","CODNUT1":"ES4","CODNUT2":"ES43","CODNUT3":null}},{"type":"MultiPolygon","arcs":[[[38,39]],[[-20,40,41,42,43]]],"properties":{"INSPIREID":"ES.IGN.SIGLIM34100000000","COUNTRY":"ES","NATCODE":"34100000000","NAMEUNIT":"Comunitat Valenciana","CODNUT1":"ES5","CODNUT2":"ES52","CODNUT3":null}},{"type":"MultiPolygon","arcs":[[[44]],[[-43,45,46]]],"properties":{"INSPIREID":"ES.IGN.SIGLIM34090000000","COUNTRY":"ES","NATCODE":"34090000000","NAMEUNIT":"Cataluña/Catalunya","CODNUT1":"ES5","CODNUT2":"ES51","CODNUT3":null}},{"type":"MultiPolygon","arcs":[[[-26]],[[47,-25,48,49,-40,50,-41,-19,51,-37]]],"properties":{"INSPIREID":"ES.IGN.SIGLIM34080000000","COUNTRY":"ES","NATCODE":"34080000000","NAMEUNIT":"Castilla-La Mancha","CODNUT1":"ES4","CODNUT2":"ES42","CODNUT3":null}},{"type":"MultiPolygon","arcs":[[[52]],[[53]],[[-8]],[[-7]],[[-13]],[[-49,-24,-48,-36,54,-32,55,56,-12,-6,57],[-23]]],"properties":{"INSPIREID":"ES.IGN.SIGLIM34070000000","COUNTRY":"ES","NATCODE":"34070000000","NAMEUNIT":"Castilla y León","CODNUT1":"ES4","CODNUT2":"ES41","CODNUT3":null}},{"type":"MultiPolygon","arcs":[[[-14]],[[-57,58,59,-9],[-54],[-53]]],"properties":{"INSPIREID":"ES.IGN.SIGLIM34060000000","COUNTRY":"ES","NATCODE":"34060000000","NAMEUNIT":"Cantabria","CODNUT1":"ES1","CODNUT2":"ES13","CODNUT3":null}},{"type":"MultiPolygon","arcs":[[[60]],[[61]],[[62]],[[63]],[[64]],[[65]],[[66]]],"properties":{"INSPIREID":"ES.IGN.SIGLIM34040000000","COUNTRY":"ES","NATCODE":"34040000000","NAMEUNIT":"Illes Balears","CODNUT1":"ES5","CODNUT2":"ES53","CODNUT3":null}},{"type":"MultiPolygon","arcs":[[[-59,-56,-31,67]]],"properties":{"INSPIREID":"ES.IGN.SIGLIM34030000000","COUNTRY":"ES","NATCODE":"34030000000","NAMEUNIT":"Principado de Asturias","CODNUT1":"ES1","CODNUT2":"ES12","CODNUT3":null}},{"type":"MultiPolygon","arcs":[[[-51,-39,-50,-58,-5,-18,68,-46,-42],[-16],[-15]]],"properties":{"INSPIREID":"ES.IGN.SIGLIM34020000000","COUNTRY":"ES","NATCODE":"34020000000","NAMEUNIT":"Aragón","CODNUT1":"ES2","CODNUT2":"ES24","CODNUT3":null}},{"type":"MultiPolygon","arcs":[[[-38,-52,-22,69]]],"properties":{"INSPIREID":"ES.IGN.SIGLIM34010000000","COUNTRY":"ES","NATCODE":"34010000000","NAMEUNIT":"Andalucí­a","CODNUT1":"ES6","CODNUT2":"ES61","CODNUT3":null}},{"type":"MultiPolygon","arcs":[[[70]],[[71]],[[72]],[[73]],[[74]],[[75]],[[76]],[[77]],[[78]],[[79]]],"properties":{"INSPIREID":"ES.IGN.SIGLIM34050000000","COUNTRY":"ES","NATCODE":"34050000000","NAMEUNIT":"Canarias","CODNUT1":"ES7","CODNUT2":"ES70","CODNUT3":null}}]}},"arcs":[[[-2.95262538,35.3202884],[-2.92863235,35.29071534],[-2.92801791,35.27293071],[-2.9504067,35.26558676],[-2.96829025,35.28215075],[-2.96627304,35.30440958],[-2.95262538,35.3202884]],[[-5.38206067,35.91239576],[-5.36694932,35.91797847],[-5.33493745,35.89407925],[-5.31352081,35.88907044],[-5.28779764,35.9069447],[-5.28136658,35.89400245],[-5.32041787,35.88652693],[-5.34348604,35.87073845],[-5.37184291,35.88143492],[-5.38206067,35.91239576]],[[-2.85809313,42.63820535],[-2.84289272,42.62960252],[-2.84180023,42.60859872],[-2.81989919,42.61450102],[-2.82419338,42.58793117000001],[-2.84084673,42.58119228],[-2.81966959,42.55519636],[-2.81303619,42.56958621],[-2.77974947,42.57993743],[-2.76372027,42.62283648],[-2.73057452,42.61762038],[-2.70794003,42.60024661],[-2.68054221,42.59451791],[-2.69150491,42.54180049],[-2.70549451,42.516765],[-2.6753822,42.52511314],[-2.67787967,42.51301628],[-2.65654126,42.50404749],[-2.64625429,42.48295143],[-2.60435843,42.50294253],[-2.59240151,42.49250778],[-2.60248185,42.48030422],[-2.5776668,42.48321433],[-2.56825923,42.49414839],[-2.55434866,42.48403547],[-2.53047983,42.48357074],[-2.53735326,42.49524333],[-2.51175083,42.51992107],[-2.50540326,42.51281516],[-2.51316569,42.48984749],[-2.47743163,42.48663675],[-2.44880521,42.49687519],[-2.42058169,42.48923427]],[[-2.42058169,42.48923427],[-2.40000848,42.47143189],[-2.37738463,42.47298992],[-2.34675196,42.45177266],[-2.32584653,42.46815665000001],[-2.298719,42.45741174],[-2.29688346,42.46814437],[-2.27247758,42.44522199],[-2.23885923,42.44092401],[-2.24171047,42.43033755],[-2.20872212,42.41465937],[-2.18552972,42.41860352],[-2.17503657,42.4077664],[-2.13968015,42.42056447],[-2.10507997,42.41594039000001],[-2.11557474,42.39996457],[-2.08754845,42.38362414],[-2.07897977,42.36648934],[-2.08996096,42.34697127],[-2.06998224,42.34252388],[-2.0455983,42.35902929],[-2.01427926,42.36925591],[-1.97329088,42.35354986],[-1.96452073,42.33382003],[-1.94131153,42.33460761],[-1.93269044,42.32258572],[-1.91851338,42.3269648],[-1.89412477,42.29058183],[-1.87125514,42.28949419],[-1.86620738,42.27540392],[-1.8762008,42.25899423],[-1.8532318,42.25801912],[-1.80232577,42.22342876],[-1.78016421,42.2241741],[-1.74113912,42.21192367],[-1.7092392,42.20998996],[-1.70508602,42.19270543],[-1.6790054,42.18831879],[-1.70089728,42.17312359],[-1.67965904,42.15168931],[-1.71989494,42.1334397],[-1.7397421,42.14973589],[-1.76470906,42.1504128],[-1.77900487,42.13770488],[-1.82161892,42.15356945],[-1.83811065,42.14196654],[-1.8402755,42.12812779],[-1.89203176,42.08598587],[-1.90923872,42.05912283],[-1.90157674,42.02968],[-1.8866235,42.02748232],[-1.85522791,42.00260384],[-1.8471849,42.00799914]],[[-1.8471849,42.00799914],[-1.84446288,41.98695089],[-1.86518806,41.97760202],[-1.85654121,41.96640222]],[[-1.85654121,41.96640222],[-1.87759234,41.95243399],[-1.9066667,41.94559064],[-1.91516917,41.93225161],[-1.98144244,41.91903395],[-2.02831438,41.95338643],[-2.03741034,41.94146625],[-2.06175728,41.95443023],[-2.1004408,41.95527139],[-2.11609634,41.96357110000001],[-2.12407217,41.99530851],[-2.10763214,42.0027743],[-2.11700834,42.02150834],[-2.15476525,42.04703815],[-2.16191283,42.06673373000001],[-2.12723951,42.08046184],[-2.12732423,42.09716934],[-2.17133506,42.10516959],[-2.23784217,42.10221798],[-2.26958888,42.08855491],[-2.28205486,42.10996995],[-2.28215981,42.13170298],[-2.31820492,42.14518057],[-2.38786685,42.14248487],[-2.43846157,42.13726809],[-2.4586151,42.11531732],[-2.48436885,42.10634852],[-2.5146761,42.11454163],[-2.52265614,42.08288126],[-2.51488043,42.06886147],[-2.55203278,42.04560460000001],[-2.56529936,42.01395239],[-2.57990898,41.99626378],[-2.62663513,42.00650413],[-2.6597892,42.00536463000001],[-2.67358075,41.99806443],[-2.70513649,42.01513667],[-2.74616654,42.00867843],[-2.75758399,42.03261575],[-2.70842102,42.08628785],[-2.7067233,42.10567452],[-2.73466643,42.1249536],[-2.75117298,42.11776761],[-2.77485101,42.12353594],[-2.79160768,42.10875221],[-2.79833532,42.04733092],[-2.85677885,42.02884792],[-2.88382583,42.0094871],[-2.91362376,42.02285214],[-2.91501611,42.03808346],[-2.93533267,42.0894077],[-2.96087358,42.08428579],[-3.03437345,42.08596323],[-3.06617203,42.13332365],[-3.08567822,42.13422037],[-3.08981492,42.15934508],[-3.1149672,42.17880335],[-3.12886377,42.20093509],[-3.10441534,42.21298323],[-3.1024833,42.23223129],[-3.08858938,42.24572506],[-3.09771895,42.26309062],[-3.08962131,42.27304897000001],[-3.10664182,42.31331924],[-3.09586264,42.32690994],[-3.11069017,42.3385777],[-3.10925639,42.35188115],[-3.0669454,42.35503838],[-3.06328617,42.36284874],[-3.08481108,42.38538631],[-3.10527045,42.38636924],[-3.09573803,42.40518219],[-3.10134658,42.41677724],[-3.0781791,42.41575042],[-3.08265217,42.39738397],[-3.06575126,42.37446524],[-3.05314267,42.37341796],[-3.06402009,42.40427633],[-3.06329939,42.42490957],[-3.04600395,42.4451541],[-3.07331467,42.47648106],[-3.09325245,42.49152479],[-3.07929209,42.49909108],[-3.07190093,42.52810391],[-3.0893025,42.5382776],[-3.10745582,42.52877007],[-3.13427139,42.54205289],[-3.10475778,42.55390794],[-3.06810577,42.58891366],[-3.06041583,42.60256162],[-3.07045708,42.6214142],[-3.08640334,42.62771658],[-3.08415204,42.64068653],[-3.04078804,42.6400522],[-3.01801271,42.63217764],[-3.00475589,42.6442647],[-2.98056902,42.63522096],[-2.97039386,42.64109957],[-2.93386773,42.63473483],[-2.92419967,42.62173297],[-2.90446199,42.62649131],[-2.88214361,42.62072464],[-2.85809313,42.63820535]],[[-2.99937798,42.60094639],[-2.99937798,42.60094639]],[[-2.94521427,42.60388627],[-2.92262872,42.60082896],[-2.93449984,42.61407523],[-2.94521427,42.60388627]],[[-3.41760805,43.13331612],[-3.43480712,43.179337],[-3.43312401,43.20661765000001],[-3.4501471,43.23620779],[-3.43640415,43.23507672],[-3.40662987,43.250683],[-3.39894821,43.24582043],[-3.38299157,43.27049322],[-3.34012618,43.27802959],[-3.34312836,43.29428004],[-3.32368808,43.29245726],[-3.29494405,43.30075581],[-3.29112205,43.29036533],[-3.26449534,43.29602161],[-3.20950601,43.28353771],[-3.19320895,43.29845085],[-3.1573265,43.3013196],[-3.14963474,43.31928411],[-3.15328741,43.35331534]],[[-3.15328741,43.35331534],[-3.11330582,43.35144136],[-3.0935084,43.36273158],[-3.04616781,43.34331633],[-3.03259292,43.34635891],[-3.02071583,43.32554377],[-3.01024593,43.33724202],[-3.01940582,43.35839255],[-3.03746861,43.37246225000001],[-3.00657367,43.38362447],[-2.9743048,43.40463786],[-2.97047186,43.41338021],[-2.94747409,43.41184096],[-2.94690901,43.43602654],[-2.88054019,43.43728129],[-2.86697296,43.43152132],[-2.80811456,43.43056346],[-2.75206195,43.45695499],[-2.73579963,43.42764513],[-2.69615828,43.40698953],[-2.66139178,43.40918799],[-2.64630897,43.41594066],[-2.61508929,43.3914649],[-2.58031485,43.38669634],[-2.56269023,43.39101543],[-2.54456056,43.37344891],[-2.50947425,43.37722958],[-2.48796206,43.36356542],[-2.45973877,43.33556651],[-2.43579211,43.3344331],[-2.42272892,43.32393151],[-2.40016234,43.32221227],[-2.35670511,43.30408325],[-2.28295373,43.2952327],[-2.22737687,43.31100542],[-2.1760265,43.2885216],[-2.14989259,43.29397538],[-2.13053182,43.29012844],[-2.11169941,43.30010412],[-2.00810758,43.32410113],[-1.98915271,43.31659632],[-1.98814019,43.32706827],[-1.96239588,43.33814643],[-1.91681555,43.33669644],[-1.87891616,43.35502349],[-1.87062012,43.36920453],[-1.84863938,43.37960111],[-1.79197489,43.39348663],[-1.79694622,43.3824907],[-1.77958545,43.36422634],[-1.78923796,43.35298344],[-1.75783492,43.34393076],[-1.73738178,43.33015547],[-1.74154504,43.31729822],[-1.7298536,43.29542383]],[[-1.7298536,43.29542383],[-1.783243,43.28681982],[-1.79391233,43.27646096],[-1.7949753,43.24692946],[-1.82554802,43.22830264],[-1.86640485,43.21769357],[-1.88018382,43.22967012],[-1.87536888,43.2102632],[-1.90295214,43.21116143],[-1.92288318,43.17898807],[-1.92068845,43.1506295],[-1.9022164,43.13550575],[-1.94752526,43.0975267],[-1.97335586,43.09156646],[-1.97808586,43.08199179],[-2.01235628,43.07309038],[-2.03174003,43.03169915],[-2.04139457,43.02970048],[-2.02830646,42.99883827],[-2.03833833,42.98099443],[-2.0952354,42.97255326],[-2.10772018,42.94876121],[-2.12950074,42.93937484],[-2.15704988,42.94229176],[-2.18096029,42.93512648],[-2.19026735,42.94779983],[-2.21025759,42.9499119],[-2.2378231,42.92145407],[-2.24147691,42.88637654],[-2.23581312,42.83448711],[-2.26769271,42.81340733],[-2.26859401,42.79510523],[-2.28101136,42.78513401],[-2.26620744,42.75294462],[-2.27343686,42.74186905],[-2.30626283,42.73558001],[-2.32367084,42.72440947],[-2.31285183,42.70868432],[-2.30929989,42.67115469],[-2.29357759,42.67793889],[-2.28848084,42.65506907],[-2.33218128,42.64618299],[-2.34489318,42.63451318],[-2.38194896,42.63429633],[-2.37212453,42.64338351],[-2.38881037,42.65848639],[-2.41579718,42.66268015],[-2.45007516,42.64725262000001],[-2.48307238,42.61215847],[-2.5000827,42.61647594],[-2.49069726,42.58768806],[-2.46220521,42.58738633],[-2.453242,42.56710779],[-2.4248383,42.60456737000001],[-2.39675449,42.59910015],[-2.38995354,42.54906409],[-2.40024652,42.54390418],[-2.39220245,42.5169523],[-2.42206456,42.51172164],[-2.42058169,42.48923427]],[[-2.85809313,42.63820535],[-2.89571891,42.65463686],[-2.90250167,42.69360266],[-2.92949901,42.69996248],[-2.93021013,42.70803217],[-2.95636449,42.71038641],[-2.98063108,42.70381871],[-2.98901644,42.7188234],[-3.00745875,42.72321833],[-3.01782068,42.74122833],[-3.04023808,42.73829583],[-3.04965355,42.76560606],[-3.06344731,42.76024095],[-3.09899741,42.76688924],[-3.11480019,42.75945412],[-3.14791334,42.75669694],[-3.1366404,42.76548222],[-3.13138659,42.78980325],[-3.15922883,42.80459143],[-3.11314988,42.86106424],[-3.10505283,42.87958669],[-3.12569692,42.89131798],[-3.1498863,42.86131978],[-3.17305971,42.85720808],[-3.19068648,42.86946347],[-3.2094436,42.84422501],[-3.23675915,42.83793121],[-3.28260871,42.87551436000001],[-3.27723917,42.90157958],[-3.24854455,42.91214544],[-3.22472932,42.94969174],[-3.180755,42.9445283],[-3.14473158,42.93468239],[-3.15083413,42.91919487],[-3.12653107,42.90405934],[-3.10466326,42.91015958],[-3.08951734,42.89899685],[-3.01890597,42.90851203],[-3.0143878,42.9189586],[-2.98147093,42.93880504],[-2.99607965,42.95287245],[-3.01750932,42.95372678],[-3.04147527,42.9699208],[-3.03695744,42.98223213],[-3.07709738,43.00852485],[-3.08898992,43.00163655],[-3.14478928,43.00683903],[-3.17780228,43.02198434],[-3.17024927,43.02907352],[-3.14346248,43.02739882],[-3.14103995,43.06869819],[-3.15808847,43.07371898],[-3.13394074,43.09723423],[-3.18178638,43.12087874],[-3.15350906,43.15908231],[-3.14829246,43.17400108000001],[-3.16803969,43.17858442],[-3.1856438,43.16922843],[-3.20813041,43.17941038],[-3.2234976,43.17224977],[-3.25029563,43.19689463],[-3.27811298,43.19442653],[-3.31022145,43.1721656],[-3.34196978,43.16684349],[-3.35063283,43.15435457000001],[-3.41760805,43.13331612]],[[-2.86193918,42.74552314],[-2.85522163,42.7287555],[-2.82898627,42.71901077],[-2.82530199,42.70893672],[-2.78450296,42.69894196],[-2.76789985,42.66601091],[-2.71800912,42.66201656],[-2.69920488,42.67483788],[-2.65392909,42.66999074],[-2.63485129,42.64779526],[-2.58484678,42.6515599],[-2.54916592,42.63757368],[-2.51739739,42.64633239],[-2.5220239,42.68403153],[-2.53939893,42.68657957],[-2.54837806,42.66880235],[-2.57947112,42.66893025],[-2.59413562,42.69003856],[-2.60897902,42.6959621],[-2.57262854,42.72517183],[-2.55830241,42.76273327],[-2.5893664,42.75032272],[-2.60234711,42.77063109],[-2.63517569,42.76488737],[-2.68008732,42.77994433],[-2.70980238,42.78341902],[-2.73155269,42.79451308],[-2.79377308,42.79316643],[-2.82681235,42.78445046],[-2.83547353,42.79626955],[-2.86193918,42.74552314]],[[-3.30453529,43.25825646],[-3.29338705,43.24264562],[-3.29681484,43.20601934],[-3.28481854,43.19717279],[-3.26548937,43.20646595],[-3.26970264,43.23271646],[-3.25201631,43.24611936],[-3.24917656,43.25964952],[-3.27014273,43.26659959],[-3.30453529,43.25825646]],[[-1.18282139,42.4238977],[-1.14497454,42.4418694],[-1.15876982,42.40966298],[-1.18440572,42.40102159],[-1.18282139,42.4238977]],[[-1.12936425,42.44672164],[-1.10285104,42.484334],[-1.06937315,42.46637596],[-1.05096304,42.44192044],[-1.05645049,42.43432296],[-1.12936425,42.44672164]],[[-1.7298536,43.29542383],[-1.69438678,43.31212419],[-1.66801366,43.314792],[-1.62575812,43.30687337],[-1.63002145,43.28503488],[-1.61740186,43.257699],[-1.57565623,43.24993867],[-1.55635975,43.27937571],[-1.56407575,43.28878328],[-1.53532089,43.29466675],[-1.50670206,43.29354215],[-1.46164789,43.271407],[-1.42690813,43.26716128],[-1.41365318,43.27366849],[-1.38432281,43.25367259],[-1.37782711,43.23059182],[-1.38666282,43.1948694],[-1.40191028,43.17841596],[-1.40328925,43.15524808],[-1.4147393,43.12769084],[-1.47135024,43.09177634],[-1.47224331,43.08155886],[-1.44120842,43.04635441],[-1.35416864,43.02812404],[-1.34256008,43.05444847],[-1.34616816,43.09058299],[-1.31963624,43.11278868],[-1.27003634,43.11826152],[-1.28882858,43.104218],[-1.30856999,43.06922226],[-1.24778859,43.04285842],[-1.22922524,43.05569221],[-1.18117078,43.03224544],[-1.17436792,43.03730575],[-1.14448548,43.02401092],[-1.14185816,43.00737247],[-1.11461732,43.02389154],[-1.08648215,43.00276737],[-1.00802999,42.99085645],[-1.00041427,42.97795498],[-0.94426962,42.95336752],[-0.91438907,42.96370428],[-0.86647399,42.95130369],[-0.80801021,42.95178332],[-0.78976728,42.96384082],[-0.75187296,42.96712776],[-0.73079477,42.94516365],[-0.72448507,42.92023029]],[[-0.72448507,42.92023029],[-0.7534742,42.92449522],[-0.78321266,42.92172531],[-0.81909499,42.90066851],[-0.81471688,42.87691169],[-0.85683299,42.84688532],[-0.85144059,42.80758656],[-0.86039241,42.8022794],[-0.84753291,42.78591967],[-0.86483781,42.76335355],[-0.90053527,42.76046607],[-0.90015473,42.74352088],[-0.92298479,42.74400072],[-0.94867627,42.71145241],[-0.96921134,42.70370542],[-1.027981,42.70006011],[-1.03918555,42.69163481],[-1.03248995,42.67559897],[-1.03859613,42.64832822],[-1.06939994,42.6415668],[-1.09283965,42.64648038],[-1.15240935,42.64756554],[-1.1576523,42.61046768],[-1.1800385,42.60786314],[-1.15845238,42.59987224],[-1.20192048,42.57823889],[-1.20279054,42.54966028],[-1.22616632,42.54224405],[-1.26476945,42.55680302],[-1.29347571,42.51095525],[-1.27511231,42.4957579],[-1.2727803,42.48189919],[-1.28983719,42.45737186],[-1.31520664,42.44921969],[-1.34150801,42.42393759],[-1.34294532,42.40814439],[-1.35977497,42.37836149],[-1.33672104,42.37237345],[-1.32908282,42.35538549],[-1.35227624,42.33952],[-1.39908199,42.29129979],[-1.38988567,42.27852672],[-1.39987766,42.24550712],[-1.41635662,42.22199652],[-1.41337469,42.20222369],[-1.39190609,42.18141828],[-1.39888146,42.12621936],[-1.36675953,42.10696108],[-1.35227723,42.0730705],[-1.31059278,42.07231256],[-1.30482248,42.04294935],[-1.33952034,42.01801386],[-1.36627081,41.98221177],[-1.38223468,41.94334234],[-1.4035523,41.93507574],[-1.42177809,41.91307297],[-1.45329326,41.91572666],[-1.47305315,41.92447533],[-1.50176095,41.92427715],[-1.52330681,41.90989372],[-1.55925572,41.91394418],[-1.59625179,41.92709264],[-1.6148243,41.95052788000001],[-1.6541458,41.9653515],[-1.67366124,41.96643406],[-1.68681798,41.95285044],[-1.71522096,41.95696348],[-1.74168688,41.96890188],[-1.76689646,41.99578932],[-1.79234364,41.98969241],[-1.81034545,41.99802222],[-1.83370298,41.99506482],[-1.8471849,42.00799914]],[[-2.34163224,38.02600054],[-2.33006605,38.06486186],[-2.29548163,38.08592119],[-2.26164972,38.11295932],[-2.25086083,38.13941553],[-2.2303591,38.16386066],[-2.21293897,38.20302228],[-2.17525103,38.22398817],[-2.11463641,38.23773186],[-2.08352555,38.26553914],[-2.06377157,38.29759249],[-2.04899181,38.30578267],[-2.0210317,38.30035269],[-2.00015628,38.28396397],[-1.90753646,38.29796182],[-1.84342252,38.33418725],[-1.82190185,38.33625281],[-1.81102509,38.35137295],[-1.78430308,38.35615432],[-1.7957543,38.37026797],[-1.77114309,38.3648576],[-1.77134641,38.37854867],[-1.74287469,38.38117538],[-1.71731149,38.36747071],[-1.70248216,38.37485929],[-1.68179777,38.35964179],[-1.69283202,38.34558983],[-1.67024637,38.31164943],[-1.58953906,38.30999232],[-1.55819765,38.32520323],[-1.54210083,38.34237882],[-1.4785473,38.37638324],[-1.47488583,38.40898479],[-1.48157355,38.48933729],[-1.49873273,38.53205612],[-1.48769512,38.56330935],[-1.45200108,38.58145975],[-1.44329106,38.6369246],[-1.44769809,38.64951751],[-1.40221803,38.69079671],[-1.36666615,38.70400184],[-1.34432318,38.67705139],[-1.28381904,38.70707664],[-1.2627774,38.73021175],[-1.22757313,38.7456951],[-1.18363507,38.75508518],[-1.11967177,38.73771872],[-1.11560114,38.71138702],[-1.04298546,38.66125676],[-1.02693349,38.65551726]],[[-1.02693349,38.65551726],[-1.01591996,38.6350568],[-1.00156894,38.57267452],[-1.02606172,38.52281923],[-1.01364545,38.49673011],[-1.03486518,38.47452488],[-1.08209391,38.44112933],[-1.0880619,38.36776823],[-1.08438379,38.34621634],[-1.02842108,38.33856611],[-0.98915262,38.3208771],[-0.97149234,38.29008813],[-0.96859655,38.25575971],[-0.9885456,38.19953146],[-1.00489294,38.17210988],[-1.03676153,38.13771967],[-1.02259937,38.07569049],[-0.96602243,38.01268963000001],[-0.93418694,37.96888828],[-0.92118842,37.94423803],[-0.85722136,37.88521752],[-0.82919546,37.86391201],[-0.8038847,37.85928665],[-0.78966405,37.84787438],[-0.76249977,37.84658077]],[[-0.76249977,37.84658077],[-0.75350364,37.78822057],[-0.77566358,37.81905525],[-0.79627503,37.81050357],[-0.80029948,37.7824448],[-0.82703907,37.75530301],[-0.84861173,37.74251519],[-0.85963121,37.71728514],[-0.81038028,37.6631034],[-0.78722671,37.65107312],[-0.72654105,37.63557218],[-0.72070727,37.65032043],[-0.73891317,37.65842896],[-0.73331545,37.67364096],[-0.74407782,37.71093855],[-0.73915816,37.74401528],[-0.75670509,37.7803605],[-0.74350655,37.77866641],[-0.74390568,37.75695658],[-0.72799647,37.7490452],[-0.74101115,37.71181698],[-0.72796683,37.67058223],[-0.69888443,37.63288194],[-0.73184885,37.60150259],[-0.78237557,37.59465027],[-0.8218906,37.57482148],[-0.8454258,37.58165194],[-0.91924763,37.55393994],[-0.95172961,37.55788768],[-0.95839551,37.57412585],[-0.97473127,37.576336],[-0.9735983,37.59723363],[-0.98580226,37.58527632],[-1.00977593,37.5857283],[-1.01371251,37.57439427],[-1.07427825,37.58412238],[-1.09558162,37.5689491],[-1.10865974,37.56936677],[-1.12713972,37.55212358],[-1.10681118,37.53549585],[-1.16647373,37.54207066],[-1.16857323,37.5570999],[-1.20373714,37.57398901],[-1.23811488,37.57782402],[-1.25650115,37.55759375],[-1.32097993,37.56335955],[-1.34078349,37.55715959],[-1.39074838,37.52479289],[-1.4015908,37.50722114],[-1.44057715,37.49851334],[-1.45991073,37.48634738],[-1.48123701,37.45307763],[-1.47736297,37.42891821],[-1.49110866,37.42146057],[-1.51900991,37.4317819],[-1.56524876,37.40387125],[-1.59080425,37.40209673],[-1.63012374,37.37523122]],[[-1.63012374,37.37523122],[-1.66596801,37.4008601],[-1.7370751,37.44263347],[-1.81175635,37.45155628],[-1.80856269,37.43353301],[-1.84526109,37.45482689],[-1.87108885,37.48981342],[-1.95378315,37.58795343],[-1.9552788,37.60086446],[-1.97867666,37.62203383],[-2.01192329,37.67253746],[-2.00765362,37.71979241],[-1.99583233,37.7280473],[-2.00883589,37.77495123],[-1.99647761,37.81900804],[-1.99527723,37.84138501],[-1.9745016,37.86846934],[-2.00452475,37.8806144],[-2.02173519,37.86824805],[-2.0509426,37.87940992],[-2.10038494,37.87719841],[-2.12320358,37.9005521],[-2.17201194,37.88868941],[-2.18494853,37.90363394],[-2.23791399,37.92849586],[-2.28008508,37.96311829],[-2.2991954,38.00169109],[-2.34163224,38.02600054]],[[-4.31950989,40.64764365],[-4.31619392,40.66674958],[-4.28481653,40.68122077],[-4.25387639,40.66189101],[-4.25603852,40.65146095],[-4.28783507,40.65291431],[-4.31950989,40.64764365]],[[-4.57907617,40.21719617],[-4.56567607,40.2181881],[-4.55961561,40.23428689],[-4.56878845,40.25871215],[-4.52937915,40.29312484],[-4.54765439,40.34037625],[-4.52678761,40.34487332],[-4.50489576,40.31543829],[-4.45576199,40.31935066],[-4.46132232,40.33978473000001],[-4.43943373,40.35076255],[-4.44232395,40.3883176],[-4.41553726,40.40960209],[-4.33027235,40.40829811],[-4.34064358,40.43736149],[-4.32289464,40.4493449],[-4.32057174,40.53207656],[-4.32370386,40.54958224],[-4.28926182,40.56419425],[-4.27886423,40.60415648],[-4.28926793,40.60668485],[-4.28917943,40.62724322],[-4.27110169,40.62902274],[-4.26214101,40.60517998],[-4.21362497,40.60567911],[-4.16118272,40.62346507],[-4.17284529,40.63139095],[-4.16657366,40.65266322],[-4.17156694,40.68062631],[-4.14437061,40.69584227],[-4.13605985,40.71774634],[-4.11044355,40.74398208],[-4.09699078,40.74773929],[-4.09668577,40.76422116],[-4.07009155,40.7939154],[-4.02131709,40.7811916],[-4.00285388,40.78864927],[-3.97967572,40.78455483],[-3.97995879,40.79938645],[-3.96212157,40.82344719],[-3.96573573,40.83495753],[-3.94710521,40.86297439],[-3.9423547,40.88896959],[-3.95227618,40.89363193],[-3.92176072,40.9299286],[-3.90719656,40.95530286],[-3.87903947,40.97520166],[-3.80944199,40.98780959],[-3.78136611,41.00031185],[-3.75554416,41.02793068],[-3.74045499,41.05364029],[-3.71398921,41.07320804],[-3.67953739,41.08423042],[-3.65105816,41.10776254],[-3.63398902,41.1348848],[-3.600047,41.15538246],[-3.53972219,41.16504109]],[[-3.53972219,41.16504109],[-3.54109818,41.1496669],[-3.51060314,41.13729032],[-3.48903171,41.10404767],[-3.44820332,41.08065054],[-3.42566102,41.08265498],[-3.42617375,41.06538274000001],[-3.43893478,41.04266972],[-3.39445032,41.00027763],[-3.41829605,40.98756352],[-3.41623344,40.97581157],[-3.43603915,40.94612837],[-3.45897202,40.89755851],[-3.43955279,40.89107043],[-3.44613383,40.87670387],[-3.47242343,40.86434349],[-3.47675596,40.82541281],[-3.50427305,40.78921342],[-3.45901014,40.78132399],[-3.44434315,40.76157956],[-3.44873753,40.73296027],[-3.43719126,40.72288962],[-3.46855262,40.68993667],[-3.42677583,40.67237578],[-3.42555318,40.68237719],[-3.40473481,40.66963716],[-3.39335404,40.69245827],[-3.37465063,40.68011262],[-3.36631822,40.64803124],[-3.32717069,40.64058715],[-3.33805723,40.62611396],[-3.32160261,40.61172403],[-3.33034054,40.59736897],[-3.31608392,40.58407355],[-3.28706034,40.57240571],[-3.28310259,40.55096409],[-3.29712639,40.53752087],[-3.2512201,40.54211673],[-3.19995495,40.51444864000001],[-3.19532796,40.47859377],[-3.19859666,40.44225227],[-3.1555145,40.43942476],[-3.142073,40.4124574],[-3.13055795,40.40518499],[-3.14334418,40.38753441],[-3.13828782,40.37554293],[-3.15342976,40.36770319],[-3.14123762,40.35051177],[-3.15139789,40.33524731],[-3.18064254,40.31331971],[-3.18420985,40.26970752],[-3.194449,40.24803708],[-3.17339692,40.23416978],[-3.15371773,40.2637135],[-3.11267418,40.2854779],[-3.0960238,40.26908588],[-3.07945638,40.20838235],[-3.08575944,40.18614536],[-3.07169465,40.15598743],[-3.08938552,40.16290816],[-3.09675536,40.14238869],[-3.07798244,40.13576075],[-3.05354725,40.10659428],[-3.06070714,40.09056391],[-3.08880225,40.07059376],[-3.11819011,40.0614287],[-3.16157891,40.06492789],[-3.16644627,40.09110996000001],[-3.20177143,40.06629195],[-3.24362248,40.05341971],[-3.26392511,40.05711101],[-3.30249422,40.05331365],[-3.32774693,40.0791352],[-3.37770838,40.07476734],[-3.37692347,40.04998735],[-3.39399307,40.03553327],[-3.42598042,40.0465859],[-3.44786511,40.03854334],[-3.44865595,40.04977533000001],[-3.47236925,40.04570781],[-3.50576984,40.04854355],[-3.51968926,40.0210718],[-3.58999508,40.01317224],[-3.59459648,40.00169737],[-3.63794423,39.98835216],[-3.63051256,39.96863447],[-3.67764319,39.96077047],[-3.69758833,39.94671845],[-3.7111052,39.95470898],[-3.74387023,39.94080199],[-3.75936806,39.91907274],[-3.77879759,39.91085406],[-3.80642118,39.88738859],[-3.83454833,39.89993412],[-3.87542731,39.91068529],[-3.87547723,39.92690425],[-3.83951803,39.94198282],[-3.83012694,39.93344338],[-3.81032973,39.95376423],[-3.78641667,39.94466855],[-3.78680485,39.95392886],[-3.75887607,39.96886754],[-3.73531123,39.96187825],[-3.74675002,39.97946514],[-3.72727834,39.98918706],[-3.69989129,40.0195428],[-3.67911328,40.01646894],[-3.66349777,40.03663121],[-3.65139604,40.03164368],[-3.63965746,40.05002032],[-3.62309403,40.0541109],[-3.61036406,40.08186968],[-3.60762816,40.10896678000001],[-3.65633153,40.12533984],[-3.66731277,40.14329067],[-3.68372357,40.13227007],[-3.71980927,40.14711534],[-3.74625867,40.13216345],[-3.77143274,40.13977826],[-3.77895142,40.15622697],[-3.80003788,40.17539943],[-3.83418612,40.16135255],[-3.85279689,40.16924078],[-3.86663458,40.18807753],[-3.91596203,40.19146925000001],[-3.93128751,40.20396728],[-3.95144277,40.19003902],[-3.95286647,40.21279654],[-3.99100234,40.20947821],[-4.02615893,40.23561052],[-4.02402768,40.24896842],[-4.05208603,40.25152858],[-4.08045645,40.26693957],[-4.1042721,40.24183334],[-4.15072658,40.24923233],[-4.14399207,40.26462091],[-4.16710174,40.27315875],[-4.17951945,40.29339971],[-4.20380895,40.28730094],[-4.20322981,40.26881762],[-4.24616455,40.27421292],[-4.26965018,40.23602388],[-4.29518904,40.21888120000001],[-4.3111797,40.23452305],[-4.32151953,40.22630089],[-4.34173264,40.24045325],[-4.35692539,40.27034029],[-4.35638571,40.30862137],[-4.3783173,40.31481535],[-4.38505171,40.29021434],[-4.43524582,40.25912724],[-4.43452512,40.24431457],[-4.44751011,40.23364754],[-4.47239522,40.23143463],[-4.51693006,40.21472097],[-4.53536434,40.19934286],[-4.57504979,40.2067268],[-4.57907617,40.21719617]],[[-3.38213512,40.63047058],[-3.38213512,40.63047058]],[[-8.89249151,42.19064695],[-8.90597737,42.19143634],[-8.90776917,42.20659289],[-8.89249151,42.19064695]],[[-8.91379602,42.2113493],[-8.90413628,42.24363414],[-8.89585413,42.22811936],[-8.91379602,42.2113493]],[[-8.93895782,42.35515358],[-8.94510577,42.37998476],[-8.92678254,42.38922749],[-8.93895782,42.35515358]],[[-9.01043497,42.46296391],[-9.01572064,42.48570272],[-8.99938052,42.46889215],[-9.01043497,42.46296391]],[[-7.03188898,43.54455858],[-7.04477902,43.5161927],[-7.04765782,43.47789908],[-7.07845215,43.46464854],[-7.10331073,43.42690735],[-7.12623037,43.42389335],[-7.1420304,43.43078476],[-7.1729879,43.43041327],[-7.16904745,43.40885948],[-7.17672001,43.3825416],[-7.15900449,43.3745813],[-7.13901519,43.38334773],[-7.12753288,43.37259939],[-7.13075045,43.33024848],[-7.11571456,43.32658714],[-7.10127497,43.30413084],[-7.06416706,43.30173048],[-7.07159798,43.26777559],[-7.06159062,43.24404786],[-7.0200533,43.21324001],[-7.00958299,43.22288168],[-7.00144464,43.20727582],[-6.97101876,43.20424999],[-6.96447031,43.1903868],[-6.9806946,43.16685436],[-6.95785214,43.13646881000001],[-6.93863505,43.13293679],[-6.86182385,43.18225276],[-6.83918622,43.16639493],[-6.82155353,43.14324321],[-6.82760445,43.12318731000001],[-6.86523888,43.10110353],[-6.87134808,43.09120864],[-6.89399036,43.09179869],[-6.91559509,43.07342196],[-6.92336757,43.08185291],[-6.95199384,43.07546404],[-6.96613996,43.06135128],[-6.97247439,43.03036565],[-6.98094901,43.0414604],[-6.99717178,43.01948333],[-6.96182619,42.99098393],[-6.95607429,42.99614425],[-6.96444852,43.0265657],[-6.94655315,43.03245236],[-6.94063821,43.0113897],[-6.90831609,42.98927006],[-6.87074197,42.98817193],[-6.83609108,42.9577638],[-6.84187466,42.92819891],[-6.82418942,42.91506098]],[[-6.82418942,42.91506098],[-6.83563106,42.90427902],[-6.82048434,42.86791315],[-6.84032381,42.8781788],[-6.8712792,42.87384093],[-6.8403212,42.82336475],[-6.86699757,42.80395364],[-6.86743047,42.78717371],[-6.89078207,42.77728742],[-6.90148511,42.76128276],[-6.93560298,42.74086304],[-6.95651584,42.75563713],[-6.98373974,42.71869418],[-6.99019436,42.72660867],[-7.01353629,42.72212716],[-7.04519184,42.69476539],[-7.01551318,42.66459478],[-7.01782627,42.64521807],[-7.04700479,42.63270043],[-7.0498488,42.59855598],[-7.03356222,42.58409032],[-7.05764157,42.56374089],[-7.07064828,42.53901331],[-7.05985289,42.52932147],[-7.07381776,42.50671144],[-7.05187986,42.50864287],[-7.02868503,42.49786469],[-7.00445755,42.50392842],[-6.9735527,42.49401184],[-6.96050983,42.51749643],[-6.92505427,42.51943854],[-6.91479269,42.51047086],[-6.84917994,42.48672383],[-6.83703855,42.49548759],[-6.80859734,42.46944878],[-6.82203408,42.45443186],[-6.8156108,42.42676907],[-6.84351266,42.40584575],[-6.82080432,42.38564422],[-6.77415572,42.37882712],[-6.76654241,42.36504905],[-6.73395327,42.35911141],[-6.74114583,42.29866347],[-6.76503461,42.27273985],[-6.76699683,42.25745773],[-6.78756388,42.25417702],[-6.80241843,42.23554977],[-6.78713952,42.21572392],[-6.84359984,42.22830416],[-6.86986609,42.22374584],[-6.8932835,42.20720353],[-6.90107801,42.1896229],[-6.9147721,42.18942581],[-6.94351335,42.17225904],[-6.94455234,42.14168047],[-6.95642138,42.12945741],[-6.98642867,42.12419403],[-7.00399608,42.08379113],[-7.03358474,42.07423505],[-7.031006,42.0632955],[-7.0077789,42.05155831],[-6.97479158,42.05515663],[-6.96113909,42.02720251],[-6.99165633,41.9860537],[-6.98581512,41.97143789]],[[-6.98581512,41.97143789],[-7.00623316,41.95051106],[-7.05479246,41.9487494],[-7.0768429,41.9521722],[-7.0875591,41.97391411],[-7.14056744,41.99082989],[-7.15795931,41.97637862],[-7.17710744,41.98003122],[-7.1866624,41.96987695],[-7.18353818,41.93343399],[-7.17350213,41.91953721],[-7.19729002,41.88005847],[-7.23265973,41.86722355],[-7.24372866,41.86920042],[-7.31118247,41.84404715],[-7.35626369,41.84010995],[-7.36382879,41.85271598],[-7.38996163,41.83881545],[-7.40757634,41.81743938],[-7.42729072,41.80747765],[-7.42674938,41.83294375],[-7.44413805,41.83977117],[-7.45280034,41.86514114],[-7.48502863,41.86128234],[-7.49099054,41.8714123],[-7.51314242,41.86215951],[-7.50540646,41.85047079000001],[-7.53887182,41.83651798000001],[-7.57416816,41.82987449],[-7.61358744,41.82927578],[-7.60232738,41.86659874],[-7.58626789,41.88202673],[-7.65274413,41.88127342],[-7.70410659,41.90783457],[-7.73465128,41.89468256],[-7.76391603,41.89929462],[-7.79231276,41.88326336],[-7.84497723,41.88153411],[-7.84199046,41.86976689],[-7.8764849,41.84946858],[-7.89176386,41.86047654],[-7.88427896,41.88139564],[-7.88763594,41.9270529],[-7.9057809,41.92736652],[-7.91900451,41.88128716],[-7.94361259,41.87154853],[-7.97097719,41.87615329],[-7.98876953,41.86764592],[-8.01326415,41.82881701],[-8.03938572,41.82957957],[-8.05753943,41.81616626],[-8.09386568,41.80894794],[-8.12995341,41.80893122],[-8.16510982,41.81827225],[-8.16169932,41.860641],[-8.17060525,41.87904662],[-8.19972279,41.87401916],[-8.21717155,41.91308164],[-8.1983451,41.93974049000001],[-8.17550596,41.95474793],[-8.16347636,41.98270543000001],[-8.14059391,41.98878609],[-8.13024842,42.00358318],[-8.08546153,42.01697959],[-8.08429118,42.04737198],[-8.09689169,42.07181297],[-8.12414856,42.08315499],[-8.14910542,42.07987397],[-8.18231697,42.06685988],[-8.19904175,42.15440995],[-8.20752592,42.1408979],[-8.2321489,42.13321119],[-8.25341813,42.13679166],[-8.25863534,42.12138233],[-8.27436963,42.12329566],[-8.30332733,42.10429345],[-8.32340321,42.10107425],[-8.3318987,42.08420374],[-8.3696426,42.08851504],[-8.39021251,42.07541219],[-8.40440337,42.08044126],[-8.42898358,42.07224644],[-8.44335981,42.08293341],[-8.52355196,42.07845022],[-8.52550269,42.06448335000001],[-8.55733079,42.05129257],[-8.59446173,42.05514521],[-8.63016992,42.04998149],[-8.65774031,42.03066186],[-8.66201083,42.00348899],[-8.68044882,41.99005301],[-8.71449641,41.97977846],[-8.74571907,41.96411746],[-8.7482755,41.94190699],[-8.78726154,41.91749975],[-8.82352402,41.90450645],[-8.83800817,41.88736684],[-8.86915054,41.86682776],[-8.88227276,41.88310212],[-8.87416231,41.89904673],[-8.88536121,41.91701519],[-8.88851202,41.97725547000001],[-8.88152194,42.00318936],[-8.8846081,42.04072153],[-8.89710441,42.07659851],[-8.89169325,42.08247657],[-8.90069644,42.11223165],[-8.88061045,42.11022371],[-8.86318518,42.12115561],[-8.83422255,42.1125818],[-8.82370679,42.11695267],[-8.82201433,42.14314459],[-8.849232,42.14971319],[-8.81861142,42.16152883],[-8.81552126,42.18727867],[-8.7794038,42.20425155],[-8.76323396,42.23073264],[-8.74045821,42.22629729],[-8.72598856,42.24317264000001],[-8.71273643,42.24105399],[-8.70292054,42.25979131],[-8.67708876,42.26429076],[-8.66830051,42.27923827],[-8.64701392,42.29033817],[-8.62913424,42.28495441],[-8.61417902,42.29767184],[-8.62371176,42.30991442],[-8.61208044,42.3282835],[-8.61211903,42.34619608],[-8.62804836,42.35082316],[-8.64403754,42.33614432],[-8.63624628,42.32650931],[-8.66226686,42.3107118],[-8.65181346,42.29775285],[-8.68966864,42.28000421],[-8.71362021,42.27783735],[-8.71831477,42.28909829],[-8.76613642,42.25945579],[-8.78356249,42.26302242],[-8.78877283,42.24835547],[-8.81527136,42.25927116000001],[-8.82474838,42.25127199],[-8.8625349,42.26894635],[-8.85948027,42.30479555],[-8.82188636,42.27513796],[-8.81746198,42.30783332],[-8.8388626,42.3385098],[-8.79930078,42.33791374],[-8.79112889,42.32703964],[-8.75204662,42.34408274],[-8.73869751,42.37372247],[-8.70659518,42.3981504],[-8.69754083,42.39353401],[-8.65654982,42.42597976],[-8.68116015,42.42106791],[-8.69004408,42.43836906],[-8.71155457,42.42301848],[-8.74078703,42.41384772],[-8.77207216,42.38931645],[-8.81638813,42.4003741],[-8.83868725,42.38431157],[-8.8647714,42.41124155],[-8.88106816,42.41520177],[-8.87119769,42.43434334],[-8.8825735,42.45481338],[-8.94165016,42.46388979],[-8.933827,42.47819519],[-8.91290055,42.47525679],[-8.88959105,42.48224932],[-8.88192145,42.49936992],[-8.85877978,42.49413208],[-8.85553389,42.47283811],[-8.87297408,42.46107751],[-8.86857821,42.44763865],[-8.84708428,42.45696856],[-8.81964352,42.45176962],[-8.83105272,42.48232719],[-8.81790822,42.50183846],[-8.8136907,42.52843783],[-8.82860567,42.51832465],[-8.82633044,42.54077445],[-8.83644239,42.5516725],[-8.8300309,42.57531492],[-8.80823663,42.57592145],[-8.76858825,42.60657552],[-8.77803129,42.6139208],[-8.74166687,42.64845953],[-8.72430396,42.68028092],[-8.75617661,42.64738686],[-8.77007139,42.65296889],[-8.79462095,42.63673725],[-8.82237415,42.64616361],[-8.81367135,42.66042509],[-8.84380872,42.68260638],[-8.84104892,42.66207023000001],[-8.85204176,42.66521601],[-8.85390214,42.63055339],[-8.86209501,42.606089],[-8.88584332,42.61458015],[-8.87349459,42.63238267],[-8.90089875,42.64034034],[-8.93715389,42.60730529],[-8.92249107,42.58612058],[-8.9555273,42.58394292],[-8.96508937,42.56802374],[-8.98829811,42.56583657],[-8.98653594,42.5380778],[-9.01901586,42.51829492],[-9.04189793,42.5172215],[-9.04124797,42.53642026],[-9.03024442,42.55216961],[-9.04469185,42.57147926],[-9.06036219,42.5779578],[-9.08761132,42.57012594],[-9.07826286,42.59840289],[-9.06805952,42.59784752],[-9.06116942,42.61769304],[-9.04629647,42.6283206],[-9.03689631,42.64890984],[-9.02417971,42.70793967],[-8.99101976,42.74046222],[-8.95390172,42.74880511],[-8.94124911,42.77391344],[-8.92220732,42.78996332],[-8.89864218,42.79636898],[-8.90527703,42.81772928],[-8.90879943,42.7964916],[-8.94214,42.80165562],[-8.95288114,42.78153485],[-8.97717681,42.79091385],[-8.98144346,42.77815082],[-9.01522428,42.78424248],[-9.01267076,42.79808667],[-9.06550584,42.78503708],[-9.04788578,42.76967947],[-9.07558311,42.75709093],[-9.08063679,42.73813436000001],[-9.10216985,42.75566312],[-9.11227401,42.75246681],[-9.13460117,42.78945306],[-9.1513459,42.7991732],[-9.11544649,42.81056396],[-9.1071905,42.82340144],[-9.11185439,42.84261307],[-9.12920159,42.84349156],[-9.14998138,42.87452656],[-9.14408252,42.89480093],[-9.12553204,42.90512442],[-9.16061491,42.91175011],[-9.17339955,42.9438783],[-9.19304581,42.94502735],[-9.18318814,42.91605535],[-9.20910093,42.91640269],[-9.21800623,42.94152663],[-9.23218851,42.92888846],[-9.25877448,42.92267062],[-9.27019749,42.88015065],[-9.28174809,42.89369216],[-9.27519017,42.90611505],[-9.29744466,42.92150476],[-9.28422151,42.95406315],[-9.26725568,42.96470948],[-9.25722834,43.00238217],[-9.27533352,43.00913731],[-9.28796031,43.04439334],[-9.2616264,43.04886732],[-9.25091796,43.06879022],[-9.25771495,43.09074105],[-9.24293823,43.08470112],[-9.21623952,43.10465845],[-9.19840718,43.10398227],[-9.19386966,43.09179774],[-9.16835132,43.1043975],[-9.15905716,43.12861934],[-9.16985312,43.14706488],[-9.18307343,43.12414149],[-9.20481348,43.12984632],[-9.21231021,43.15947624],[-9.19908795,43.15458818],[-9.18108825,43.16734887],[-9.1746605,43.19134457],[-9.16590795,43.18313186],[-9.15156717,43.19340355],[-9.11473425,43.19416143],[-9.0808178,43.18123122],[-9.05946529,43.18508691],[-9.00409881,43.23099128],[-8.99152991,43.2167187],[-8.97960473,43.2291553],[-8.93975459,43.22687304],[-8.9542517,43.25996357],[-8.9790618,43.26351672000001],[-8.99059987,43.27449617],[-8.95669554,43.29374583],[-8.93660643,43.28918588],[-8.90613137,43.29527014],[-8.91076627,43.32164846],[-8.87356775,43.32253637],[-8.85867793,43.31695637],[-8.84838033,43.33741553],[-8.8324588,43.34447872],[-8.82575314,43.32819504],[-8.80621695,43.32673432],[-8.80249593,43.31346584],[-8.7718388,43.29934078],[-8.71158881,43.28997051],[-8.63497817,43.30875323],[-8.6074179,43.32228293],[-8.56803842,43.31180803],[-8.53372045,43.31644054],[-8.5103073,43.32798998],[-8.48833178,43.35308589],[-8.45645246,43.36033248],[-8.44183828,43.38103399],[-8.38769385,43.36977791],[-8.40401939,43.36368495],[-8.38505149,43.3537706],[-8.38494755,43.34133431],[-8.34929355,43.34627135],[-8.34010902,43.38165797],[-8.35553776,43.38069126],[-8.3445149,43.39691767],[-8.30461218,43.40366054],[-8.29651741,43.38520362],[-8.26722935,43.38452601],[-8.25217418,43.36717965],[-8.25265702,43.35379774],[-8.21042185,43.32727862],[-8.22029681,43.38506422000001],[-8.20649929,43.40866975],[-8.17797761,43.41174221],[-8.17573287,43.42102679],[-8.1982347,43.42661995],[-8.21570156,43.41788189],[-8.23823438,43.42866013],[-8.2581184,43.41966041],[-8.27950737,43.43649685000001],[-8.31656266,43.44501049],[-8.31301807,43.45318799],[-8.25278712,43.46540521],[-8.23140216,43.45509039],[-8.20200535,43.45986565],[-8.1738473,43.47715375],[-8.15126326,43.5151864],[-8.16617363,43.51263014],[-8.19109861,43.48153704],[-8.24859347,43.47618544],[-8.25732676,43.48961091],[-8.2668971,43.46776094],[-8.29938806,43.46136657],[-8.32030566,43.46776524],[-8.34102999,43.45835171],[-8.34331056,43.47213566],[-8.32753822,43.48153434],[-8.32030239,43.50241603],[-8.33093319,43.50754589],[-8.32406055,43.52554815000001],[-8.30271124,43.52602136],[-8.29651143,43.53601445],[-8.32200927,43.56527314],[-8.29992572,43.55727285],[-8.2594552,43.55821173000001],[-8.21662971,43.58360478],[-8.21641299,43.59240122],[-8.19332458,43.60273733],[-8.18775458,43.62148231],[-8.16553401,43.61266073],[-8.14130647,43.63219347],[-8.09660716,43.65290835],[-8.0932989,43.6665422],[-8.0817613,43.64757539],[-8.05386947,43.64894118],[-8.055758,43.65975072],[-8.07573731,43.65992539],[-8.07579122,43.68287949],[-8.06263005,43.70510667],[-8.04015911,43.71386239],[-8.00714711,43.7049729],[-7.96322248,43.72170231],[-7.95019675,43.74180381],[-7.92914496,43.73963675],[-7.90326708,43.76861494],[-7.88915309,43.76311713],[-7.87014733,43.77395903],[-7.85927416,43.76352073],[-7.8696976,43.73021699],[-7.85032146,43.71813291],[-7.85370126,43.70805029],[-7.87779073,43.72119275],[-7.87244086,43.67165508],[-7.90447747,43.67135338],[-7.88424111,43.66271495],[-7.84314111,43.67252478],[-7.86798066,43.69865525],[-7.8279876,43.70080514],[-7.82496142,43.71549037],[-7.78160907,43.73296228],[-7.72521575,43.74995033],[-7.71796712,43.76404226],[-7.68752705,43.77634327],[-7.68883814,43.7913417],[-7.6617305,43.77725648],[-7.68909401,43.75636525],[-7.69868339,43.73863176],[-7.68309835,43.730018],[-7.6731406,43.74641495],[-7.65097089,43.74397212],[-7.63652127,43.7530228],[-7.62355246,43.71884421],[-7.60736793,43.71918395],[-7.61457232,43.70246296],[-7.61226239,43.67497231],[-7.59667888,43.6742599],[-7.57627612,43.69299544],[-7.58600075,43.70839555],[-7.5579232,43.71159149],[-7.55707125,43.72995492],[-7.52434108,43.73680345],[-7.51405714,43.7227346],[-7.49253281,43.7278788],[-7.46715873,43.72322179],[-7.47877507,43.7127102],[-7.46981729,43.70308661],[-7.40785407,43.68952708],[-7.40422733,43.68321218000001],[-7.35709714,43.67121187],[-7.35670104,43.65924425],[-7.33134135,43.62669235],[-7.32335328,43.62729246],[-7.29289156,43.59290836],[-7.24629462,43.57482777],[-7.26285336,43.55786989],[-7.2434775,43.55185797],[-7.23612536,43.56914682],[-7.1791114,43.56188637],[-7.16758223,43.55449347],[-7.11595345,43.56162531],[-7.08892053,43.55458447],[-7.04320079,43.55618654],[-7.03188898,43.54455858]],[[-8.87175402,42.52413502],[-8.87985675,42.54027246],[-8.86916542,42.5557745],[-8.88914403,42.56749243],[-8.87665163,42.57488745],[-8.85796894,42.55881595],[-8.87175402,42.52413502]],[[-6.93165634,38.20831687],[-6.93612078,38.22039914],[-6.95674154,38.21683178],[-6.97225448,38.20230994],[-6.98024747,38.21115427],[-7.0112097,38.20455074],[-7.02257626,38.18544444],[-7.04378992,38.1870837],[-7.08432146,38.16947538],[-7.10786478,38.188063],[-7.11326393,38.20672512],[-7.14304149,38.24083887],[-7.14321049,38.26189058],[-7.15596336,38.27898389],[-7.1696111,38.2792735],[-7.20067023,38.32702412],[-7.24315811,38.36521023],[-7.27238879,38.39710998],[-7.28574246,38.42377554],[-7.33050847,38.44428219],[-7.30072503,38.46648258],[-7.29930718,38.48347539],[-7.3224307,38.47755248],[-7.31304064,38.51504958],[-7.30207034,38.52716181000001],[-7.30271872,38.54533039],[-7.28602611,38.57375481],[-7.26359482,38.58863412],[-7.24520139,38.62715721],[-7.26969352,38.63879215],[-7.26436499,38.7037324],[-7.25530251,38.72589415],[-7.20382488,38.75029349],[-7.19140022,38.76849195],[-7.1637866,38.77870326],[-7.15479553,38.79385739],[-7.12854938,38.81384695],[-7.089168,38.81887298],[-7.07376245,38.84808901],[-7.03933788,38.86477796],[-7.03308977,38.87753144],[-7.05203583,38.90716356],[-7.02637667,38.9246879],[-7.02043648,38.94015013],[-6.98342181,38.98076239000001],[-6.95131541,39.02399823],[-6.96788139,39.03981833],[-6.95938011,39.05446437],[-6.981006,39.08775445],[-7.03340974,39.11760869],[-7.05296686,39.11791998],[-7.10579723,39.09931633],[-7.14380638,39.10925424],[-7.14951534,39.12240715],[-7.13738065,39.14183348],[-7.13458554,39.17109521],[-7.16690121,39.18127198],[-7.20811068,39.18731753],[-7.24135284,39.20854406],[-7.24777596,39.25395194],[-7.23139579,39.27836117],[-7.26738616,39.30140641000001],[-7.26898702,39.30942591],[-7.31053794,39.34095248],[-7.30624102,39.35142353],[-7.32166138,39.38625281],[-7.30150055,39.4163963],[-7.30892711,39.43157491],[-7.29460827,39.45592568],[-7.34733712,39.48797698],[-7.36281618,39.48238003],[-7.3892396,39.5029968],[-7.39171659,39.53047765],[-7.4266607,39.53301293],[-7.4457134,39.54871904],[-7.46113294,39.5727564],[-7.49936289,39.58990234],[-7.50982617,39.61820423],[-7.52761752,39.63317971],[-7.53592075,39.66768665],[-7.45283307,39.66321773],[-7.40013014,39.64666114],[-7.37404649,39.65124126],[-7.33095571,39.64156604],[-7.28651025,39.66158895],[-7.24850287,39.66729262],[-7.15052715,39.65292874],[-7.12617201,39.66399256],[-7.07097081,39.65780213],[-7.01521566,39.6710392],[-6.99302772,39.73247024],[-6.98760965,39.75964813],[-6.97671616,39.772703],[-6.9893989,39.79544006],[-6.98052899,39.82035895],[-6.94803879,39.82833333],[-6.93311521,39.84987964],[-6.90353077,39.87130682],[-6.9010645,39.91250382],[-6.90838987,39.91997513],[-6.8859675,39.94022865],[-6.88529777,39.97757267],[-6.86433206,40.01307426],[-6.87580939,40.01677911],[-6.89315885,40.06065005],[-6.91680127,40.06558872],[-6.91926102,40.08189607],[-6.94283912,40.10382541],[-6.941638,40.11287214],[-6.99310256,40.11841013],[-7.0118999,40.12687316],[-7.01564512,40.17805697],[-7.02887252,40.18531444],[-7.01900014,40.19707709],[-7.0121638,40.22648341],[-6.99735299,40.23593908],[-6.96203334,40.23901044],[-6.95054484,40.25825237],[-6.9107258,40.25468073],[-6.87170629,40.26216349],[-6.8650889,40.27063421]],[[-6.8650889,40.27063421],[-6.83718828,40.24859044],[-6.80012792,40.24204296],[-6.78155275,40.24909145],[-6.75555051,40.24626498],[-6.71822469,40.26923935],[-6.69013705,40.24266249],[-6.67175281,40.26323245],[-6.58702199,40.27072117],[-6.55617545,40.29077692],[-6.56474543,40.31461343],[-6.56041037,40.32904898],[-6.53628405,40.34724432],[-6.46321272,40.37283923],[-6.43770529,40.37328626],[-6.4196418,40.39888752],[-6.37518244,40.40031291],[-6.36510081,40.42162833],[-6.33337264,40.44776698],[-6.2944258,40.45196519000001],[-6.25502236,40.46999732],[-6.23993563,40.48585907],[-6.20137466,40.48288179],[-6.18692072,40.46684447],[-6.15773035,40.45697361],[-6.14701663,40.4361182],[-6.12018548,40.44268279],[-6.12948419,40.42078767],[-6.07515266,40.40340454],[-6.08691935,40.37652905],[-6.08237827,40.36321181],[-6.10571567,40.35679537],[-6.05216323,40.34155013],[-6.01601662,40.34029226],[-6.01958437,40.32264416],[-6.0053199,40.3053708],[-5.93778242,40.28106661],[-5.92083981,40.28090135],[-5.90359331,40.29533313],[-5.89370172,40.31822553],[-5.85026115,40.33789591],[-5.84712784,40.32804702],[-5.81648726,40.35110904],[-5.79495896,40.35122634000001],[-5.78199228,40.31245584],[-5.80273535,40.29763298],[-5.79314447,40.28670483],[-5.76499131,40.28077898],[-5.73756194,40.29412326],[-5.69266193,40.29210606],[-5.65650303,40.26993689],[-5.6488523,40.24957511],[-5.62400853,40.24706082],[-5.61004024,40.21548092],[-5.59435193,40.21635636],[-5.53096409,40.19471862],[-5.47091046,40.20785307],[-5.46807131,40.22415483],[-5.43977224,40.23362779],[-5.42982503,40.25225816],[-5.39637883,40.25029847],[-5.34320922,40.26405241],[-5.36967004,40.21831197],[-5.36466842,40.18192295],[-5.36731998,40.16089805],[-5.33702757,40.12423762],[-5.33597651,40.11581813]],[[-5.33597651,40.11581813],[-5.36901062,40.10008527],[-5.37385763,40.05932212],[-5.36238035,40.01282047],[-5.365144,39.9829186],[-5.39482791,39.9184291],[-5.40610963,39.87772907],[-5.36948158,39.8883839],[-5.32645089,39.89196701],[-5.29428168,39.87487924],[-5.2835238,39.85720966],[-5.30647104,39.83630599],[-5.31625603,39.79746402],[-5.3088266,39.76038802],[-5.25345176,39.75288224],[-5.2443467,39.76649997],[-5.20646545,39.79755938],[-5.16714437,39.79875105],[-5.15845866,39.75966127],[-5.17378806,39.75085263],[-5.1377938,39.71499894],[-5.15185516,39.69600912],[-5.16148192,39.64309089],[-5.20524262,39.59990735],[-5.20206959,39.59202156],[-5.14601222,39.54934904],[-5.12378818,39.52159402],[-5.08288821,39.49008014],[-5.0588927,39.4894173],[-5.00782443,39.43441458],[-4.94909284,39.393104],[-4.93351885,39.3951028],[-4.91028918,39.37871038],[-4.87093479,39.36831293],[-4.80590604,39.39749645],[-4.76747487,39.40190685],[-4.75488978,39.41642308],[-4.71269646,39.43569351],[-4.69027731,39.45178883],[-4.66949764,39.42453669],[-4.71004615,39.34575031],[-4.70666042,39.32772595],[-4.76101182,39.32078923],[-4.73157241,39.25491676],[-4.71354849,39.2443172],[-4.70822935,39.2098682],[-4.66516443,39.18611906],[-4.6489698,39.16490481],[-4.67654673,39.16959307],[-4.71440622,39.18762117],[-4.74254883,39.19451978],[-4.77364005,39.18950027],[-4.81027349,39.19941553],[-4.83057586,39.16603982],[-4.85317101,39.15243764],[-4.8571677,39.12265834],[-4.87370548,39.09633619],[-4.85922077,39.0775295],[-4.82693506,39.06411882],[-4.83279276,39.04615956],[-4.84917195,39.04550467],[-4.86099024,39.03178337],[-4.8855993,39.03363175],[-4.93513382,39.05641803],[-4.96250449,39.05872671],[-4.93366962,38.97557614],[-4.91822121,38.95704482],[-4.9063547,38.96337523],[-4.8771409,38.94795462],[-4.8518892,38.94731277],[-4.83667582,38.93055967],[-4.84951999,38.88146676],[-4.86572548,38.88709277],[-4.91493989,38.88744037],[-4.94348397,38.85437844],[-4.95362507,38.8299624],[-4.96074082,38.7907829],[-4.97284503,38.76084456],[-4.98999365,38.73975757],[-5.04694842,38.72908738]],[[-5.04694842,38.72908738],[-5.1007903,38.70772314],[-5.11842295,38.71602792],[-5.16942108,38.71306544],[-5.18450457,38.71969549],[-5.16800834,38.67732056],[-5.18396829,38.67559995],[-5.18423315,38.65972778],[-5.20884435,38.66743796],[-5.21157556,38.65235716],[-5.23661192,38.64232121],[-5.25442832,38.62572472],[-5.292237,38.61080803],[-5.30929328,38.59442543],[-5.30765325,38.57798698],[-5.37174812,38.58357172],[-5.38980695,38.56217472],[-5.38365307,38.543676],[-5.40693158,38.54369541],[-5.41042935,38.5199445],[-5.48037106,38.48367748],[-5.4845561,38.46334278],[-5.5035352,38.45676668],[-5.51301316,38.46407823],[-5.54642749,38.4499945],[-5.56813536,38.43339251],[-5.58427664,38.40097061],[-5.58506597,38.38584323],[-5.55960518,38.36760688],[-5.57564772,38.32910638],[-5.55552841,38.31773418],[-5.54139034,38.27835109],[-5.52595765,38.26412368],[-5.52042692,38.20756714],[-5.53870729,38.20060458],[-5.53578454,38.16868064],[-5.56009877,38.1485643],[-5.57398999,38.15065741],[-5.58478853,38.13170555],[-5.63343208,38.13812152],[-5.69363103,38.08373975],[-5.73289507,38.08751841],[-5.74073725,38.12653906],[-5.71541197,38.13383088],[-5.69494276,38.15138575],[-5.70556141,38.1636207],[-5.68861201,38.18187728],[-5.72816242,38.19741726],[-5.75534426,38.18189769],[-5.78170414,38.18588009],[-5.82399853,38.16993161],[-5.8378569,38.17442669],[-5.87757017,38.1551337],[-5.88066463,38.13228084],[-5.91291826,38.12269139],[-5.92834415,38.08771888],[-5.90804482,38.06824835],[-5.91967187,38.04966979],[-5.93398458,38.04715081],[-5.93291436,38.03232021],[-5.9536882,37.9953458],[-5.99350269,37.99954619],[-6.00627563,37.99140866],[-6.03074515,37.99759162],[-6.09444668,37.98160634],[-6.11872405,37.98047818],[-6.18023994,37.94102603],[-6.19554645,37.95637763],[-6.23324407,37.95794162],[-6.2519521,37.97138109],[-6.30337077,37.97824481],[-6.32929324,37.99827049],[-6.3549131,38.00984827],[-6.3672465,38.04891901],[-6.39011145,38.04843246],[-6.41390245,38.05856305],[-6.45243921,38.05595906],[-6.44360876,38.04695724],[-6.47385985,38.02442735],[-6.46592695,38.01076107],[-6.49173508,38.00946541],[-6.49466905,38.01897248],[-6.54569328,38.02811878],[-6.57215306,38.02022741],[-6.58717398,38.02677829],[-6.58052574,38.05277243],[-6.6221042,38.09700767000001],[-6.66036795,38.09237064],[-6.72904355,38.09977598],[-6.74767821,38.09146269],[-6.76891072,38.09896227],[-6.76943512,38.11115124],[-6.80910621,38.11172624],[-6.81581496,38.12013786],[-6.79954026,38.14379802],[-6.79509238,38.17854108],[-6.82236987,38.17381818],[-6.85811853,38.17985408],[-6.90315449,38.2019729],[-6.93165634,38.20831687]],[[-1.44885568,40.1453419],[-1.39127215,40.13451102],[-1.36366114,40.13861016],[-1.35459677,40.1294727],[-1.31972177,40.14639485],[-1.32298952,40.18485592000001],[-1.31095888,40.20390584],[-1.29674201,40.19922913],[-1.28434155,40.17149691],[-1.25241774,40.1432991],[-1.25022624,40.12257273],[-1.23631103,40.11338872],[-1.20725056,40.11013156],[-1.14803361,40.11449654],[-1.13356839,40.09767911],[-1.11186065,40.09280471],[-1.07212898,40.06048422],[-1.08422839,40.03620823],[-1.13619609,40.01509272],[-1.16518784,40.01009631]],[[-1.16518784,40.01009631],[-1.24683025,39.99518057],[-1.28638905,40.00817785],[-1.33577508,40.01667283],[-1.37685964,40.01649922],[-1.38313651,40.03896552],[-1.42028559,40.0935144],[-1.40759715,40.10140367000001],[-1.44281096,40.11804459],[-1.45723527,40.13505746],[-1.44885568,40.1453419]],[[-1.02693349,38.65551726],[-0.96246635,38.65692534],[-0.91579325,38.69596459],[-0.92754101,38.70681487],[-0.9614287,38.77479157],[-0.92893808,38.78383372],[-0.93569711,38.85593675],[-0.92453737,38.8917525],[-0.94085454,38.89961934],[-0.95652448,38.9201229],[-0.95941033,38.94458204],[-0.99879362,38.94935499],[-1.01299871,38.93940732],[-1.10592013,38.92852743],[-1.14665401,38.92935268],[-1.16088852,38.9548159],[-1.22653772,39.02467264],[-1.26390277,39.045094],[-1.26570146,39.07546761],[-1.25581538,39.08402402],[-1.25572049,39.10616991],[-1.24050996,39.1137351],[-1.22699701,39.15170666],[-1.19449776,39.18040939],[-1.17637633,39.23024995],[-1.17473582,39.27923867000001],[-1.16188928,39.30541757],[-1.17726366,39.31448918],[-1.22398355,39.31632],[-1.24715407,39.32857358],[-1.28136273,39.32870555],[-1.31842977,39.34318573],[-1.33664512,39.33399601],[-1.38299856,39.36558129],[-1.40778752,39.36577923],[-1.41412484,39.38015577],[-1.42222641,39.3663363],[-1.43816925,39.37338102],[-1.44550513,39.36138769],[-1.45218031,39.39758895],[-1.46723679,39.3904091],[-1.47454682,39.40877741],[-1.48987263,39.40580587],[-1.48955114,39.422317],[-1.50490908,39.42882245],[-1.52886672,39.45526606],[-1.51295762,39.45899204],[-1.5106604,39.48114519],[-1.49920723,39.5001079],[-1.50721705,39.50786058],[-1.50101587,39.53444118],[-1.51781765,39.55139723],[-1.50436249,39.56390169],[-1.46208197,39.57662112],[-1.43651699,39.62880703],[-1.41793175,39.65493578],[-1.36853463,39.68961485],[-1.3128269,39.67048406],[-1.27958029,39.67788859],[-1.26199529,39.69890712],[-1.27540928,39.73864056],[-1.24920498,39.7725018],[-1.21500358,39.80877428],[-1.21087609,39.83817965],[-1.19997789,39.85943461],[-1.19588185,39.91354248],[-1.20896674,39.92815993],[-1.20397761,39.94934404],[-1.15275881,39.96441264],[-1.14239516,39.97184147]],[[-1.14239516,39.97184147],[-1.12689903,39.96301545],[-1.10501492,39.97497479],[-1.05757569,39.98047725],[-1.02569359,39.97459592],[-1.00252065,39.9818291],[-0.96729151,39.97404528],[-0.93188585,39.95607696],[-0.9204541,39.96440368],[-0.90492624,39.94036803],[-0.91382146,39.91800669],[-0.90024247,39.89183452],[-0.9102257,39.86811475],[-0.88857399,39.85211074],[-0.86741984,39.84677816],[-0.82813186,39.87144421],[-0.79769479,39.88106745],[-0.82998659,39.90678314],[-0.8462969,39.94769794],[-0.8348115,39.9793381],[-0.79015283,39.9897819],[-0.76782974,40.00919991],[-0.76227075,40.04126255],[-0.71889605,40.0387136],[-0.68364368,40.04420277],[-0.6461665,40.06749962],[-0.61358899,40.07001287],[-0.62870277,40.10209545],[-0.60740671,40.12797919],[-0.58698256,40.13142869],[-0.57085553,40.15518792],[-0.57216053,40.18147386],[-0.5578887,40.20083805],[-0.54418691,40.25165947],[-0.52589905,40.23731632],[-0.494515,40.22873163],[-0.46997414,40.24013286],[-0.45180598,40.23532008],[-0.38397015,40.26445915],[-0.38274199,40.27648373],[-0.39962727,40.29618646],[-0.34135396,40.3281263],[-0.31443868,40.35833722],[-0.28238709,40.36509109],[-0.28539,40.38649164],[-0.30721976,40.40918824],[-0.33282741,40.42553665],[-0.34361359,40.44315178],[-0.33709519,40.45654885],[-0.29343076,40.46709012],[-0.27143335,40.47849814],[-0.27454657,40.49657725],[-0.30158144,40.51737069],[-0.29011162,40.54395284],[-0.29986809,40.57732832],[-0.29446931,40.61216804],[-0.32208565,40.60284122],[-0.37966822,40.62352891],[-0.37096102,40.6511003],[-0.38151389,40.66158161],[-0.35616806,40.67769392],[-0.32881805,40.68027939],[-0.31656673,40.66332265],[-0.2504417,40.69076839],[-0.23599125,40.69110754],[-0.2393639,40.71745288],[-0.22403428,40.75415799],[-0.19407933,40.7825885],[-0.14530621,40.78593058],[-0.1471793,40.77512365],[-0.12684071,40.75331739],[-0.06469894,40.72740695],[-0.03075556,40.7226112],[-0.01771588,40.73120037],[0.01520258,40.72862373],[0.02836609,40.71318352],[0.02643818,40.69495061],[0.04217471,40.69100593],[0.07268765,40.71430767],[0.11250125,40.72713718],[0.14391662,40.7182515],[0.17072356,40.73283722]],[[0.17072356,40.73283722],[0.19729145,40.72416882],[0.22522923,40.73271179],[0.23652266,40.70168349],[0.27012972,40.70307645],[0.29184,40.68855275],[0.26783113,40.65900137],[0.27882983,40.63005812],[0.31578266,40.61403301],[0.36020587,40.60597404],[0.3891552,40.60662167],[0.43068281,40.57967218],[0.43582709,40.54982591],[0.46036696,40.53754627],[0.51470215,40.52304652]],[[0.51470215,40.52304652],[0.47679932,40.46611798],[0.46639754,40.46014431],[0.41857912,40.40148756],[0.40142431,40.35819475],[0.36463053,40.32410091],[0.35091405,40.30042429],[0.33010311,40.27983254],[0.27907568,40.24479539],[0.26368842,40.20832902],[0.23420597,40.19928547],[0.2022399,40.18172825],[0.18364484,40.1620294],[0.14981264,40.10085915],[0.14755426,40.08291496],[0.1206584,40.06224256],[0.08470395,40.0568122],[0.05105909,40.03682574],[0.03528652,40.01044349],[0.02341162,39.97150865],[0.00873749,39.96633339],[-0.0057414,39.91541958],[-0.05794444,39.87317796],[-0.08638471,39.85642167],[-0.12080543,39.81478317],[-0.13674344,39.78933409],[-0.19021676,39.71997333],[-0.21355357,39.64762305],[-0.23903493,39.635107],[-0.26150259,39.61252364],[-0.27594394,39.57300918],[-0.31596515,39.52343797],[-0.32321276,39.50009224],[-0.31852704,39.46137085],[-0.30424073,39.46025941],[-0.31282313,39.44289851],[-0.32307584,39.45834031],[-0.31569903,39.42295992],[-0.32933247,39.42782828],[-0.33200632,39.40985587],[-0.32106475,39.37345645],[-0.28876591,39.30234069],[-0.22018147,39.18693866],[-0.24093709,39.16713555],[-0.23634123,39.13641405],[-0.20986414,39.07829689],[-0.18053421,39.02992444],[-0.13531449,38.97011918],[-0.07418638,38.91419701],[-0.01349453,38.87136193],[0.03232582,38.86055792],[0.05484393,38.86306947],[0.08894198,38.85565836],[0.12514015,38.83323557],[0.15543419,38.82731226],[0.19906924,38.802053],[0.18385264,38.7855419],[0.20911013,38.76076996],[0.22181537,38.75905064],[0.23152838,38.73182821],[0.19614378,38.72855909],[0.15558534,38.69784289],[0.15466989,38.6864444],[0.1294362,38.68661854],[0.11517384,38.67370257],[0.09846124,38.67284068],[0.07104355,38.63904203],[0.04589176,38.64076338],[0.03055116,38.62591874],[-0.0065323,38.6303429],[-0.0315304,38.61629543],[-0.06174047,38.58204818],[-0.04855411,38.56379633000001],[-0.0966647,38.52399856],[-0.10765664,38.53246062],[-0.15007612,38.53558325],[-0.17203173,38.51624979],[-0.19165538,38.51589362],[-0.23265533,38.50145484],[-0.26736087,38.49480155],[-0.30233869,38.48222466],[-0.35633006,38.4489306],[-0.37501282,38.44304412],[-0.40106727,38.41106293],[-0.4090108,38.35893473],[-0.43377691,38.35593896],[-0.44253352,38.3633297],[-0.50536783,38.33282432],[-0.5200221,38.29121902],[-0.51332045,38.23471784],[-0.50744751,38.21837462],[-0.51371069,38.19745909],[-0.53770054,38.18829671],[-0.56600588,38.19127506],[-0.59737546,38.18690239],[-0.61072938,38.17722708],[-0.63815753,38.13203421],[-0.65051166,38.0555361],[-0.65482587,37.98533672],[-0.69650749,37.96967932],[-0.70542987,37.94122523],[-0.71760513,37.93717285],[-0.71952895,37.91211378],[-0.74096937,37.90913027],[-0.75043223,37.89756083],[-0.76249977,37.84658077]],[[1.97028454,42.48120132],[1.97884408,42.4947748],[1.99333459,42.48457197],[1.98662682,42.47166616],[2.01276779,42.44834734],[1.98441068,42.44655371],[1.95674729,42.45768729],[1.97028454,42.48120132]],[[0.17072356,40.73283722],[0.17522215,40.75494093],[0.19012584,40.75032343],[0.21198857,40.76752146],[0.22996663,40.76743322],[0.23356985,40.78699273],[0.25776236,40.8002258],[0.27822457,40.82103502],[0.25087916,40.85653764],[0.25540274,40.87453023],[0.24572708,40.8870337],[0.25384218,40.91965044],[0.27427172,40.93662436],[0.2842484,40.96465601],[0.28108721,40.98716289],[0.25867178,41.01537697],[0.27988936,41.01979093],[0.24611455,41.04123767],[0.22074281,41.04173419],[0.230426,41.05462106],[0.21786996,41.06379882],[0.22074004,41.08186603],[0.20120205,41.08468066],[0.20897432,41.11691345],[0.20122518,41.12677483],[0.21465474,41.1371357],[0.24884047,41.13056477],[0.2529901,41.1501527],[0.27301136,41.14881025],[0.30331779,41.16437954],[0.3059393,41.1856752],[0.32240378,41.22524081],[0.34030696,41.23106245],[0.36380091,41.22697376],[0.37967043,41.2363068],[0.37370913,41.24935087],[0.38566417,41.27884421],[0.36564753,41.303972],[0.37021384,41.3144738],[0.34949387,41.32666974],[0.37372966,41.35040212],[0.35828916,41.37199433],[0.32003648,41.394183],[0.34184141,41.41381559],[0.35532904,41.45175942],[0.34466498,41.46225584],[0.34202378,41.4840002],[0.39749917,41.49066002],[0.41743554,41.5163643],[0.44692332,41.54223578],[0.43032895,41.56523709],[0.43585772,41.58491963],[0.42849436,41.60237606],[0.40202293,41.59271756],[0.34961282,41.59946403],[0.34581635,41.62186306],[0.3579819,41.63171989],[0.32624135,41.66219942],[0.32876512,41.68202808],[0.36865808,41.71419258],[0.38474176,41.74031163],[0.39543623,41.73198112],[0.4006129,41.75669085],[0.46965831,41.76561947],[0.48323184,41.80146314],[0.51052744,41.8206316],[0.54239093,41.82038161],[0.55738955,41.85422634],[0.58005313,41.85090981],[0.58005518,41.86345356],[0.60578766,41.87032861],[0.59278317,41.88441511],[0.60289405,41.92232321],[0.56243997,41.93269084],[0.56767939,41.94683655],[0.59259764,41.96889466],[0.60435577,41.96065549],[0.6237719,41.99176699],[0.65507587,41.99965171],[0.6628727,42.01223439],[0.65200439,42.02675445],[0.70197458,42.12240941],[0.69583532,42.15199844],[0.71396615,42.16342416],[0.69859007,42.17267397],[0.7141617,42.22189295],[0.73257008,42.24787575],[0.74483031,42.30117773],[0.76462313,42.32248142],[0.74367772,42.32631945],[0.74036008,42.33687274],[0.77130667,42.3506427],[0.72327194,42.36563038],[0.74609672,42.38477618],[0.72594427,42.40523277000001],[0.7358462,42.41402193],[0.71132223,42.43516762],[0.70915963,42.45857998],[0.69048571,42.48762174],[0.71331081,42.48725245],[0.73327725,42.50444811],[0.72116245,42.52453873000001],[0.74183134,42.54202138],[0.75927274,42.57384951],[0.76785801,42.60963153],[0.70849383,42.62082587],[0.69895447,42.62856921],[0.69589483,42.65892477],[0.68123322,42.66566828],[0.66006819,42.69085393]],[[0.66006819,42.69085393],[0.67616266,42.6908687],[0.68254927,42.70888666],[0.67314873,42.71798579],[0.66073581,42.75187849],[0.64258127,42.75374625],[0.66688906,42.77540637],[0.64504112,42.78296649],[0.67007124,42.801938],[0.67009737,42.82427601],[0.65908299,42.83783814],[0.67795511,42.8552673],[0.70841655,42.86144092],[0.73594813,42.84878525],[0.77987354,42.83592471],[0.80085105,42.84065899],[0.83326681,42.82831369],[0.85800945,42.82551931],[0.90723345,42.79707205],[0.93086848,42.78881641],[0.9612609,42.80570334],[0.98306439,42.78688494],[1.00562777,42.79082443],[1.07342445,42.78259747],[1.10877186,42.7716734],[1.13263697,42.75052038],[1.13319697,42.7282704],[1.1661443,42.70891586],[1.21666408,42.72007619],[1.22910463,42.72775639],[1.25271843,42.7144654],[1.31693626,42.71893012],[1.33529597,42.72427726],[1.35732469,42.71972187],[1.35093094,42.70303829],[1.38983149,42.68513849],[1.38743967,42.66869051],[1.41365886,42.65559879],[1.42043027,42.62501193],[1.44053804,42.59440305000001],[1.42648169,42.58280173],[1.44343422,42.571916],[1.42627924,42.55862521],[1.41363845,42.53535278],[1.43922038,42.54346550000001],[1.4525006,42.53862745],[1.46836603,42.51001591],[1.41897287,42.4827991],[1.44119196,42.47535679],[1.44439299,42.44142373],[1.45240431,42.43697954],[1.51719076,42.42873098],[1.55242406,42.43278108],[1.55623477,42.45412977],[1.58083039,42.44997798],[1.60024958,42.46678331000001],[1.63110261,42.46304573],[1.65702087,42.46821612],[1.66219449,42.49362104],[1.70361005,42.48980218000001],[1.72562204,42.50437252],[1.7307,42.49251196],[1.76201708,42.48758415],[1.80489369,42.49021072],[1.84343442,42.47715818],[1.84750686,42.46785583],[1.88178204,42.459023],[1.88363935,42.45086747],[1.91565943,42.44617255],[1.93281156,42.45496828],[1.9715233,42.37415121],[2.01312908,42.35277979],[2.08459263,42.36174234],[2.0894325,42.37384303],[2.11675633,42.38330094],[2.12866499,42.41254924],[2.16768406,42.42489947],[2.20667325,42.41737727],[2.24619013,42.42892151],[2.25692877,42.43873618],[2.29815715,42.42321183],[2.30693676,42.4290344],[2.36116355,42.40276442],[2.41482124,42.39182676],[2.43102824,42.39428063],[2.43340067,42.37762134],[2.45419346,42.36985209],[2.48342708,42.33978055],[2.5002287,42.34319529],[2.54167261,42.33357718],[2.56195291,42.35710516],[2.58669446,42.35729359],[2.61018477,42.34686151000001],[2.67545281,42.34232383],[2.67380952,42.35907711],[2.66087617,42.36601116],[2.65402263,42.38859455],[2.67136854,42.38770758],[2.67917447,42.40647592],[2.69323359,42.4063971],[2.71645084,42.42124287],[2.75534996,42.42595974],[2.77049435,42.41162077],[2.79931116,42.41847887],[2.80449221,42.43035008],[2.82730333,42.4392705],[2.83961768,42.4592557],[2.86141942,42.45527633],[2.87033004,42.4677272],[2.88180499,42.46070959],[2.91842151,42.45619854],[2.94709255,42.48211933],[2.96723527,42.46545089],[2.98877373,42.47416234],[3.01359557,42.466485],[3.04031686,42.47351839000001],[3.04720177,42.4568072],[3.08518459,42.42584966],[3.1209363,42.43823364],[3.16074553,42.42832461],[3.17097955,42.41638508],[3.15297359,42.3940696],[3.16294716,42.36046008000001],[3.18420887,42.35044447],[3.19652959,42.33496936],[3.20347488,42.34707745],[3.22753059,42.35129523],[3.24975792,42.32977394],[3.2621425,42.34072535],[3.3073794,42.32699346],[3.29768179,42.28913818],[3.27965884,42.28893315],[3.28702451,42.27115563],[3.27929237,42.25303847],[3.2298323,42.25154232],[3.21769212,42.23249994],[3.19491159,42.24744615],[3.18114108,42.24625675],[3.17018631,42.26454539],[3.13587384,42.24831888],[3.11173623,42.20590237],[3.11295942,42.16550232],[3.12596349,42.12699163],[3.1410085,42.11492374],[3.17672166,42.11157738],[3.21064364,42.05333882],[3.19912281,42.04951756],[3.19459746,42.02738584],[3.20292261,41.98872426],[3.23020481,41.97001225],[3.23360016,41.95060043],[3.21815143,41.94266538],[3.21678288,41.91848955],[3.20294611,41.89156988],[3.18396295,41.88811522],[3.17827066,41.86825103],[3.13238727,41.84627261],[3.10789043,41.84719444],[3.07161507,41.81947636],[3.0654522,41.80090934],[3.04358659,41.77940075],[3.0072577,41.77080836],[2.97195959,41.75355394],[2.9351565,41.7156447],[2.88745851,41.70146313],[2.85423147,41.699719],[2.82004102,41.68903909],[2.79318755,41.6734322],[2.77807342,41.6501788],[2.74613916,41.64281980000001],[2.71836889,41.62915856],[2.54784129,41.57594323],[2.49539983,41.55319255],[2.47029092,41.54665193],[2.38011748,41.49519396],[2.30822923,41.47622558],[2.26658953,41.45919405],[2.25190094,41.44715545],[2.22346321,41.4077608],[2.1983099,41.38689078],[2.18664251,41.3669456],[2.17677455,41.37254971],[2.17056699,41.35277965],[2.15090072,41.34644313],[2.1512381,41.32139063],[2.11611146,41.290596],[2.07413487,41.27654218],[2.0175632,41.2654705],[1.93452754,41.2623258],[1.87030884,41.24291933],[1.8527942,41.23434215],[1.81521555,41.23600485],[1.78869801,41.22422003],[1.72821034,41.2149387],[1.67446053,41.19843554],[1.53971426,41.18277615],[1.46490433,41.16551056],[1.40647047,41.14030262],[1.34301243,41.12487078],[1.29437074,41.12676118],[1.24483108,41.10187507],[1.21504222,41.10423173],[1.19239507,41.08828381],[1.17243893,41.05545752],[1.14344898,41.07194023],[1.11915272,41.0740649],[1.08155615,41.06360004],[1.04603073,41.0630364],[0.96664573,41.02834968],[0.91492241,40.98710325],[0.83718582,40.91891842],[0.79600278,40.87585803000001],[0.74510484,40.83887224],[0.741336,40.82332495],[0.69934788,40.80376121000001],[0.70723463,40.78854931],[0.73675116,40.76683763],[0.76236151,40.76205057],[0.78131827,40.7734253],[0.730647,40.78959458],[0.74736412,40.79356375],[0.77614843,40.78732842],[0.82443027,40.7374026],[0.83863607,40.7305011],[0.85940882,40.7349406],[0.87857439,40.72656137],[0.87201658,40.69902645],[0.83280913,40.67232892],[0.76174447,40.64361011],[0.74773215,40.63280945],[0.69104386,40.57135462],[0.66135573,40.55733326],[0.61581808,40.55413188],[0.59498648,40.57809076],[0.61654442,40.58557612],[0.6481174,40.57293687],[0.66032524,40.59147144],[0.71097405,40.59217583],[0.74494533,40.63624115],[0.73291737,40.64017057],[0.6878556,40.63575835],[0.66320928,40.62650272000001],[0.60482837,40.62317365],[0.53791823,40.56722872],[0.51470215,40.52304652]],[[-5.33597651,40.11581813],[-5.32010159,40.10788558],[-5.26719146,40.11108611],[-5.21531076,40.10784682000001],[-5.19979235,40.08245041],[-5.14048371,40.09248876],[-5.10541267,40.11873363],[-5.08777155,40.12432292],[-5.06970505,40.14924938],[-5.01854206,40.15905294],[-5.00667185,40.12993641],[-5.01334413,40.11105573],[-4.95454594,40.12112558],[-4.9593435,40.13045854],[-4.92545408,40.1360358],[-4.91806135,40.15529288],[-4.92467528,40.16998429],[-4.86270345,40.20506876],[-4.84030186,40.21000353],[-4.80767479,40.23531858],[-4.81795032,40.25560713],[-4.80346915,40.27526531],[-4.76119118,40.26093528],[-4.74262723,40.27527889],[-4.73217741,40.27091346],[-4.69814137,40.28219246000001],[-4.70179727,40.25722964],[-4.68720378,40.24960574],[-4.68645177,40.2107618],[-4.63993973,40.19703821],[-4.61736021,40.19997394],[-4.57907617,40.21719617]],[[-3.53972219,41.16504109],[-3.51382161,41.16323892],[-3.50067486,41.17909643],[-3.46027991,41.19103737],[-3.44415375,41.21534047],[-3.40248633,41.21361898],[-3.40613389,41.23458557],[-3.39950037,41.25454293],[-3.3693942,41.26041665],[-3.33635022,41.25303146],[-3.32506369,41.26133264],[-3.29054924,41.25783873],[-3.27575907,41.27503449],[-3.2742654,41.26026537],[-3.25426434,41.2583832],[-3.23893501,41.28794293],[-3.20735118,41.30423571],[-3.10865669,41.28788615],[-3.06190095,41.27342696],[-3.01801475,41.28911537000001],[-3.00598832,41.28439643],[-2.94406016,41.29748044],[-2.94119077,41.31393643],[-2.90666812,41.32763221],[-2.87545548,41.32137785],[-2.86688815,41.27446495],[-2.81959319,41.2573401],[-2.77551114,41.25008351],[-2.76094557,41.27402371],[-2.71677224,41.27567117],[-2.70954613,41.25198087],[-2.66853751,41.23711555],[-2.64601459,41.24021033],[-2.6291981,41.21521496],[-2.58948594,41.22453822],[-2.59177893,41.20313493],[-2.62000832,41.19536784],[-2.61933916,41.18328615],[-2.60256561,41.18866115],[-2.57721211,41.17781549],[-2.59494709,41.14990069],[-2.57557711,41.1394717],[-2.53956493,41.15360178],[-2.53651039,41.16252538],[-2.51754541,41.14811572],[-2.50885076,41.11885708],[-2.48226075,41.11627228],[-2.46946628,41.07810999],[-2.42974429,41.07228981],[-2.41890992,41.05770555],[-2.40212986,41.06165515],[-2.35532908,41.08645363],[-2.32340716,41.05650781],[-2.29358127,41.07125484],[-2.26354352,41.0675354],[-2.23214664,41.09701145],[-2.17529809,41.08375486],[-2.16732902,41.09540779],[-2.14344472,41.102574],[-2.13019545,41.11750879],[-2.11744307,41.10293609],[-2.05643418,41.06969066],[-2.0481792,41.07837841],[-2.06562217,41.09578934],[-2.0505896,41.12589671],[-2.05169332,41.14684895]],[[-2.05169332,41.14684895],[-2.04761717,41.15265235],[-2.00843422,41.15643812],[-1.95901686,41.17248618],[-1.94833031,41.16684934],[-1.93244667,41.13859009],[-1.89057074,41.13332124],[-1.86925227,41.10791031],[-1.8025657,41.08921137],[-1.75775156,41.05507435],[-1.75938014,41.04820084],[-1.71655181,41.01356443],[-1.66101423,40.97832409],[-1.60790365,40.92761989],[-1.62597438,40.89867792],[-1.6216012,40.88116822],[-1.57049046,40.83008281],[-1.54467977,40.81619378],[-1.5399082,40.76073336],[-1.56201713,40.7397517],[-1.55887098,40.71926371],[-1.53563788,40.68701878],[-1.5389917,40.65809053000001],[-1.56485622,40.61474242],[-1.54551509,40.59519529],[-1.59874932,40.5620539],[-1.63424985,40.57979371],[-1.66646055,40.58204412],[-1.67433053,40.59217028],[-1.6932848,40.57764848],[-1.68963917,40.56649058],[-1.70162398,40.5410957],[-1.69251196,40.48682388],[-1.74859987,40.46289664],[-1.78543374,40.41318317],[-1.8006431,40.414216],[-1.80288331,40.39887017],[-1.77776922,40.39187752],[-1.74110509,40.34933147],[-1.71984385,40.34039538],[-1.6972386,40.31655769],[-1.72015157,40.31850735],[-1.72924302,40.30315753],[-1.71927446,40.27710199],[-1.70039813,40.30707094],[-1.68965786,40.309328],[-1.66561275,40.29454871],[-1.65895399,40.28203043],[-1.60868279,40.24277029],[-1.59259398,40.23625135],[-1.57147408,40.21366827],[-1.54047075,40.19136242],[-1.51090249,40.20371523],[-1.47441587,40.18504178000001],[-1.43920836,40.19701366],[-1.44236571,40.15759707],[-1.44885568,40.1453419]],[[-1.16518784,40.01009631],[-1.14239516,39.97184147]],[[-2.34163224,38.02600054],[-2.37307908,38.02327885],[-2.42341244,38.03370211],[-2.43170329,38.0431608],[-2.47164383,38.05637914],[-2.48070559,38.05311166],[-2.50440169,38.06831986],[-2.52173166,38.06977962],[-2.55129637,38.08409219],[-2.52092909,38.1073071],[-2.46317417,38.17314999],[-2.44685419,38.18434053],[-2.4535808,38.21901752],[-2.44286241,38.23126964],[-2.43546643,38.26541939],[-2.44077803,38.28511013],[-2.48525066,38.30039099],[-2.4789539,38.34881328],[-2.49238023,38.37130287],[-2.48339836,38.39785787],[-2.53491259,38.40625563],[-2.55005083,38.40310623],[-2.57154084,38.4139285],[-2.57697651,38.43428789],[-2.56739963,38.46065792],[-2.57659484,38.47577735],[-2.5666241,38.49046639],[-2.59974122,38.51291565000001],[-2.64334379,38.50749585],[-2.67272116,38.49662265],[-2.70250828,38.50109068],[-2.76207664,38.53275111],[-2.77076867,38.52001629],[-2.86071227,38.47021336],[-2.88149009,38.4526449],[-2.90578759,38.46990737],[-2.93844328,38.47474196],[-2.96358628,38.47145435],[-2.99630537,38.44479339],[-2.99222745,38.42858924],[-3.00536758,38.41485496],[-3.06496638,38.47824772],[-3.13019908,38.43876624],[-3.1800246,38.44992096],[-3.28000867,38.4604047],[-3.3070151,38.47992942],[-3.32649243,38.48212086],[-3.37501202,38.47523497],[-3.37668404,38.43959599],[-3.42482362,38.40679915],[-3.47259471,38.39795624],[-3.50592077,38.4080102],[-3.52844267,38.40864104],[-3.54188846,38.44538493],[-3.58307598,38.45146891],[-3.58584564,38.40560203],[-3.62047161,38.39398781],[-3.64694559,38.40420862000001],[-3.69927558,38.41288399],[-3.73000761,38.42436687],[-3.73906407,38.41375705],[-3.76491328,38.42436032],[-3.80785559,38.42181894],[-3.83005597,38.41279589],[-3.83056115,38.39290288],[-3.85428447,38.37514073],[-3.87418114,38.37703056],[-3.91176042,38.36926394],[-3.96193751,38.36609584],[-4.00644715,38.36807406],[-4.06802041,38.37971359],[-4.08635095,38.37670648],[-4.14492502,38.38643161],[-4.15655697,38.38132489],[-4.22425182,38.39748047],[-4.25778362,38.40157725],[-4.27680016,38.39020611],[-4.26887004,38.34717096],[-4.28733026,38.34276125],[-4.31956118,38.36154406],[-4.39499798,38.38720158],[-4.40644867,38.38312676],[-4.4351731,38.40223491000001],[-4.4524679,38.40065223],[-4.47126913,38.42598366],[-4.50018673,38.44501896],[-4.51269129,38.46385448],[-4.55737514,38.47647086],[-4.56577755,38.4907771],[-4.58816135,38.48673602],[-4.60901666,38.49502113],[-4.62427795,38.52412433],[-4.66603635,38.54772397],[-4.69414355,38.54896979],[-4.70837545,38.57239047],[-4.71933885,38.57101351],[-4.79007414,38.59719396],[-4.82272712,38.59707755],[-4.86017088,38.61397865],[-4.86733101,38.6327784],[-4.86888025,38.68093435],[-4.87696992,38.68609411],[-4.94418909,38.68184231],[-5.0014123,38.69500551],[-5.00202072,38.70817752],[-5.02428382,38.72611249],[-5.04694842,38.72908738]],[[-4.10104157,42.79396762],[-4.11307725,42.81668983],[-4.1070363,42.8277622],[-4.08852213,42.81849247],[-4.08906446,42.79989063],[-4.10104157,42.79396762]],[[-4.16858733,42.81153534],[-4.16858733,42.81153534]],[[-6.8650889,40.27063421],[-6.86352714,40.29520888],[-6.83977542,40.31502072],[-6.79042746,40.334653],[-6.79346568,40.35608605],[-6.78099687,40.3646722],[-6.83479875,40.40815156],[-6.84969431,40.45257577],[-6.81472729,40.50162907],[-6.79502802,40.51191481],[-6.80397695,40.53117144],[-6.80082958,40.55062837],[-6.84482015,40.56587586],[-6.83730662,40.59470088],[-6.80787303,40.62951972],[-6.79389364,40.66168039],[-6.83119808,40.75263673],[-6.81741542,40.80718163],[-6.82416392,40.84515039],[-6.80030443,40.84827258],[-6.80875421,40.88204366],[-6.8387792,40.88950286],[-6.84960309,40.90259582],[-6.84900397,40.9245534],[-6.86056037,40.94944502],[-6.93136094,41.01769663],[-6.91510696,41.03892706],[-6.87684962,41.02809194],[-6.83604503,41.02824372],[-6.80874406,41.03632818],[-6.8083995,41.04477781],[-6.77334518,41.07470581],[-6.75380351,41.10328952],[-6.77033825,41.12444297],[-6.72867354,41.1636155],[-6.70909609,41.1735603],[-6.69226432,41.19385106],[-6.69194626,41.20832411],[-6.64298433,41.24825844],[-6.62995207,41.24261891],[-6.60977125,41.24966627000001],[-6.58494064,41.24183383],[-6.55152553,41.24564459],[-6.54672608,41.25814851],[-6.5176412,41.27477498],[-6.50986245,41.26372861],[-6.47848128,41.27646182],[-6.49179401,41.28567639],[-6.46923566,41.30111083],[-6.44824283,41.29932897],[-6.41615349,41.34796393],[-6.37716276,41.36007634],[-6.39397945,41.37084717],[-6.38992822,41.38536696],[-6.36605297,41.39356159],[-6.35762179,41.3798673],[-6.31577356,41.38999815],[-6.33142588,41.40470218],[-6.29512756,41.4350626],[-6.305819,41.44952489],[-6.2853161,41.46826841],[-6.26827003,41.49500611],[-6.25048867,41.50063477],[-6.24335748,41.51686641],[-6.21752224,41.54316904],[-6.20182335,41.56849038],[-6.18934975,41.57502432],[-6.20904684,41.59954734],[-6.23523636,41.60719672],[-6.25354272,41.63311088],[-6.30217166,41.66273761],[-6.35677498,41.67701267],[-6.37499708,41.67380384000001],[-6.40600909,41.68107381],[-6.45229383,41.68109605],[-6.45772817,41.66683927],[-6.4888997,41.65740412000001],[-6.51210365,41.66124419],[-6.54824462,41.68561723],[-6.55567044,41.73769821],[-6.56898881,41.74349825],[-6.55485079,41.75812018],[-6.54449854,41.78369976],[-6.5179387,41.87536958],[-6.57118514,41.88362058],[-6.54860875,41.92393431],[-6.54913594,41.94450335],[-6.58847297,41.96775425],[-6.59936492,41.9482054],[-6.69927321,41.9333279],[-6.75062233,41.94339262],[-6.76870384,41.98389701],[-6.81148444,41.99252253],[-6.81022306,41.97018798],[-6.82115017,41.94631313],[-6.84441712,41.94230252000001],[-6.86964837,41.94747763],[-6.88551263,41.94038566],[-6.94427198,41.94508723],[-6.95785718,41.96929123],[-6.98581512,41.97143789]],[[-6.82418942,42.91506098],[-6.77067064,42.89862375],[-6.77284875,42.88254280000001],[-6.75666936,42.88305754],[-6.72172467,42.9174164],[-6.69099713,42.92229345],[-6.61292626,42.92455394000001],[-6.60650271,42.91610384],[-6.57939657,42.91850455],[-6.54123411,42.91250785],[-6.51057645,42.92873334],[-6.48976955,42.92024904],[-6.47721305,42.93397574],[-6.43310164,42.93975683],[-6.44159807,42.94861361],[-6.43363832,42.96415995],[-6.46854263,42.96612263],[-6.47731595,42.99189582],[-6.44643915,42.98217011],[-6.40757671,42.99948863],[-6.40930324,43.01826474],[-6.3943519,43.01661181],[-6.3970707,43.03807785],[-6.37354608,43.04110677],[-6.35792136,43.05665783],[-6.33012452,43.0433257],[-6.32766383,43.03210617],[-6.29516645,43.02690685],[-6.28369222,43.03405322],[-6.26323804,43.01590124000001],[-6.22680824,43.0089126],[-6.22904928,43.02216748],[-6.21640271,43.04695604],[-6.18864884,43.04890863],[-6.14986255,43.03400142],[-6.13666741,43.0209929],[-6.09690111,43.03064012],[-6.09185114,43.06691987],[-6.08187796,43.07571616000001],[-6.02021359,43.05487834],[-5.97378563,43.06447843],[-5.97024633,43.04129436],[-5.95674453,43.01859328],[-5.93368645,43.01086721],[-5.90661854,42.99005602],[-5.88720658,42.9940865],[-5.88915024,42.97902706],[-5.86391067,42.98138175],[-5.84313154,42.9642785],[-5.80400551,42.96261525000001],[-5.76557107,42.969224],[-5.76651132,42.98608464],[-5.72837579,43.04251317],[-5.69334906,43.0564809],[-5.62748994,43.03420533],[-5.57460171,43.0322295],[-5.57014236,43.02273102],[-5.54040978,43.01835273],[-5.50600165,43.02863847],[-5.493752,43.02135137],[-5.48074128,43.05358223],[-5.44817731,43.0554094],[-5.39045072,43.04933671],[-5.38310363,43.08723681],[-5.34368604,43.09385006],[-5.3414471,43.08378389],[-5.31149853,43.08415879],[-5.28212113,43.0774279],[-5.26850411,43.08755863000001],[-5.22019125,43.08365296],[-5.18860347,43.09976746],[-5.16737792,43.10279185],[-5.14780285,43.11511905],[-5.14067867,43.10291631],[-5.10173558,43.10184737],[-5.09327591,43.14434928],[-5.0754314,43.1667649],[-5.07662678,43.1789505],[-5.05947118,43.17433261],[-5.04089521,43.18468214],[-5.02146011,43.18351368],[-4.9976203,43.17026021],[-4.99641352,43.18532502],[-4.94259549,43.22488625],[-4.91953292,43.22696941],[-4.89478831,43.23816576],[-4.87100967,43.2280167],[-4.86082382,43.205317],[-4.83955231,43.18966181],[-4.84102324,43.18078]],[[-4.84102324,43.18078],[-4.85144576,43.17265173],[-4.83473667,43.15821632],[-4.8514255,43.12594486],[-4.816304,43.09229514],[-4.76649737,43.07454658],[-4.76611395,43.05563338],[-4.74398462,43.05644998],[-4.73421584,43.04707132],[-4.74325713,43.02815881],[-4.71970561,43.01725005],[-4.69950779,43.02665576],[-4.63813141,43.01667294],[-4.60608412,43.03576742],[-4.59060687,43.02587105],[-4.55844871,43.01951475],[-4.52093191,43.0473675],[-4.47571316,43.03870233],[-4.46195329,43.06102204],[-4.39811387,43.03486773],[-4.37483312,42.99879664],[-4.34848493,42.97258123],[-4.26222536,42.96527132],[-4.24024911,42.95653348],[-4.23641395,42.91676344],[-4.22427411,42.88089989],[-4.22569996,42.85888429],[-4.20898601,42.84477913],[-4.14990132,42.87113363],[-4.12611957,42.85663693],[-4.14044667,42.82900174],[-4.15661317,42.83779116],[-4.18542946,42.81729706],[-4.14991468,42.7893091],[-4.12267138,42.79459545],[-4.09848567,42.79118235],[-4.08133963,42.76146405],[-4.04591172,42.76661114],[-4.04375385,42.78879399],[-4.01418291,42.80637743],[-4.02077994,42.8193499],[-4.00355514,42.83140748],[-3.99594299,42.78622107],[-3.99965179,42.7689788],[-3.97888466,42.75808129],[-3.94658196,42.76191022],[-3.9305886,42.77448708],[-3.9109527,42.76838567],[-3.90966455,42.78644311],[-3.89444605,42.80453766],[-3.86461179,42.78661117],[-3.82327671,42.79885636],[-3.81651218,42.8359261],[-3.83377569,42.85217372],[-3.82535346,42.86863329],[-3.86373577,42.88981041],[-3.87404871,42.87511679],[-3.86850141,42.85669803],[-3.87982105,42.8513257],[-3.91474872,42.86605546],[-3.89762608,42.8798787],[-3.92434883,42.8892211],[-3.89293383,42.88736266],[-3.89914097,42.9041359],[-3.8663793,42.899327],[-3.85208516,42.91894826],[-3.82992673,42.92769261],[-3.86709453,42.95482936],[-3.88738331,42.94876688],[-3.89127738,42.92548546],[-3.92341999,42.91566777],[-3.92635179,42.90443271],[-3.97461729,42.91235347],[-3.99088837,42.9308366],[-3.97166611,42.97490989],[-3.94546478,43.00577301],[-3.90926145,43.01609735],[-3.8887628,43.04221033],[-3.84915391,43.04110562],[-3.83176902,43.06382633],[-3.84701285,43.08442112],[-3.81020786,43.08665494],[-3.7902811,43.07813117],[-3.75691169,43.08574008],[-3.7548816,43.10054847],[-3.72828889,43.10475441000001],[-3.70292733,43.11808661],[-3.68378061,43.13625706],[-3.6770864,43.15450475],[-3.6501681,43.18100864],[-3.61244893,43.16951841],[-3.60354351,43.1496376],[-3.58526218,43.1544111],[-3.54363546,43.1481463],[-3.50632816,43.13568075],[-3.41760805,43.13331612]],[[-1.85654121,41.96640222],[-1.85728121,41.90951545],[-1.83878345,41.8890199],[-1.83212841,41.86332822],[-1.82259544,41.86543751],[-1.81856242,41.82995439],[-1.84372854,41.80601797],[-1.85240781,41.78850541],[-1.82532299,41.77836919],[-1.80267732,41.75122335],[-1.80935029,41.73703492],[-1.7753716,41.72478895],[-1.78686156,41.69943051],[-1.8090788,41.68467552],[-1.8131145,41.66056088],[-1.85899076,41.66153001],[-1.87398211,41.63798076],[-1.89789804,41.6324122],[-1.92310041,41.59833452],[-1.95802147,41.60484414],[-1.9930298,41.60079662],[-1.99368616,41.5770867],[-1.96733455,41.54606673],[-1.97817862,41.52668989],[-1.98111151,41.48643522],[-1.95327564,41.46245075],[-1.94874038,41.42964029],[-1.93787675,41.40739105],[-1.9536855,41.4086349],[-2.00193842,41.39376903],[-2.00965455,41.38583705],[-2.04235536,41.38899642],[-2.03562324,41.4268888],[-2.04709913,41.43433456000001],[-2.10152037,41.44578876],[-2.11676718,41.42494652],[-2.11979173,41.37999518],[-2.14983651,41.35588281],[-2.1631371,41.35534986],[-2.15665018,41.33741336],[-2.17048684,41.31883221],[-2.17367127,41.28808499],[-2.16351106,41.28319243],[-2.14900288,41.21880701],[-2.14624157,41.18439493],[-2.07989599,41.17098447],[-2.05169332,41.14684895]],[[-4.84102324,43.18078],[-4.81904229,43.17896148],[-4.77792005,43.19206134],[-4.74768592,43.18400886],[-4.7341563,43.1898787],[-4.73556547,43.20902247],[-4.72101143,43.2295115],[-4.73080493,43.25240338],[-4.70627013,43.26625189],[-4.6318833,43.26765279],[-4.63708786,43.27425976],[-4.60759544,43.29523542],[-4.55087646,43.28460983],[-4.5527852,43.27194156],[-4.52242548,43.27904],[-4.52299942,43.3380929],[-4.53663033,43.34245782],[-4.53473087,43.36794787],[-4.51059445,43.38061421],[-4.51227972,43.39328811]],[[-4.51227972,43.39328811],[-4.49108644,43.39713194],[-4.47293496,43.39002847],[-4.44350004,43.39785009],[-4.37269702,43.39309336],[-4.34066491,43.40587201],[-4.32457811,43.39081487],[-4.2805751,43.38799293000001],[-4.23322046,43.40052473],[-4.21758604,43.39618987],[-4.11131172,43.41890854],[-4.08067673,43.43837237],[-4.07735521,43.43084895],[-4.02256411,43.44141886],[-3.99931475,43.43962537],[-3.95709809,43.45581651],[-3.9451364,43.46873852],[-3.87521759,43.4804519],[-3.86273989,43.4760624],[-3.81156606,43.49493259],[-3.78527784,43.49176582],[-3.77203465,43.46777661],[-3.80890334,43.45668113],[-3.81525154,43.43694264],[-3.80377743,43.42616398],[-3.81531473,43.40755963],[-3.77943963,43.42436873],[-3.79078562,43.43040547],[-3.76937112,43.44883936],[-3.745103,43.44836872],[-3.77517195,43.45883178],[-3.73322887,43.45989004000001],[-3.70693635,43.47904542],[-3.68087227,43.47816693],[-3.6448105,43.49873368],[-3.61180073,43.49918383],[-3.59670718,43.51274266],[-3.57846032,43.50650561],[-3.549671,43.50896983],[-3.53931997,43.49406245],[-3.51721996,43.49429894],[-3.51188714,43.47786268],[-3.47194676,43.46648062],[-3.43088372,43.46199533],[-3.4257535,43.44427557],[-3.46057639,43.43909898],[-3.46472029,43.40393758],[-3.45005058,43.43606107],[-3.42296695,43.41307609],[-3.37206398,43.41686272],[-3.35844767,43.41198042],[-3.32649031,43.4158935],[-3.27709373,43.40239016],[-3.25731225,43.40301238],[-3.22119279,43.39374075],[-3.21212638,43.37500134],[-3.19526569,43.37154644],[-3.16146469,43.35090648],[-3.15328741,43.35331534]],[[1.3885518,38.64038758],[1.3807065,38.69284062],[1.38880136,38.69282623],[1.38024876,38.71923653],[1.39639118,38.73084881],[1.41803082,38.72196121],[1.4352744,38.75932828],[1.44807687,38.73147448],[1.4710963,38.7190815],[1.49264545,38.69088647],[1.53039381,38.67282239],[1.56143054,38.69114993],[1.58238447,38.67749257],[1.57317974,38.65127486],[1.52500588,38.65306495],[1.47680975,38.68183212],[1.44286837,38.6841692],[1.42919995,38.6651984],[1.3885518,38.64038758]],[[1.43211188,38.77393817],[1.41718548,38.78523516],[1.42192657,38.79733821],[1.43211188,38.77393817]],[[2.94716377,39.12516153],[2.91431958,39.14459722],[2.92395815,39.1561293],[2.94973782,39.14946602],[2.9465908,39.16372036],[2.97652578,39.15817939],[2.95785066,39.14888353],[2.95772447,39.12779716],[2.94716377,39.12516153]],[[1.41013211,38.8909364],[1.40317875,38.8746943],[1.40530513,38.83165181],[1.38433723,38.84238408],[1.37188283,38.83122709000001],[1.36136387,38.86038326],[1.34312492,38.87108335],[1.30485461,38.86635304],[1.29719757,38.87666683],[1.26684621,38.87764381],[1.24636174,38.8565595],[1.21363745,38.89736749],[1.22073863,38.92284031],[1.23598056,38.93569524],[1.21474582,38.9571415],[1.23233326,38.9687442],[1.26345865,38.96747247],[1.30653064,38.97241223],[1.28361245,38.99847776],[1.29649629,39.00869494000001],[1.29099953,39.02451767],[1.3127979,39.04389146],[1.36165346,39.07478062000001],[1.3751643,39.06226516],[1.38654592,39.07814571],[1.4171668,39.07773601],[1.42636302,39.09256542],[1.44052625,39.08051088],[1.45265412,39.0968822],[1.50887574,39.10285916],[1.5153148,39.11675425],[1.5419355,39.11645059],[1.53710053,39.1075057],[1.5568952,39.09353403],[1.59145956,39.09741714],[1.60848433,39.07779857],[1.59148744,39.07507139],[1.59545724,39.0514758],[1.61862117,39.03691221],[1.58449286,39.01486864000001],[1.57849184,38.98922368],[1.5515594,38.9924336],[1.53128749,38.97942122],[1.5289285,38.94502506],[1.51006306,38.94667807],[1.50521336,38.93311822],[1.47500376,38.91352593],[1.43953878,38.91667046],[1.43865985,38.90257516],[1.42128186,38.90360291],[1.41013211,38.8909364]],[[2.30604824,39.57222634],[2.30765221,39.58186801],[2.33757243,39.59836915],[2.30604824,39.57222634]],[[4.27534585,39.88436125],[4.29361971,39.8814909],[4.30740149,39.86456086],[4.30838295,39.84852181],[4.29614838,39.82321592],[4.27231945,39.80903693],[4.24026778,39.81639313],[4.18293143,39.83850638],[4.14468022,39.86107161000001],[4.09793963,39.87869567],[4.07861188,39.89602231],[4.01897181,39.92221231],[4.01270489,39.92016795],[3.95750895,39.93846691],[3.9086545,39.92421927],[3.82244519,39.92318684],[3.82490543,39.95165801],[3.83430848,39.9605193],[3.8305374,39.99330544],[3.7946414,39.99999001],[3.79228326,40.01998046],[3.81024958,40.02905497],[3.82156609,40.0501387],[3.85335338,40.05522445],[3.87879596,40.05254756],[3.89853999,40.05979285],[3.90916766,40.04868231],[3.92015833,40.05699233],[3.9584273,40.06120466],[3.96887781,40.05399126],[4.02148247,40.0594585],[4.03215688,40.06521995],[4.04929007,40.05234485],[4.08794364,40.06864645000001],[4.10336082,40.04448198],[4.13288879,40.06360321],[4.12326898,40.03758786],[4.13917919,40.03224325],[4.13649041,40.06654102],[4.16641958,40.0585588],[4.15958519,40.04201424],[4.1817078,40.02184412],[4.18866815,40.03398052],[4.21941617,39.99739832],[4.24693201,40.00122265],[4.25734163,39.99520917],[4.25501921,39.96365675],[4.28327571,39.94447319],[4.27494278,39.9325466],[4.28588737,39.91202867],[4.30559981,39.89717735],[4.31028184,39.87769128],[4.27452705,39.89371165],[4.27534585,39.88436125]],[[3.02951347,39.28977922],[3.004522,39.31611761],[2.9859967,39.3159997],[2.99079645,39.33676998],[2.96565269,39.35869725],[2.9304891,39.36431336],[2.90896615,39.35654041],[2.88153467,39.36614829],[2.84443475,39.36589749],[2.82877564,39.35613495],[2.80492813,39.36709957],[2.79037417,39.36214542],[2.75199013,39.39427413],[2.73965327,39.41722424],[2.74731439,39.44147042],[2.7219959,39.47572449],[2.75144722,39.50480478],[2.7260798,39.53129246],[2.68845849,39.55259807],[2.6327139,39.56843069],[2.6252224,39.54577203],[2.60106628,39.5511151],[2.58828667,39.53346329],[2.55886173,39.53118342],[2.53739244,39.51733184],[2.53657443,39.48808954],[2.52320101,39.45747173],[2.50145048,39.46112887],[2.47618384,39.48381451],[2.47914655,39.49193729],[2.45620704,39.50471736],[2.46686964,39.51887715],[2.45096275,39.53705838],[2.4190905,39.52435199],[2.42349757,39.53591633],[2.40562792,39.53678149],[2.38768375,39.52090205],[2.36581288,39.55530386],[2.34649664,39.56460378],[2.35441739,39.57666788],[2.34463067,39.58722734],[2.35596675,39.60552752],[2.384935,39.61355032],[2.42132745,39.63608257],[2.46259528,39.65227371],[2.49815941,39.6843557],[2.530321,39.70170847],[2.55567745,39.70019525],[2.58582515,39.71649772],[2.6226853,39.747816],[2.63574769,39.76530117],[2.6655747,39.77553608],[2.66925545,39.79208906],[2.68906749,39.79652276],[2.70109125,39.81164624],[2.74281337,39.83307312],[2.74791648,39.8277504],[2.77608538,39.84030516],[2.77438897,39.85153732],[2.80535286,39.85242233],[2.85365585,39.87438717],[2.87494343,39.87799784],[2.90532074,39.89821758],[2.93588137,39.90407667],[2.95069217,39.92009434],[2.98700359,39.90914789],[3.00186242,39.92378054],[3.0282668,39.93509336],[3.06108234,39.93258483],[3.05544456,39.92223536],[3.11932844,39.931368],[3.14612911,39.95335713],[3.16389097,39.95918966],[3.18053075,39.95130834],[3.21337981,39.96253271],[3.20220115,39.94381238000001],[3.18306362,39.93976282],[3.15439649,39.9232176],[3.13132737,39.92686808],[3.10790062,39.9056652],[3.09059358,39.91118506],[3.0784818,39.88866034],[3.09075581,39.86591046],[3.1102931,39.85849636],[3.1334383,39.86911264],[3.14348536,39.86498308],[3.194496,39.89335256],[3.20181425,39.88804221],[3.18420145,39.87107906],[3.19461549,39.8571597],[3.17836909,39.84053564],[3.14314039,39.83415162],[3.12537141,39.83774022],[3.11990144,39.80413885],[3.15315995,39.76771686],[3.24242806,39.73054185],[3.25465347,39.72949748],[3.32551297,39.75787259],[3.33508428,39.78410032],[3.3481204,39.78936872],[3.37860354,39.76610851],[3.40408936,39.76395916],[3.4321889,39.74509906],[3.45737311,39.74461505],[3.45319522,39.72163803],[3.47571781,39.72039463],[3.45670529,39.7055054],[3.45465831,39.65484132],[3.43944233,39.65415206],[3.43422641,39.63275465],[3.39972011,39.63229278],[3.38499191,39.59661714],[3.4001468,39.57678863],[3.37814389,39.57518626],[3.36839896,39.55098881],[3.34115071,39.54117854],[3.29638082,39.49991674],[3.28242655,39.46887452],[3.27481227,39.41586502],[3.25443015,39.40126924],[3.25048921,39.38723922],[3.22380116,39.3568828],[3.21112707,39.36474603],[3.18682134,39.33508808],[3.17097343,39.32650716],[3.14722044,39.33012607],[3.11910189,39.3129118],[3.07291322,39.26863469],[3.04946033,39.26610596],[3.02951347,39.28977922]],[[-7.03188898,43.54455858],[-7.02925798,43.5566887],[-6.99641478,43.55408043],[-6.96284849,43.56078813],[-6.94848142,43.57244119],[-6.82843605,43.56636738000001],[-6.80977333,43.5545494],[-6.78613277,43.55580427],[-6.76684918,43.56876785],[-6.75893678,43.56141193],[-6.71012345,43.56390941],[-6.68475542,43.55866292],[-6.66633822,43.56567525],[-6.62860617,43.56889751],[-6.59054379,43.55330953],[-6.57999074,43.55717926],[-6.52378956,43.55047331],[-6.47224599,43.55158414],[-6.47047195,43.57112157],[-6.42975339,43.55276027],[-6.39686057,43.56045101],[-6.34789937,43.55251504],[-6.33225422,43.56153494],[-6.30697606,43.56297192],[-6.24224856,43.5900107],[-6.20448826,43.57360052],[-6.1881168,43.57946085],[-6.19079865,43.5662317],[-6.17000192,43.56963796],[-6.11242727,43.55558215],[-6.06689831,43.56568237],[-6.01747908,43.58795022],[-5.99802455,43.57833332],[-5.96147596,43.5783233],[-5.91394425,43.60940192],[-5.91487942,43.62362176],[-5.88773772,43.62314052],[-5.85845117,43.64014646],[-5.85753023,43.65601581],[-5.84261941,43.6572251],[-5.82806922,43.63945293],[-5.78348417,43.63158919],[-5.79059575,43.61544323],[-5.77108191,43.60825606],[-5.76589053,43.59366975],[-5.73535359,43.5739754],[-5.70089075,43.56820461],[-5.69431191,43.54646273],[-5.65235629,43.5415382],[-5.622307,43.55672821],[-5.59878628,43.54814488],[-5.51824181,43.55183067],[-5.49539444,43.54476873],[-5.46975168,43.55095338],[-5.41324669,43.55487093],[-5.3858263,43.53516065],[-5.30009026,43.53568418],[-5.26657016,43.51871480000001],[-5.2698546,43.50929448],[-5.22675003,43.48631738],[-5.21575626,43.47481665],[-5.12884647,43.48423843],[-5.11536073,43.47660115],[-5.0864367,43.47613318],[-5.07081175,43.46573837],[-5.01323734,43.45855501],[-4.97510175,43.4622727],[-4.93554388,43.45876239],[-4.88430956,43.44847116],[-4.87186285,43.44161631],[-4.84284545,43.44480691],[-4.82476964,43.43590326],[-4.76609481,43.42929645],[-4.74218128,43.41829962],[-4.68087101,43.40923127],[-4.65353611,43.40096762],[-4.57815644,43.39810682000001],[-4.56652745,43.39200869],[-4.54600543,43.39976155],[-4.51227972,43.39328811]],[[-0.72448507,42.92023029],[-0.73634901,42.91301907],[-0.73302798,42.89802362],[-0.69842861,42.87895461],[-0.67875182,42.88453631],[-0.64879937,42.85526306],[-0.60435996,42.83342361],[-0.60047004,42.80242895],[-0.57666782,42.80820382000001],[-0.56488869,42.79828278],[-0.57054803,42.78303195],[-0.55111947,42.77753929],[-0.54371637,42.79318398],[-0.5302405,42.79139024],[-0.52602253,42.80947965],[-0.5105141,42.82503665],[-0.44346759,42.79588745],[-0.40878825,42.80766011],[-0.39474679,42.79896705],[-0.3644881,42.81639164],[-0.34683989,42.83778405],[-0.32447332,42.83466109],[-0.31326416,42.84937313],[-0.27681676,42.83551816],[-0.23893121,42.8087224],[-0.17976198,42.78560561],[-0.15998734,42.79802906000001],[-0.14940016,42.76896925],[-0.13841782,42.76673215],[-0.10929573,42.73464617],[-0.10640621,42.72061599],[-0.06845958,42.7180743],[-0.06211926,42.69458962],[0.00026532,42.68531687],[0.02432662,42.70248546],[0.04805719,42.69593051],[0.09022357,42.71709404],[0.10658059,42.71011344],[0.13672668,42.72243686],[0.16230344,42.72370412],[0.17579602,42.73704374],[0.20602779,42.72967152],[0.22689515,42.7173154],[0.26000534,42.71601544],[0.27084698,42.69136672],[0.29526602,42.67319474],[0.32380975,42.68702932],[0.32517392,42.7050253],[0.36023112,42.72434937],[0.39530519,42.69952329],[0.42209036,42.69045838],[0.4811045,42.6996428],[0.51678082,42.69134709],[0.53071441,42.70245152],[0.58894748,42.69510877],[0.60596678,42.69919188],[0.66006819,42.69085393]],[[-1.63012374,37.37523122],[-1.65079782,37.35658635],[-1.67188655,37.35675304],[-1.68888769,37.33941199],[-1.7060773,37.30666652],[-1.7583884,37.26345756],[-1.77579899,37.23921226],[-1.79619132,37.23156151],[-1.8235743,37.17054438000001],[-1.83313787,37.11925223],[-1.84472971,37.10827894],[-1.84985373,37.0686415],[-1.87660832,37.03395166],[-1.87768175,37.01449208],[-1.90076136,36.98775687],[-1.89551918,36.94849801],[-1.91447288,36.93451183],[-1.93321703,36.93909843],[-1.95440495,36.92361121],[-1.96743713,36.89880107],[-1.98456277,36.90060712],[-2.00224053,36.88333229],[-1.99960678,36.84002364],[-2.02160161,36.83632132],[-2.06263532,36.80320813],[-2.06359903,36.77557743],[-2.10519418,36.76307866],[-2.12427973,36.73200333],[-2.15118992,36.73121541],[-2.19345064,36.72112407],[-2.24998557,36.78489332],[-2.29366071,36.82157984000001],[-2.31854814,36.83354339],[-2.36148923,36.84159781],[-2.40253393,36.82784801],[-2.42654678,36.81073960000001],[-2.47500261,36.83681788],[-2.50269299,36.82460527],[-2.56192454,36.81613083],[-2.59982319,36.77487848],[-2.61964861,36.72695818],[-2.65013051,36.70028706],[-2.70093428,36.68298236],[-2.77154217,36.68142666],[-2.79716719,36.70053081],[-2.82073124,36.70618518],[-2.84511548,36.69554614],[-2.85753588,36.69858192],[-2.89637593,36.73692775],[-2.91914432,36.75002704],[-2.93887131,36.75110352],[-2.97787171,36.73848945],[-3.02257622,36.74719202],[-3.07117905,36.74542718],[-3.11403114,36.75098439],[-3.15577413,36.74743058],[-3.20183267,36.75050708],[-3.20985084,36.74540871],[-3.24464957,36.75454551],[-3.30509155,36.7382054],[-3.3388614,36.7382848],[-3.36461074,36.71449092],[-3.41384462,36.70200624000001],[-3.41903042,36.69418127],[-3.48266648,36.69727469],[-3.51269013,36.72083925],[-3.52870491,36.72434769],[-3.5527016,36.71473675],[-3.57974051,36.72340595],[-3.60009909,36.74354267],[-3.66067342,36.74586206],[-3.6740181,36.73087647],[-3.7186979,36.73255242],[-3.73537361,36.72775348],[-3.75446226,36.73856913],[-3.76758639,36.72922701],[-3.79205343,36.74627622000001],[-3.83509655,36.75399638],[-3.86664475,36.75007491],[-3.87972289,36.74168547],[-3.9202938,36.74081087],[-3.95686313,36.72625246],[-3.99331038,36.73808776],[-4.07437607,36.74838182],[-4.11274502,36.72453806],[-4.24940849,36.71010336],[-4.2827469,36.71395861],[-4.33972394,36.71257407],[-4.39375374,36.7223382],[-4.4187927,36.71693151],[-4.43723959,36.69620335],[-4.45467848,36.66405484],[-4.48178657,36.63938288],[-4.50928496,36.600034],[-4.53978928,36.57896575],[-4.55891678,36.58030377],[-4.58920166,36.5719357],[-4.60958002,36.55674877],[-4.63813389,36.50707583],[-4.67641237,36.50354257],[-4.69158197,36.49154717],[-4.74338161,36.48411335],[-4.87342628,36.50791749],[-4.9348052,36.49985791],[-5.00490007,36.45974412],[-5.03338075,36.46118232],[-5.05155411,36.45211933],[-5.08701233,36.44795354],[-5.10812169,36.43395455],[-5.13505166,36.42794207],[-5.16244991,36.41323556],[-5.18204674,36.41097757],[-5.22048762,36.37465061],[-5.24699965,36.31097364],[-5.26856047,36.29984004],[-5.29580009,36.24673407],[-5.31664605,36.22987247],[-5.33557453,36.17691873],[-5.33864569,36.15345969],[-5.38175968,36.16934722],[-5.38304196,36.17938068],[-5.41035122,36.18135743],[-5.42987481,36.17347241],[-5.44506677,36.15508237],[-5.446701,36.13792388],[-5.43157265,36.12802919],[-5.44210914,36.11739538],[-5.43108057,36.1055871],[-5.44341963,36.08904876],[-5.42685402,36.08300415],[-5.42934303,36.0711461],[-5.46453032,36.05026437],[-5.48694223,36.05421793],[-5.5164504,36.03763054],[-5.57418755,36.01505257],[-5.60542831,36.01033996],[-5.650254,36.05201588],[-5.69533477,36.0665667],[-5.71135742,36.05859849],[-5.74984916,36.07065467],[-5.78092833,36.08817885],[-5.79599814,36.07789622],[-5.82546286,36.10424217],[-5.84876892,36.13453017],[-5.87329412,36.15690712],[-5.9152946,36.18491025],[-5.94471733,36.1865867],[-5.98572486,36.17712583],[-6.01046812,36.18524721],[-6.03428363,36.18101365],[-6.08006673,36.24469197],[-6.08864957,36.26516137],[-6.11357427,36.29338789],[-6.14185256,36.29541403],[-6.18220939,36.36857142],[-6.2188063,36.39276757],[-6.23718313,36.43969646],[-6.28675656,36.51601048],[-6.3050537,36.53674363],[-6.27826154,36.52949948],[-6.25872992,36.49935156],[-6.26667057,36.48912293],[-6.25387938,36.46826846],[-6.22791482,36.46307973],[-6.21330966,36.48111833],[-6.19366763,36.4867461],[-6.17362714,36.50973803],[-6.1732445,36.52140913],[-6.19647833,36.5265829],[-6.20920729,36.50904724],[-6.23190217,36.50372164],[-6.25570991,36.52901777],[-6.22911769,36.52507281],[-6.22378233,36.56246076],[-6.23281693,36.58491481],[-6.26568175,36.57971154],[-6.27622303,36.59886769],[-6.2989211,36.61745477],[-6.34903166,36.62476666],[-6.35851342,36.61529071],[-6.39450802,36.63381095],[-6.3939335,36.64636308],[-6.43934536,36.71924993],[-6.44252473,36.73655674000001],[-6.38941256,36.76596106],[-6.3454687,36.79871559],[-6.37125697,36.79505836],[-6.39781876,36.80870922],[-6.43883067,36.89102558],[-6.46213896,36.92377427],[-6.5218839,36.97716339],[-6.58207093,37.01444327],[-6.71539188,37.08353862],[-6.79127346,37.11899894],[-6.83035169,37.12853391],[-6.83943323,37.13747368],[-6.87425041,37.14833886],[-6.9166798,37.17630102],[-6.91585283,37.16334728],[-6.88958675,37.14639598],[-6.94774897,37.16698099],[-7.01712045,37.19967014],[-7.0596523,37.21079353],[-7.07403599,37.20580408],[-7.14566256,37.20792781],[-7.27089109,37.20177914],[-7.30138403,37.19604414],[-7.35087952,37.1762639],[-7.37320022,37.17158548],[-7.4068271,37.18197422],[-7.41901296,37.23761488],[-7.43198497,37.24617204],[-7.42283448,37.27634584],[-7.44227239,37.31265273],[-7.44451615,37.34783012],[-7.43666426,37.36658954],[-7.44023021,37.39029659],[-7.46162842,37.40716086],[-7.44566709,37.41847237],[-7.45788453,37.42968416],[-7.45719714,37.45328976],[-7.46958054,37.47132075],[-7.46612345,37.49029368],[-7.48200627,37.49618459],[-7.49496071,37.5234852],[-7.50970954,37.52316485],[-7.52284613,37.55339995],[-7.50674762,37.5575114],[-7.5146224,37.57137664],[-7.47134578,37.624138],[-7.46744767,37.64901708],[-7.45565115,37.64571743],[-7.44491486,37.6641447],[-7.45255232,37.67779792],[-7.43503765,37.71946491],[-7.41878914,37.74402416],[-7.42264721,37.75547042],[-7.39905463,37.76430766],[-7.34912802,37.80226219],[-7.32096052,37.81947597],[-7.29753486,37.85675741],[-7.27954916,37.87670606],[-7.28109823,37.8985272],[-7.25567332,37.92240012],[-7.24996657,37.96699244],[-7.26279924,37.97739856],[-7.2434919,37.99204038],[-7.2227804,37.98988662],[-7.20221823,38.00347685],[-7.17366402,37.99333528000001],[-7.12243593,38.00407905],[-7.1282521,38.02960804],[-7.09877987,38.04384475],[-7.04460998,38.01423322],[-7.02465905,38.02496168000001],[-7.00226045,38.02285368],[-7.00256233,38.04385783],[-6.99032948,38.05495704],[-6.98736279,38.10389641],[-6.97517278,38.10444504],[-6.95847675,38.15069519],[-6.96857134,38.15973086],[-6.96148218,38.17690434],[-6.93165634,38.20831687]],[[-17.96066413,27.69256486],[-17.97259164,27.67096789],[-17.97036378,27.64843125],[-17.98670855,27.63773394],[-18.00990328,27.64980407],[-18.02783447,27.67695384],[-18.05058316,27.69271002],[-18.12472318,27.70521619],[-18.14616936,27.70396788],[-18.16073453,27.7163051],[-18.15183967,27.73214766],[-18.15153326,27.76004129],[-18.13242364,27.77116273],[-18.10585031,27.75661462],[-18.0644231,27.75458198],[-18.03955302,27.76220872],[-17.99770232,27.79084428],[-17.98629364,27.80735745],[-17.9919794,27.82224899],[-17.95510994,27.84204493],[-17.91721239,27.84807678],[-17.89459412,27.83167888],[-17.88317363,27.81155218],[-17.9240849,27.74664931],[-17.93167098,27.72854963],[-17.95733016,27.71957056],[-17.96066413,27.69256486]],[[-17.19210628,28.02957363],[-17.24344982,28.01986185],[-17.27104009,28.02568868],[-17.272724,28.03517134],[-17.3197964,28.06040131],[-17.32457962,28.07998247],[-17.34893222,28.09836779],[-17.34110632,28.1314218],[-17.34655865,28.14808221],[-17.31865988,28.20358832],[-17.27515937,28.21779658],[-17.26036949,28.21737236],[-17.24405489,28.20068746],[-17.20139637,28.20066147],[-17.17637079,28.17738718],[-17.11789319,28.15196728],[-17.10345706,28.12835002],[-17.09852251,28.09558912],[-17.15301761,28.05459824],[-17.16731642,28.03651729],[-17.19210628,28.02957363]],[[-15.40841027,27.84777027],[-15.42231716,27.83101118],[-15.42269904,27.81031471],[-15.43862702,27.8003006],[-15.48687834,27.79277624],[-15.56449937,27.75960696],[-15.56904638,27.73905917],[-15.59901601,27.73450383],[-15.61982223,27.74898592],[-15.62803697,27.74506802],[-15.66119247,27.75681147],[-15.67461644,27.74920616],[-15.68999226,27.77131204],[-15.72532089,27.78822866],[-15.78718156,27.83406442],[-15.81805891,27.8929672],[-15.83312497,27.91005512],[-15.82846552,27.94972285],[-15.83324043,27.97477592],[-15.81741723,28.00479828],[-15.82301908,28.01335563],[-15.79013038,28.0192328],[-15.76540324,28.04622025],[-15.73783556,28.05457017],[-15.70707029,28.08949882],[-15.71310691,28.10284978],[-15.69623251,28.15165388],[-15.70949295,28.16543913],[-15.68200163,28.16979696],[-15.66567222,28.1582951],[-15.63712505,28.17184914],[-15.61371737,28.14771277],[-15.58011037,28.14410581],[-15.54263985,28.14757669],[-15.52936768,28.15523285],[-15.47855175,28.13649211],[-15.46787749,28.12614075],[-15.44570211,28.13122731],[-15.43152884,28.14575644],[-15.44140315,28.16307297],[-15.42229967,28.18072038],[-15.40379022,28.1740015],[-15.41213221,28.12864696],[-15.42769649,28.14678219],[-15.42744113,28.1264269],[-15.41120867,28.09808502],[-15.41963894,28.0623322],[-15.41609106,28.04795292],[-15.38773412,28.02914211],[-15.36710993,27.99159445],[-15.38433224,27.96780653],[-15.37811229,27.94635969],[-15.36121229,27.93691018],[-15.38386918,27.92772141],[-15.39274219,27.88469575],[-15.38541946,27.85752965],[-15.40841027,27.84777027]],[[-13.82209246,28.73701045],[-13.83571513,28.75239205],[-13.81413452,28.76524227],[-13.82209246,28.73701045]],[[-13.48875624,29.24999956],[-13.52204349,29.21905938],[-13.54456595,29.21896973],[-13.54533987,29.23284733],[-13.52637786,29.24273045],[-13.52384315,29.26655214],[-13.50696728,29.2903134],[-13.48300476,29.27966769],[-13.47136455,29.26569864],[-13.48875624,29.24999956]],[[-13.52379657,29.41036352],[-13.50572976,29.41601134],[-13.48905743,29.40300319],[-13.50679561,29.3844805],[-13.52934597,29.38569224],[-13.52379657,29.41036352]],[[-13.70046127,28.91789941],[-13.73431145,28.90712663],[-13.75207465,28.87436842],[-13.78720264,28.83840198],[-13.79426137,28.85398302],[-13.83002258,28.86238188],[-13.87686279,28.85956364],[-13.88187721,28.88550318],[-13.82917295,28.93034701],[-13.8338028,28.9900453],[-13.81332125,29.03407916],[-13.75210953,29.07901457],[-13.70959839,29.07940123],[-13.66183688,29.11321218],[-13.65763715,29.12379023],[-13.63048602,29.11685103],[-13.60421229,29.13562331],[-13.58515468,29.1336547],[-13.56279889,29.1169556],[-13.54010151,29.12343432],[-13.52457813,29.14145445],[-13.52092546,29.17082845],[-13.49713527,29.2179733],[-13.47052055,29.23880127],[-13.41954237,29.20146867],[-13.42948762,29.15409277],[-13.447076,29.14623669],[-13.46352583,29.11523374],[-13.44746054,29.09156351],[-13.46913189,29.03391623],[-13.46362283,29.02449342],[-13.48619777,28.99217569],[-13.49519084,28.992847],[-13.55126603,28.95692663],[-13.59924893,28.94721265],[-13.61580942,28.93041409],[-13.64403845,28.91916783],[-13.70046127,28.91789941]],[[-17.79690843,28.51829723],[-17.81710647,28.49463382],[-17.83255376,28.4580912],[-17.8568603,28.45999195],[-17.87460918,28.49067784],[-17.88004231,28.54018921],[-17.91091686,28.58619542],[-17.92513999,28.59523225],[-17.92342738,28.60904108],[-17.93833069,28.63954183],[-17.96421476,28.66785106],[-17.98173247,28.72883015],[-18.00075853,28.7518473],[-18.0067314,28.77606817],[-17.9949732,28.7960239],[-17.97837921,28.80462261],[-17.96805603,28.82584709],[-17.91981631,28.85743002],[-17.89605025,28.84221033],[-17.85713214,28.83271469],[-17.80702068,28.84312425],[-17.77815101,28.83752083],[-17.75911651,28.80416131],[-17.75791687,28.78723613],[-17.72454389,28.74312861],[-17.732561,28.72019465],[-17.74612508,28.71205455],[-17.76874034,28.67732014],[-17.75010489,28.62062396],[-17.75585157,28.61315522],[-17.76037655,28.56950255],[-17.78673224,28.5436279],[-17.79690843,28.51829723]],[[-16.59727148,28.0279918],[-16.62576954,28.01844906],[-16.64600873,28.00379397],[-16.66615475,28.00769468],[-16.67815219,27.99839003],[-16.70735125,28.01107616],[-16.71110641,28.04673865],[-16.73675324,28.05453184],[-16.73891643,28.08803727],[-16.76924759,28.10961929],[-16.79356689,28.14016222],[-16.80471375,28.17067419],[-16.83331062,28.20204956],[-16.84624488,28.23947488],[-16.83779986,28.25562051],[-16.86140034,28.28747175],[-16.88035552,28.30341951],[-16.90472421,28.33834965],[-16.92071938,28.34284398],[-16.91780671,28.36063075],[-16.8709003,28.37127148],[-16.82858601,28.39339576],[-16.80911615,28.37635164],[-16.75500689,28.37494463],[-16.68145765,28.39036401],[-16.67544536,28.40071896],[-16.65312733,28.39578624],[-16.60246971,28.39438],[-16.55518338,28.41873493],[-16.52068576,28.41754796],[-16.50306725,28.42455479],[-16.49715486,28.43845352],[-16.47712055,28.44069046],[-16.47416021,28.45303816],[-16.4286985,28.48919864],[-16.42157604,28.51767894],[-16.37765165,28.54797049],[-16.36580358,28.5451444],[-16.33363792,28.55777459],[-16.32972435,28.57594827],[-16.29784689,28.56912066],[-16.27374473,28.57782563],[-16.22562269,28.56546545],[-16.19322147,28.57192493],[-16.15811182,28.58866191],[-16.13433622,28.5812263],[-16.12070849,28.55170581],[-16.14370467,28.52129267],[-16.15592621,28.52284002],[-16.2196661,28.48944121],[-16.23537385,28.48652617],[-16.25401144,28.45048733],[-16.2668359,28.44930261],[-16.32015347,28.40005668],[-16.32833636,28.40233908],[-16.35561717,28.38324514],[-16.36972695,28.354418],[-16.35939213,28.31997357],[-16.36208359,28.30595725],[-16.38374989,28.28473441],[-16.38730232,28.26452916],[-16.42501562,28.20209385],[-16.42093488,28.19851617],[-16.43435074,28.15568023],[-16.4251173,28.15075571],[-16.46392424,28.11903713],[-16.49133631,28.08165992],[-16.54081115,28.04244195],[-16.54664904,28.02486704],[-16.55876321,28.03126722],[-16.59727148,28.0279918]],[[-14.36467991,28.04951671],[-14.40898714,28.05857723],[-14.47749965,28.07781624],[-14.50310928,28.07173688],[-14.49323323,28.083045],[-14.49909849,28.10046334],[-14.43028838,28.1019361],[-14.38272042,28.11364376],[-14.31507343,28.14458967],[-14.24585239,28.19467697],[-14.22269251,28.21557479],[-14.2130378,28.23381817],[-14.20835859,28.27080246],[-14.2142708,28.28781454],[-14.20338769,28.32879358],[-14.17679736,28.34665232],[-14.16120945,28.372739],[-14.16137973,28.39234598],[-14.15127132,28.43014924],[-14.1273224,28.45670706],[-14.10062559,28.47542837],[-14.0738767,28.52407042],[-14.06676581,28.55039733],[-14.03329453,28.59318208],[-14.03875282,28.61133386],[-14.00891359,28.67715291],[-14.01830003,28.69422838],[-14.01754076,28.71458382],[-13.97587421,28.73491802],[-13.95714724,28.73522885],[-13.92659454,28.75141425],[-13.91570386,28.74475319],[-13.89087954,28.75700681],[-13.86660065,28.74592711],[-13.867552,28.73596025],[-13.84484687,28.72759301],[-13.8308945,28.69386093],[-13.83381761,28.67476048],[-13.82243947,28.59303789],[-13.82843004,28.58287472],[-13.82608953,28.55211179],[-13.83763151,28.54221892],[-13.84264896,28.50395985],[-13.86254549,28.49394328],[-13.8675585,28.48046556],[-13.85682343,28.46025025],[-13.86236496,28.43946714],[-13.85198198,28.42387736],[-13.85243643,28.39450776],[-13.86327173,28.38602589],[-13.87913546,28.33801966],[-13.8946402,28.32486994],[-13.90288723,28.29683774],[-13.89690077,28.28837549],[-13.92693943,28.24149242],[-13.94848252,28.22773789],[-13.98885628,28.22694748],[-14.01313944,28.20770575],[-14.07197004,28.20158324],[-14.15269887,28.18236867],[-14.15877234,28.17587724],[-14.20109762,28.17273854],[-14.22262605,28.1622309],[-14.25099017,28.11804446],[-14.3010035,28.07423252],[-14.32566159,28.04687629],[-14.36467991,28.04951671]]]} 2 | -------------------------------------------------------------------------------- /src/common/helpers/classname.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * CNC = Class Name Composer. 3 | * So you pas an array of names (whether they are null, undefined, 4 | * or have a valid value) and it filter invalid ones and join them 5 | * together to compose a full style class name. 6 | */ 7 | export const cnc = (...names) => names.filter((n) => n).join(' '); 8 | -------------------------------------------------------------------------------- /src/common/types/d3Types.ts: -------------------------------------------------------------------------------- 1 | import { Selection } from 'd3-selection'; 2 | 3 | export type D3Selection = Selection; 4 | 5 | export type Extension = [[number, number], [number, number]]; 6 | -------------------------------------------------------------------------------- /src/common/types/index.ts: -------------------------------------------------------------------------------- 1 | export * from './d3Types'; 2 | -------------------------------------------------------------------------------- /src/components/home/home.scss: -------------------------------------------------------------------------------- 1 | .home { 2 | margin-top: 2rem; 3 | margin-left: 2rem; 4 | display: flex; 5 | flex-direction: column; 6 | } 7 | -------------------------------------------------------------------------------- /src/components/home/home.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import Link from 'next/link'; 3 | import { Map } from './viewModel'; 4 | const styles = require('./home.scss'); 5 | 6 | interface Props { 7 | maps: Map[]; 8 | } 9 | 10 | export const Home: React.StatelessComponent = (props) => ( 11 |
12 | { 13 | props.maps.map((map) => ( 14 | 18 | {map.title} 19 | 20 | )) 21 | } 22 |
23 | ); 24 | -------------------------------------------------------------------------------- /src/components/home/homeContainer.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import * as Next from 'next'; 3 | import { Home } from './home'; 4 | import { Map } from './viewModel'; 5 | import { mapAPI } from '../../rest-api/api/map'; 6 | import { mapMapListModelToVM } from './mappers'; 7 | 8 | interface Props { 9 | maps: Map[]; 10 | } 11 | 12 | export const HomeContainer: Next.NextStatelessComponent = (props) => ( 13 | 16 | ); 17 | 18 | HomeContainer.getInitialProps = async () => { 19 | const maps = await mapAPI.fetchMaps(); 20 | return { 21 | maps: mapMapListModelToVM(maps), 22 | }; 23 | }; 24 | -------------------------------------------------------------------------------- /src/components/home/index.ts: -------------------------------------------------------------------------------- 1 | import { HomeContainer } from './homeContainer'; 2 | 3 | export default HomeContainer; 4 | -------------------------------------------------------------------------------- /src/components/home/mappers.spec.ts: -------------------------------------------------------------------------------- 1 | import * as vm from './viewModel'; 2 | import * as model from '../../rest-api/model'; 3 | import { mapMapListModelToVM } from './mappers'; 4 | 5 | describe('home/mappers specs', () => { 6 | describe('mapMapListModelToVM', () => { 7 | it('should return empty array feeding maps equals undefined', () => { 8 | // Arrange 9 | const maps: model.Map[] = undefined; 10 | 11 | // Act 12 | const result = mapMapListModelToVM(maps); 13 | 14 | // Assert 15 | expect(result).toEqual([]); 16 | }); 17 | 18 | it('should return empty array feeding maps equals null', () => { 19 | // Arrange 20 | const maps: model.Map[] = null; 21 | 22 | // Act 23 | const result = mapMapListModelToVM(maps); 24 | 25 | // Assert 26 | expect(result).toEqual([]); 27 | }); 28 | 29 | it('should return empty array feeding maps equals empty array', () => { 30 | // Arrange 31 | const maps: model.Map[] = []; 32 | 33 | // Act 34 | const result = mapMapListModelToVM(maps); 35 | 36 | // Assert 37 | expect(result).toEqual([]); 38 | }); 39 | 40 | it('should return mapped array feeding maps equals with one item', () => { 41 | // Arrange 42 | const maps: model.Map[] = [ 43 | { 44 | id: 1, 45 | title: 'test title', 46 | type: 2, 47 | description: 'test description', 48 | tags: ['test tag 1', 'test tag 2'], 49 | url: 'test url', 50 | }, 51 | ]; 52 | 53 | // Act 54 | const result = mapMapListModelToVM(maps); 55 | 56 | // Assert 57 | const expectedResult: vm.Map[] = [ 58 | { 59 | id: 1, 60 | title: 'test title', 61 | type: 2, 62 | description: 'test description', 63 | tags: ['test tag 1', 'test tag 2'], 64 | url: 'test url', 65 | }, 66 | ]; 67 | expect(result).toEqual(expectedResult); 68 | }); 69 | }); 70 | }); 71 | -------------------------------------------------------------------------------- /src/components/home/mappers.ts: -------------------------------------------------------------------------------- 1 | import * as vm from './viewModel'; 2 | import * as model from '../../rest-api/model'; 3 | 4 | export const mapMapListModelToVM = (maps: model.Map[]): vm.Map[] => ( 5 | Array.isArray(maps) ? 6 | maps.map(mapMapModelToVm) : 7 | [] 8 | ); 9 | 10 | const mapMapModelToVm = (map: model.Map): vm.Map => ( 11 | Boolean(map) ? 12 | { 13 | ...map, 14 | } : 15 | vm.createEmptyMap() 16 | ); 17 | -------------------------------------------------------------------------------- /src/components/home/viewModel.ts: -------------------------------------------------------------------------------- 1 | export interface Map { 2 | id: number; 3 | title: string; 4 | type: number; 5 | description: string; 6 | tags: string[]; 7 | url: string; 8 | } 9 | 10 | export const createEmptyMap = (): Map => ({ 11 | id: 0, 12 | title: '', 13 | type: 0, 14 | description: '', 15 | tags: [], 16 | url: '', 17 | }); 18 | -------------------------------------------------------------------------------- /src/components/spainMunicipalitiesElectoralMap2016/electoralMap.scss: -------------------------------------------------------------------------------- 1 | .electoral-map { 2 | width: 100vw; 3 | height: 100vh; 4 | display: flex; 5 | flex-direction: column; 6 | justify-content: flex-start; 7 | margin: auto; 8 | 9 | .header { 10 | text-align: center; 11 | margin: 2rem 1rem 0 1rem; 12 | } 13 | 14 | .map-container { 15 | flex-grow: 1; 16 | flex-shrink: 1; 17 | display: flex; 18 | flex-direction: column; 19 | justify-content: center; 20 | align-items: center; 21 | padding: 2rem; 22 | margin: 2rem 2rem; 23 | box-shadow: 0 0 15px darkgrey; 24 | border-radius: 1rem; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/components/spainMunicipalitiesElectoralMap2016/electoralMap.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import { FeatureCollection, GeometryObject, MultiLineString } from 'geojson'; 3 | import { MapComponent } from '../../common/components/map'; 4 | import { mapGeoAreaListModelToVM } from './mapper'; 5 | import { getProjection } from '../../common/geo/spain'; 6 | import { ElectoralVote, MapInfo } from './viewModel'; 7 | const styles = require('./electoralMap.scss'); 8 | 9 | interface Props { 10 | mapInfo: MapInfo; 11 | electoralVoteEntities: ElectoralVote[]; 12 | geoEntities: FeatureCollection; 13 | mesh: MultiLineString; 14 | } 15 | 16 | export const ElectoralMapComponent: React.StatelessComponent = (props) => ( 17 |
18 |
19 |

{props.mapInfo.title}

20 |

{props.mapInfo.description}

21 |
22 |
23 | 29 |
30 |
31 | ); 32 | -------------------------------------------------------------------------------- /src/components/spainMunicipalitiesElectoralMap2016/electoralMapContainer.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import { FeatureCollection, GeometryObject, MultiLineString } from 'geojson'; 3 | import { ElectoralVote, MapInfo } from './viewModel'; 4 | import { getGeoEntities, geoAreaTypes, getMesh } from '../../common/geo/spain'; 5 | import { ElectoralMapComponent } from './electoralMap'; 6 | import { mapElectoralVotesModelToVM, mapMapInfoModelToVM } from './mapper'; 7 | import { mapAPI } from '../../rest-api/api/map'; 8 | 9 | const mapId = 1; 10 | 11 | interface Props { 12 | mapInfo: MapInfo; 13 | } 14 | 15 | interface State { 16 | electoralVotes: ElectoralVote[]; 17 | geoEntities: FeatureCollection; 18 | mesh: MultiLineString; 19 | } 20 | 21 | export class ElectoralMapContainer extends React.PureComponent { 22 | state = { 23 | electoralVotes: [], 24 | geoEntities: null, 25 | mesh: null, 26 | }; 27 | 28 | static async getInitialProps() { 29 | const map = await mapAPI.fetchMapById(mapId); 30 | 31 | return { 32 | mapInfo: mapMapInfoModelToVM(map), 33 | }; 34 | } 35 | 36 | componentDidMount() { 37 | this.loadMapData(); 38 | } 39 | 40 | loadMapData = async () => { 41 | const electoralVoteEntities = await require('../../map-data/spain/0001_spain2016MunicipalitiesElectoralVotes.json'); 42 | 43 | this.setState({ 44 | electoralVotes: mapElectoralVotesModelToVM(electoralVoteEntities), 45 | geoEntities: getGeoEntities(geoAreaTypes.municipalities), 46 | mesh: getMesh(geoAreaTypes.municipalities), 47 | }); 48 | } 49 | 50 | render() { 51 | return ( 52 | 58 | ); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/components/spainMunicipalitiesElectoralMap2016/index.ts: -------------------------------------------------------------------------------- 1 | import { ElectoralMapContainer } from './electoralMapContainer'; 2 | export default ElectoralMapContainer; 3 | -------------------------------------------------------------------------------- /src/components/spainMunicipalitiesElectoralMap2016/mapper.spec.ts: -------------------------------------------------------------------------------- 1 | import { mapElectoralVotesModelToVM, mapGeoAreaListModelToVM, mapMapInfoModelToVM } from './mapper'; 2 | import * as model from '../../rest-api/model'; 3 | import * as vm from './viewModel'; 4 | import { FeatureCollection, GeometryObject } from 'geojson'; 5 | import { GeoArea } from '../../common/components/map'; 6 | 7 | describe('spainMunicipalitiesElectoralMap2016/mappers specs', () => { 8 | describe('mapElectoralVotesModelToVM', () => { 9 | it('should return empty array feeding electoralVotes equals undefined', () => { 10 | // Arrange 11 | const electoralVotes: model.ElectoralVote[] = undefined; 12 | 13 | // Act 14 | const result = mapElectoralVotesModelToVM(electoralVotes); 15 | 16 | // Assert 17 | expect(result).toEqual([]); 18 | }); 19 | 20 | it('should return empty array feeding electoralVotes equals null', () => { 21 | // Arrange 22 | const electoralVotes: model.ElectoralVote[] = null; 23 | 24 | // Act 25 | const result = mapElectoralVotesModelToVM(electoralVotes); 26 | 27 | // Assert 28 | expect(result).toEqual([]); 29 | }); 30 | 31 | it('should return empty array feeding electoralVotes equals empty array', () => { 32 | // Arrange 33 | const electoralVotes: model.ElectoralVote[] = []; 34 | 35 | // Act 36 | const result = mapElectoralVotesModelToVM(electoralVotes); 37 | 38 | // Assert 39 | expect(result).toEqual([]); 40 | }); 41 | 42 | it('should return mapped array feeding electoralVotes equals with values', () => { 43 | // Arrange 44 | const electoralVotes: model.ElectoralVote[] = [ 45 | { 46 | id: 1, 47 | name: 'test name', 48 | party: 'test party', 49 | province: 'test province', 50 | region: 'test region', 51 | }, 52 | ]; 53 | 54 | // Act 55 | const result = mapElectoralVotesModelToVM(electoralVotes); 56 | 57 | // Assert 58 | const expectedResult: vm.ElectoralVote[] = [ 59 | { 60 | id: '1', 61 | name: 'test name', 62 | party: 'test party', 63 | province: 'test province', 64 | region: 'test region', 65 | }, 66 | ]; 67 | expect(result).toEqual(expectedResult); 68 | }); 69 | }); 70 | 71 | describe('mapGeoAreaListModelToVM', () => { 72 | it('should return empty array feeding geoEntities equals undefined', () => { 73 | // Arrange 74 | const geoEntities: FeatureCollection = undefined; 75 | const electoralVotes: vm.ElectoralVote[] = [ 76 | { 77 | id: '1', 78 | name: 'test name', 79 | party: 'test party', 80 | province: 'test province', 81 | region: 'test region', 82 | }, 83 | ]; 84 | 85 | // Act 86 | const result = mapGeoAreaListModelToVM(geoEntities, electoralVotes); 87 | 88 | // Assert 89 | expect(result).toEqual([]); 90 | }); 91 | 92 | it('should return empty array feeding geoEntities equals null', () => { 93 | // Arrange 94 | const geoEntities: FeatureCollection = null; 95 | const electoralVotes: vm.ElectoralVote[] = [ 96 | { 97 | id: '1', 98 | name: 'test name', 99 | party: 'test party', 100 | province: 'test province', 101 | region: 'test region', 102 | }, 103 | ]; 104 | 105 | // Act 106 | const result = mapGeoAreaListModelToVM(geoEntities, electoralVotes); 107 | 108 | // Assert 109 | expect(result).toEqual([]); 110 | }); 111 | 112 | it('should return mapped array feeding geoEntities with values', () => { 113 | // Arrange 114 | const geoEntities: any = { 115 | features: [ 116 | { 117 | properties: { 118 | NATCODE: '1', 119 | }, 120 | }, 121 | { 122 | properties: { 123 | NATCODE: '2', 124 | }, 125 | }, 126 | { 127 | properties: { 128 | NATCODE: '3', 129 | }, 130 | }, 131 | { 132 | properties: { 133 | NATCODE: '4', 134 | }, 135 | }, 136 | ], 137 | }; 138 | const electoralVotes: vm.ElectoralVote[] = [ 139 | { 140 | id: '1', 141 | name: 'test name 1', 142 | party: 'PP', 143 | province: 'test province 1', 144 | region: 'test region 1', 145 | }, 146 | { 147 | id: '2', 148 | name: 'test name 2', 149 | party: 'PSOE', 150 | province: 'test province 2', 151 | region: 'test region 2', 152 | }, 153 | { 154 | id: '3', 155 | name: 'test name 3', 156 | party: 'PODEMOS', 157 | province: 'test province 3', 158 | region: 'test region 3', 159 | }, 160 | { 161 | id: '4', 162 | name: 'test name 4', 163 | party: 'CS', 164 | province: 'test province 4', 165 | region: 'test region 4', 166 | }, 167 | ]; 168 | 169 | // Act 170 | const result = mapGeoAreaListModelToVM(geoEntities, electoralVotes); 171 | 172 | // Assert 173 | 174 | const expectedResult: GeoArea[] = [ 175 | { 176 | id: '1', 177 | geoEntity: geoEntities.features[0], 178 | color: '#0cb2ff', 179 | tooltipMessage: ` 180 |

test name 1

181 |

PP

182 | `, 183 | }, 184 | { 185 | id: '2', 186 | geoEntity: geoEntities.features[1], 187 | color: '#ff0000', 188 | tooltipMessage: ` 189 |

test name 2

190 |

PSOE

191 | `, 192 | }, 193 | { 194 | id: '3', 195 | geoEntity: geoEntities.features[2], 196 | color: '#9a569a', 197 | tooltipMessage: ` 198 |

test name 3

199 |

PODEMOS

200 | `, 201 | }, 202 | { 203 | id: '4', 204 | geoEntity: geoEntities.features[3], 205 | color: '#fca501', 206 | tooltipMessage: ` 207 |

test name 4

208 |

CS

209 | `, 210 | }, 211 | ]; 212 | 213 | expect(result).toEqual(expectedResult); 214 | }); 215 | }); 216 | 217 | describe('mapMapInfoModelToVM', () => { 218 | it('should return mapInfo object with default values when feeding map equals undefined', () => { 219 | // Arrange 220 | const map: model.Map = undefined; 221 | 222 | // Act 223 | const result = mapMapInfoModelToVM(map); 224 | 225 | // Assert 226 | const expectedResult: vm.MapInfo = { 227 | id: 0, 228 | title: '', 229 | description: '', 230 | }; 231 | 232 | expect(result).toEqual(expectedResult); 233 | }); 234 | 235 | it('should return mapInfo object with default values when feeding map equals null', () => { 236 | // Arrange 237 | const map: model.Map = null; 238 | 239 | // Act 240 | const result = mapMapInfoModelToVM(map); 241 | 242 | // Assert 243 | const expectedResult: vm.MapInfo = { 244 | id: 0, 245 | title: '', 246 | description: '', 247 | }; 248 | 249 | expect(result).toEqual(expectedResult); 250 | }); 251 | 252 | it('should return mapInfo object with mapped values when feeding map with values', () => { 253 | // Arrange 254 | const map: model.Map = { 255 | id: 1, 256 | title: 'test title', 257 | description: 'test description', 258 | type: 2, 259 | tags: ['test tag'], 260 | url: 'test url', 261 | }; 262 | 263 | // Act 264 | const result = mapMapInfoModelToVM(map); 265 | 266 | // Assert 267 | const expectedResult: vm.MapInfo = { 268 | id: 1, 269 | title: 'test title', 270 | description: 'test description', 271 | }; 272 | 273 | expect(result).toEqual(expectedResult); 274 | }); 275 | }); 276 | }); 277 | -------------------------------------------------------------------------------- /src/components/spainMunicipalitiesElectoralMap2016/mapper.ts: -------------------------------------------------------------------------------- 1 | import { FeatureCollection, GeometryObject } from 'geojson'; 2 | import { GeoArea, createEmptyGeoArea } from '../../common/components/map'; 3 | import { getId } from '../../common/geo/spain'; 4 | import * as vm from './viewModel'; 5 | import * as model from '../../rest-api/model'; 6 | 7 | export const mapElectoralVotesModelToVM = (electoralVotes: model.ElectoralVote[]): vm.ElectoralVote[] => ( 8 | Boolean(electoralVotes) ? 9 | electoralVotes.map(mapElectoralVoteModelToVM) : 10 | [] 11 | ); 12 | 13 | const mapElectoralVoteModelToVM = (electoralVote: model.ElectoralVote): vm.ElectoralVote => ( 14 | Boolean(electoralVote) ? 15 | { 16 | id: electoralVote.id.toString(), 17 | name: electoralVote.name, 18 | region: electoralVote.region, 19 | province: electoralVote.province, 20 | party: electoralVote.party, 21 | } : 22 | vm.createEmptyElectoralVote() 23 | ); 24 | 25 | export const mapGeoAreaListModelToVM = 26 | (geoEntities: FeatureCollection, electoralVotes: vm.ElectoralVote[]): GeoArea[] => 27 | ( 28 | Boolean(geoEntities) ? 29 | geoEntities.features.map((geoEntity) => ( 30 | mapGeoAreaModelToVM(geoEntity, electoralVotes) 31 | )) : 32 | [] 33 | ); 34 | 35 | const mapGeoAreaModelToVM = (geoEntity, electoralVotes: vm.ElectoralVote[]): GeoArea => { 36 | const id = getId(geoEntity); 37 | const electoralVote = electoralVotes.find((item) => item.id === id); 38 | 39 | return Boolean(electoralVote) ? 40 | { 41 | id, 42 | geoEntity, 43 | color: getColor(electoralVote), 44 | tooltipMessage: getTooltipMessage(electoralVote), 45 | } : 46 | createEmptyGeoArea(); 47 | }; 48 | 49 | const partyColors = { 50 | PP: '#0cb2ff', 51 | PSOE: '#ff0000', 52 | PODEMOS: '#9a569a', 53 | CS: '#fca501', 54 | }; 55 | 56 | const getColor = (electoralVote: vm.ElectoralVote) => ( 57 | partyColors[electoralVote.party] 58 | ); 59 | 60 | const getTooltipMessage = (electoralVote: vm.ElectoralVote) => ( 61 | Boolean(electoralVote) ? 62 | ` 63 |

${electoralVote.name}

64 |

${electoralVote.party}

65 | ` : 66 | '

Sin Datos

' 67 | ); 68 | 69 | export const mapMapInfoModelToVM = (map: model.Map): vm.MapInfo => ( 70 | Boolean(map) ? 71 | { 72 | id: map.id, 73 | title: map.title, 74 | description: map.description, 75 | } : 76 | vm.createEmptyMapInfo() 77 | ); 78 | -------------------------------------------------------------------------------- /src/components/spainMunicipalitiesElectoralMap2016/viewModel.ts: -------------------------------------------------------------------------------- 1 | export interface ElectoralVote { 2 | id: string; 3 | name: string; 4 | region: string; 5 | province: string; 6 | party: string; 7 | } 8 | 9 | export const createEmptyElectoralVote = (): ElectoralVote => ({ 10 | id: '', 11 | name: '', 12 | region: '', 13 | province: '', 14 | party: '', 15 | }); 16 | 17 | export interface MapInfo { 18 | id: number; 19 | title: string; 20 | description: string; 21 | } 22 | 23 | export const createEmptyMapInfo = (): MapInfo => ({ 24 | id: 0, 25 | title: '', 26 | description: '', 27 | }); 28 | -------------------------------------------------------------------------------- /src/content/styles/styles.scss: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | width: 100vw; 4 | height: 100vh; 5 | color: darkgrey; 6 | font-family: 'Roboto', Arial, Helvetica, sans-serif; 7 | } 8 | -------------------------------------------------------------------------------- /src/pages/_app.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import App, { Container } from "next/app"; 3 | import Router from "next/router"; 4 | 5 | Router.events.on("routeChangeComplete", () => { 6 | if (process.env.NODE_ENV !== "production") { 7 | const els = document.querySelectorAll( 8 | 'link[href*="/_next/static/css/styles.chunk.css"]' 9 | ); 10 | const timestamp = new Date().valueOf(); 11 | els[0].href = "/_next/static/css/styles.chunk.css?v=" + timestamp; 12 | } 13 | }); 14 | 15 | export default class MyApp extends App { 16 | static async getInitialProps({ Component, router, ctx }) { 17 | let pageProps = {}; 18 | 19 | if (Component.getInitialProps) { 20 | pageProps = await Component.getInitialProps(ctx); 21 | } 22 | 23 | return { pageProps }; 24 | } 25 | 26 | render() { 27 | const { Component, pageProps } = this.props; 28 | 29 | return ( 30 | 31 | 32 | 33 | ); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/pages/_document.js: -------------------------------------------------------------------------------- 1 | import Document, { Head, Main, NextScript } from 'next/document'; 2 | 3 | export default class MyDocument extends Document { 4 | render() { 5 | return ( 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | ) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/pages/index.ts: -------------------------------------------------------------------------------- 1 | import Home from '../components/home'; 2 | 3 | export default Home; 4 | -------------------------------------------------------------------------------- /src/pages/mapa-electoral-municipios-espana-2016.ts: -------------------------------------------------------------------------------- 1 | import ElectoralMap from '../components/spainMunicipalitiesElectoralMap2016'; 2 | 3 | export default ElectoralMap; 4 | -------------------------------------------------------------------------------- /src/rest-api/api/config.ts: -------------------------------------------------------------------------------- 1 | export const config = { 2 | useRealAPI: (process.env.REST_ENV !== 'mock'), 3 | }; 4 | -------------------------------------------------------------------------------- /src/rest-api/api/createRequest/constants.ts: -------------------------------------------------------------------------------- 1 | export const headers = { 2 | accept: 'Accept', 3 | contentType: 'Content-Type', 4 | }; 5 | 6 | export const contentTypes = { 7 | json: 'application/json', 8 | }; 9 | 10 | export interface ContentTypeHandler { 11 | contentType: string; 12 | handler: string; 13 | } 14 | 15 | export const contenTypeHandlers: ContentTypeHandler[] = [ 16 | { 17 | contentType: contentTypes.json, 18 | handler: 'json', 19 | }, 20 | ]; 21 | -------------------------------------------------------------------------------- /src/rest-api/api/createRequest/createRequest.ts: -------------------------------------------------------------------------------- 1 | import fetch from 'isomorphic-unfetch'; 2 | import { stringify } from 'qs'; 3 | import { responseHandler } from './responseHandler'; 4 | import { defaultOptions } from './defaultOptions'; 5 | 6 | export const createRequest = (url: string, options: RequestInit, params?): Promise => ( 7 | fetch(buildURL(url, params), { 8 | ...defaultOptions, 9 | ...options, 10 | }) 11 | .then((response) => responseHandler(response)) 12 | .catch((error) => Promise.reject(error.message)) 13 | ); 14 | 15 | const buildURL = (url, params?) => { 16 | const baseUrl = `${process.env.BASE_API_URL}${url}`; 17 | 18 | return Boolean(params) ? 19 | `${baseUrl}${stringify(params, { 20 | addQueryPrefix: true, 21 | })}` : 22 | baseUrl; 23 | }; 24 | -------------------------------------------------------------------------------- /src/rest-api/api/createRequest/defaultOptions.ts: -------------------------------------------------------------------------------- 1 | import { headers, contentTypes } from './constants'; 2 | 3 | export const defaultOptions: RequestInit = { 4 | // NOTE: we can't use new Headers({...}) because isomorphic-unfetch has not defined it. 5 | headers: { 6 | [headers.accept]: contentTypes.json, 7 | [headers.contentType]: contentTypes.json, 8 | }, 9 | }; 10 | -------------------------------------------------------------------------------- /src/rest-api/api/createRequest/index.ts: -------------------------------------------------------------------------------- 1 | export * from './methods'; 2 | -------------------------------------------------------------------------------- /src/rest-api/api/createRequest/methods.ts: -------------------------------------------------------------------------------- 1 | import { createRequest } from './createRequest'; 2 | 3 | export const get = (url: string, params?) => ( 4 | createRequest(url, { method: 'GET' }, params) 5 | ); 6 | 7 | export const post = (url: string, params?) => ( 8 | createRequest( 9 | url, 10 | { 11 | method: 'POST', 12 | body: JSON.stringify(params), 13 | }, 14 | null, 15 | ) 16 | ); 17 | 18 | export const put = (url: string, params?) => ( 19 | createRequest( 20 | url, 21 | { 22 | method: 'PUT', 23 | body: JSON.stringify(params), 24 | }, 25 | null, 26 | ) 27 | ); 28 | 29 | export const deleteMethod = (url: string, params?) => ( 30 | createRequest(url, { method: 'DELETE' }, params) 31 | ); 32 | -------------------------------------------------------------------------------- /src/rest-api/api/createRequest/responseHandler.ts: -------------------------------------------------------------------------------- 1 | import { headers, ContentTypeHandler, contenTypeHandlers } from './constants'; 2 | 3 | export const responseHandler = (response: Response): Promise => ( 4 | response.ok ? 5 | extractPayload(response) : 6 | responseError(response) 7 | ); 8 | 9 | const extractPayload = (response: Response): Promise => { 10 | const contentTypeHandler = getContentTypeHandler(response); 11 | 12 | return ( 13 | Boolean(contentTypeHandler) ? 14 | response[contentTypeHandler.handler]() : 15 | response.text() 16 | ); 17 | }; 18 | 19 | const getContentTypeHandler = (response: Response): ContentTypeHandler => { 20 | const contentType = response.headers.get(headers.contentType); 21 | return contenTypeHandlers.find((rh) => contentType.includes(rh.contentType)); 22 | }; 23 | 24 | const responseError = (response: Response): Promise => { 25 | return response.json() 26 | .then((error) => ( 27 | Promise.reject(error.message) 28 | )); 29 | }; 30 | -------------------------------------------------------------------------------- /src/rest-api/api/map/api.ts: -------------------------------------------------------------------------------- 1 | import { FetchMaps, FetchMapById } from './contract'; 2 | import { get } from '../createRequest'; 3 | import { urls } from './urls'; 4 | 5 | export const fetchMaps: FetchMaps = () => ( 6 | get(urls.fetchMaps) 7 | ); 8 | 9 | export const fetchMapById: FetchMapById = (id: number) => ( 10 | get(urls.fetchMapById, { id }) 11 | ); 12 | -------------------------------------------------------------------------------- /src/rest-api/api/map/contract.ts: -------------------------------------------------------------------------------- 1 | import { Map } from '../../model'; 2 | 3 | export type FetchMaps = () => Promise; 4 | export type FetchMapById = (id: number) => Promise; 5 | -------------------------------------------------------------------------------- /src/rest-api/api/map/double.ts: -------------------------------------------------------------------------------- 1 | import { FetchMaps, FetchMapById } from './contract'; 2 | import { maps } from './mockData'; 3 | 4 | export const fetchMaps: FetchMaps = () => ( 5 | Promise.resolve(maps) 6 | ); 7 | 8 | export const fetchMapById: FetchMapById = (id: number) => ( 9 | Promise.resolve(maps.find((m) => m.id === id)) 10 | ); 11 | -------------------------------------------------------------------------------- /src/rest-api/api/map/index.ts: -------------------------------------------------------------------------------- 1 | import { config } from '../config'; 2 | import * as api from './api'; 3 | import * as double from './double'; 4 | 5 | export const mapAPI = config.useRealAPI ? 6 | api : 7 | double; 8 | -------------------------------------------------------------------------------- /src/rest-api/api/map/mockData.ts: -------------------------------------------------------------------------------- 1 | import { Map } from '../../model'; 2 | import { routes } from '../../../common/constants/routes'; 3 | 4 | export const maps: Map[] = [ 5 | { 6 | id: 1, 7 | title: 'Test title', 8 | type: 1, 9 | description: 'Test description', 10 | tags: [ 11 | 'tag1', 12 | 'tag2', 13 | 'tag3', 14 | ], 15 | url: routes.spainMunicipalitiesElectoralMap2016, 16 | }, 17 | ]; 18 | -------------------------------------------------------------------------------- /src/rest-api/api/map/urls.ts: -------------------------------------------------------------------------------- 1 | const baseUrl = '/maps'; 2 | 3 | export const urls = { 4 | fetchMaps: baseUrl, 5 | fetchMapById: baseUrl, 6 | }; 7 | -------------------------------------------------------------------------------- /src/rest-api/model/electoralVote.ts: -------------------------------------------------------------------------------- 1 | export interface ElectoralVote { 2 | id: number; 3 | name: string; 4 | region: string; 5 | province: string; 6 | party: string; 7 | } 8 | -------------------------------------------------------------------------------- /src/rest-api/model/index.ts: -------------------------------------------------------------------------------- 1 | export * from './map'; 2 | export * from './electoralVote'; 3 | -------------------------------------------------------------------------------- /src/rest-api/model/map.ts: -------------------------------------------------------------------------------- 1 | export interface Map { 2 | id: number; 3 | title: string; 4 | type: number; 5 | description: string; 6 | tags: string[]; 7 | url: string; 8 | } 9 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "esnext", 4 | "module": "esnext", 5 | "moduleResolution": "node", 6 | "declaration": false, 7 | "noImplicitAny": false, 8 | "sourceMap": true, 9 | "jsx": "react", 10 | "noLib": false, 11 | "allowJs": true 12 | }, 13 | "compileOnSave": true, 14 | "exclude": [ 15 | "node_modules" 16 | ] 17 | } -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "tslint:latest", 4 | "tslint-react" 5 | ], 6 | "rules": { 7 | "jsx-alignment": true, 8 | "jsx-self-close": true, 9 | "class-name": true, 10 | "interface-name": false, 11 | "object-literal-sort-keys": false, 12 | "ordered-imports": [ 13 | false 14 | ], 15 | "comment-format": [ 16 | true, 17 | "check-space" 18 | ], 19 | "indent": [ 20 | true, 21 | "spaces" 22 | ], 23 | "no-eval": true, 24 | "no-internal-module": true, 25 | "no-trailing-whitespace": true, 26 | "no-unsafe-finally": true, 27 | "no-var-keyword": true, 28 | "only-arrow-functions": [ 29 | false 30 | ], 31 | "one-line": [ 32 | true, 33 | "check-open-brace", 34 | "check-whitespace" 35 | ], 36 | "quotemark": [ 37 | true, 38 | "single", 39 | "jsx-double" 40 | ], 41 | "semicolon": [ 42 | true, 43 | "always" 44 | ], 45 | "triple-equals": [ 46 | true, 47 | "allow-null-check" 48 | ], 49 | "typedef-whitespace": [ 50 | true, 51 | { 52 | "call-signature": "nospace", 53 | "index-signature": "nospace", 54 | "parameter": "nospace", 55 | "property-declaration": "nospace", 56 | "variable-declaration": "nospace" 57 | } 58 | ], 59 | "variable-name": [ 60 | true, 61 | "ban-keywords" 62 | ], 63 | "whitespace": [ 64 | true, 65 | "check-branch", 66 | "check-decl", 67 | "check-operator", 68 | "check-separator", 69 | "check-type" 70 | ], 71 | "jsx-no-multiline-js": false, 72 | "jsx-wrap-multiline": false, 73 | "no-var-requires": false, 74 | "no-empty": false, 75 | "member-ordering": false, 76 | "member-access": false, 77 | "no-submodule-imports": false, 78 | "no-implicit-dependencies": false, 79 | "no-this-assignment": false, 80 | "object-literal-shorthand": false, 81 | "no-object-literal-type-assertion": false 82 | } 83 | } --------------------------------------------------------------------------------