Käännetty tiedostojen nimet englanniksi

Sat, 10 Jun 2017 16:45:41 +0300

author
Teemu Piippo <teemu@hecknology.net>
date
Sat, 10 Jun 2017 16:45:41 +0300
changeset 7
f3791dccfd03
parent 6
88cfb916c852
child 8
d12e8a560faa

Käännetty tiedostojen nimet englanniksi

.hgignore file | annotate | diff | comparison | revisions
Makefile file | annotate | diff | comparison | revisions
alue-edustajat.json file | annotate | diff | comparison | revisions
alueet.gmp file | annotate | diff | comparison | revisions
alueet.py file | annotate | diff | comparison | revisions
buses.py file | annotate | diff | comparison | revisions
busroute.py file | annotate | diff | comparison | revisions
bussireitti.py file | annotate | diff | comparison | revisions
bussit.py file | annotate | diff | comparison | revisions
compute-regions.py file | annotate | diff | comparison | revisions
geometria.py file | annotate | diff | comparison | revisions
geometry.py file | annotate | diff | comparison | revisions
palvelu.py file | annotate | diff | comparison | revisions
region-representatives.json file | annotate | diff | comparison | revisions
regions.gmp file | annotate | diff | comparison | revisions
service.py file | annotate | diff | comparison | revisions
--- a/.hgignore	Sat Jun 10 16:36:36 2017 +0300
+++ b/.hgignore	Sat Jun 10 16:45:41 2017 +0300
@@ -2,4 +2,4 @@
 __pycache__
 gtfs
 gtfs.zip
-pysäkkialueet.json
+regions-per-stop.json
--- a/Makefile	Sat Jun 10 16:36:36 2017 +0300
+++ b/Makefile	Sat Jun 10 16:45:41 2017 +0300
@@ -1,7 +1,7 @@
-all: gtfs pysäkkialueet.json
+all: gtfs regions-per-stop.json
 
-pysäkkialueet.json: alue-edustajat.json alueet.gmp gtfs
-	./alueet.py > pysäkkialueet.json
+regions-per-stop.json: region-representatives.json regions.gmp gtfs
+	./compute-regions.py > regions-per-stop.json
 
 gtfs: gtfs.zip
 	unzip gtfs.zip -d gtfs
@@ -10,5 +10,5 @@
 	wget http://data.foli.fi/gtfs/gtfs.zip
 
 clean:
-	rm -f pysäkkialueet.json gtfs.zip
-	rm -rf gtfs
\ No newline at end of file
+	rm -f regions-per-stop.json gtfs.zip
+	rm -rf gtfs
--- a/alue-edustajat.json	Sat Jun 10 16:36:36 2017 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,215 +0,0 @@
-{
-	"Kaarinan keskusta": "6043",
-	"Piikkiö": "6175",
-	"Hadvala": "6171",
-	"Puosta": "6351",
-	"Runko": "6156",
-	"Tuorla": "6149",
-	"Raadelma": "6153",
-	"Sipilänmäki": "6227",
-	
-	"Paimio": "6619",
-	"Paimion sairaala": "6664",
-	"Moisio": "6757",
-	"Hanhijoki": "6657",
-	"Naskarla": "6638",
-	
-	"Lieto": "5021",
-	"Pompo": "6112",
-	"Tammi": "6117",
-	"Hakkinen": "5004",
-	"Loukinainen": "5009",
-	"Sillilä": "5011",
-	"Piispala": "5030",
-	"Jokila": "5035",
-	"Vieru": "5018",
-	"Ilmarinen": "5070",
-	"Liedon asemanseutu": "5112",
-	"Tarvasjoki": "5423",
-	"Avanti": "5470",
-
-	"Aura": "8024",
-	"Salo": "8900",
-	"Korpo": "8960",
-	
-	"Marttila": "8800",
-
-	"Raision keskusta": "2010",
-	"Kauppakeskus Mylly": "2117",
-	"Petäsmäki": "2063",
-	"Kaanaa": "2037",
-	
-	"Koski Tl": "8810",
-	
-	"Somero": "8820",
-
-	"Naantalin keskusta": "3016",
-	"Ahteentaka": "3290",
-	"Kurala (Naantali)": "3196",
-	"Haapala": "3283",
-	"Ajola": "3282",
-	"Ylttinen": "3192",
-	"Tamminiemi": "3279",
-	"Artukainen": "1513",
-	"Asikko": "3036",
-	"Hämölä": "3270",
-	"Eerikvalla": "395",
-	"Friskala": "394",
-	"Jyrkkälä": "758",
-	"Haarla": "364",
-	"Haijainen": "3231",
-	"Halinen": "1628",
-	"Harittu": "1489",
-	"Hemmola": "4077",
-	"Hepokulta": "26",
-	"Herttula": "3235",
-	"Hyrköinen": "4060",
-	"Häppilä": "409",
-	"Härkämäki": "761",
-	"Ihala": "2098",
-	"Illoinen": "324",
-	"Ilpoinen": "456",
-	"Impivaara": "1564",
-	"Itäharju": "1805",
-	"Itäranta": "332",
-	"Ispoinen": "647",
-	"Jäkärlä": "1366",
-	"Jänessaari": "437",
-	"Kahari": "4093",
-	"Karvetti": "3202",
-	"Kaistarniemi": "1747",
-	"Kaivola": "3229",
-	"Kakskerta": "1764",
-	"Kastu": "627",
-	"Katariina": "1708",
-	"Kauppatori": "T1",
-	"Kerttuli": "867",
-	"Kultaranta": "3027",
-	"Koivula": "788",
-	"Kohmo": "1651",
-	"Konserttitalo": "18",
-	"Kuivalahti": "3237",
-	"Kukola": "1732",
-	"Kuninkoja": "2129",
-	"Kupittaa": "870",
-	"Kupittaanpuisto": "1972",
-	"Kurala": "1660",
-	"Kurjenmäki": "1688",
-	"Kuuvuori": "218",
-	"Kähäri": "1022",
-	"Kärsämäki": "192",
-	"Käkölä": "3236",
-	"Iso-Heikkilä": "768",
-	"Lauste": "708",
-	"Lauttaranta": "128",
-	"Lentoasema": "1586",
-	"Liljalaakso": "592",
-	"Linja-autoasema": "41",
-	"Linnavuori": "3122",
-	"Littoinen": "6085",
-	"Luolavuori": "1721",
-	"Luostarinmäki": "864",
-	"Länsinummi": "818",
-	"Maanpää": "1729",
-	"Majakkaranta": "81",
-	"Maksla": "2150",
-	"Marjaniemi": "534",
-	"Martti": "74",
-	"Metsäaro": "2089",
-	"Mäntymäki": "1800",
-	"Moikoinen": "91",
-	"Moisio": "1066",
-	"Muhkuri": "899",
-	"Munittula": "4012",
-	"Mälikkälä": "781",
-	"Nuorikkala": "2079",
-	"Nummenmäki": "62",
-	"Nummen koulu": "1826",
-	"Nättinummi": "30",
-	"Ojanto": "4004",
-	"Oriniemi": "316",
-	"Oriketo": "1435",
-	"Paasniittu": "4036",
-	"Paattinen": "1170",
-	"Paikkari": "2048",
-	"Pansio": "1506",
-	"Papinsaari": "352",
-	"Patterinhaka": "578",
-	"Peijerlä": "4058",
-	"Peltola": "1455",
-	"Perno": "745",
-	"Pernon telakka": "775",
-	"Piispanristi": "6282",
-	"Pikisaari": "124",
-	"Pläkkikaupunki": "780",
-	"Pohjola": "1017",
-	"Porhonkallio": "3037",
-	"Port Arthur": "9",
-	"Puutori": "286",
-	"Pyöli": "3247",
-	"Pääskyvuori": "879",
-	"Raunistula": "224",
-	"Rautatieasema": "144",
-	"Ruissalo": "666",
-	"Ruona": "3220",
-	"Runosmäki": "1015",
-	"Ruskon keskusta": "4017",
-	"Rymättylä": "3151",
-	"Räntämäki": "1441",
-	"Röölä": "3166",
-	"Saaro": "556",
-	"Salonkylä": "3301",
-	"Saramäki": "250",
-	"Okala": "3297",
-	"Satama": "1",
-	"Satava": "373",
-	"Montola": "3157",
-	"Silvola": "4086",
-	"Skanssi": "349",
-	"Airismaa": "3171",
-	"Suikkila": "485",
-	"Suutarla": "3286",
-	"Särkilahti": "404",
-	"Aaslaluoto": "3308",
-	"Länsikeskus": "476",
-	"Tikanmaa": "2136",
-	"Toijainen": "424",
-	"Tortinmäki": "1149",
-	"Tuomiokirkkotori": "131",
-	"TYKS": "1030",
-	"Uittamo": "920",
-	"Urusvuori": "1587",
-	"Vaala": "1500",
-	"Vahto": "4069",
-	"Vaisaari": "2103",
-	"Vanha Suurtori": "219",
-	"Vasaramäki": "1967",
-	"Varissuo": "828",
-	"Verkahovi": "1601",
-	"Vienola": "1020",
-	"Viiala": "3024",
-	"Viluluoto": "3010",
-	"VII kaupunginosa": "109",
-	"Velusmaa": "3287",
-	"Vähä-Heikkilä": "944",
-	"Yli-Maaria": "396",
-	"Yliopistonmäki": "1797",
-	"Ylioppilaskylä-Länsi": "445",
-	"Ylioppilaskylä-Itä": "448",
-	"Caribia": "1643",
-	"Meripirtti": "3179",
-
-	"Pargas": "8137",
-	"Björkhagen": "8125",
-	"Storäng": "8121",
-	"Norrby": "8142",
-	"Österby": "8140",
-	"Munkviken": "8129",
-	"Tennby": "8127",
-	"Kårkulla": "8105",
-	"Kyrkäng": "8109",
-	"Kirjala": "8102",
-
-
-	"Poikko": "3184"
-}
--- a/alueet.gmp	Sat Jun 10 16:36:36 2017 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,227 +0,0 @@
-roadmap^60.6155412106049, 22.400419931927335^12@undefined^#FF0000,5,1,#ff8800,0.4^^60.39482,22.2577~60.40037,22.27521~60.39147,22.28456~60.38851,22.27179
-polygon^#FF0000,5,1,#ff8800,0.4^^60.3977,22.24465~60.40772,22.24046~60.40792,22.26057~60.40076,22.27409~60.3952,22.25642
-polygon^#FF0000,5,1,#ff8800,0.4^^60.3977,22.22706~60.38719,22.23676~60.38341,22.22466~60.38518,22.21205~60.39359,22.20706~60.39816,22.21341
-polygon^#FF0000,5,1,#ff8800,0.4^^60.39868,22.21599~60.39804,22.22852~60.38876,22.23916~60.38952,22.24843~60.39329,22.25135~60.40217,22.23474~60.4019,22.21689
-polygon^#FF0000,5,1,#ff8800,0.4^^60.38871,22.16432~60.39236,22.18483~60.39972,22.188~60.40171,22.1823~60.39919,22.15413~60.39151,22.15633
-undefined^#FF0000,5,1,#ff8800,0.4^^60.42123,22.17264~60.41472,22.15422~60.40622,22.14277~60.40003,22.15599~60.40577,22.17143~60.41357,22.18174
-undefined^#FF0000,5,1,#ff8800,0.4^^60.43275,22.20869~60.4239,22.21632~60.41889,22.19831~60.42495,22.19216~60.43033,22.19648
-undefined^#FF0000,5,1,#ff8800,0.4^^60.42148,22.17333~60.42584,22.18964~60.41902,22.1971~60.41534,22.18056
-undefined^#FF0000,5,1,#ff8800,0.4^^60.49702,22.21496~60.49936,22.22028~60.50048,22.23744~60.49676,22.2392~60.49373,22.23435~60.49306,22.23554~60.49178,22.23402~60.48872,22.22903~60.48729,22.2221~60.49085,22.21505
-undefined^#FF0000,5,1,#ff8800,0.4^^60.45775,22.29049~60.4599,22.29787~60.45951,22.29945~60.45688,22.3026~60.45537,22.29751~60.45501,22.29585~60.45465,22.29285~60.45619,22.29141
-undefined^#FF0000,5,1,#ff8800,0.4^^60.45331,22.2865~60.45033,22.29068~60.45113,22.29322~60.45198,22.29413~60.45225,22.29741~60.45399,22.29853~60.45529,22.2975~60.45495,22.29585~60.45446,22.2915~60.45386,22.28832~60.45369,22.28748
-undefined^#FF0000,5,1,#ff8800,0.4^^60.4445,22.25538~60.44359,22.25256~60.44121,22.24824~60.43617,22.25517~60.43897,22.26358
-undefined^#FF0000,5,1,#ff8800,0.4^^60.4537,22.25043~60.45203,22.25283~60.45345,22.25685~60.45493,22.25432
-undefined^#FF0000,5,1,#ff8800,0.4^^60.45224,22.29757~60.4499,22.32448~60.4569,22.32432~60.4621,22.31703~60.45992,22.29862~60.45961,22.29964~60.45684,22.30304~60.45528,22.29775~60.45402,22.29882
-undefined^#FF0000,5,1,#ff8800,0.4^^60.45206,22.29738~60.45137,22.2971~60.44687,22.30439~60.44232,22.3131~60.43895,22.31757~60.44625,22.3267~60.44913,22.32902
-undefined^#FF0000,5,1,#ff8800,0.4^^60.35447,22.12646~60.34122,22.13676~60.33714,22.17865~60.35634,22.30671~60.36475,22.31056~60.38221,22.2982~60.37208,22.22194~60.3631,22.16082
-undefined^#FF0000,5,1,#ff8800,0.4^^60.36483,22.11222~60.35498,22.12595~60.34539,22.09816~60.35061,22.08758
-undefined^#FF0000,5,1,#ff8800,0.4^^60.35557,22.12732~60.36614,22.11211~60.37617,22.11563~60.38197,22.13505~60.38392,22.1608~60.38367,22.21058~60.38265,22.23049~60.37467,22.23427~60.36377,22.15899
-undefined^#FF0000,5,1,#ff8800,0.4^^60.44513,22.32739~60.4509,22.33176~60.45303,22.33709~60.45193,22.34516~60.44766,22.34725~60.44482,22.35053~60.44204,22.35147~60.44187,22.33875~60.44334,22.33174
-undefined^#FF0000,5,1,#ff8800,0.4^^60.44211,22.3519~60.44491,22.35092~60.44783,22.34766~60.45206,22.34564~60.45506,22.34898~60.4569,22.35851~60.45464,22.36246~60.44861,22.36587~60.44271,22.36825
-undefined^#FF0000,5,1,#ff8800,0.4^^60.45658,22.33769~60.46067,22.33863~60.46369,22.34413~60.46361,22.35091~60.46069,22.35683~60.45802,22.35761~60.45549,22.34853~60.45532,22.34116
-undefined^#FF0000,5,1,#ff8800,0.4^^60.4623,22.31774~60.46502,22.33262~60.46094,22.33791~60.4565,22.33709~60.45315,22.33619~60.45112,22.33105~60.45135,22.32557~60.45712,22.32505
-undefined^#FF0000,5,1,#ff8800,0.4^^60.42408,22.21672~60.43288,22.20943~60.43357,22.21448~60.43179,22.225~60.42963,22.22912~60.42589,22.23131~60.42324,22.2362~60.42237,22.23158~60.41794,22.22753
-undefined^#FF0000,5,1,#ff8800,0.4^^60.45645,22.26163~60.45447,22.26424~60.45634,22.26935~60.4576,22.26927~60.45794,22.2662
-undefined^#FF0000,5,1,#ff8800,0.4^^60.456,22.26864~60.45472,22.2702~60.45356,22.26639~60.45395,22.26597~60.45512,22.26643
-undefined^#FF0000,5,1,#ff8800,0.4^^60.45569,22.26935~60.45492,22.27039~60.45569,22.27163~60.45627,22.27076
-undefined^#FF0000,5,1,#ff8800,0.4^^60.45811,22.27231~60.4578,22.27506~60.45618,22.27427~60.45707,22.27271
-undefined^#FF0000,5,1,#ff8800,0.4^^60.49152,22.24869~60.49397,22.26783~60.48683,22.27238~60.48425,22.26869~60.48425,22.2544
-undefined^#FF0000,5,1,#ff8800,0.4^^60.48328,22.24959~60.48059,22.25139~60.47672,22.25169~60.47522,22.26525~60.4831,22.2707
-undefined^#FF0000,5,1,#ff8800,0.4^^60.4697,22.22131~60.46693,22.21517~60.46528,22.20514~60.47272,22.19522~60.47605,22.20406~60.47122,22.21328
-undefined^#FF0000,5,1,#ff8800,0.4^^60.4705,22.21951~60.48023,22.22414~60.48044,22.21169~60.47626,22.20483~60.47169,22.21384
-undefined^#FF0000,5,1,#ff8800,0.4^^60.45191,22.2745~60.44999,22.27746~60.44796,22.2706~60.44837,22.26998~60.44934,22.272
-undefined^#FF0000,5,1,#ff8800,0.4^^60.4457,22.19908~60.44249,22.20603~60.43554,22.20629~60.43394,22.19696~60.44188,22.18918
-undefined^#FF0000,5,1,#ff8800,0.4^^60.4219,22.10621~60.4208,22.13539~60.40461,22.11823~60.40554,22.10579
-undefined^#FF0000,5,1,#ff8800,0.4^^60.46255,22.1208~60.46094,22.14792~60.45392,22.15324~60.45116,22.13868~60.44198,22.1196~60.4466,22.10751
-undefined^#FF0000,5,1,#ff8800,0.4^^60.45366,22.15796~60.45129,22.1614~60.45049,22.16689~60.44892,22.17899~60.4424,22.18543~60.43899,22.15149~60.43804,22.12393~60.44149,22.1198~60.45079,22.13974
-undefined^#FF0000,5,1,#ff8800,0.4^^60.45942,22.15127~60.45429,22.15401~60.45399,22.1588~60.4517,22.16222~60.45006,22.17728~60.45513,22.17316~60.4602,22.17171
-undefined^#FF0000,5,1,#ff8800,0.4^^60.46014,22.17238~60.4603,22.18908~60.45502,22.18972~60.45112,22.19633~60.44625,22.19779~60.44274,22.18699~60.4505,22.17996
-undefined^#FF0000,5,1,#ff8800,0.4^^60.45066,22.24616~60.44458,22.25495~60.44369,22.25247~60.43624,22.23858~60.4444,22.23654~60.44471,22.23537~60.4478,22.2407
-undefined^#FF0000,5,1,#ff8800,0.4^^60.48504,22.23244~60.48575,22.24697~60.49033,22.24506~60.49114,22.24283~60.49107,22.24098~60.49086,22.24005~60.49023,22.23753~60.49002,22.23558~60.48981,22.23345~60.491,22.23294~60.48865,22.22914~60.48714,22.22952~60.48611,22.23257
-undefined^#FF0000,5,1,#ff8800,0.4^^60.48987,22.23356~60.49103,22.23309~60.49175,22.23427~60.49312,22.23579~60.49373,22.2346~60.49673,22.23947~60.49728,22.2393~60.49751,22.24406~60.49696,22.24764~60.49359,22.24392~60.49128,22.24289~60.49117,22.24067~60.49032,22.23748
-undefined^#FF0000,5,1,#ff8800,0.4^^60.42207,22.10793~60.43171,22.10878~60.43629,22.11982~60.43677,22.12916~60.43279,22.1408~60.43745,22.15093~60.4402,22.1662~60.44177,22.18809~60.43334,22.19685~60.42639,22.18912~60.42142,22.17058~60.42463,22.15582~60.42085,22.14449
-undefined^#FF0000,5,1,#ff8800,0.4^^60.43186,22.10827~60.4223,22.10735~60.42254,22.10205~60.41546,22.0972~60.41587,22.09045~60.42412,22.0846~60.42765,22.08646
-undefined^#FF0000,5,1,#ff8800,0.4^^60.44991,22.24738~60.45435,22.25976~60.448,22.2675~60.4447,22.25516
-undefined^#FF0000,5,1,#ff8800,0.4^^60.45217,22.26268~60.45381,22.26794~60.45108,22.27178~60.4493,22.26616
-undefined^#FF0000,5,1,#ff8800,0.4^^60.42275,22.24174~60.43039,22.24392~60.43345,22.24115~60.43304,22.23017~60.43182,22.22603~60.4298,22.2295~60.42591,22.23195~60.42344,22.23659
-undefined^#FF0000,5,1,#ff8800,0.4^^60.44096,22.24787~60.43597,22.255~60.43152,22.24341~60.43358,22.2417~60.43332,22.2306~60.43608,22.23889
-undefined^#FF0000,5,1,#ff8800,0.4^^60.48239,22.29941~60.48947,22.30446~60.49533,22.31812~60.48423,22.34836~60.4741,22.3328~60.47605,22.32512~60.47535,22.32003~60.4791,22.30809
-undefined^#FF0000,5,1,#ff8800,0.4^^60.45561,22.3637~60.45679,22.38985~60.45604,22.42422~60.44062,22.42533~60.44181,22.39838~60.43955,22.36977~60.44301,22.36914
-undefined^#FF0000,5,1,#ff8800,0.4^^60.42351,22.24337~60.43036,22.24491~60.43116,22.24466~60.43677,22.259~60.42605,22.26388
-undefined^#FF0000,5,1,#ff8800,0.4^^60.43711,22.25976~60.4297,22.26362~60.43476,22.28431~60.4409,22.27738
-undefined^#FF0000,5,1,#ff8800,0.4^^60.44109,22.27813~60.44283,22.28328~60.43965,22.28611~60.44219,22.29813~60.43711,22.3013~60.43474,22.28554
-undefined^#FF0000,5,1,#ff8800,0.4^^60.44452,22.25624~60.44774,22.26929~60.44727,22.2704~60.4496,22.2777~60.44736,22.2807~60.44634,22.27856~60.44338,22.28208~60.44145,22.27749~60.43898,22.26476
-undefined^#FF0000,5,1,#ff8800,0.4^^60.47118,22.16063~60.47947,22.18281~60.47535,22.18783~60.4732,22.189~60.47133,22.1923~60.47014,22.19453~60.46911,22.19307~60.46615,22.19058~60.46354,22.18959~60.462,22.18921~60.46103,22.18338~60.46691,22.17196
-undefined^#FF0000,5,1,#ff8800,0.4^^60.48169,22.16286~60.47717,22.17423~60.4715,22.16041~60.47522,22.1529
-undefined^#FF0000,5,1,#ff8800,0.4^^60.48953,22.15058~60.49328,22.17831~60.48793,22.18101~60.48119,22.17755~60.48323,22.16537~60.48313,22.15071
-undefined^#FF0000,5,1,#ff8800,0.4^^60.48302,22.16453~60.48082,22.17753~60.48234,22.17873~60.48201,22.18088~60.47987,22.18217~60.47708,22.17531~60.48196,22.1631
-undefined^#FF0000,5,1,#ff8800,0.4^^60.48421,22.13076~60.48235,22.13745~60.47389,22.1541~60.46755,22.13231~60.47493,22.12153~60.48071,22.11884
-undefined^#FF0000,5,1,#ff8800,0.4^^60.47353,22.1541~60.47091,22.15934~60.46926,22.15591~60.46098,22.15119~60.46196,22.13721~60.46798,22.145
-undefined^#FF0000,5,1,#ff8800,0.4^^60.473,22.15251~60.46819,22.14438~60.46243,22.13627~60.46293,22.12142~60.46689,22.13144
-undefined^#FF0000,5,1,#ff8800,0.4^^60.47074,22.1599~60.46629,22.17157~60.46058,22.182~60.46054,22.17163~60.45963,22.15159~60.46511,22.15427~60.46911,22.15644
-undefined^#FF0000,5,1,#ff8800,0.4^^60.45853,22.19019~60.45508,22.19054~60.45053,22.19882~60.44925,22.21523~60.45314,22.22142~60.45383,22.22435
-undefined^#FF0000,5,1,#ff8800,0.4^^60.46113,22.19127~60.46132,22.19824~60.46001,22.2073~60.45919,22.21152~60.45652,22.2088~60.45931,22.19073
-undefined^#FF0000,5,1,#ff8800,0.4^^60.46139,22.19131~60.46428,22.19195~60.46767,22.194~60.47022,22.19663~60.46369,22.20573~60.45959,22.21049~60.46167,22.19811
-undefined^#FF0000,5,1,#ff8800,0.4^^60.47602,22.25242~60.47484,22.26457~60.47306,22.26336~60.46917,22.26521~60.46496,22.26894~60.46259,22.26148~60.46492,22.24917~60.47087,22.25384~60.47163,22.25338
-undefined^#FF0000,5,1,#ff8800,0.4^^60.48884,22.18543~60.48132,22.18556~60.47867,22.1974~60.47689,22.20328~60.48104,22.21122~60.48704,22.20809~60.48823,22.19436
-undefined^#FF0000,5,1,#ff8800,0.4^^60.48122,22.18547~60.47853,22.19719~60.47645,22.20365~60.47299,22.19482
-undefined^#FF0000,5,1,#ff8800,0.4^^60.49404,22.26856~60.49248,22.28712~60.48973,22.30216~60.48271,22.29808~60.47627,22.28925~60.47537,22.27866~60.47564,22.26596~60.48309,22.27138~60.48695,22.27301
-undefined^#FF0000,5,1,#ff8800,0.4^^60.43241,22.32263~60.4233,22.33585~60.42025,22.32107~60.42818,22.31196~60.43215,22.31439~60.43258,22.31667
-undefined^#FF0000,5,1,#ff8800,0.4^^60.4422,22.29864~60.43473,22.30327~60.43438,22.32316~60.43887,22.3172~60.44454,22.30841
-undefined^#FF0000,5,1,#ff8800,0.4^^60.42961,22.26392~60.4343,22.28456~60.43499,22.29225~60.43245,22.29564~60.42894,22.29349~60.42506,22.27929~60.42531,22.26699
-undefined^#FF0000,5,1,#ff8800,0.4^^60.42521,22.26577~60.42195,22.26877~60.41579,22.26733~60.41625,22.27877~60.42052,22.2783~60.42469,22.2762
-undefined^#FF0000,5,1,#ff8800,0.4^^60.42288,22.24603~60.42536,22.26349~60.4219,22.26787~60.4157,22.26641~60.41536,22.2713~60.40943,22.26612~60.41382,22.25849
-undefined^#FF0000,5,1,#ff8800,0.4^^60.40898,22.26645~60.41573,22.27229~60.4162,22.27959~60.41694,22.28892~60.41809,22.29195~60.41392,22.29396~60.40429,22.28059~60.40683,22.26871
-undefined^#FF0000,5,1,#ff8800,0.4^^60.41536,22.18092~60.41875,22.19766~60.4136,22.20165~60.41187,22.18124~60.41382,22.18224
-undefined^#FF0000,5,1,#ff8800,0.4^^60.41156,22.18045~60.41307,22.20002~60.40765,22.19821~60.40864,22.17655
-undefined^#FF0000,5,1,#ff8800,0.4^^60.40834,22.17552~60.40773,22.19004~60.40054,22.18878~60.40212,22.18257~60.40071,22.1682~60.40567,22.17207
-undefined^#FF0000,5,1,#ff8800,0.4^^60.38922,22.16942~60.39234,22.18616~60.38439,22.1926~60.38445,22.16751
-undefined^#FF0000,5,1,#ff8800,0.4^^60.39291,22.18552~60.39257,22.19483~60.39348,22.20569~60.39844,22.21229~60.3995,22.18893
-undefined^#FF0000,5,1,#ff8800,0.4^^60.40769,22.19037~60.40056,22.18946~60.40044,22.19775~60.40256,22.19895~60.40733,22.19792
-undefined^#FF0000,5,1,#ff8800,0.4^^60.41343,22.21989~60.40506,22.22324~60.40398,22.20494~60.4127,22.2044
-undefined^#FF0000,5,1,#ff8800,0.4^^60.44634,22.22058~60.44405,22.22474~60.44395,22.23328~60.44604,22.23667~60.44797,22.23457~60.44768,22.22393
-undefined^#FF0000,5,1,#ff8800,0.4^^60.44594,22.19951~60.4478,22.19877~60.44824,22.21556~60.44775,22.22051~60.44611,22.22006~60.44378,22.22384~60.44355,22.23234~60.44448,22.23491~60.44422,22.23603~60.43618,22.23813~60.43201,22.22567~60.43402,22.21505~60.43541,22.20654~60.44264,22.2068
-undefined^#FF0000,5,1,#ff8800,0.4^^60.44896,22.2171~60.44767,22.22204~60.44837,22.22394~60.44827,22.23472~60.4463,22.2371~60.45119,22.24507~60.45133,22.24013~60.45296,22.23209~60.45315,22.22472
-undefined^#FF0000,5,1,#ff8800,0.4^^60.47143,22.30907~60.46766,22.3065~60.46638,22.30976~60.46627,22.32465~60.46868,22.33113~60.47168,22.33288~60.47388,22.329~60.47425,22.32349~60.47351,22.31668
-undefined^#FF0000,5,1,#ff8800,0.4^^60.46155,22.29103~60.46086,22.29293~60.45902,22.28974~60.45965,22.28794~60.46039,22.28656~60.46118,22.28815~60.46077,22.28918
-undefined^#FF0000,5,1,#ff8800,0.4^^60.4604,22.28644~60.46128,22.28815~60.46084,22.28915~60.4616,22.29102~60.46318,22.29159~60.46421,22.29127~60.46459,22.2903~60.46406,22.28743~60.46227,22.28269~60.46082,22.28075~60.46038,22.28315~60.46058,22.28521
-undefined^#FF0000,5,1,#ff8800,0.4^^60.46037,22.28649~60.4595,22.28811~60.45894,22.28975~60.45835,22.29101~60.45731,22.2896~60.45527,22.2912~60.45464,22.29024~60.45344,22.28649~60.45281,22.28577~60.45162,22.28202~60.45278,22.28007~60.45487,22.27889~60.45787,22.27826~60.45933,22.27867~60.46069,22.28068~60.46024,22.2831~60.46048,22.28519
-undefined^#FF0000,5,1,#ff8800,0.4^^60.45199,22.27478~60.45005,22.27763~60.45144,22.28188~60.45277,22.27968~60.45313,22.27621
-undefined^#FF0000,5,1,#ff8800,0.4^^60.44999,22.27767~60.45277,22.28687~60.45026,22.29051~60.44722,22.2813
-undefined^#FF0000,5,1,#ff8800,0.4^^60.41489,22.29662~60.40966,22.30021~60.41175,22.31038~60.41516,22.31797~60.41864,22.31381~60.41797,22.30828~60.41666,22.3036
-undefined^#FF0000,5,1,#ff8800,0.4^^60.41662,22.31787~60.41211,22.32495~60.41382,22.33615~60.41582,22.33948~60.41949,22.33244~60.41896,22.32201
-undefined^#FF0000,5,1,#ff8800,0.4^^60.43793,22.35164~60.43952,22.36344~60.43178,22.37284~60.42969,22.35957~60.43502,22.35297
-undefined^#FF0000,5,1,#ff8800,0.4^^60.43777,22.35091~60.43508,22.35207~60.4293,22.35903~60.42704,22.34468~60.43318,22.33569~60.43753,22.33349
-undefined^#FF0000,5,1,#ff8800,0.4^^60.43002,22.32731~60.43303,22.33487~60.4259,22.34668~60.42359,22.34244~60.42658,22.33374
-undefined^#FF0000,5,1,#ff8800,0.4^^60.43107,22.29598~60.43256,22.30139~60.42946,22.30611~60.42796,22.30954~60.42544,22.30964~60.42451,22.30518~60.42191,22.30171~60.42346,22.29444~60.42401,22.29166~60.42781,22.29229~60.42907,22.29398
-undefined^#FF0000,5,1,#ff8800,0.4^^60.4247,22.27686~60.42481,22.27978~60.42649,22.28607~60.42571,22.29051~60.42375,22.29105~60.42174,22.30152~60.41947,22.29918~60.41873,22.29367~60.41824,22.29177~60.41723,22.28889~60.41632,22.27951~60.42068,22.27894
-undefined^#FF0000,5,1,#ff8800,0.4^^60.41822,22.29268~60.41866,22.29452~60.41929,22.29923~60.42414,22.30531~60.42625,22.31349~60.41981,22.32087~60.41902,22.31332~60.41824,22.30827~60.41482,22.29424
-undefined^#FF0000,5,1,#ff8800,0.4^^60.50456,22.27092~60.4942,22.26937~60.49296,22.28753~60.49025,22.30289~60.49583,22.31615~60.50197,22.30518~60.50918,22.29724~60.50454,22.27839
-undefined^#FF0000,5,1,#ff8800,0.4^^60.51907,22.29928~60.50948,22.29774~60.50223,22.30547~60.49598,22.31774~60.4924,22.32691~60.49714,22.33434~60.50004,22.33825~60.50487,22.34078~60.50577,22.34722~60.50741,22.35198~60.51125,22.35147~60.51308,22.34955~60.51599,22.35211~60.51867,22.34943~60.52121,22.35074~60.52359,22.34838~60.52687,22.35005~60.5276,22.32719~60.52621,22.30748
-undefined^#FF0000,5,1,#ff8800,0.4^^60.53067,22.28298~60.53473,22.28328~60.53746,22.28761~60.53782,22.29628~60.53611,22.30546~60.53301,22.31246~60.52963,22.31031~60.52767,22.30177~60.52746,22.29008~60.5278,22.28504
-undefined^#FF0000,5,1,#ff8800,0.4^^60.54416,22.33589~60.53523,22.3407~60.5348,22.35709~60.53816,22.38258~60.5504,22.37649~60.55019,22.35541
-undefined^#FF0000,5,1,#ff8800,0.4^^60.53831,22.28826~60.53831,22.29639~60.5366,22.30597~60.53508,22.31491~60.53941,22.33053~60.54105,22.3343~60.54776,22.32782~60.55521,22.31581~60.555,22.30319~60.5488,22.29272~60.54211,22.28673
-undefined^#FF0000,5,1,#ff8800,0.4^^60.73911,22.40833~60.65804,22.36507~60.65297,22.46585~60.69574,22.47177~60.72608,22.44863
-undefined^#FF0000,5,1,#ff8800,0.4^^60.63228,22.25193~60.63841,22.25663~60.63974,22.26757~60.63789,22.27982~60.63179,22.28508~60.62939,22.28474~60.62591,22.27817~60.62497,22.26963~60.62585,22.26294~60.62816,22.25642
-undefined^#FF0000,5,1,#ff8800,0.4^^60.61701,22.29598~60.61844,22.29997~60.62151,22.30392~60.62177,22.31443~60.61989,22.32263~60.61751,22.32744~60.61309,22.32727~60.6105,22.32349~60.60898,22.3134~60.60578,22.30641~60.60473,22.29837~60.60846,22.29452~60.61393,22.29362
-undefined^#FF0000,5,1,#ff8800,0.4^^60.63183,22.28765~60.62286,22.30757~60.62203,22.30275~60.61859,22.29876~60.61793,22.29512~60.6144,22.291~60.61267,22.28526~60.61524,22.26766~60.62429,22.25701~60.62436,22.27036~60.62543,22.27867~60.62748,22.28476
-undefined^#FF0000,5,1,#ff8800,0.4^^60.5485,22.21865~60.54859,22.22521~60.54679,22.23345~60.54212,22.23594~60.53736,22.23298~60.53583,22.22764~60.53504,22.22218~60.53565,22.21249~60.53877,22.21165
-undefined^#FF0000,5,1,#ff8800,0.4^^60.52877,22.21779~60.52955,22.22865~60.52875,22.23582~60.52454,22.23461~60.52214,22.22831~60.52235,22.21873~60.5245,22.21595
-undefined^#FF0000,5,1,#ff8800,0.4^^60.51975,22.21418~60.52028,22.23079~60.51605,22.23247~60.51343,22.23208~60.51251,22.2238~60.51284,22.21253~60.51642,22.20939
-undefined^#FF0000,5,1,#ff8800,0.4^^60.5124,22.21225~60.51248,22.22451~60.51299,22.23247~60.50741,22.23603~60.50545,22.23423~60.50505,22.22405~60.50632,22.20916~60.50953,22.20603~60.51158,22.20914
-undefined^#FF0000,5,1,#ff8800,0.4^^60.50515,22.21667~60.49938,22.21689~60.50086,22.23793~60.50539,22.23839~60.50476,22.22388
-undefined^#FF0000,5,1,#ff8800,0.4^^60.56523,22.23268~60.56325,22.23641~60.55938,22.23357~60.55631,22.23255~60.55635,22.22264~60.55931,22.22038~60.56377,22.22117~60.56525,22.22697
-undefined^#FF0000,5,1,#ff8800,0.4^^60.59679,22.27705~60.59422,22.28856~60.58484,22.27633~60.59074,22.261~60.59537,22.26289
-undefined^#FF0000,5,1,#ff8800,0.4^^60.60622,22.28272~60.60374,22.29667~60.59449,22.2892~60.59743,22.27614
-undefined^#FF0000,5,1,#ff8800,0.4^^60.5469,22.2341~60.54117,22.23667~60.54289,22.25424~60.54653,22.25504~60.54902,22.25303~60.5496,22.24528~60.54848,22.23719
-undefined^#FF0000,5,1,#ff8800,0.4^^60.53373,22.23598~60.53299,22.25298~60.5291,22.25375~60.52862,22.24042~60.53072,22.23656
-undefined^#FF0000,5,1,#ff8800,0.4^^60.49101,22.19397~60.49163,22.19834~60.49194,22.20178~60.4921,22.20437~60.49179,22.20583~60.49126,22.2083~60.48972,22.20796~60.48979,22.2039~60.48898,22.19994~60.4889,22.19673~60.4897,22.19482
-undefined^#FF0000,5,1,#ff8800,0.4^^60.4934,22.17886~60.48956,22.18084~60.4911,22.19373~60.49171,22.19841~60.49219,22.20442~60.49339,22.21451~60.4971,22.21457
-undefined^#FF0000,5,1,#ff8800,0.4^^60.49721,22.14869~60.50015,22.16573~60.49277,22.17238~60.48988,22.15109
-undefined^#FF0000,5,1,#ff8800,0.4^^60.48622,22.15035~60.48616,22.14137~60.49151,22.13889~60.49218,22.14262~60.49193,22.14929~60.48956,22.15012
-undefined^#FF0000,5,1,#ff8800,0.4^^60.48615,22.14136~60.48618,22.15052~60.48319,22.15037~60.48113,22.14966~60.47855,22.14669~60.48296,22.13831
-undefined^#FF0000,5,1,#ff8800,0.4^^60.46621,22.01291~60.4756,22.03136~60.46964,22.04724~60.45966,22.02782
-undefined^#FF0000,5,1,#ff8800,0.4^^60.48839,22.11325~60.48786,22.11544~60.48829,22.11771~60.48993,22.11788~60.49843,22.11377~60.49917,22.10025~60.49584,22.08536~60.4908,22.08252~60.48687,22.07969~60.48549,22.08037~60.48585,22.09461~60.48687,22.09672~60.48795,22.10552~60.48788,22.10548
-undefined^#FF0000,5,1,#ff8800,0.4^^60.48793,22.05986~60.48292,22.06321~60.48423,22.07634~60.4891,22.07471
-undefined^#FF0000,5,1,#ff8800,0.4^^60.47963,22.0434~60.48179,22.04952~60.48136,22.05795~60.47832,22.06057~60.47644,22.05118~60.4777,22.04725
-undefined^#FF0000,5,1,#ff8800,0.4^^60.47451,22.05205~60.47139,22.04357~60.47441,22.03658~60.47698,22.04613
-undefined^#FF0000,5,1,#ff8800,0.4^^60.48013,22.04005~60.47721,22.04623~60.4745,22.03626~60.47745,22.02811~60.47991,22.03291
-undefined^#FF0000,5,1,#ff8800,0.4^^60.46934,22.00377~60.46376,22.006~60.45842,22.00107~60.45739,21.99416~60.45956,21.9855~60.4627,21.98495~60.46486,21.9869~60.46816,21.99042~60.47118,21.99553~60.47116,22.00085
-undefined^#FF0000,5,1,#ff8800,0.4^^60.4583,21.9657~60.45409,21.96832~60.45339,21.98699~60.45687,21.98618~60.45903,21.97556
-undefined^#FF0000,5,1,#ff8800,0.4^^60.46479,21.93772~60.4601,21.94146~60.45912,21.95794~60.45933,21.96746~60.46305,21.96746~60.46538,21.95206
-undefined^#FF0000,5,1,#ff8800,0.4^^60.45817,21.93747~60.45787,21.95395~60.45461,21.96017~60.44968,21.95759~60.44452,21.94811~60.44901,21.93678~60.4558,21.93259
-undefined^#FF0000,5,1,#ff8800,0.4^^60.47289,21.92545~60.47127,21.93193~60.4642,21.93661~60.45933,21.93905~60.45779,21.93472~60.45682,21.93004~60.46058,21.92725~60.46553,21.92554
-undefined^#FF0000,5,1,#ff8800,0.4^^60.44672,21.99368~60.44539,22.01072~60.43828,22.0106~60.43692,21.99503~60.4419,21.98714
-undefined^#FF0000,5,1,#ff8800,0.4^^60.43249,21.99471~60.42817,21.99317~60.42641,21.99991~60.42794,22.00707~60.43068,22.00725~60.43279,22.00142
-undefined^#FF0000,5,1,#ff8800,0.4^^60.4291,22.01385~60.42671,22.02724~60.4225,22.02561~60.42091,22.01817~60.42152,22.00729~60.42571,22.00965
-undefined^#FF0000,5,1,#ff8800,0.4^^60.43711,22.03643~60.43147,22.03844~60.43175,22.02212~60.43729,22.02329~60.43808,22.03051
-undefined^#FF0000,5,1,#ff8800,0.4^^60.43713,22.03784~60.43264,22.03969~60.4338,22.05253~60.4375,22.05188~60.43833,22.04534
-undefined^#FF0000,5,1,#ff8800,0.4^^60.43237,22.04244~60.43385,22.05553~60.43279,22.06823~60.42902,22.06797~60.42481,22.06334~60.42356,22.05095~60.42731,22.04409
-undefined^#FF0000,5,1,#ff8800,0.4^^60.44632,22.01141~60.43693,22.01184~60.43838,22.03102~60.4431,22.0342~60.44734,22.02842
-undefined^#FF0000,5,1,#ff8800,0.4^^60.45153,21.99738~60.45208,22.01853~60.44772,22.0278~60.44674,22.0081~60.4474,21.99635
-undefined^#FF0000,5,1,#ff8800,0.4^^60.45536,21.99716~60.45548,22.01993~60.45229,22.01896~60.45182,21.99755
-undefined^#FF0000,5,1,#ff8800,0.4^^60.45817,22.00171~60.45587,22.00239~60.45578,22.02025~60.45977,22.02428~60.46318,22.01614~60.46463,22.00757
-undefined^#FF0000,5,1,#ff8800,0.4^^60.38468,21.92931~60.3751,21.92828~60.37034,21.933~60.37009,21.94914~60.37247,21.95781~60.37684,21.96141~60.38138,21.95583~60.38395,21.9437
-undefined^#FF0000,5,1,#ff8800,0.4^^60.39196,21.96356~60.38507,21.95802~60.38214,21.95519~60.38389,21.94663~60.38839,21.94785~60.3915,21.95289~60.39255,21.95558
-undefined^#FF0000,5,1,#ff8800,0.4^^60.39219,21.96429~60.39327,21.97081~60.39785,21.97493~60.40239,21.98922~60.39959,22.00454~60.3896,22.00042~60.38519,21.98236~60.38545,21.96723~60.38557,21.9592
-undefined^#FF0000,5,1,#ff8800,0.4^^60.37034,21.85902~60.37798,21.86576~60.379,21.88296~60.37701,21.89919~60.37115,21.89893~60.36266,21.89318
-undefined^#FF0000,5,1,#ff8800,0.4^^60.36147,21.91858~60.34742,21.89533~60.35684,21.81905~60.36498,21.816~60.36818,21.82743~60.36631,21.86932~60.3619,21.89292
-undefined^#FF0000,5,1,#ff8800,0.4^^60.345,21.93592~60.35307,21.93884~60.35161,21.96677~60.34273,21.96631
-undefined^#FF0000,5,1,#ff8800,0.4^^60.34721,21.8967~60.34462,21.93069~60.35386,21.93677~60.36105,21.94742~60.36139,21.91931
-undefined^#FF0000,5,1,#ff8800,0.4^^60.37034,21.91867~60.36958,21.96193~60.36075,21.95832~60.36209,21.91776
-undefined^#FF0000,5,1,#ff8800,0.4^^60.33213,21.94819~60.33858,22.00361~60.33052,22.04098~60.31658,22.04338~60.30279,22.02163~60.31461,21.96875~60.3181,21.9125~60.3248,21.91719~60.32677,21.94377
-undefined^#FF0000,5,1,#ff8800,0.4^^60.31615,21.91275~60.31411,21.96682~60.30382,22.00253~60.2732,21.95927~60.27022,21.9039~60.27743,21.86993~60.31041,21.86229
-undefined^#FF0000,5,1,#ff8800,0.4^^60.4588,21.89253~60.46342,21.91277~60.45913,21.92518~60.45353,21.92335~60.45278,21.89848
-undefined^#FF0000,5,1,#ff8800,0.4^^60.41993,21.88532~60.41981,21.90974~60.41084,21.90961~60.40606,21.90507~60.40658,21.88517~60.41376,21.88275
-undefined^#FF0000,5,1,#ff8800,0.4^^60.40559,21.87069~60.3973,21.86145~60.39395,21.86816~60.3913,21.88425~60.39673,21.89541~60.40183,21.90391~60.40548,21.90203~60.40573,21.88763~60.40638,21.87778
-undefined^#FF0000,5,1,#ff8800,0.4^^60.41411,21.86657~60.40649,21.87274~60.4061,21.86952~60.39758,21.85996~60.3999,21.84439~60.40677,21.84254~60.41169,21.84863
-undefined^#FF0000,5,1,#ff8800,0.4^^60.41625,21.84606~60.41236,21.83934~60.4107,21.84571~60.41211,21.8485~60.41383,21.85666~60.41599,21.85209
-undefined^#FF0000,5,1,#ff8800,0.4^^60.41608,21.82546~60.4126,21.83867~60.41642,21.84571~60.41676,21.8476~60.41523,21.85736~60.41847,21.86356~60.42265,21.85766~60.42449,21.84555~60.42942,21.83726~60.4271,21.82994~60.42242,21.82972~60.41895,21.82501
-undefined^#FF0000,5,1,#ff8800,0.4^^60.40953,21.82254~60.40847,21.8294~60.39851,21.83172~60.39584,21.81224~60.39433,21.78955~60.40101,21.78666~60.40682,21.80082
-undefined^#FF0000,5,1,#ff8800,0.4^^60.39418,21.79404~60.38477,21.79782~60.3818,21.81018~60.39284,21.83845~60.3988,21.8367~60.39539,21.81194
-undefined^#FF0000,5,1,#ff8800,0.4^^60.44168,21.89524~60.43967,21.92588~60.4315,21.92446~60.43124,21.91478~60.43522,21.91076~60.43514,21.89388
-undefined^#FF0000,5,1,#ff8800,0.4^^60.31005,22.31126~60.30829,22.31139~60.30549,22.32734~60.3091,22.33233
-undefined^#FF0000,5,1,#ff8800,0.4^^60.31726,22.31225~60.31029,22.31812~60.31014,22.31119~60.30795,22.30609~60.31543,22.30019
-undefined^#FF0000,5,1,#ff8800,0.4^^NaN,NaN
-undefined^#FF0000,5,1,#ff8800,0.4^^60.30946,22.30409~60.30757,22.30542~60.30366,22.30785~60.29686,22.30906~60.2964,22.29239~60.30305,22.29152~60.30762,22.29572~60.30874,22.29992
-undefined^#FF0000,5,1,#ff8800,0.4^^60.29872,22.3089~60.29602,22.30952~60.29306,22.30779~60.2912,22.31036~60.29087,22.31654~60.2948,22.31885~60.30009,22.31516~60.2991,22.31073
-undefined^#FF0000,5,1,#ff8800,0.4^^60.30564,22.32491~60.30443,22.32312~60.30334,22.31706~60.3037,22.30853~60.30703,22.30615~60.30808,22.31085
-undefined^#FF0000,5,1,#ff8800,0.4^^60.30238,22.31725~60.30307,22.32282~60.30508,22.3254~60.30326,22.33505~60.29891,22.32422~60.29814,22.31792~60.30027,22.31532
-undefined^#FF0000,5,1,#ff8800,0.4^^60.31741,22.31302~60.3105,22.31933~60.31371,22.33881~60.32013,22.3443~60.32292,22.3345~60.32233,22.32158
-undefined^#FF0000,5,1,#ff8800,0.4^^60.35167,22.34817~60.34309,22.34877~60.34296,22.37713~60.34534,22.39574~60.35086,22.39134~60.35266,22.37124~60.35292,22.35754
-undefined^#FF0000,5,1,#ff8800,0.4^^60.32516,22.33495~60.3187,22.36885~60.32113,22.38284~60.32541,22.38764~60.33406,22.35426~60.33033,22.34112
-undefined^#FF0000,5,1,#ff8800,0.4^^60.36324,22.34812~60.35388,22.34658~60.35574,22.37044~60.36562,22.36825
-undefined^#FF0000,5,1,#ff8800,0.4^^60.41358,22.22011~60.40495,22.22367~60.40406,22.2398~60.40792,22.23734~60.41234,22.23324~60.41464,22.22954~60.41648,22.22409
-undefined^#FF0000,5,1,#ff8800,0.4^^60.50787,22.44893~60.50853,22.45912~60.50819,22.46699~60.50497,22.46741~60.50317,22.4648~60.50189,22.45962~60.50153,22.45521~60.50215,22.45004~60.50255,22.44831~60.50485,22.44773
-undefined^#FF0000,5,1,#ff8800,0.4^^60.42716,22.51605~60.42152,22.51764~60.42273,22.53824~60.42689,22.53533~60.42836,22.52668
-undefined^#FF0000,5,1,#ff8800,0.4^^60.42815,22.51498~60.42365,22.51652~60.42286,22.50405~60.42545,22.50265~60.42893,22.50496~60.4312,22.51206
-undefined^#FF0000,5,1,#ff8800,0.4^^60.42341,22.51682~60.42117,22.51721~60.42146,22.51966~60.41629,22.51476~60.41456,22.50974~60.4169,22.50669~60.42265,22.50845
-undefined^#FF0000,5,1,#ff8800,0.4^^60.41695,22.42666~60.40546,22.43262~60.40915,22.45477~60.42096,22.44649
-undefined^#FF0000,5,1,#ff8800,0.4^^60.42114,22.44678~60.42228,22.457~60.41074,22.47228~60.40917,22.45584
-undefined^#FF0000,5,1,#ff8800,0.4^^60.4226,22.45713~60.42427,22.45721~60.42595,22.46996~60.42413,22.48103~60.41961,22.48056~60.41902,22.46213
-undefined^#FF0000,5,1,#ff8800,0.4^^60.42517,22.48142~60.41548,22.48056~60.41682,22.503~60.42228,22.50318~60.42232,22.49283
-undefined^#FF0000,5,1,#ff8800,0.4^^60.45777,22.67578~60.45959,22.68239~60.45933,22.69372~60.45603,22.70428~60.45167,22.70831~60.44664,22.70857~60.44423,22.69632~60.44532,22.68055~60.44647,22.67252~60.44863,22.67166
-undefined^#FF0000,5,1,#ff8800,0.4^^60.45944,22.67733~60.46092,22.69544~60.46672,22.69458~60.46699,22.66836~60.46703,22.6487~60.4624,22.64464
-undefined^#FF0000,5,1,#ff8800,0.4^^60.46799,22.7305~60.46779,22.73739~60.465,22.74003~60.46261,22.73803~60.46217,22.73225~60.4629,22.72985
-undefined^#FF0000,5,1,#ff8800,0.4^^60.45777,22.70256~60.45065,22.7114~60.46046,22.73801~60.46591,22.71834
-undefined^#FF0000,5,1,#ff8800,0.4^^60.43692,22.68321~60.43455,22.69084~60.42925,22.69067~60.42557,22.6866~60.42517,22.68029~60.42591,22.67351~60.42804,22.66844~60.43214,22.66584~60.43605,22.67028~60.43688,22.67745
-undefined^#FF0000,5,1,#ff8800,0.4^^60.4826,22.371~60.47977,22.38142~60.47488,22.38627~60.47167,22.37992~60.47257,22.36853~60.4745,22.36182
-undefined^#FF0000,5,1,#ff8800,0.4^^60.47141,22.35692~60.46921,22.37027~60.4605,22.35851~60.46692,22.34488
-undefined^#FF0000,5,1,#ff8800,0.4^^60.49049,22.3955~60.48326,22.40232~60.47488,22.38705~60.48028,22.38164~60.48316,22.37111
-undefined^#FF0000,5,1,#ff8800,0.4^^60.49036,22.39645~60.49004,22.40401~60.49285,22.41177~60.49002,22.42026~60.48729,22.42443~60.48303,22.40307
-undefined^#FF0000,5,1,#ff8800,0.4^^60.49323,22.41323~60.49226,22.41872~60.48829,22.42606~60.49018,22.4337~60.49554,22.43417~60.49989,22.42843~60.49778,22.41595
-undefined^#FF0000,5,1,#ff8800,0.4^^60.50025,22.43061~60.49552,22.43605~60.49056,22.43513~60.49038,22.45086~60.49707,22.44944~60.50221,22.44357
-undefined^#FF0000,5,1,#ff8800,0.4^^60.51397,22.46206~60.50845,22.46544~60.50864,22.45903~60.50805,22.44888~60.51385,22.449
-undefined^#FF0000,5,1,#ff8800,0.4^^60.51392,22.46251~60.50851,22.46565~60.50827,22.46807~60.51109,22.47562~60.51545,22.46873
-undefined^#FF0000,5,1,#ff8800,0.4^^60.45911,22.21202~60.45806,22.22069~60.4563,22.23515~60.45568,22.23772~60.45322,22.23343~60.45646,22.20923
-undefined^#FF0000,5,1,#ff8800,0.4^^60.49742,22.14861~60.50046,22.16552~60.50749,22.16646~60.51229,22.15288~60.51079,22.12724~60.5046,22.11986~60.49856,22.12634~60.49676,22.13936
-undefined^#FF0000,5,1,#ff8800,0.4^^60.5154,22.37237~60.5143,22.39314~60.50793,22.40026~60.50015,22.38808~60.49888,22.37503~60.50081,22.36358~60.50646,22.359~60.51193,22.3607
-undefined^#FF0000,5,1,#ff8800,0.4^^60.55994,22.41537~60.555,22.44945~60.57174,22.46909~60.57958,22.43482~60.57043,22.42093
-undefined^#FF0000,5,1,#ff8800,0.4^^60.65712,22.51081~60.62803,22.52145~60.62278,22.60523~60.64753,22.63429~60.6662,22.61381~60.66486,22.54679
-undefined^#FF0000,5,1,#ff8800,0.4^^60.41478,22.35632~60.40355,22.35623~60.40425,22.39331~60.41563,22.39314
-undefined^#FF0000,5,1,#ff8800,0.4^^60.37586,23.08399~60.40826,23.09137~60.40088,23.20724~60.35661,23.16847
-undefined^#FF0000,5,1,#ff8800,0.4^^60.17772,21.45699~60.20832,21.56301~60.21663,21.71242~60.19172,21.88408~60.06724,21.92322~60.0621,21.4532~60.12773,21.4083
-undefined^#FF0000,5,1,#ff8800,0.4^^60.5184,22.29066~60.50809,22.2868~60.50501,22.26305~60.50686,22.23835~60.51316,22.23453~60.51705,22.24268
-undefined^#FF0000,5,1,#ff8800,0.4^^60.58368,22.71183~60.5907,22.72732~60.58924,22.75895~60.57904,22.75406~60.57702,22.72431
-undefined^#FF0000,5,1,#ff8800,0.4^^60.66418,23.1142~60.64273,23.11944~60.645,23.1651~60.66338,23.1621
-undefined^#FF0000,5,1,#ff8800,0.4^^60.47127,22.38121~60.46374,22.39039~60.46065,22.42348~60.46995,22.43357~60.48456,22.4226~60.48176,22.40141
-undefined^#FF0000,5,1,#ff8800,0.4^^60.59725,22.8871~60.59487,22.92104~60.58161,22.9095~60.57626,22.87997~60.58278,22.86698~60.59122,22.87079
-undefined^#FF0000,5,1,#ff8800,0.4^^60.47522,22.2368~60.4772,22.24399~60.4774,22.25062~60.4708,22.25337~60.46795,22.25135~60.4713,22.23669~60.47455,22.23838
-undefined^#FF0000,5,1,#ff8800,0.4^^60.48497,22.23079~60.47757,22.23225~60.47539,22.23637~60.47755,22.24371~60.47765,22.25101~60.4807,22.2507~60.48555,22.24749
-undefined^#FF0000,5,1,#ff8800,0.4^^60.4803,22.22448~60.47454,22.23796~60.46833,22.23435~60.47094,22.22033
-undefined^#FF0000,5,1,#ff8800,0.4^^60.48533,22.08042~60.48055,22.08599~60.48721,22.11904~60.48744,22.11588~60.48825,22.11327~60.4878,22.10522~60.48675,22.09685~60.48575,22.09462
-undefined^#FF0000,5,1,#ff8800,0.4^^60.46405,22.09132~60.4627,22.11106~60.47455,22.11768~60.4849,22.11197~60.48188,22.09514~60.47191,22.09863
-undefined^#FF0000,5,1,#ff8800,0.4^^60.46224,22.29508~60.46122,22.29679~60.4604,22.29517~60.46062,22.29415~60.46164,22.29403~60.46233,22.29434
-undefined^#FF0000,5,1,#ff8800,0.4^^60.6386,23.48019~60.64036,23.54104~60.61247,23.55108~60.60559,23.51006~60.61444,23.45856~60.62842,23.45907
-undefined^#FF0000,5,1,#ff8800,0.4^^60.4222,22.23671~60.41807,22.23096~60.41564,22.23169~60.4083,22.23886~60.40847,22.26201~60.42222,22.24487
-undefined^#FF0000,5,1,#ff8800,0.4^^60.46242,22.26276~60.45908,22.26551~60.45339,22.24715~60.45678,22.24115
-undefined^#FF0000,5,1,#ff8800,0.4^^60.46904,22.2353~60.46183,22.25873~60.45824,22.24483~60.46736,22.23274
-undefined^#FF0000,5,1,#ff8800,0.4^^60.46354,22.21109~60.46532,22.23178~60.45828,22.24375~60.45807,22.22897~60.46028,22.21318
-undefined^#FF0000,5,1,#ff8800,0.4^^60.48002,22.29883~60.47485,22.29218~60.47239,22.29136~60.47177,22.30714~60.47418,22.31576~60.47621,22.31538~60.48083,22.3011
-undefined^#FF0000,5,1,#ff8800,0.4^^60.47194,22.28444~60.46773,22.27778~60.46291,22.27042~60.46123,22.27052~60.46067,22.27275~60.46331,22.28014~60.46655,22.28452~60.47039,22.28564
-undefined^#FF0000,5,1,#ff8800,0.4^^60.46454,22.27109~60.47194,22.28216~60.47447,22.2786~60.47493,22.26699~60.47301,22.26558~60.46881,22.26787
-undefined^#FF0000,5,1,#ff8800,0.4^^60.44633,22.27881~60.44291,22.28361~60.43985,22.28621~60.44384,22.30489~60.44693,22.29655~60.44807,22.28946~60.44718,22.28422~60.44777,22.28313
-undefined^#FF0000,5,1,#ff8800,0.4^^60.44779,22.28316~60.451,22.29353~60.45184,22.29422~60.45213,22.29714~60.45129,22.29688~60.44466,22.30842~60.44396,22.30501~60.44706,22.29681~60.44823,22.28947~60.44727,22.28423
-undefined^#FF0000,5,1,#ff8800,0.4^^60.46486,22.29223~60.46296,22.29501~60.46267,22.29761~60.46128,22.2971~60.46032,22.29738~60.46069,22.30326~60.46243,22.30332~60.46421,22.3033~60.46594,22.29844~60.46581,22.29539
-undefined^#FF0000,5,1,#ff8800,0.4^^60.57752,22.31255~60.56217,22.37125~60.59623,22.42342~60.63292,22.45499~60.65058,22.46426~60.65584,22.36526~60.63174,22.35328~60.59817,22.33307~60.58865,22.32559
-@@@@@@
--- a/alueet.py	Sat Jun 10 16:36:36 2017 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,59 +0,0 @@
-#!/usr/bin/env python3
-import sys, json
-from misc import *
-from geometria import *
-
-with open('alueet.gmp') as file:
-	data = file.read().split('@')
-
-with open('alue-edustajat.json') as file:
-	representatives = json.load(file)
-
-pysäkit = {}
-
-with open('gtfs/stops.txt') as file:
-	for rivi in lue_csv(file):
-		sijainti = Sijainti(float(rivi['stop_lat']), float(rivi['stop_lon']))
-		tunniste = rivi['stop_id']
-		pysäkit[tunniste] = sijainti
-
-district_shapes = []
-for polygon in data[1].splitlines():
-	polygon = polygon.split('^')
-	coordinates = []
-	for point in polygon[3].split('~'):
-		x, y = point.split(',')
-		coordinates.append(Sijainti(float(x), float(y)))
-	district_shapes.append(Monikulmio(*coordinates))
-
-districts = {}
-bus_stop_districts = {}
-
-for name, stop_id in representatives.items():
-	if stop_id is None:
-		continue
-	if stop_id not in pysäkit:
-		print('Alueen %r edustaja %r ei löydy aikatauluista' % (name, stop_id), file = sys.stderr)
-	else:
-		for district_shape in district_shapes:
-			if district_shape.sisältää_pisteen(pysäkit[stop_id]):
-				assert name not in districts
-				districts[name] = district_shape
-				district_shapes.remove(district_shape)
-				bus_stop_districts[stop_id] = name
-				break
-		else:
-			print('cannot find a shape for %r' % name, file = sys.stderr)
-
-for stop_id, stop_position in pysäkit.items():
-	for district, shape in districts.items():
-		if shape.sisältää_pisteen(stop_position):
-			bus_stop_districts[stop_id] = district
-			break
-	else:
-		bus_stop_districts[stop_id] = None
-
-covered = sum(int(bool(k)) for k in bus_stop_districts.values())
-total = len(pysäkit)
-print('%.1f%% bus stops covered.' % (covered * 100 / total), file = sys.stderr)
-json.dump(bus_stop_districts, sys.stdout, indent = 2)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buses.py	Sat Jun 10 16:45:41 2017 +0300
@@ -0,0 +1,211 @@
+#!/usr/bin/env python3
+import enum, json
+from sys import stderr
+from datetime import date, time, datetime, timedelta
+from copy import copy
+from misc import *
+from geometry import *
+Suunta = enum.Enum('Suunta', [('Taaksepäin', 0), ('Eteenpäin', 1)])
+
+def muunna_ajovuoro_tunniste(tunniste):
+	return tunniste
+
+class Ajovuoro:
+	def __init__(self, tunniste, linja, palvelu, kyltti, suunta):
+		self.tunniste, self.linja, self.palvelu, self.kyltti, self.suunta = tunniste, linja, \
+			palvelu, kyltti, suunta
+		self.reitti = []
+		self.nimi = muunna_ajovuoro_tunniste(tunniste)
+	def __repr__(self):
+		return 'ajot[%r]' % self.nimi
+	def pysäkkiReitillä(self, pysäkki):
+		for pysähdys in self.reitti:
+			if pysähdys.pysäkki is pysäkki:
+				return pysähdys
+		else:
+			return None
+	def ajetaan_päivänä(self, päivä):
+		try:
+			return self.palvelu in palvelut_per_päivä[päivä]
+		except KeyError:
+			return False
+	def suppea_reitti(self, pysäkistä = None):
+		if pysäkistä and pysäkistä in self.reitti:
+			reitti = copy(self.reitti)
+			reitti = reitti[reitti.index(pysäkistä):]
+		else:
+			reitti = self.reitti
+		käytetyt_alueet = set()
+		tulos = []
+		for pysähdys in reitti:
+			pysäkki = pysähdys.pysäkki
+			if pysäkki.alue and pysäkki.alue not in käytetyt_alueet:
+				käytetyt_alueet.add(pysäkki.alue)
+				tulos.append(pysäkki.alue)
+		return tulos
+
+class Linja:
+	def __init__(self, tietue):
+		self.tunniste = tietue['route_id']
+		self.viite = tietue['route_short_name']
+		self.selite = tietue['route_long_name']
+	def __repr__(self):
+		return 'linjat[%r]' % self.viite
+
+class Palvelu:
+	def __init__(self, tunniste):
+		self.tunniste = tunniste
+		self.päivät = set()
+	def __repr__(self):
+		return 'palvelut[%r]' % self.tunniste
+
+class Pysäkki:
+	def __init__(self, tunniste, nimi, sijainti):
+		self.tunniste, self.nimi, self.sijainti = tunniste, nimi, sijainti
+	def __repr__(self):
+		return 'pysäkit[%r]' % self.tunniste
+	def aikataulu(self, määrä = 50):
+		'''
+			Hakee tämän pysäkin seuraavat `määrä` lähtöä. Päätepysäkille saapuvia busseja ei
+			lasketa. Palauttaa pysähdykset listana jossa alkiot ovat muotoa (aika, pysähdys),
+			jossa:
+			- `aika` on saapumishetki muotoa datetime ja
+			- `pysähdys` on vastaava Pysähdys olio.
+			
+			Mikäli pysäkille ei ole määrätty riittävästi pysähdyksiä kalenterissa, tuloslista
+			jää alimittaiseksi, mahdollisesti jopa tyhjäksi.
+		'''
+		class PäivätLoppuError(Exception):
+			pass
+		# Hakee pysäkin aikataulut tiettynä päivänä.
+		def aikataulu_päivänä(päivä):
+			# Jos päädyttiin aikataulukalenterin ulkopuolelle, niin tuotetaan virhe. Jos vain
+			# palautettaisiin tyhjä tulos, niin algoritmi jatkaisi etsintää loputtomiin.
+			if päivä > viimeinen_käyttöpäivä:
+				raise PäivätLoppuError()
+			taulu = []
+			# Jokaiselle ajovuorolle,
+			for ajo in ajot.values():
+				# jos tämä ajovuoro ajetaan tänä päivänä
+				if ajo.ajetaan_päivänä(päivä):
+					# ja jos tämä ajo pysähtyy tällä pysäkillä, ei kuitenkaan saapuen
+					# päätepysäkille,
+					pysähdys = ajo.pysäkkiReitillä(self)
+					if pysähdys and pysähdys is not ajo.reitti[-1]:
+						# ja jos tämä pysähdys on tulevaisuudessa,
+						aika = datetime.combine(päivä, time()) + pysähdys.saapumisaika
+						if aika >= nyt():
+							# lisää pysähdys listaan.
+							taulu.append((aika, pysähdys))
+			# Lajittele lopputulos saapumisajan mukaan.
+			taulu.sort(key = lambda tietue: tietue[0])
+			return taulu
+		taulu = []
+		päivä = tänään()
+		# Niin kauan kuin aikatauluja ei ole vielä tarpeeksi,
+		while len(taulu) < määrä:
+			try:
+				# hae nykyisen päivän aikataulut ja lisää ne,
+				taulu += aikataulu_päivänä(päivä)
+			except PäivätLoppuError:
+				# paitsi jos mentiin kalenterin ulkopuolelle, jolloin lopetetaan,
+				break
+			# ja siirry seuraavaan päivään.
+			päivä += timedelta(1)
+		# Typistä lopputulos haluttuun tulosmäärään.
+		return taulu[:määrä]
+	@property
+	def linkki_karttaan(self):
+		return 'http://www.openstreetmap.org/#map=19/%f/%f' % (self.sijainti.leveys, self.sijainti.pituus)
+
+class Pysähdys:
+	def __init__(self, saapumisaika, lähtöaika, pysäkki, ajo):
+		self.saapumisaika, self.lähtöaika, self.pysäkki, self.ajo = saapumisaika, lähtöaika, \
+			pysäkki, ajo
+	def __repr__(self):
+		return 'Pysähdys(%r, %r, %r, %r)' % (self.saapumisaika, self.lähtöaika, self.pysäkki, self.ajo)
+
+linjat = {}
+linjat_per_tunniste = {}
+ajot = {}
+ajot_per_numero = {}
+palvelut = {}
+pysäkit = {}
+
+print('Ladataan linjat... ', file = stderr, end = '', flush = True)
+with open('gtfs/routes.txt') as tiedosto:
+	for rivi in lue_csv(tiedosto):
+		linja = Linja(rivi)
+		linja.tunniste = linja.tunniste
+		linjat[linja.viite] = linja
+		linjat_per_tunniste[linja.tunniste] = linja
+print('%d linjaa' % len(linjat), file = stderr)
+
+print('Ladataan ajot... ', file = stderr, end = '', flush = True)
+with open('gtfs/trips.txt') as tiedosto:
+	for rivi in lue_csv(tiedosto, muunnokset = {'direction_id': lambda k: Suunta(int(k))}):
+		if rivi['service_id'] not in palvelut:
+			palvelut[rivi['service_id']] = Palvelu(rivi['service_id'])
+		linja = linjat_per_tunniste[rivi['route_id']]
+		ajo = Ajovuoro(tunniste = rivi['trip_id'],
+			linja = linja,
+			palvelu = palvelut[rivi['service_id']],
+			kyltti = rivi['trip_headsign'],
+			suunta = rivi['direction_id'])
+		assert ajo.nimi not in ajot
+		ajot[ajo.nimi] = ajo
+print('%d ajoa' % len(ajot), file = stderr)
+
+def lue_päiväys(teksti):
+	return date(int(teksti[:4]), int(teksti[4:6]), int(teksti[6:]))
+
+def lue_aika(teksti):
+	tunti, minuutti, sekunti = map(int, teksti.split(':'))
+	return timedelta(hours = tunti, minutes = minuutti, seconds = sekunti)
+
+print('Ladataan päiväykset... ', file = stderr, flush = True)
+
+viimeinen_käyttöpäivä = date.today()
+palvelut_per_päivä = {}
+
+with open('gtfs/calendar_dates.txt') as tiedosto:
+	for rivi in lue_csv(tiedosto):
+		palvelu = palvelut[rivi['service_id']]
+		päivä = lue_päiväys(rivi['date'])
+		palvelu.päivät.add(päivä)
+		if päivä not in palvelut_per_päivä:
+			palvelut_per_päivä[päivä] = set()
+		palvelut_per_päivä[päivä].add(palvelu)
+		viimeinen_käyttöpäivä = max(päivä, viimeinen_käyttöpäivä)
+
+def palvelut_käytössä(päivä):
+	for palvelu in palvelut.values():
+		if päivä in palvelu.päivät:
+			yield palvelu
+
+print('Ladataan pysäkit... ', file = stderr, end = '', flush = True)
+with open('gtfs/stops.txt') as file:
+	for rivi in lue_csv(file):
+		sijainti = Sijainti(float(rivi['stop_lat']), float(rivi['stop_lon']))
+		pysäkki = Pysäkki(rivi['stop_id'], rivi['stop_name'], sijainti)
+		pysäkit[pysäkki.tunniste] = pysäkki
+with open('regions-per-stop.json') as file:
+	for pysäkkitunniste, alue in json.load(file).items():
+		pysäkit[pysäkkitunniste].alue = alue
+print('%d pysäkkiä' % len(pysäkit), file = stderr)
+
+print('Ladataan aikataulut... ', end = '', flush = True, file = stderr)
+with open('gtfs/stop_times.txt') as file:
+	rivimäärä = sum(line.count('\n') for line in file)
+	laskettu = 0
+	file.seek(0)
+	for rivi in lue_csv(file):
+		ajo = ajot[muunna_ajovuoro_tunniste(rivi['trip_id'])]
+		saapumisaika = lue_aika(rivi['arrival_time'])
+		lähtöaika = lue_aika(rivi['departure_time'])
+		pysäkki = pysäkit[rivi['stop_id']]
+		ajo.reitti.append(Pysähdys(saapumisaika, lähtöaika, pysäkki, ajo))
+		laskettu += 1
+		if laskettu % 1000 == 0:
+			print('\rLadataan aikataulut... %.1f%%' % (laskettu * 100 / rivimäärä), end = ' ', file = stderr)
+print('\rLadataan aikataulut... ladattu', file = stderr)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/busroute.py	Sat Jun 10 16:45:41 2017 +0300
@@ -0,0 +1,159 @@
+#!/usr/bin/env python3
+def supista_reitti(reitti, kokonainen = False):
+	if not reitti:
+		return ''
+	kunnat = {'Turku', 'Naantali', 'Lieto', 'Aura', 'Kaarina', 'Pargas', 'Marttila', 'Somero', 'Koski Tl', 'Tarvasjoki'}
+	replacements = {
+		"Ylioppilaskylä-Itä": "Ylioppilaskylä",
+		"Ylioppilaskylä-Länsi": "Ylioppilaskylä",
+		"Caribia": "Ylioppilaskylä",
+		"Jokila": "Lieto",
+		"Piispala": "Lieto",
+		'Saaro': 'Ruissalo',
+		'Silvola': 'Vahto',
+		'Hemmola': 'Vahto',
+		'Paasniittu': 'Ruskon keskusta',
+		'Kahari': 'Ruskon keskusta',
+	}
+	have_already = set()
+	i = 0
+	while i < len(reitti):
+		if reitti[i] in replacements:
+			reitti[i] = replacements[reitti[i]]
+		if reitti[i] in have_already:
+			del reitti[i]
+		else:
+			have_already.add(reitti[i])
+			i += 1
+	prioriteetit = {
+		'Ihala': 150,
+		'Kauppakeskus Mylly': 200,
+		'Kuninkoja': 80,
+		'Moikoinen': 50,
+		'Raision keskusta': 100,
+		'Friskala': 20,
+		'Kukola': 50,
+		'Kaistarniemi': 50,
+		'Papinsaari': 50,
+		'Oriniemi': 50,
+		'Pikisaari': 50,
+		'Häppilä': 50,
+		'Haarla': 50,
+		'Ylioppilaskylä': 50,
+		'Halinen': 70,
+		'Kakskerta': 50,
+		'Pansio': 50,
+		'Räntämäki': 10,
+		'Verkahovi': 20,
+		'Skanssi': 200,
+		'Vaala': 20,
+		'Varissuo': 60,
+		'Kohmo': 80,
+		'Kupittaa': 70,
+		'Kauppatori': 1e15,
+		'Lentoasema': 50,
+		'Runosmäki': 50,
+		'Lieto': 100,
+		'Liedon asemanseutu': 200,
+		'Ilmarinen': 50,
+		'Vahto': 50,
+		'Ruskon keskusta': 200,
+		'Oriketo': 30,
+		'Harittu': 40,
+		'Jäkärlä': 50,
+		'Paattinen': 100,
+		'Kaarinan keskusta': 200,
+		'Naantalin keskusta': 200,
+		'Uittamo': 50,
+		'Piikkiö': 100,
+		'Paimio': 100,
+		'Pargas': 50,
+		'Yli-Maaria': 50,
+		'Saramäki': 50,
+		'Tarvasjoki': 100,
+		'Marttila': 100,
+		'Koski Tl': 100,
+		'Katariina': 50,
+		'Länsikeskus': 50,
+		'Kaanaa': 100,
+		'Satava': 50,
+		'Suikkila': 50,
+		'Raunistula': 50,
+		'Räntämäki': 50,
+		'Moisio': 25,
+	}
+
+	if 'Kauppatori' not in reitti:
+		prioriteetit['Länsikeskus'] = prioriteetit['Skanssi'] = prioriteetit['Kauppatori']
+
+	# nimiä joista voidaan joustaa tarvittaessa
+	helpot_supistukset = {
+		'Raision keskusta': 'Raisio',
+		'Ruskon keskusta': 'Rusko',
+		'Naantalin keskusta': 'Naantali',
+		'Kaarinan keskusta': 'Kaarina',
+		'Liedon asemanseutu': 'Lieto as.',
+		'Kauppakeskus Mylly': 'Mylly',
+	}
+
+	# jos ei nyt millään vaan mahdu muuten...
+	vakavat_supistukset = {
+		'Kauppatori': 'Tori',
+		'Ylioppilaskylä': 'Yo-kylä',
+	}
+
+	lähtö = reitti[0]
+	määränpää = reitti[-1]
+	reitti_arvot = {}
+	f = lambda i: i**-0.6
+	jakaja = max(f(i + 1) for i in range(len(reitti)))
+	for i, pysäkki in enumerate(reitti):
+		# muunna indeksi siten että myöhemmät alueet korostuvat
+		i = f(i + 1) / jakaja
+		# ota prioriteetti huomioon, jotkin alueet ovat tärkeämpiä kyltissä kuin toiset
+		i *= prioriteetit.get(pysäkki, 1)
+		reitti_arvot[pysäkki] = i
+	# nollaa lähtöpaikan arvo ettei se mitenkään tule kylttiin
+	if lähtö in reitti_arvot:
+		reitti_arvot[lähtö] = 0
+	# varmista että määränpää tulee kylttiin
+	reitti_arvot[määränpää] = 1e10
+	# muodosta kyltti-tiedot järjestettynä reittiarvon mukaan
+	painot = sorted([
+		(pysäkki, reitti_arvot[pysäkki], i) \
+		for i, pysäkki in enumerate(reitti) \
+		if reitti_arvot[pysäkki] >= 1
+		], key = lambda pysäkki: -pysäkki[1])
+	# enintään neljä tulee kylttiin
+	painot = painot[:4]
+	# jos neljäs kylttiarvo ei ole tarpeeksi merkittävä suhteessa reitin pituuteen niin otetaan neljäs pois
+	if len(painot) == 4 and painot[3][0] != määränpää and painot[3][1] < (4000 / len(reitti) ** 1.5):
+		del painot[3]
+	# sama kolmannelle
+	if len(painot) == 3 and painot[2][0] != määränpää and painot[2][1] < (500 / len(reitti) ** 1.5):
+		del painot[2]
+	if len(painot) == 2 and painot[1][0] != määränpää and painot[1][1] < (100 / len(reitti) ** 1.5):
+		del painot[1]
+	# lajitellaan painoarvot uudestaan reittijärjestykseen jotta kyltti tulee oikeinpäin
+	painot = sorted(painot, key = lambda paino: paino[2])
+	# muodostetaan kyltti..
+	kyltti = [paino[0] for paino in painot]
+	
+	# supista nimet jos mahdollista
+	def viimeistele(kyltti, supistus_taso = 0):
+		if supistus_taso > 0:
+			kyltti = [helpot_supistukset.get(paikka, paikka) for paikka in kyltti]
+		if supistus_taso > 1:
+			kyltti = [vakavat_supistukset.get(paikka, paikka) for paikka in kyltti]
+		return kyltti
+	tulos = viimeistele(kyltti)
+	if len(' - '.join(kyltti)) > 20:
+		tulos = viimeistele(kyltti, supistus_taso = 1)
+	if len(' - '.join(kyltti)) > 70:
+		tulos = viimeistele(kyltti, supistus_taso = 2)
+	if kokonainen:
+		tulos = [lähtö] + tulos
+	lyhyt_lähtö = replacements.get(lähtö, lähtö)
+	if lyhyt_lähtö != tulos[-1] and helpot_supistukset.get(lyhyt_lähtö, lyhyt_lähtö) in kunnat | {'Kauppatori'} and tulos[-1] in kunnat | {'Kauppatori'}:
+		tulos = ['Turku' if k == 'Kauppatori' else k for k in tulos]
+	return tulos
--- a/bussireitti.py	Sat Jun 10 16:36:36 2017 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,159 +0,0 @@
-#!/usr/bin/env python3
-def supista_reitti(reitti, kokonainen = False):
-	if not reitti:
-		return ''
-	kunnat = {'Turku', 'Naantali', 'Lieto', 'Aura', 'Kaarina', 'Pargas', 'Marttila', 'Somero', 'Koski Tl', 'Tarvasjoki'}
-	replacements = {
-		"Ylioppilaskylä-Itä": "Ylioppilaskylä",
-		"Ylioppilaskylä-Länsi": "Ylioppilaskylä",
-		"Caribia": "Ylioppilaskylä",
-		"Jokila": "Lieto",
-		"Piispala": "Lieto",
-		'Saaro': 'Ruissalo',
-		'Silvola': 'Vahto',
-		'Hemmola': 'Vahto',
-		'Paasniittu': 'Ruskon keskusta',
-		'Kahari': 'Ruskon keskusta',
-	}
-	have_already = set()
-	i = 0
-	while i < len(reitti):
-		if reitti[i] in replacements:
-			reitti[i] = replacements[reitti[i]]
-		if reitti[i] in have_already:
-			del reitti[i]
-		else:
-			have_already.add(reitti[i])
-			i += 1
-	prioriteetit = {
-		'Ihala': 150,
-		'Kauppakeskus Mylly': 200,
-		'Kuninkoja': 80,
-		'Moikoinen': 50,
-		'Raision keskusta': 100,
-		'Friskala': 20,
-		'Kukola': 50,
-		'Kaistarniemi': 50,
-		'Papinsaari': 50,
-		'Oriniemi': 50,
-		'Pikisaari': 50,
-		'Häppilä': 50,
-		'Haarla': 50,
-		'Ylioppilaskylä': 50,
-		'Halinen': 70,
-		'Kakskerta': 50,
-		'Pansio': 50,
-		'Räntämäki': 10,
-		'Verkahovi': 20,
-		'Skanssi': 200,
-		'Vaala': 20,
-		'Varissuo': 60,
-		'Kohmo': 80,
-		'Kupittaa': 70,
-		'Kauppatori': 1e15,
-		'Lentoasema': 50,
-		'Runosmäki': 50,
-		'Lieto': 100,
-		'Liedon asemanseutu': 200,
-		'Ilmarinen': 50,
-		'Vahto': 50,
-		'Ruskon keskusta': 200,
-		'Oriketo': 30,
-		'Harittu': 40,
-		'Jäkärlä': 50,
-		'Paattinen': 100,
-		'Kaarinan keskusta': 200,
-		'Naantalin keskusta': 200,
-		'Uittamo': 50,
-		'Piikkiö': 100,
-		'Paimio': 100,
-		'Pargas': 50,
-		'Yli-Maaria': 50,
-		'Saramäki': 50,
-		'Tarvasjoki': 100,
-		'Marttila': 100,
-		'Koski Tl': 100,
-		'Katariina': 50,
-		'Länsikeskus': 50,
-		'Kaanaa': 100,
-		'Satava': 50,
-		'Suikkila': 50,
-		'Raunistula': 50,
-		'Räntämäki': 50,
-		'Moisio': 25,
-	}
-
-	if 'Kauppatori' not in reitti:
-		prioriteetit['Länsikeskus'] = prioriteetit['Skanssi'] = prioriteetit['Kauppatori']
-
-	# nimiä joista voidaan joustaa tarvittaessa
-	helpot_supistukset = {
-		'Raision keskusta': 'Raisio',
-		'Ruskon keskusta': 'Rusko',
-		'Naantalin keskusta': 'Naantali',
-		'Kaarinan keskusta': 'Kaarina',
-		'Liedon asemanseutu': 'Lieto as.',
-		'Kauppakeskus Mylly': 'Mylly',
-	}
-
-	# jos ei nyt millään vaan mahdu muuten...
-	vakavat_supistukset = {
-		'Kauppatori': 'Tori',
-		'Ylioppilaskylä': 'Yo-kylä',
-	}
-
-	lähtö = reitti[0]
-	määränpää = reitti[-1]
-	reitti_arvot = {}
-	f = lambda i: i**-0.6
-	jakaja = max(f(i + 1) for i in range(len(reitti)))
-	for i, pysäkki in enumerate(reitti):
-		# muunna indeksi siten että myöhemmät alueet korostuvat
-		i = f(i + 1) / jakaja
-		# ota prioriteetti huomioon, jotkin alueet ovat tärkeämpiä kyltissä kuin toiset
-		i *= prioriteetit.get(pysäkki, 1)
-		reitti_arvot[pysäkki] = i
-	# nollaa lähtöpaikan arvo ettei se mitenkään tule kylttiin
-	if lähtö in reitti_arvot:
-		reitti_arvot[lähtö] = 0
-	# varmista että määränpää tulee kylttiin
-	reitti_arvot[määränpää] = 1e10
-	# muodosta kyltti-tiedot järjestettynä reittiarvon mukaan
-	painot = sorted([
-		(pysäkki, reitti_arvot[pysäkki], i) \
-		for i, pysäkki in enumerate(reitti) \
-		if reitti_arvot[pysäkki] >= 1
-		], key = lambda pysäkki: -pysäkki[1])
-	# enintään neljä tulee kylttiin
-	painot = painot[:4]
-	# jos neljäs kylttiarvo ei ole tarpeeksi merkittävä suhteessa reitin pituuteen niin otetaan neljäs pois
-	if len(painot) == 4 and painot[3][0] != määränpää and painot[3][1] < (4000 / len(reitti) ** 1.5):
-		del painot[3]
-	# sama kolmannelle
-	if len(painot) == 3 and painot[2][0] != määränpää and painot[2][1] < (500 / len(reitti) ** 1.5):
-		del painot[2]
-	if len(painot) == 2 and painot[1][0] != määränpää and painot[1][1] < (100 / len(reitti) ** 1.5):
-		del painot[1]
-	# lajitellaan painoarvot uudestaan reittijärjestykseen jotta kyltti tulee oikeinpäin
-	painot = sorted(painot, key = lambda paino: paino[2])
-	# muodostetaan kyltti..
-	kyltti = [paino[0] for paino in painot]
-	
-	# supista nimet jos mahdollista
-	def viimeistele(kyltti, supistus_taso = 0):
-		if supistus_taso > 0:
-			kyltti = [helpot_supistukset.get(paikka, paikka) for paikka in kyltti]
-		if supistus_taso > 1:
-			kyltti = [vakavat_supistukset.get(paikka, paikka) for paikka in kyltti]
-		return kyltti
-	tulos = viimeistele(kyltti)
-	if len(' - '.join(kyltti)) > 20:
-		tulos = viimeistele(kyltti, supistus_taso = 1)
-	if len(' - '.join(kyltti)) > 70:
-		tulos = viimeistele(kyltti, supistus_taso = 2)
-	if kokonainen:
-		tulos = [lähtö] + tulos
-	lyhyt_lähtö = replacements.get(lähtö, lähtö)
-	if lyhyt_lähtö != tulos[-1] and helpot_supistukset.get(lyhyt_lähtö, lyhyt_lähtö) in kunnat | {'Kauppatori'} and tulos[-1] in kunnat | {'Kauppatori'}:
-		tulos = ['Turku' if k == 'Kauppatori' else k for k in tulos]
-	return tulos
--- a/bussit.py	Sat Jun 10 16:36:36 2017 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,211 +0,0 @@
-#!/usr/bin/env python3
-import enum, json
-from sys import stderr
-from datetime import date, time, datetime, timedelta
-from copy import copy
-from misc import *
-from geometria import *
-Suunta = enum.Enum('Suunta', [('Taaksepäin', 0), ('Eteenpäin', 1)])
-
-def muunna_ajovuoro_tunniste(tunniste):
-	return tunniste
-
-class Ajovuoro:
-	def __init__(self, tunniste, linja, palvelu, kyltti, suunta):
-		self.tunniste, self.linja, self.palvelu, self.kyltti, self.suunta = tunniste, linja, \
-			palvelu, kyltti, suunta
-		self.reitti = []
-		self.nimi = muunna_ajovuoro_tunniste(tunniste)
-	def __repr__(self):
-		return 'ajot[%r]' % self.nimi
-	def pysäkkiReitillä(self, pysäkki):
-		for pysähdys in self.reitti:
-			if pysähdys.pysäkki is pysäkki:
-				return pysähdys
-		else:
-			return None
-	def ajetaan_päivänä(self, päivä):
-		try:
-			return self.palvelu in palvelut_per_päivä[päivä]
-		except KeyError:
-			return False
-	def suppea_reitti(self, pysäkistä = None):
-		if pysäkistä and pysäkistä in self.reitti:
-			reitti = copy(self.reitti)
-			reitti = reitti[reitti.index(pysäkistä):]
-		else:
-			reitti = self.reitti
-		käytetyt_alueet = set()
-		tulos = []
-		for pysähdys in reitti:
-			pysäkki = pysähdys.pysäkki
-			if pysäkki.alue and pysäkki.alue not in käytetyt_alueet:
-				käytetyt_alueet.add(pysäkki.alue)
-				tulos.append(pysäkki.alue)
-		return tulos
-
-class Linja:
-	def __init__(self, tietue):
-		self.tunniste = tietue['route_id']
-		self.viite = tietue['route_short_name']
-		self.selite = tietue['route_long_name']
-	def __repr__(self):
-		return 'linjat[%r]' % self.viite
-
-class Palvelu:
-	def __init__(self, tunniste):
-		self.tunniste = tunniste
-		self.päivät = set()
-	def __repr__(self):
-		return 'palvelut[%r]' % self.tunniste
-
-class Pysäkki:
-	def __init__(self, tunniste, nimi, sijainti):
-		self.tunniste, self.nimi, self.sijainti = tunniste, nimi, sijainti
-	def __repr__(self):
-		return 'pysäkit[%r]' % self.tunniste
-	def aikataulu(self, määrä = 50):
-		'''
-			Hakee tämän pysäkin seuraavat `määrä` lähtöä. Päätepysäkille saapuvia busseja ei
-			lasketa. Palauttaa pysähdykset listana jossa alkiot ovat muotoa (aika, pysähdys),
-			jossa:
-			- `aika` on saapumishetki muotoa datetime ja
-			- `pysähdys` on vastaava Pysähdys olio.
-			
-			Mikäli pysäkille ei ole määrätty riittävästi pysähdyksiä kalenterissa, tuloslista
-			jää alimittaiseksi, mahdollisesti jopa tyhjäksi.
-		'''
-		class PäivätLoppuError(Exception):
-			pass
-		# Hakee pysäkin aikataulut tiettynä päivänä.
-		def aikataulu_päivänä(päivä):
-			# Jos päädyttiin aikataulukalenterin ulkopuolelle, niin tuotetaan virhe. Jos vain
-			# palautettaisiin tyhjä tulos, niin algoritmi jatkaisi etsintää loputtomiin.
-			if päivä > viimeinen_käyttöpäivä:
-				raise PäivätLoppuError()
-			taulu = []
-			# Jokaiselle ajovuorolle,
-			for ajo in ajot.values():
-				# jos tämä ajovuoro ajetaan tänä päivänä
-				if ajo.ajetaan_päivänä(päivä):
-					# ja jos tämä ajo pysähtyy tällä pysäkillä, ei kuitenkaan saapuen
-					# päätepysäkille,
-					pysähdys = ajo.pysäkkiReitillä(self)
-					if pysähdys and pysähdys is not ajo.reitti[-1]:
-						# ja jos tämä pysähdys on tulevaisuudessa,
-						aika = datetime.combine(päivä, time()) + pysähdys.saapumisaika
-						if aika >= nyt():
-							# lisää pysähdys listaan.
-							taulu.append((aika, pysähdys))
-			# Lajittele lopputulos saapumisajan mukaan.
-			taulu.sort(key = lambda tietue: tietue[0])
-			return taulu
-		taulu = []
-		päivä = tänään()
-		# Niin kauan kuin aikatauluja ei ole vielä tarpeeksi,
-		while len(taulu) < määrä:
-			try:
-				# hae nykyisen päivän aikataulut ja lisää ne,
-				taulu += aikataulu_päivänä(päivä)
-			except PäivätLoppuError:
-				# paitsi jos mentiin kalenterin ulkopuolelle, jolloin lopetetaan,
-				break
-			# ja siirry seuraavaan päivään.
-			päivä += timedelta(1)
-		# Typistä lopputulos haluttuun tulosmäärään.
-		return taulu[:määrä]
-	@property
-	def linkki_karttaan(self):
-		return 'http://www.openstreetmap.org/#map=19/%f/%f' % (self.sijainti.leveys, self.sijainti.pituus)
-
-class Pysähdys:
-	def __init__(self, saapumisaika, lähtöaika, pysäkki, ajo):
-		self.saapumisaika, self.lähtöaika, self.pysäkki, self.ajo = saapumisaika, lähtöaika, \
-			pysäkki, ajo
-	def __repr__(self):
-		return 'Pysähdys(%r, %r, %r, %r)' % (self.saapumisaika, self.lähtöaika, self.pysäkki, self.ajo)
-
-linjat = {}
-linjat_per_tunniste = {}
-ajot = {}
-ajot_per_numero = {}
-palvelut = {}
-pysäkit = {}
-
-print('Ladataan linjat... ', file = stderr, end = '', flush = True)
-with open('gtfs/routes.txt') as tiedosto:
-	for rivi in lue_csv(tiedosto):
-		linja = Linja(rivi)
-		linja.tunniste = linja.tunniste
-		linjat[linja.viite] = linja
-		linjat_per_tunniste[linja.tunniste] = linja
-print('%d linjaa' % len(linjat), file = stderr)
-
-print('Ladataan ajot... ', file = stderr, end = '', flush = True)
-with open('gtfs/trips.txt') as tiedosto:
-	for rivi in lue_csv(tiedosto, muunnokset = {'direction_id': lambda k: Suunta(int(k))}):
-		if rivi['service_id'] not in palvelut:
-			palvelut[rivi['service_id']] = Palvelu(rivi['service_id'])
-		linja = linjat_per_tunniste[rivi['route_id']]
-		ajo = Ajovuoro(tunniste = rivi['trip_id'],
-			linja = linja,
-			palvelu = palvelut[rivi['service_id']],
-			kyltti = rivi['trip_headsign'],
-			suunta = rivi['direction_id'])
-		assert ajo.nimi not in ajot
-		ajot[ajo.nimi] = ajo
-print('%d ajoa' % len(ajot), file = stderr)
-
-def lue_päiväys(teksti):
-	return date(int(teksti[:4]), int(teksti[4:6]), int(teksti[6:]))
-
-def lue_aika(teksti):
-	tunti, minuutti, sekunti = map(int, teksti.split(':'))
-	return timedelta(hours = tunti, minutes = minuutti, seconds = sekunti)
-
-print('Ladataan päiväykset... ', file = stderr, flush = True)
-
-viimeinen_käyttöpäivä = date.today()
-palvelut_per_päivä = {}
-
-with open('gtfs/calendar_dates.txt') as tiedosto:
-	for rivi in lue_csv(tiedosto):
-		palvelu = palvelut[rivi['service_id']]
-		päivä = lue_päiväys(rivi['date'])
-		palvelu.päivät.add(päivä)
-		if päivä not in palvelut_per_päivä:
-			palvelut_per_päivä[päivä] = set()
-		palvelut_per_päivä[päivä].add(palvelu)
-		viimeinen_käyttöpäivä = max(päivä, viimeinen_käyttöpäivä)
-
-def palvelut_käytössä(päivä):
-	for palvelu in palvelut.values():
-		if päivä in palvelu.päivät:
-			yield palvelu
-
-print('Ladataan pysäkit... ', file = stderr, end = '', flush = True)
-with open('gtfs/stops.txt') as file:
-	for rivi in lue_csv(file):
-		sijainti = Sijainti(float(rivi['stop_lat']), float(rivi['stop_lon']))
-		pysäkki = Pysäkki(rivi['stop_id'], rivi['stop_name'], sijainti)
-		pysäkit[pysäkki.tunniste] = pysäkki
-with open('pysäkkialueet.json') as file:
-	for pysäkkitunniste, alue in json.load(file).items():
-		pysäkit[pysäkkitunniste].alue = alue
-print('%d pysäkkiä' % len(pysäkit), file = stderr)
-
-print('Ladataan aikataulut... ', end = '', flush = True, file = stderr)
-with open('gtfs/stop_times.txt') as file:
-	rivimäärä = sum(line.count('\n') for line in file)
-	laskettu = 0
-	file.seek(0)
-	for rivi in lue_csv(file):
-		ajo = ajot[muunna_ajovuoro_tunniste(rivi['trip_id'])]
-		saapumisaika = lue_aika(rivi['arrival_time'])
-		lähtöaika = lue_aika(rivi['departure_time'])
-		pysäkki = pysäkit[rivi['stop_id']]
-		ajo.reitti.append(Pysähdys(saapumisaika, lähtöaika, pysäkki, ajo))
-		laskettu += 1
-		if laskettu % 1000 == 0:
-			print('\rLadataan aikataulut... %.1f%%' % (laskettu * 100 / rivimäärä), end = ' ', file = stderr)
-print('\rLadataan aikataulut... ladattu', file = stderr)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/compute-regions.py	Sat Jun 10 16:45:41 2017 +0300
@@ -0,0 +1,59 @@
+#!/usr/bin/env python3
+import sys, json
+from misc import *
+from geometry import *
+
+with open('regions.gmp') as file:
+	data = file.read().split('@')
+
+with open('region-representatives.json') as file:
+	representatives = json.load(file)
+
+bus_stops = {}
+
+with open('gtfs/stops.txt') as file:
+	for rivi in lue_csv(file):
+		sijainti = Sijainti(float(rivi['stop_lat']), float(rivi['stop_lon']))
+		tunniste = rivi['stop_id']
+		bus_stops[tunniste] = sijainti
+
+district_shapes = []
+for polygon in data[1].splitlines():
+	polygon = polygon.split('^')
+	coordinates = []
+	for point in polygon[3].split('~'):
+		x, y = point.split(',')
+		coordinates.append(Sijainti(float(x), float(y)))
+	district_shapes.append(Monikulmio(*coordinates))
+
+districts = {}
+bus_stop_districts = {}
+
+for name, stop_id in representatives.items():
+	if stop_id is None:
+		continue
+	if stop_id not in bus_stops:
+		print('Representative %r for region %r not found in schedule' % (stop_id, name), file = sys.stderr)
+	else:
+		for district_shape in district_shapes:
+			if district_shape.sisältää_pisteen(bus_stops[stop_id]):
+				assert name not in districts
+				districts[name] = district_shape
+				district_shapes.remove(district_shape)
+				bus_stop_districts[stop_id] = name
+				break
+		else:
+			print('Cannot find a shape for %r' % name, file = sys.stderr)
+
+for stop_id, stop_position in bus_stops.items():
+	for district, shape in districts.items():
+		if shape.sisältää_pisteen(stop_position):
+			bus_stop_districts[stop_id] = district
+			break
+	else:
+		bus_stop_districts[stop_id] = None
+
+covered = sum(int(bool(k)) for k in bus_stop_districts.values())
+total = len(bus_stops)
+print('%.1f%% bus stops covered.' % (covered * 100 / total), file = sys.stderr)
+json.dump(bus_stop_districts, sys.stdout, indent = 2)
--- a/geometria.py	Sat Jun 10 16:36:36 2017 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,121 +0,0 @@
-from math import sqrt, hypot, radians, sin, cos, atan2
-
-class Sijainti:
-	def __init__(self, leveys, pituus):
-		self.leveys, self.pituus = leveys, pituus
-	def etäisyys(tämä, toinen):
-		# https://stackoverflow.com/a/365853
-		a = sin(radians(tämä.leveys - toinen.leveys) / 2) ** 2
-		a += sin(radians(tämä.pituus - toinen.pituus) / 2) ** 2 * cos(radians(tämä.leveys)) * cos(radians(toinen.leveys))
-		return 6371 * 2 * atan2(sqrt(a), sqrt(1 - a))
-	def __repr__(self):
-		return '%s(%r, %r)' % (type(self).__name__, self.leveys, self.pituus)
-	def __str__(self):
-		return '%.5f, %.5f' % (self.leveys, self.pituus)
-	@property
-	def x(self):
-		return self.leveys
-	@property
-	def y(self):
-		return self.pituus
-
-class Rengas:
-	def __init__(tämä, säiliö):
-		tämä.säiliö = säiliö
-	def __getitem__(tämä, indeksi):
-		while indeksi < 0:
-			indeksi += len(tämä.säiliö)
-		while indeksi >= len(tämä.säiliö):
-			indeksi -= len(tämä.säiliö)
-		return tämä.säiliö[indeksi]
-	def __iter__(tämä):
-		return iter(tämä.säiliö)
-	def __len__(tämä):
-		return len(tämä.säiliö)
-
-class Monikulmio:
-	def __init__(self, *pisteet):
-		self.pisteet = pisteet
-	def __repr__(self):
-		return '%s(%s)' % (type(self).__name__, ', '.join(map(repr, self.pisteet)))
-	def pinta_ala(self):
-		rengas = Rengas(self.pisteet)
-		return sum(
-			rengas[i].x * rengas[i + 1].y - rengas[i + 1].x * rengas[i].y
-			for i in range(len(rengas))
-		) / 2
-	def piiri(self):
-		rengas = Rengas(self.pisteet)
-		return sum(
-			sqrt((rengas[i + 1].x - rengas[i].x)**2 + (rengas[i + 1].y - rengas[i].y)**2)
-			for i in range(len(rengas))
-		)
-	def painopiste(self):
-		rengas = Rengas(self.pisteet)
-		x = sum(
-			(rengas[i].x + rengas[i + 1].x) * (rengas[i].x * rengas[i + 1].y - rengas[i + 1].x * rengas[i].y)
-			for i in range(len(rengas))
-		) / 6 / self.pinta_ala()
-		y = sum(
-			(rengas[i].y + rengas[i + 1].y) * (rengas[i].x * rengas[i + 1].y - rengas[i + 1].x * rengas[i].y)
-			for i in range(len(rengas))
-		) / 6 / self.pinta_ala()
-		return self.pistetyyppi()(x, y)
-	def pistetyyppi(self):
-		if len(self.pisteet):
-			return type(self.pisteet[0])
-		else:
-			return Piste
-	def piiri_janat(self):
-		rengas = Rengas(self.pisteet)
-		for i in range(len(rengas)):
-			yield Jana(rengas[i], rengas[i + 1])
-	def sisältää_pisteen(self, piste):
-		ulkopiste = self.pistetyyppi()(
-			min(piste.x for piste in self.pisteet) - 1,
-			min(piste.y for piste in self.pisteet) - 1
-		)
-		ulkojana = Jana(piste, ulkopiste)
-		leikkauksia = 0
-		for jana in self.piiri_janat():
-			if jana.leikkauspiste(ulkojana) is not None:
-				leikkauksia += 1
-		return bool(leikkauksia & 1)
-
-class Jana:
-	def __init__(self, alkupiste, päätepiste):
-		self.alkupiste, self.päätepiste = alkupiste, päätepiste
-	def __repr__(self):
-		return 'Jana(%r, %r)' % (self.alkupiste, self.päätepiste)
-	def pituus(self):
-		return hypot(self.alkupiste.x - self.päätepiste.x, self.alkupiste.y - self.päätepiste.y)
-	def leikkauspiste(tämä, toinen):
-		pistetyyppi = type(tämä.alkupiste)
-		x = (tämä.alkupiste.x, tämä.päätepiste.x, toinen.alkupiste.x, toinen.päätepiste.x)
-		y = (tämä.alkupiste.y, tämä.päätepiste.y, toinen.alkupiste.y, toinen.päätepiste.y)
-		try:
-			jakaja = (x[0] - x[1]) * (y[2] - y[3]) - (y[0] - y[1]) * (x[2] - x[3])
-			Px = ((x[0] * y[1] - y[0] * x[1]) * (x[2] - x[3]) - (x[0] - x[1]) * (x[2] * y[3] - y[2] * x[3])) / jakaja
-			Py = ((x[0] * y[1] - y[0] * x[1]) * (y[2] - y[3]) - (y[0] - y[1]) * (x[2] * y[3] - y[2] * x[3])) / jakaja
-			etäisyys = lambda n: (Px - x[n]) ** 2 + (Py - y[n]) ** 2
-			if max(etäisyys(0), etäisyys(1)) <= tämä.pituus() ** 2 and max(etäisyys(2), etäisyys(3)) <= toinen.pituus() ** 2:
-				return pistetyyppi(Px, Py)
-			else:
-				return None
-		except ZeroDivisionError:
-			return None
-
-class Piste:
-	def __init__(self, x, y):
-		self.x, self.y = x, y
-	def __repr__(self):
-		return 'Piste(%r, %r)' % (self.x, self.y)
-
-A = Monikulmio(
-	Piste(2,3),
-	Piste(1,1),
-	Piste(4,0),
-	Piste(6,2),
-	Piste(4,4))
-L1 = Jana(Piste(1, 1), Piste(-1, 5))
-L2 = Jana(Piste(1, 5), Piste(5, 1))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/geometry.py	Sat Jun 10 16:45:41 2017 +0300
@@ -0,0 +1,121 @@
+from math import sqrt, hypot, radians, sin, cos, atan2
+
+class Sijainti:
+	def __init__(self, leveys, pituus):
+		self.leveys, self.pituus = leveys, pituus
+	def etäisyys(tämä, toinen):
+		# https://stackoverflow.com/a/365853
+		a = sin(radians(tämä.leveys - toinen.leveys) / 2) ** 2
+		a += sin(radians(tämä.pituus - toinen.pituus) / 2) ** 2 * cos(radians(tämä.leveys)) * cos(radians(toinen.leveys))
+		return 6371 * 2 * atan2(sqrt(a), sqrt(1 - a))
+	def __repr__(self):
+		return '%s(%r, %r)' % (type(self).__name__, self.leveys, self.pituus)
+	def __str__(self):
+		return '%.5f, %.5f' % (self.leveys, self.pituus)
+	@property
+	def x(self):
+		return self.leveys
+	@property
+	def y(self):
+		return self.pituus
+
+class Rengas:
+	def __init__(tämä, säiliö):
+		tämä.säiliö = säiliö
+	def __getitem__(tämä, indeksi):
+		while indeksi < 0:
+			indeksi += len(tämä.säiliö)
+		while indeksi >= len(tämä.säiliö):
+			indeksi -= len(tämä.säiliö)
+		return tämä.säiliö[indeksi]
+	def __iter__(tämä):
+		return iter(tämä.säiliö)
+	def __len__(tämä):
+		return len(tämä.säiliö)
+
+class Monikulmio:
+	def __init__(self, *pisteet):
+		self.pisteet = pisteet
+	def __repr__(self):
+		return '%s(%s)' % (type(self).__name__, ', '.join(map(repr, self.pisteet)))
+	def pinta_ala(self):
+		rengas = Rengas(self.pisteet)
+		return sum(
+			rengas[i].x * rengas[i + 1].y - rengas[i + 1].x * rengas[i].y
+			for i in range(len(rengas))
+		) / 2
+	def piiri(self):
+		rengas = Rengas(self.pisteet)
+		return sum(
+			sqrt((rengas[i + 1].x - rengas[i].x)**2 + (rengas[i + 1].y - rengas[i].y)**2)
+			for i in range(len(rengas))
+		)
+	def painopiste(self):
+		rengas = Rengas(self.pisteet)
+		x = sum(
+			(rengas[i].x + rengas[i + 1].x) * (rengas[i].x * rengas[i + 1].y - rengas[i + 1].x * rengas[i].y)
+			for i in range(len(rengas))
+		) / 6 / self.pinta_ala()
+		y = sum(
+			(rengas[i].y + rengas[i + 1].y) * (rengas[i].x * rengas[i + 1].y - rengas[i + 1].x * rengas[i].y)
+			for i in range(len(rengas))
+		) / 6 / self.pinta_ala()
+		return self.pistetyyppi()(x, y)
+	def pistetyyppi(self):
+		if len(self.pisteet):
+			return type(self.pisteet[0])
+		else:
+			return Piste
+	def piiri_janat(self):
+		rengas = Rengas(self.pisteet)
+		for i in range(len(rengas)):
+			yield Jana(rengas[i], rengas[i + 1])
+	def sisältää_pisteen(self, piste):
+		ulkopiste = self.pistetyyppi()(
+			min(piste.x for piste in self.pisteet) - 1,
+			min(piste.y for piste in self.pisteet) - 1
+		)
+		ulkojana = Jana(piste, ulkopiste)
+		leikkauksia = 0
+		for jana in self.piiri_janat():
+			if jana.leikkauspiste(ulkojana) is not None:
+				leikkauksia += 1
+		return bool(leikkauksia & 1)
+
+class Jana:
+	def __init__(self, alkupiste, päätepiste):
+		self.alkupiste, self.päätepiste = alkupiste, päätepiste
+	def __repr__(self):
+		return 'Jana(%r, %r)' % (self.alkupiste, self.päätepiste)
+	def pituus(self):
+		return hypot(self.alkupiste.x - self.päätepiste.x, self.alkupiste.y - self.päätepiste.y)
+	def leikkauspiste(tämä, toinen):
+		pistetyyppi = type(tämä.alkupiste)
+		x = (tämä.alkupiste.x, tämä.päätepiste.x, toinen.alkupiste.x, toinen.päätepiste.x)
+		y = (tämä.alkupiste.y, tämä.päätepiste.y, toinen.alkupiste.y, toinen.päätepiste.y)
+		try:
+			jakaja = (x[0] - x[1]) * (y[2] - y[3]) - (y[0] - y[1]) * (x[2] - x[3])
+			Px = ((x[0] * y[1] - y[0] * x[1]) * (x[2] - x[3]) - (x[0] - x[1]) * (x[2] * y[3] - y[2] * x[3])) / jakaja
+			Py = ((x[0] * y[1] - y[0] * x[1]) * (y[2] - y[3]) - (y[0] - y[1]) * (x[2] * y[3] - y[2] * x[3])) / jakaja
+			etäisyys = lambda n: (Px - x[n]) ** 2 + (Py - y[n]) ** 2
+			if max(etäisyys(0), etäisyys(1)) <= tämä.pituus() ** 2 and max(etäisyys(2), etäisyys(3)) <= toinen.pituus() ** 2:
+				return pistetyyppi(Px, Py)
+			else:
+				return None
+		except ZeroDivisionError:
+			return None
+
+class Piste:
+	def __init__(self, x, y):
+		self.x, self.y = x, y
+	def __repr__(self):
+		return 'Piste(%r, %r)' % (self.x, self.y)
+
+A = Monikulmio(
+	Piste(2,3),
+	Piste(1,1),
+	Piste(4,0),
+	Piste(6,2),
+	Piste(4,4))
+L1 = Jana(Piste(1, 1), Piste(-1, 5))
+L2 = Jana(Piste(1, 5), Piste(5, 1))
--- a/palvelu.py	Sat Jun 10 16:36:36 2017 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,114 +0,0 @@
-#!/usr/bin/env python3
-from flask import Flask, render_template, abort
-from datetime import datetime, date, time, timedelta
-from misc import *
-import locale
-from bussireitti import supista_reitti
-from configparser import ConfigParser
-
-app = Flask(__name__)
-locale.setlocale(locale.LC_ALL, locale.getdefaultlocale())
-
-kielet = ['fi', 'sv', 'en', 'ru']
-kieli_ini = {}
-for kieli in kielet:
-	ini = ConfigParser()
-	ini.read(kieli + '.ini')
-	kieli_ini[kieli] = ini
-
-def käännä(nimi, osio):
-	kieli = sivun_kieli()
-	try:
-		return kieli_ini[kieli][osio][nimi]
-	except KeyError:
-		return nimi
-
-def sivun_kieli():
-	from flask import request
-	if request.args.get('sv') is not None:
-		return 'sv'
-	elif request.args.get('en') is not None:
-		return 'en'
-	elif request.args.get('ru') is not None:
-		return 'ru'
-	elif request.args.get('kääntämätön') is None:
-		return 'fi'
-	else:
-		return None
-
-@app.route('/pysäkki/<tunniste>')
-def pysäkkiaikataulu(tunniste):
-	from bussit import pysäkit
-	from math import ceil
-	aikataulu = []
-	try:
-		pysäkki = pysäkit[tunniste]
-	except KeyError:
-		abort(404)
-	for (aika, pysähdys) in pysäkki.aikataulu(100):
-		kyltti = supista_reitti(pysähdys.ajo.suppea_reitti(pysähdys))
-		kyltti = [käännä(paikka, 'paikat') for paikka in kyltti]
-		kylttiesitys = ' - '.join(kyltti)
-		if len(kylttiesitys) > 25:
-			k = ceil(len(kyltti) / 2)
-			kylttiesitys = ' - '.join(kyltti[:k]) + '\n' + ' - '.join(kyltti[k:])
-		aikataulu.append({
-			'aika': muotoile_aika(aika),
-			'linja': pysähdys.ajo.linja.viite,
-			'kyltti': kylttiesitys,
-			'ajovuoro': pysähdys.ajo.nimi,
-			'yö': yö(aika),
-		})
-	return render_template(
-		'pysäkki.html',
-		aikataulu = aikataulu,
-		viite = tunniste,
-		nimi = käännä(pysäkki.nimi, 'pysäkit'),
-		linkki_karttaan = pysäkki.linkki_karttaan,
-		alue = pysäkki.alue,
-		sijainti = pysäkki.sijainti,
-	)
-
-@app.route('/ajovuoro/<numero>')
-def ajoreitti(numero):
-	from flask import request
-	from bussit import ajot
-	try:
-		ajovuoro = ajot[numero]
-	except KeyError:
-		abort(404)
-	suppea = request.args.get('suppea') is not None
-	reitti = []
-	suppea_reitti = []
-	käydyt_alueet = set()
-	for pysähdys in ajovuoro.reitti:
-		aika = datetime.combine(tänään(), time()) + pysähdys.saapumisaika
-		muotoiltu_aika = muotoile_aika(aika)
-		reitti.append({
-			'aika': muotoiltu_aika,
-			'tunniste': pysähdys.pysäkki.tunniste,
-			'alue': käännä(pysähdys.pysäkki.alue or '', 'paikat'),
-			'nimi': käännä(pysähdys.pysäkki.nimi, 'pysäkit'),
-		})
-		alue = pysähdys.pysäkki.alue
-		if alue:
-			if alue not in käydyt_alueet:
-				suppea_reitti.append({
-					'aika': muotoiltu_aika,
-					'alue': alue,
-				})
-				käydyt_alueet.add(alue)
-	kyltti = supista_reitti([k['alue'] for k in suppea_reitti], kokonainen = True)
-	sivu = suppea and 'ajovuoro-suppea.html' or 'ajovuoro.html'
-	return render_template(sivu, reitti = reitti, suppea_reitti = suppea_reitti,
-						numero = numero, linja = ajovuoro.linja.viite,
-						selite = ' - '.join(käännä(paikka, 'paikat') for paikka in kyltti),
-						yö = yö(datetime.combine(tänään(), time()) + ajovuoro.reitti[-1].saapumisaika),
-						)
-
-if __name__ == '__main__':
-	from argparse import ArgumentParser
-	parser = ArgumentParser()
-	parser.add_argument('-p', '--port', type = int, default = 5000)
-	args = parser.parse_args()
-	app.run(debug = True, port = args.port)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/region-representatives.json	Sat Jun 10 16:45:41 2017 +0300
@@ -0,0 +1,215 @@
+{
+	"Kaarinan keskusta": "6043",
+	"Piikkiö": "6175",
+	"Hadvala": "6171",
+	"Puosta": "6351",
+	"Runko": "6156",
+	"Tuorla": "6149",
+	"Raadelma": "6153",
+	"Sipilänmäki": "6227",
+	
+	"Paimio": "6619",
+	"Paimion sairaala": "6664",
+	"Moisio": "6757",
+	"Hanhijoki": "6657",
+	"Naskarla": "6638",
+	
+	"Lieto": "5021",
+	"Pompo": "6112",
+	"Tammi": "6117",
+	"Hakkinen": "5004",
+	"Loukinainen": "5009",
+	"Sillilä": "5011",
+	"Piispala": "5030",
+	"Jokila": "5035",
+	"Vieru": "5018",
+	"Ilmarinen": "5070",
+	"Liedon asemanseutu": "5112",
+	"Tarvasjoki": "5423",
+	"Avanti": "5470",
+
+	"Aura": "8024",
+	"Salo": "8900",
+	"Korpo": "8960",
+	
+	"Marttila": "8800",
+
+	"Raision keskusta": "2010",
+	"Kauppakeskus Mylly": "2117",
+	"Petäsmäki": "2063",
+	"Kaanaa": "2037",
+	
+	"Koski Tl": "8810",
+	
+	"Somero": "8820",
+
+	"Naantalin keskusta": "3016",
+	"Ahteentaka": "3290",
+	"Kurala (Naantali)": "3196",
+	"Haapala": "3283",
+	"Ajola": "3282",
+	"Ylttinen": "3192",
+	"Tamminiemi": "3279",
+	"Artukainen": "1513",
+	"Asikko": "3036",
+	"Hämölä": "3270",
+	"Eerikvalla": "395",
+	"Friskala": "394",
+	"Jyrkkälä": "758",
+	"Haarla": "364",
+	"Haijainen": "3231",
+	"Halinen": "1628",
+	"Harittu": "1489",
+	"Hemmola": "4077",
+	"Hepokulta": "26",
+	"Herttula": "3235",
+	"Hyrköinen": "4060",
+	"Häppilä": "409",
+	"Härkämäki": "761",
+	"Ihala": "2098",
+	"Illoinen": "324",
+	"Ilpoinen": "456",
+	"Impivaara": "1564",
+	"Itäharju": "1805",
+	"Itäranta": "332",
+	"Ispoinen": "647",
+	"Jäkärlä": "1366",
+	"Jänessaari": "437",
+	"Kahari": "4093",
+	"Karvetti": "3202",
+	"Kaistarniemi": "1747",
+	"Kaivola": "3229",
+	"Kakskerta": "1764",
+	"Kastu": "627",
+	"Katariina": "1708",
+	"Kauppatori": "T1",
+	"Kerttuli": "867",
+	"Kultaranta": "3027",
+	"Koivula": "788",
+	"Kohmo": "1651",
+	"Konserttitalo": "18",
+	"Kuivalahti": "3237",
+	"Kukola": "1732",
+	"Kuninkoja": "2129",
+	"Kupittaa": "870",
+	"Kupittaanpuisto": "1972",
+	"Kurala": "1660",
+	"Kurjenmäki": "1688",
+	"Kuuvuori": "218",
+	"Kähäri": "1022",
+	"Kärsämäki": "192",
+	"Käkölä": "3236",
+	"Iso-Heikkilä": "768",
+	"Lauste": "708",
+	"Lauttaranta": "128",
+	"Lentoasema": "1586",
+	"Liljalaakso": "592",
+	"Linja-autoasema": "41",
+	"Linnavuori": "3122",
+	"Littoinen": "6085",
+	"Luolavuori": "1721",
+	"Luostarinmäki": "864",
+	"Länsinummi": "818",
+	"Maanpää": "1729",
+	"Majakkaranta": "81",
+	"Maksla": "2150",
+	"Marjaniemi": "534",
+	"Martti": "74",
+	"Metsäaro": "2089",
+	"Mäntymäki": "1800",
+	"Moikoinen": "91",
+	"Moisio": "1066",
+	"Muhkuri": "899",
+	"Munittula": "4012",
+	"Mälikkälä": "781",
+	"Nuorikkala": "2079",
+	"Nummenmäki": "62",
+	"Nummen koulu": "1826",
+	"Nättinummi": "30",
+	"Ojanto": "4004",
+	"Oriniemi": "316",
+	"Oriketo": "1435",
+	"Paasniittu": "4036",
+	"Paattinen": "1170",
+	"Paikkari": "2048",
+	"Pansio": "1506",
+	"Papinsaari": "352",
+	"Patterinhaka": "578",
+	"Peijerlä": "4058",
+	"Peltola": "1455",
+	"Perno": "745",
+	"Pernon telakka": "775",
+	"Piispanristi": "6282",
+	"Pikisaari": "124",
+	"Pläkkikaupunki": "780",
+	"Pohjola": "1017",
+	"Porhonkallio": "3037",
+	"Port Arthur": "9",
+	"Puutori": "286",
+	"Pyöli": "3247",
+	"Pääskyvuori": "879",
+	"Raunistula": "224",
+	"Rautatieasema": "144",
+	"Ruissalo": "666",
+	"Ruona": "3220",
+	"Runosmäki": "1015",
+	"Ruskon keskusta": "4017",
+	"Rymättylä": "3151",
+	"Räntämäki": "1441",
+	"Röölä": "3166",
+	"Saaro": "556",
+	"Salonkylä": "3301",
+	"Saramäki": "250",
+	"Okala": "3297",
+	"Satama": "1",
+	"Satava": "373",
+	"Montola": "3157",
+	"Silvola": "4086",
+	"Skanssi": "349",
+	"Airismaa": "3171",
+	"Suikkila": "485",
+	"Suutarla": "3286",
+	"Särkilahti": "404",
+	"Aaslaluoto": "3308",
+	"Länsikeskus": "476",
+	"Tikanmaa": "2136",
+	"Toijainen": "424",
+	"Tortinmäki": "1149",
+	"Tuomiokirkkotori": "131",
+	"TYKS": "1030",
+	"Uittamo": "920",
+	"Urusvuori": "1587",
+	"Vaala": "1500",
+	"Vahto": "4069",
+	"Vaisaari": "2103",
+	"Vanha Suurtori": "219",
+	"Vasaramäki": "1967",
+	"Varissuo": "828",
+	"Verkahovi": "1601",
+	"Vienola": "1020",
+	"Viiala": "3024",
+	"Viluluoto": "3010",
+	"VII kaupunginosa": "109",
+	"Velusmaa": "3287",
+	"Vähä-Heikkilä": "944",
+	"Yli-Maaria": "396",
+	"Yliopistonmäki": "1797",
+	"Ylioppilaskylä-Länsi": "445",
+	"Ylioppilaskylä-Itä": "448",
+	"Caribia": "1643",
+	"Meripirtti": "3179",
+
+	"Pargas": "8137",
+	"Björkhagen": "8125",
+	"Storäng": "8121",
+	"Norrby": "8142",
+	"Österby": "8140",
+	"Munkviken": "8129",
+	"Tennby": "8127",
+	"Kårkulla": "8105",
+	"Kyrkäng": "8109",
+	"Kirjala": "8102",
+
+
+	"Poikko": "3184"
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/regions.gmp	Sat Jun 10 16:45:41 2017 +0300
@@ -0,0 +1,227 @@
+roadmap^60.6155412106049, 22.400419931927335^12@undefined^#FF0000,5,1,#ff8800,0.4^^60.39482,22.2577~60.40037,22.27521~60.39147,22.28456~60.38851,22.27179
+polygon^#FF0000,5,1,#ff8800,0.4^^60.3977,22.24465~60.40772,22.24046~60.40792,22.26057~60.40076,22.27409~60.3952,22.25642
+polygon^#FF0000,5,1,#ff8800,0.4^^60.3977,22.22706~60.38719,22.23676~60.38341,22.22466~60.38518,22.21205~60.39359,22.20706~60.39816,22.21341
+polygon^#FF0000,5,1,#ff8800,0.4^^60.39868,22.21599~60.39804,22.22852~60.38876,22.23916~60.38952,22.24843~60.39329,22.25135~60.40217,22.23474~60.4019,22.21689
+polygon^#FF0000,5,1,#ff8800,0.4^^60.38871,22.16432~60.39236,22.18483~60.39972,22.188~60.40171,22.1823~60.39919,22.15413~60.39151,22.15633
+undefined^#FF0000,5,1,#ff8800,0.4^^60.42123,22.17264~60.41472,22.15422~60.40622,22.14277~60.40003,22.15599~60.40577,22.17143~60.41357,22.18174
+undefined^#FF0000,5,1,#ff8800,0.4^^60.43275,22.20869~60.4239,22.21632~60.41889,22.19831~60.42495,22.19216~60.43033,22.19648
+undefined^#FF0000,5,1,#ff8800,0.4^^60.42148,22.17333~60.42584,22.18964~60.41902,22.1971~60.41534,22.18056
+undefined^#FF0000,5,1,#ff8800,0.4^^60.49702,22.21496~60.49936,22.22028~60.50048,22.23744~60.49676,22.2392~60.49373,22.23435~60.49306,22.23554~60.49178,22.23402~60.48872,22.22903~60.48729,22.2221~60.49085,22.21505
+undefined^#FF0000,5,1,#ff8800,0.4^^60.45775,22.29049~60.4599,22.29787~60.45951,22.29945~60.45688,22.3026~60.45537,22.29751~60.45501,22.29585~60.45465,22.29285~60.45619,22.29141
+undefined^#FF0000,5,1,#ff8800,0.4^^60.45331,22.2865~60.45033,22.29068~60.45113,22.29322~60.45198,22.29413~60.45225,22.29741~60.45399,22.29853~60.45529,22.2975~60.45495,22.29585~60.45446,22.2915~60.45386,22.28832~60.45369,22.28748
+undefined^#FF0000,5,1,#ff8800,0.4^^60.4445,22.25538~60.44359,22.25256~60.44121,22.24824~60.43617,22.25517~60.43897,22.26358
+undefined^#FF0000,5,1,#ff8800,0.4^^60.4537,22.25043~60.45203,22.25283~60.45345,22.25685~60.45493,22.25432
+undefined^#FF0000,5,1,#ff8800,0.4^^60.45224,22.29757~60.4499,22.32448~60.4569,22.32432~60.4621,22.31703~60.45992,22.29862~60.45961,22.29964~60.45684,22.30304~60.45528,22.29775~60.45402,22.29882
+undefined^#FF0000,5,1,#ff8800,0.4^^60.45206,22.29738~60.45137,22.2971~60.44687,22.30439~60.44232,22.3131~60.43895,22.31757~60.44625,22.3267~60.44913,22.32902
+undefined^#FF0000,5,1,#ff8800,0.4^^60.35447,22.12646~60.34122,22.13676~60.33714,22.17865~60.35634,22.30671~60.36475,22.31056~60.38221,22.2982~60.37208,22.22194~60.3631,22.16082
+undefined^#FF0000,5,1,#ff8800,0.4^^60.36483,22.11222~60.35498,22.12595~60.34539,22.09816~60.35061,22.08758
+undefined^#FF0000,5,1,#ff8800,0.4^^60.35557,22.12732~60.36614,22.11211~60.37617,22.11563~60.38197,22.13505~60.38392,22.1608~60.38367,22.21058~60.38265,22.23049~60.37467,22.23427~60.36377,22.15899
+undefined^#FF0000,5,1,#ff8800,0.4^^60.44513,22.32739~60.4509,22.33176~60.45303,22.33709~60.45193,22.34516~60.44766,22.34725~60.44482,22.35053~60.44204,22.35147~60.44187,22.33875~60.44334,22.33174
+undefined^#FF0000,5,1,#ff8800,0.4^^60.44211,22.3519~60.44491,22.35092~60.44783,22.34766~60.45206,22.34564~60.45506,22.34898~60.4569,22.35851~60.45464,22.36246~60.44861,22.36587~60.44271,22.36825
+undefined^#FF0000,5,1,#ff8800,0.4^^60.45658,22.33769~60.46067,22.33863~60.46369,22.34413~60.46361,22.35091~60.46069,22.35683~60.45802,22.35761~60.45549,22.34853~60.45532,22.34116
+undefined^#FF0000,5,1,#ff8800,0.4^^60.4623,22.31774~60.46502,22.33262~60.46094,22.33791~60.4565,22.33709~60.45315,22.33619~60.45112,22.33105~60.45135,22.32557~60.45712,22.32505
+undefined^#FF0000,5,1,#ff8800,0.4^^60.42408,22.21672~60.43288,22.20943~60.43357,22.21448~60.43179,22.225~60.42963,22.22912~60.42589,22.23131~60.42324,22.2362~60.42237,22.23158~60.41794,22.22753
+undefined^#FF0000,5,1,#ff8800,0.4^^60.45645,22.26163~60.45447,22.26424~60.45634,22.26935~60.4576,22.26927~60.45794,22.2662
+undefined^#FF0000,5,1,#ff8800,0.4^^60.456,22.26864~60.45472,22.2702~60.45356,22.26639~60.45395,22.26597~60.45512,22.26643
+undefined^#FF0000,5,1,#ff8800,0.4^^60.45569,22.26935~60.45492,22.27039~60.45569,22.27163~60.45627,22.27076
+undefined^#FF0000,5,1,#ff8800,0.4^^60.45811,22.27231~60.4578,22.27506~60.45618,22.27427~60.45707,22.27271
+undefined^#FF0000,5,1,#ff8800,0.4^^60.49152,22.24869~60.49397,22.26783~60.48683,22.27238~60.48425,22.26869~60.48425,22.2544
+undefined^#FF0000,5,1,#ff8800,0.4^^60.48328,22.24959~60.48059,22.25139~60.47672,22.25169~60.47522,22.26525~60.4831,22.2707
+undefined^#FF0000,5,1,#ff8800,0.4^^60.4697,22.22131~60.46693,22.21517~60.46528,22.20514~60.47272,22.19522~60.47605,22.20406~60.47122,22.21328
+undefined^#FF0000,5,1,#ff8800,0.4^^60.4705,22.21951~60.48023,22.22414~60.48044,22.21169~60.47626,22.20483~60.47169,22.21384
+undefined^#FF0000,5,1,#ff8800,0.4^^60.45191,22.2745~60.44999,22.27746~60.44796,22.2706~60.44837,22.26998~60.44934,22.272
+undefined^#FF0000,5,1,#ff8800,0.4^^60.4457,22.19908~60.44249,22.20603~60.43554,22.20629~60.43394,22.19696~60.44188,22.18918
+undefined^#FF0000,5,1,#ff8800,0.4^^60.4219,22.10621~60.4208,22.13539~60.40461,22.11823~60.40554,22.10579
+undefined^#FF0000,5,1,#ff8800,0.4^^60.46255,22.1208~60.46094,22.14792~60.45392,22.15324~60.45116,22.13868~60.44198,22.1196~60.4466,22.10751
+undefined^#FF0000,5,1,#ff8800,0.4^^60.45366,22.15796~60.45129,22.1614~60.45049,22.16689~60.44892,22.17899~60.4424,22.18543~60.43899,22.15149~60.43804,22.12393~60.44149,22.1198~60.45079,22.13974
+undefined^#FF0000,5,1,#ff8800,0.4^^60.45942,22.15127~60.45429,22.15401~60.45399,22.1588~60.4517,22.16222~60.45006,22.17728~60.45513,22.17316~60.4602,22.17171
+undefined^#FF0000,5,1,#ff8800,0.4^^60.46014,22.17238~60.4603,22.18908~60.45502,22.18972~60.45112,22.19633~60.44625,22.19779~60.44274,22.18699~60.4505,22.17996
+undefined^#FF0000,5,1,#ff8800,0.4^^60.45066,22.24616~60.44458,22.25495~60.44369,22.25247~60.43624,22.23858~60.4444,22.23654~60.44471,22.23537~60.4478,22.2407
+undefined^#FF0000,5,1,#ff8800,0.4^^60.48504,22.23244~60.48575,22.24697~60.49033,22.24506~60.49114,22.24283~60.49107,22.24098~60.49086,22.24005~60.49023,22.23753~60.49002,22.23558~60.48981,22.23345~60.491,22.23294~60.48865,22.22914~60.48714,22.22952~60.48611,22.23257
+undefined^#FF0000,5,1,#ff8800,0.4^^60.48987,22.23356~60.49103,22.23309~60.49175,22.23427~60.49312,22.23579~60.49373,22.2346~60.49673,22.23947~60.49728,22.2393~60.49751,22.24406~60.49696,22.24764~60.49359,22.24392~60.49128,22.24289~60.49117,22.24067~60.49032,22.23748
+undefined^#FF0000,5,1,#ff8800,0.4^^60.42207,22.10793~60.43171,22.10878~60.43629,22.11982~60.43677,22.12916~60.43279,22.1408~60.43745,22.15093~60.4402,22.1662~60.44177,22.18809~60.43334,22.19685~60.42639,22.18912~60.42142,22.17058~60.42463,22.15582~60.42085,22.14449
+undefined^#FF0000,5,1,#ff8800,0.4^^60.43186,22.10827~60.4223,22.10735~60.42254,22.10205~60.41546,22.0972~60.41587,22.09045~60.42412,22.0846~60.42765,22.08646
+undefined^#FF0000,5,1,#ff8800,0.4^^60.44991,22.24738~60.45435,22.25976~60.448,22.2675~60.4447,22.25516
+undefined^#FF0000,5,1,#ff8800,0.4^^60.45217,22.26268~60.45381,22.26794~60.45108,22.27178~60.4493,22.26616
+undefined^#FF0000,5,1,#ff8800,0.4^^60.42275,22.24174~60.43039,22.24392~60.43345,22.24115~60.43304,22.23017~60.43182,22.22603~60.4298,22.2295~60.42591,22.23195~60.42344,22.23659
+undefined^#FF0000,5,1,#ff8800,0.4^^60.44096,22.24787~60.43597,22.255~60.43152,22.24341~60.43358,22.2417~60.43332,22.2306~60.43608,22.23889
+undefined^#FF0000,5,1,#ff8800,0.4^^60.48239,22.29941~60.48947,22.30446~60.49533,22.31812~60.48423,22.34836~60.4741,22.3328~60.47605,22.32512~60.47535,22.32003~60.4791,22.30809
+undefined^#FF0000,5,1,#ff8800,0.4^^60.45561,22.3637~60.45679,22.38985~60.45604,22.42422~60.44062,22.42533~60.44181,22.39838~60.43955,22.36977~60.44301,22.36914
+undefined^#FF0000,5,1,#ff8800,0.4^^60.42351,22.24337~60.43036,22.24491~60.43116,22.24466~60.43677,22.259~60.42605,22.26388
+undefined^#FF0000,5,1,#ff8800,0.4^^60.43711,22.25976~60.4297,22.26362~60.43476,22.28431~60.4409,22.27738
+undefined^#FF0000,5,1,#ff8800,0.4^^60.44109,22.27813~60.44283,22.28328~60.43965,22.28611~60.44219,22.29813~60.43711,22.3013~60.43474,22.28554
+undefined^#FF0000,5,1,#ff8800,0.4^^60.44452,22.25624~60.44774,22.26929~60.44727,22.2704~60.4496,22.2777~60.44736,22.2807~60.44634,22.27856~60.44338,22.28208~60.44145,22.27749~60.43898,22.26476
+undefined^#FF0000,5,1,#ff8800,0.4^^60.47118,22.16063~60.47947,22.18281~60.47535,22.18783~60.4732,22.189~60.47133,22.1923~60.47014,22.19453~60.46911,22.19307~60.46615,22.19058~60.46354,22.18959~60.462,22.18921~60.46103,22.18338~60.46691,22.17196
+undefined^#FF0000,5,1,#ff8800,0.4^^60.48169,22.16286~60.47717,22.17423~60.4715,22.16041~60.47522,22.1529
+undefined^#FF0000,5,1,#ff8800,0.4^^60.48953,22.15058~60.49328,22.17831~60.48793,22.18101~60.48119,22.17755~60.48323,22.16537~60.48313,22.15071
+undefined^#FF0000,5,1,#ff8800,0.4^^60.48302,22.16453~60.48082,22.17753~60.48234,22.17873~60.48201,22.18088~60.47987,22.18217~60.47708,22.17531~60.48196,22.1631
+undefined^#FF0000,5,1,#ff8800,0.4^^60.48421,22.13076~60.48235,22.13745~60.47389,22.1541~60.46755,22.13231~60.47493,22.12153~60.48071,22.11884
+undefined^#FF0000,5,1,#ff8800,0.4^^60.47353,22.1541~60.47091,22.15934~60.46926,22.15591~60.46098,22.15119~60.46196,22.13721~60.46798,22.145
+undefined^#FF0000,5,1,#ff8800,0.4^^60.473,22.15251~60.46819,22.14438~60.46243,22.13627~60.46293,22.12142~60.46689,22.13144
+undefined^#FF0000,5,1,#ff8800,0.4^^60.47074,22.1599~60.46629,22.17157~60.46058,22.182~60.46054,22.17163~60.45963,22.15159~60.46511,22.15427~60.46911,22.15644
+undefined^#FF0000,5,1,#ff8800,0.4^^60.45853,22.19019~60.45508,22.19054~60.45053,22.19882~60.44925,22.21523~60.45314,22.22142~60.45383,22.22435
+undefined^#FF0000,5,1,#ff8800,0.4^^60.46113,22.19127~60.46132,22.19824~60.46001,22.2073~60.45919,22.21152~60.45652,22.2088~60.45931,22.19073
+undefined^#FF0000,5,1,#ff8800,0.4^^60.46139,22.19131~60.46428,22.19195~60.46767,22.194~60.47022,22.19663~60.46369,22.20573~60.45959,22.21049~60.46167,22.19811
+undefined^#FF0000,5,1,#ff8800,0.4^^60.47602,22.25242~60.47484,22.26457~60.47306,22.26336~60.46917,22.26521~60.46496,22.26894~60.46259,22.26148~60.46492,22.24917~60.47087,22.25384~60.47163,22.25338
+undefined^#FF0000,5,1,#ff8800,0.4^^60.48884,22.18543~60.48132,22.18556~60.47867,22.1974~60.47689,22.20328~60.48104,22.21122~60.48704,22.20809~60.48823,22.19436
+undefined^#FF0000,5,1,#ff8800,0.4^^60.48122,22.18547~60.47853,22.19719~60.47645,22.20365~60.47299,22.19482
+undefined^#FF0000,5,1,#ff8800,0.4^^60.49404,22.26856~60.49248,22.28712~60.48973,22.30216~60.48271,22.29808~60.47627,22.28925~60.47537,22.27866~60.47564,22.26596~60.48309,22.27138~60.48695,22.27301
+undefined^#FF0000,5,1,#ff8800,0.4^^60.43241,22.32263~60.4233,22.33585~60.42025,22.32107~60.42818,22.31196~60.43215,22.31439~60.43258,22.31667
+undefined^#FF0000,5,1,#ff8800,0.4^^60.4422,22.29864~60.43473,22.30327~60.43438,22.32316~60.43887,22.3172~60.44454,22.30841
+undefined^#FF0000,5,1,#ff8800,0.4^^60.42961,22.26392~60.4343,22.28456~60.43499,22.29225~60.43245,22.29564~60.42894,22.29349~60.42506,22.27929~60.42531,22.26699
+undefined^#FF0000,5,1,#ff8800,0.4^^60.42521,22.26577~60.42195,22.26877~60.41579,22.26733~60.41625,22.27877~60.42052,22.2783~60.42469,22.2762
+undefined^#FF0000,5,1,#ff8800,0.4^^60.42288,22.24603~60.42536,22.26349~60.4219,22.26787~60.4157,22.26641~60.41536,22.2713~60.40943,22.26612~60.41382,22.25849
+undefined^#FF0000,5,1,#ff8800,0.4^^60.40898,22.26645~60.41573,22.27229~60.4162,22.27959~60.41694,22.28892~60.41809,22.29195~60.41392,22.29396~60.40429,22.28059~60.40683,22.26871
+undefined^#FF0000,5,1,#ff8800,0.4^^60.41536,22.18092~60.41875,22.19766~60.4136,22.20165~60.41187,22.18124~60.41382,22.18224
+undefined^#FF0000,5,1,#ff8800,0.4^^60.41156,22.18045~60.41307,22.20002~60.40765,22.19821~60.40864,22.17655
+undefined^#FF0000,5,1,#ff8800,0.4^^60.40834,22.17552~60.40773,22.19004~60.40054,22.18878~60.40212,22.18257~60.40071,22.1682~60.40567,22.17207
+undefined^#FF0000,5,1,#ff8800,0.4^^60.38922,22.16942~60.39234,22.18616~60.38439,22.1926~60.38445,22.16751
+undefined^#FF0000,5,1,#ff8800,0.4^^60.39291,22.18552~60.39257,22.19483~60.39348,22.20569~60.39844,22.21229~60.3995,22.18893
+undefined^#FF0000,5,1,#ff8800,0.4^^60.40769,22.19037~60.40056,22.18946~60.40044,22.19775~60.40256,22.19895~60.40733,22.19792
+undefined^#FF0000,5,1,#ff8800,0.4^^60.41343,22.21989~60.40506,22.22324~60.40398,22.20494~60.4127,22.2044
+undefined^#FF0000,5,1,#ff8800,0.4^^60.44634,22.22058~60.44405,22.22474~60.44395,22.23328~60.44604,22.23667~60.44797,22.23457~60.44768,22.22393
+undefined^#FF0000,5,1,#ff8800,0.4^^60.44594,22.19951~60.4478,22.19877~60.44824,22.21556~60.44775,22.22051~60.44611,22.22006~60.44378,22.22384~60.44355,22.23234~60.44448,22.23491~60.44422,22.23603~60.43618,22.23813~60.43201,22.22567~60.43402,22.21505~60.43541,22.20654~60.44264,22.2068
+undefined^#FF0000,5,1,#ff8800,0.4^^60.44896,22.2171~60.44767,22.22204~60.44837,22.22394~60.44827,22.23472~60.4463,22.2371~60.45119,22.24507~60.45133,22.24013~60.45296,22.23209~60.45315,22.22472
+undefined^#FF0000,5,1,#ff8800,0.4^^60.47143,22.30907~60.46766,22.3065~60.46638,22.30976~60.46627,22.32465~60.46868,22.33113~60.47168,22.33288~60.47388,22.329~60.47425,22.32349~60.47351,22.31668
+undefined^#FF0000,5,1,#ff8800,0.4^^60.46155,22.29103~60.46086,22.29293~60.45902,22.28974~60.45965,22.28794~60.46039,22.28656~60.46118,22.28815~60.46077,22.28918
+undefined^#FF0000,5,1,#ff8800,0.4^^60.4604,22.28644~60.46128,22.28815~60.46084,22.28915~60.4616,22.29102~60.46318,22.29159~60.46421,22.29127~60.46459,22.2903~60.46406,22.28743~60.46227,22.28269~60.46082,22.28075~60.46038,22.28315~60.46058,22.28521
+undefined^#FF0000,5,1,#ff8800,0.4^^60.46037,22.28649~60.4595,22.28811~60.45894,22.28975~60.45835,22.29101~60.45731,22.2896~60.45527,22.2912~60.45464,22.29024~60.45344,22.28649~60.45281,22.28577~60.45162,22.28202~60.45278,22.28007~60.45487,22.27889~60.45787,22.27826~60.45933,22.27867~60.46069,22.28068~60.46024,22.2831~60.46048,22.28519
+undefined^#FF0000,5,1,#ff8800,0.4^^60.45199,22.27478~60.45005,22.27763~60.45144,22.28188~60.45277,22.27968~60.45313,22.27621
+undefined^#FF0000,5,1,#ff8800,0.4^^60.44999,22.27767~60.45277,22.28687~60.45026,22.29051~60.44722,22.2813
+undefined^#FF0000,5,1,#ff8800,0.4^^60.41489,22.29662~60.40966,22.30021~60.41175,22.31038~60.41516,22.31797~60.41864,22.31381~60.41797,22.30828~60.41666,22.3036
+undefined^#FF0000,5,1,#ff8800,0.4^^60.41662,22.31787~60.41211,22.32495~60.41382,22.33615~60.41582,22.33948~60.41949,22.33244~60.41896,22.32201
+undefined^#FF0000,5,1,#ff8800,0.4^^60.43793,22.35164~60.43952,22.36344~60.43178,22.37284~60.42969,22.35957~60.43502,22.35297
+undefined^#FF0000,5,1,#ff8800,0.4^^60.43777,22.35091~60.43508,22.35207~60.4293,22.35903~60.42704,22.34468~60.43318,22.33569~60.43753,22.33349
+undefined^#FF0000,5,1,#ff8800,0.4^^60.43002,22.32731~60.43303,22.33487~60.4259,22.34668~60.42359,22.34244~60.42658,22.33374
+undefined^#FF0000,5,1,#ff8800,0.4^^60.43107,22.29598~60.43256,22.30139~60.42946,22.30611~60.42796,22.30954~60.42544,22.30964~60.42451,22.30518~60.42191,22.30171~60.42346,22.29444~60.42401,22.29166~60.42781,22.29229~60.42907,22.29398
+undefined^#FF0000,5,1,#ff8800,0.4^^60.4247,22.27686~60.42481,22.27978~60.42649,22.28607~60.42571,22.29051~60.42375,22.29105~60.42174,22.30152~60.41947,22.29918~60.41873,22.29367~60.41824,22.29177~60.41723,22.28889~60.41632,22.27951~60.42068,22.27894
+undefined^#FF0000,5,1,#ff8800,0.4^^60.41822,22.29268~60.41866,22.29452~60.41929,22.29923~60.42414,22.30531~60.42625,22.31349~60.41981,22.32087~60.41902,22.31332~60.41824,22.30827~60.41482,22.29424
+undefined^#FF0000,5,1,#ff8800,0.4^^60.50456,22.27092~60.4942,22.26937~60.49296,22.28753~60.49025,22.30289~60.49583,22.31615~60.50197,22.30518~60.50918,22.29724~60.50454,22.27839
+undefined^#FF0000,5,1,#ff8800,0.4^^60.51907,22.29928~60.50948,22.29774~60.50223,22.30547~60.49598,22.31774~60.4924,22.32691~60.49714,22.33434~60.50004,22.33825~60.50487,22.34078~60.50577,22.34722~60.50741,22.35198~60.51125,22.35147~60.51308,22.34955~60.51599,22.35211~60.51867,22.34943~60.52121,22.35074~60.52359,22.34838~60.52687,22.35005~60.5276,22.32719~60.52621,22.30748
+undefined^#FF0000,5,1,#ff8800,0.4^^60.53067,22.28298~60.53473,22.28328~60.53746,22.28761~60.53782,22.29628~60.53611,22.30546~60.53301,22.31246~60.52963,22.31031~60.52767,22.30177~60.52746,22.29008~60.5278,22.28504
+undefined^#FF0000,5,1,#ff8800,0.4^^60.54416,22.33589~60.53523,22.3407~60.5348,22.35709~60.53816,22.38258~60.5504,22.37649~60.55019,22.35541
+undefined^#FF0000,5,1,#ff8800,0.4^^60.53831,22.28826~60.53831,22.29639~60.5366,22.30597~60.53508,22.31491~60.53941,22.33053~60.54105,22.3343~60.54776,22.32782~60.55521,22.31581~60.555,22.30319~60.5488,22.29272~60.54211,22.28673
+undefined^#FF0000,5,1,#ff8800,0.4^^60.73911,22.40833~60.65804,22.36507~60.65297,22.46585~60.69574,22.47177~60.72608,22.44863
+undefined^#FF0000,5,1,#ff8800,0.4^^60.63228,22.25193~60.63841,22.25663~60.63974,22.26757~60.63789,22.27982~60.63179,22.28508~60.62939,22.28474~60.62591,22.27817~60.62497,22.26963~60.62585,22.26294~60.62816,22.25642
+undefined^#FF0000,5,1,#ff8800,0.4^^60.61701,22.29598~60.61844,22.29997~60.62151,22.30392~60.62177,22.31443~60.61989,22.32263~60.61751,22.32744~60.61309,22.32727~60.6105,22.32349~60.60898,22.3134~60.60578,22.30641~60.60473,22.29837~60.60846,22.29452~60.61393,22.29362
+undefined^#FF0000,5,1,#ff8800,0.4^^60.63183,22.28765~60.62286,22.30757~60.62203,22.30275~60.61859,22.29876~60.61793,22.29512~60.6144,22.291~60.61267,22.28526~60.61524,22.26766~60.62429,22.25701~60.62436,22.27036~60.62543,22.27867~60.62748,22.28476
+undefined^#FF0000,5,1,#ff8800,0.4^^60.5485,22.21865~60.54859,22.22521~60.54679,22.23345~60.54212,22.23594~60.53736,22.23298~60.53583,22.22764~60.53504,22.22218~60.53565,22.21249~60.53877,22.21165
+undefined^#FF0000,5,1,#ff8800,0.4^^60.52877,22.21779~60.52955,22.22865~60.52875,22.23582~60.52454,22.23461~60.52214,22.22831~60.52235,22.21873~60.5245,22.21595
+undefined^#FF0000,5,1,#ff8800,0.4^^60.51975,22.21418~60.52028,22.23079~60.51605,22.23247~60.51343,22.23208~60.51251,22.2238~60.51284,22.21253~60.51642,22.20939
+undefined^#FF0000,5,1,#ff8800,0.4^^60.5124,22.21225~60.51248,22.22451~60.51299,22.23247~60.50741,22.23603~60.50545,22.23423~60.50505,22.22405~60.50632,22.20916~60.50953,22.20603~60.51158,22.20914
+undefined^#FF0000,5,1,#ff8800,0.4^^60.50515,22.21667~60.49938,22.21689~60.50086,22.23793~60.50539,22.23839~60.50476,22.22388
+undefined^#FF0000,5,1,#ff8800,0.4^^60.56523,22.23268~60.56325,22.23641~60.55938,22.23357~60.55631,22.23255~60.55635,22.22264~60.55931,22.22038~60.56377,22.22117~60.56525,22.22697
+undefined^#FF0000,5,1,#ff8800,0.4^^60.59679,22.27705~60.59422,22.28856~60.58484,22.27633~60.59074,22.261~60.59537,22.26289
+undefined^#FF0000,5,1,#ff8800,0.4^^60.60622,22.28272~60.60374,22.29667~60.59449,22.2892~60.59743,22.27614
+undefined^#FF0000,5,1,#ff8800,0.4^^60.5469,22.2341~60.54117,22.23667~60.54289,22.25424~60.54653,22.25504~60.54902,22.25303~60.5496,22.24528~60.54848,22.23719
+undefined^#FF0000,5,1,#ff8800,0.4^^60.53373,22.23598~60.53299,22.25298~60.5291,22.25375~60.52862,22.24042~60.53072,22.23656
+undefined^#FF0000,5,1,#ff8800,0.4^^60.49101,22.19397~60.49163,22.19834~60.49194,22.20178~60.4921,22.20437~60.49179,22.20583~60.49126,22.2083~60.48972,22.20796~60.48979,22.2039~60.48898,22.19994~60.4889,22.19673~60.4897,22.19482
+undefined^#FF0000,5,1,#ff8800,0.4^^60.4934,22.17886~60.48956,22.18084~60.4911,22.19373~60.49171,22.19841~60.49219,22.20442~60.49339,22.21451~60.4971,22.21457
+undefined^#FF0000,5,1,#ff8800,0.4^^60.49721,22.14869~60.50015,22.16573~60.49277,22.17238~60.48988,22.15109
+undefined^#FF0000,5,1,#ff8800,0.4^^60.48622,22.15035~60.48616,22.14137~60.49151,22.13889~60.49218,22.14262~60.49193,22.14929~60.48956,22.15012
+undefined^#FF0000,5,1,#ff8800,0.4^^60.48615,22.14136~60.48618,22.15052~60.48319,22.15037~60.48113,22.14966~60.47855,22.14669~60.48296,22.13831
+undefined^#FF0000,5,1,#ff8800,0.4^^60.46621,22.01291~60.4756,22.03136~60.46964,22.04724~60.45966,22.02782
+undefined^#FF0000,5,1,#ff8800,0.4^^60.48839,22.11325~60.48786,22.11544~60.48829,22.11771~60.48993,22.11788~60.49843,22.11377~60.49917,22.10025~60.49584,22.08536~60.4908,22.08252~60.48687,22.07969~60.48549,22.08037~60.48585,22.09461~60.48687,22.09672~60.48795,22.10552~60.48788,22.10548
+undefined^#FF0000,5,1,#ff8800,0.4^^60.48793,22.05986~60.48292,22.06321~60.48423,22.07634~60.4891,22.07471
+undefined^#FF0000,5,1,#ff8800,0.4^^60.47963,22.0434~60.48179,22.04952~60.48136,22.05795~60.47832,22.06057~60.47644,22.05118~60.4777,22.04725
+undefined^#FF0000,5,1,#ff8800,0.4^^60.47451,22.05205~60.47139,22.04357~60.47441,22.03658~60.47698,22.04613
+undefined^#FF0000,5,1,#ff8800,0.4^^60.48013,22.04005~60.47721,22.04623~60.4745,22.03626~60.47745,22.02811~60.47991,22.03291
+undefined^#FF0000,5,1,#ff8800,0.4^^60.46934,22.00377~60.46376,22.006~60.45842,22.00107~60.45739,21.99416~60.45956,21.9855~60.4627,21.98495~60.46486,21.9869~60.46816,21.99042~60.47118,21.99553~60.47116,22.00085
+undefined^#FF0000,5,1,#ff8800,0.4^^60.4583,21.9657~60.45409,21.96832~60.45339,21.98699~60.45687,21.98618~60.45903,21.97556
+undefined^#FF0000,5,1,#ff8800,0.4^^60.46479,21.93772~60.4601,21.94146~60.45912,21.95794~60.45933,21.96746~60.46305,21.96746~60.46538,21.95206
+undefined^#FF0000,5,1,#ff8800,0.4^^60.45817,21.93747~60.45787,21.95395~60.45461,21.96017~60.44968,21.95759~60.44452,21.94811~60.44901,21.93678~60.4558,21.93259
+undefined^#FF0000,5,1,#ff8800,0.4^^60.47289,21.92545~60.47127,21.93193~60.4642,21.93661~60.45933,21.93905~60.45779,21.93472~60.45682,21.93004~60.46058,21.92725~60.46553,21.92554
+undefined^#FF0000,5,1,#ff8800,0.4^^60.44672,21.99368~60.44539,22.01072~60.43828,22.0106~60.43692,21.99503~60.4419,21.98714
+undefined^#FF0000,5,1,#ff8800,0.4^^60.43249,21.99471~60.42817,21.99317~60.42641,21.99991~60.42794,22.00707~60.43068,22.00725~60.43279,22.00142
+undefined^#FF0000,5,1,#ff8800,0.4^^60.4291,22.01385~60.42671,22.02724~60.4225,22.02561~60.42091,22.01817~60.42152,22.00729~60.42571,22.00965
+undefined^#FF0000,5,1,#ff8800,0.4^^60.43711,22.03643~60.43147,22.03844~60.43175,22.02212~60.43729,22.02329~60.43808,22.03051
+undefined^#FF0000,5,1,#ff8800,0.4^^60.43713,22.03784~60.43264,22.03969~60.4338,22.05253~60.4375,22.05188~60.43833,22.04534
+undefined^#FF0000,5,1,#ff8800,0.4^^60.43237,22.04244~60.43385,22.05553~60.43279,22.06823~60.42902,22.06797~60.42481,22.06334~60.42356,22.05095~60.42731,22.04409
+undefined^#FF0000,5,1,#ff8800,0.4^^60.44632,22.01141~60.43693,22.01184~60.43838,22.03102~60.4431,22.0342~60.44734,22.02842
+undefined^#FF0000,5,1,#ff8800,0.4^^60.45153,21.99738~60.45208,22.01853~60.44772,22.0278~60.44674,22.0081~60.4474,21.99635
+undefined^#FF0000,5,1,#ff8800,0.4^^60.45536,21.99716~60.45548,22.01993~60.45229,22.01896~60.45182,21.99755
+undefined^#FF0000,5,1,#ff8800,0.4^^60.45817,22.00171~60.45587,22.00239~60.45578,22.02025~60.45977,22.02428~60.46318,22.01614~60.46463,22.00757
+undefined^#FF0000,5,1,#ff8800,0.4^^60.38468,21.92931~60.3751,21.92828~60.37034,21.933~60.37009,21.94914~60.37247,21.95781~60.37684,21.96141~60.38138,21.95583~60.38395,21.9437
+undefined^#FF0000,5,1,#ff8800,0.4^^60.39196,21.96356~60.38507,21.95802~60.38214,21.95519~60.38389,21.94663~60.38839,21.94785~60.3915,21.95289~60.39255,21.95558
+undefined^#FF0000,5,1,#ff8800,0.4^^60.39219,21.96429~60.39327,21.97081~60.39785,21.97493~60.40239,21.98922~60.39959,22.00454~60.3896,22.00042~60.38519,21.98236~60.38545,21.96723~60.38557,21.9592
+undefined^#FF0000,5,1,#ff8800,0.4^^60.37034,21.85902~60.37798,21.86576~60.379,21.88296~60.37701,21.89919~60.37115,21.89893~60.36266,21.89318
+undefined^#FF0000,5,1,#ff8800,0.4^^60.36147,21.91858~60.34742,21.89533~60.35684,21.81905~60.36498,21.816~60.36818,21.82743~60.36631,21.86932~60.3619,21.89292
+undefined^#FF0000,5,1,#ff8800,0.4^^60.345,21.93592~60.35307,21.93884~60.35161,21.96677~60.34273,21.96631
+undefined^#FF0000,5,1,#ff8800,0.4^^60.34721,21.8967~60.34462,21.93069~60.35386,21.93677~60.36105,21.94742~60.36139,21.91931
+undefined^#FF0000,5,1,#ff8800,0.4^^60.37034,21.91867~60.36958,21.96193~60.36075,21.95832~60.36209,21.91776
+undefined^#FF0000,5,1,#ff8800,0.4^^60.33213,21.94819~60.33858,22.00361~60.33052,22.04098~60.31658,22.04338~60.30279,22.02163~60.31461,21.96875~60.3181,21.9125~60.3248,21.91719~60.32677,21.94377
+undefined^#FF0000,5,1,#ff8800,0.4^^60.31615,21.91275~60.31411,21.96682~60.30382,22.00253~60.2732,21.95927~60.27022,21.9039~60.27743,21.86993~60.31041,21.86229
+undefined^#FF0000,5,1,#ff8800,0.4^^60.4588,21.89253~60.46342,21.91277~60.45913,21.92518~60.45353,21.92335~60.45278,21.89848
+undefined^#FF0000,5,1,#ff8800,0.4^^60.41993,21.88532~60.41981,21.90974~60.41084,21.90961~60.40606,21.90507~60.40658,21.88517~60.41376,21.88275
+undefined^#FF0000,5,1,#ff8800,0.4^^60.40559,21.87069~60.3973,21.86145~60.39395,21.86816~60.3913,21.88425~60.39673,21.89541~60.40183,21.90391~60.40548,21.90203~60.40573,21.88763~60.40638,21.87778
+undefined^#FF0000,5,1,#ff8800,0.4^^60.41411,21.86657~60.40649,21.87274~60.4061,21.86952~60.39758,21.85996~60.3999,21.84439~60.40677,21.84254~60.41169,21.84863
+undefined^#FF0000,5,1,#ff8800,0.4^^60.41625,21.84606~60.41236,21.83934~60.4107,21.84571~60.41211,21.8485~60.41383,21.85666~60.41599,21.85209
+undefined^#FF0000,5,1,#ff8800,0.4^^60.41608,21.82546~60.4126,21.83867~60.41642,21.84571~60.41676,21.8476~60.41523,21.85736~60.41847,21.86356~60.42265,21.85766~60.42449,21.84555~60.42942,21.83726~60.4271,21.82994~60.42242,21.82972~60.41895,21.82501
+undefined^#FF0000,5,1,#ff8800,0.4^^60.40953,21.82254~60.40847,21.8294~60.39851,21.83172~60.39584,21.81224~60.39433,21.78955~60.40101,21.78666~60.40682,21.80082
+undefined^#FF0000,5,1,#ff8800,0.4^^60.39418,21.79404~60.38477,21.79782~60.3818,21.81018~60.39284,21.83845~60.3988,21.8367~60.39539,21.81194
+undefined^#FF0000,5,1,#ff8800,0.4^^60.44168,21.89524~60.43967,21.92588~60.4315,21.92446~60.43124,21.91478~60.43522,21.91076~60.43514,21.89388
+undefined^#FF0000,5,1,#ff8800,0.4^^60.31005,22.31126~60.30829,22.31139~60.30549,22.32734~60.3091,22.33233
+undefined^#FF0000,5,1,#ff8800,0.4^^60.31726,22.31225~60.31029,22.31812~60.31014,22.31119~60.30795,22.30609~60.31543,22.30019
+undefined^#FF0000,5,1,#ff8800,0.4^^NaN,NaN
+undefined^#FF0000,5,1,#ff8800,0.4^^60.30946,22.30409~60.30757,22.30542~60.30366,22.30785~60.29686,22.30906~60.2964,22.29239~60.30305,22.29152~60.30762,22.29572~60.30874,22.29992
+undefined^#FF0000,5,1,#ff8800,0.4^^60.29872,22.3089~60.29602,22.30952~60.29306,22.30779~60.2912,22.31036~60.29087,22.31654~60.2948,22.31885~60.30009,22.31516~60.2991,22.31073
+undefined^#FF0000,5,1,#ff8800,0.4^^60.30564,22.32491~60.30443,22.32312~60.30334,22.31706~60.3037,22.30853~60.30703,22.30615~60.30808,22.31085
+undefined^#FF0000,5,1,#ff8800,0.4^^60.30238,22.31725~60.30307,22.32282~60.30508,22.3254~60.30326,22.33505~60.29891,22.32422~60.29814,22.31792~60.30027,22.31532
+undefined^#FF0000,5,1,#ff8800,0.4^^60.31741,22.31302~60.3105,22.31933~60.31371,22.33881~60.32013,22.3443~60.32292,22.3345~60.32233,22.32158
+undefined^#FF0000,5,1,#ff8800,0.4^^60.35167,22.34817~60.34309,22.34877~60.34296,22.37713~60.34534,22.39574~60.35086,22.39134~60.35266,22.37124~60.35292,22.35754
+undefined^#FF0000,5,1,#ff8800,0.4^^60.32516,22.33495~60.3187,22.36885~60.32113,22.38284~60.32541,22.38764~60.33406,22.35426~60.33033,22.34112
+undefined^#FF0000,5,1,#ff8800,0.4^^60.36324,22.34812~60.35388,22.34658~60.35574,22.37044~60.36562,22.36825
+undefined^#FF0000,5,1,#ff8800,0.4^^60.41358,22.22011~60.40495,22.22367~60.40406,22.2398~60.40792,22.23734~60.41234,22.23324~60.41464,22.22954~60.41648,22.22409
+undefined^#FF0000,5,1,#ff8800,0.4^^60.50787,22.44893~60.50853,22.45912~60.50819,22.46699~60.50497,22.46741~60.50317,22.4648~60.50189,22.45962~60.50153,22.45521~60.50215,22.45004~60.50255,22.44831~60.50485,22.44773
+undefined^#FF0000,5,1,#ff8800,0.4^^60.42716,22.51605~60.42152,22.51764~60.42273,22.53824~60.42689,22.53533~60.42836,22.52668
+undefined^#FF0000,5,1,#ff8800,0.4^^60.42815,22.51498~60.42365,22.51652~60.42286,22.50405~60.42545,22.50265~60.42893,22.50496~60.4312,22.51206
+undefined^#FF0000,5,1,#ff8800,0.4^^60.42341,22.51682~60.42117,22.51721~60.42146,22.51966~60.41629,22.51476~60.41456,22.50974~60.4169,22.50669~60.42265,22.50845
+undefined^#FF0000,5,1,#ff8800,0.4^^60.41695,22.42666~60.40546,22.43262~60.40915,22.45477~60.42096,22.44649
+undefined^#FF0000,5,1,#ff8800,0.4^^60.42114,22.44678~60.42228,22.457~60.41074,22.47228~60.40917,22.45584
+undefined^#FF0000,5,1,#ff8800,0.4^^60.4226,22.45713~60.42427,22.45721~60.42595,22.46996~60.42413,22.48103~60.41961,22.48056~60.41902,22.46213
+undefined^#FF0000,5,1,#ff8800,0.4^^60.42517,22.48142~60.41548,22.48056~60.41682,22.503~60.42228,22.50318~60.42232,22.49283
+undefined^#FF0000,5,1,#ff8800,0.4^^60.45777,22.67578~60.45959,22.68239~60.45933,22.69372~60.45603,22.70428~60.45167,22.70831~60.44664,22.70857~60.44423,22.69632~60.44532,22.68055~60.44647,22.67252~60.44863,22.67166
+undefined^#FF0000,5,1,#ff8800,0.4^^60.45944,22.67733~60.46092,22.69544~60.46672,22.69458~60.46699,22.66836~60.46703,22.6487~60.4624,22.64464
+undefined^#FF0000,5,1,#ff8800,0.4^^60.46799,22.7305~60.46779,22.73739~60.465,22.74003~60.46261,22.73803~60.46217,22.73225~60.4629,22.72985
+undefined^#FF0000,5,1,#ff8800,0.4^^60.45777,22.70256~60.45065,22.7114~60.46046,22.73801~60.46591,22.71834
+undefined^#FF0000,5,1,#ff8800,0.4^^60.43692,22.68321~60.43455,22.69084~60.42925,22.69067~60.42557,22.6866~60.42517,22.68029~60.42591,22.67351~60.42804,22.66844~60.43214,22.66584~60.43605,22.67028~60.43688,22.67745
+undefined^#FF0000,5,1,#ff8800,0.4^^60.4826,22.371~60.47977,22.38142~60.47488,22.38627~60.47167,22.37992~60.47257,22.36853~60.4745,22.36182
+undefined^#FF0000,5,1,#ff8800,0.4^^60.47141,22.35692~60.46921,22.37027~60.4605,22.35851~60.46692,22.34488
+undefined^#FF0000,5,1,#ff8800,0.4^^60.49049,22.3955~60.48326,22.40232~60.47488,22.38705~60.48028,22.38164~60.48316,22.37111
+undefined^#FF0000,5,1,#ff8800,0.4^^60.49036,22.39645~60.49004,22.40401~60.49285,22.41177~60.49002,22.42026~60.48729,22.42443~60.48303,22.40307
+undefined^#FF0000,5,1,#ff8800,0.4^^60.49323,22.41323~60.49226,22.41872~60.48829,22.42606~60.49018,22.4337~60.49554,22.43417~60.49989,22.42843~60.49778,22.41595
+undefined^#FF0000,5,1,#ff8800,0.4^^60.50025,22.43061~60.49552,22.43605~60.49056,22.43513~60.49038,22.45086~60.49707,22.44944~60.50221,22.44357
+undefined^#FF0000,5,1,#ff8800,0.4^^60.51397,22.46206~60.50845,22.46544~60.50864,22.45903~60.50805,22.44888~60.51385,22.449
+undefined^#FF0000,5,1,#ff8800,0.4^^60.51392,22.46251~60.50851,22.46565~60.50827,22.46807~60.51109,22.47562~60.51545,22.46873
+undefined^#FF0000,5,1,#ff8800,0.4^^60.45911,22.21202~60.45806,22.22069~60.4563,22.23515~60.45568,22.23772~60.45322,22.23343~60.45646,22.20923
+undefined^#FF0000,5,1,#ff8800,0.4^^60.49742,22.14861~60.50046,22.16552~60.50749,22.16646~60.51229,22.15288~60.51079,22.12724~60.5046,22.11986~60.49856,22.12634~60.49676,22.13936
+undefined^#FF0000,5,1,#ff8800,0.4^^60.5154,22.37237~60.5143,22.39314~60.50793,22.40026~60.50015,22.38808~60.49888,22.37503~60.50081,22.36358~60.50646,22.359~60.51193,22.3607
+undefined^#FF0000,5,1,#ff8800,0.4^^60.55994,22.41537~60.555,22.44945~60.57174,22.46909~60.57958,22.43482~60.57043,22.42093
+undefined^#FF0000,5,1,#ff8800,0.4^^60.65712,22.51081~60.62803,22.52145~60.62278,22.60523~60.64753,22.63429~60.6662,22.61381~60.66486,22.54679
+undefined^#FF0000,5,1,#ff8800,0.4^^60.41478,22.35632~60.40355,22.35623~60.40425,22.39331~60.41563,22.39314
+undefined^#FF0000,5,1,#ff8800,0.4^^60.37586,23.08399~60.40826,23.09137~60.40088,23.20724~60.35661,23.16847
+undefined^#FF0000,5,1,#ff8800,0.4^^60.17772,21.45699~60.20832,21.56301~60.21663,21.71242~60.19172,21.88408~60.06724,21.92322~60.0621,21.4532~60.12773,21.4083
+undefined^#FF0000,5,1,#ff8800,0.4^^60.5184,22.29066~60.50809,22.2868~60.50501,22.26305~60.50686,22.23835~60.51316,22.23453~60.51705,22.24268
+undefined^#FF0000,5,1,#ff8800,0.4^^60.58368,22.71183~60.5907,22.72732~60.58924,22.75895~60.57904,22.75406~60.57702,22.72431
+undefined^#FF0000,5,1,#ff8800,0.4^^60.66418,23.1142~60.64273,23.11944~60.645,23.1651~60.66338,23.1621
+undefined^#FF0000,5,1,#ff8800,0.4^^60.47127,22.38121~60.46374,22.39039~60.46065,22.42348~60.46995,22.43357~60.48456,22.4226~60.48176,22.40141
+undefined^#FF0000,5,1,#ff8800,0.4^^60.59725,22.8871~60.59487,22.92104~60.58161,22.9095~60.57626,22.87997~60.58278,22.86698~60.59122,22.87079
+undefined^#FF0000,5,1,#ff8800,0.4^^60.47522,22.2368~60.4772,22.24399~60.4774,22.25062~60.4708,22.25337~60.46795,22.25135~60.4713,22.23669~60.47455,22.23838
+undefined^#FF0000,5,1,#ff8800,0.4^^60.48497,22.23079~60.47757,22.23225~60.47539,22.23637~60.47755,22.24371~60.47765,22.25101~60.4807,22.2507~60.48555,22.24749
+undefined^#FF0000,5,1,#ff8800,0.4^^60.4803,22.22448~60.47454,22.23796~60.46833,22.23435~60.47094,22.22033
+undefined^#FF0000,5,1,#ff8800,0.4^^60.48533,22.08042~60.48055,22.08599~60.48721,22.11904~60.48744,22.11588~60.48825,22.11327~60.4878,22.10522~60.48675,22.09685~60.48575,22.09462
+undefined^#FF0000,5,1,#ff8800,0.4^^60.46405,22.09132~60.4627,22.11106~60.47455,22.11768~60.4849,22.11197~60.48188,22.09514~60.47191,22.09863
+undefined^#FF0000,5,1,#ff8800,0.4^^60.46224,22.29508~60.46122,22.29679~60.4604,22.29517~60.46062,22.29415~60.46164,22.29403~60.46233,22.29434
+undefined^#FF0000,5,1,#ff8800,0.4^^60.6386,23.48019~60.64036,23.54104~60.61247,23.55108~60.60559,23.51006~60.61444,23.45856~60.62842,23.45907
+undefined^#FF0000,5,1,#ff8800,0.4^^60.4222,22.23671~60.41807,22.23096~60.41564,22.23169~60.4083,22.23886~60.40847,22.26201~60.42222,22.24487
+undefined^#FF0000,5,1,#ff8800,0.4^^60.46242,22.26276~60.45908,22.26551~60.45339,22.24715~60.45678,22.24115
+undefined^#FF0000,5,1,#ff8800,0.4^^60.46904,22.2353~60.46183,22.25873~60.45824,22.24483~60.46736,22.23274
+undefined^#FF0000,5,1,#ff8800,0.4^^60.46354,22.21109~60.46532,22.23178~60.45828,22.24375~60.45807,22.22897~60.46028,22.21318
+undefined^#FF0000,5,1,#ff8800,0.4^^60.48002,22.29883~60.47485,22.29218~60.47239,22.29136~60.47177,22.30714~60.47418,22.31576~60.47621,22.31538~60.48083,22.3011
+undefined^#FF0000,5,1,#ff8800,0.4^^60.47194,22.28444~60.46773,22.27778~60.46291,22.27042~60.46123,22.27052~60.46067,22.27275~60.46331,22.28014~60.46655,22.28452~60.47039,22.28564
+undefined^#FF0000,5,1,#ff8800,0.4^^60.46454,22.27109~60.47194,22.28216~60.47447,22.2786~60.47493,22.26699~60.47301,22.26558~60.46881,22.26787
+undefined^#FF0000,5,1,#ff8800,0.4^^60.44633,22.27881~60.44291,22.28361~60.43985,22.28621~60.44384,22.30489~60.44693,22.29655~60.44807,22.28946~60.44718,22.28422~60.44777,22.28313
+undefined^#FF0000,5,1,#ff8800,0.4^^60.44779,22.28316~60.451,22.29353~60.45184,22.29422~60.45213,22.29714~60.45129,22.29688~60.44466,22.30842~60.44396,22.30501~60.44706,22.29681~60.44823,22.28947~60.44727,22.28423
+undefined^#FF0000,5,1,#ff8800,0.4^^60.46486,22.29223~60.46296,22.29501~60.46267,22.29761~60.46128,22.2971~60.46032,22.29738~60.46069,22.30326~60.46243,22.30332~60.46421,22.3033~60.46594,22.29844~60.46581,22.29539
+undefined^#FF0000,5,1,#ff8800,0.4^^60.57752,22.31255~60.56217,22.37125~60.59623,22.42342~60.63292,22.45499~60.65058,22.46426~60.65584,22.36526~60.63174,22.35328~60.59817,22.33307~60.58865,22.32559
+@@@@@@
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/service.py	Sat Jun 10 16:45:41 2017 +0300
@@ -0,0 +1,114 @@
+#!/usr/bin/env python3
+from flask import Flask, render_template, abort
+from datetime import datetime, date, time, timedelta
+from misc import *
+import locale
+from busroute import supista_reitti
+from configparser import ConfigParser
+
+app = Flask(__name__)
+locale.setlocale(locale.LC_ALL, locale.getdefaultlocale())
+
+kielet = ['fi', 'sv', 'en', 'ru']
+kieli_ini = {}
+for kieli in kielet:
+	ini = ConfigParser()
+	ini.read(kieli + '.ini')
+	kieli_ini[kieli] = ini
+
+def käännä(nimi, osio):
+	kieli = sivun_kieli()
+	try:
+		return kieli_ini[kieli][osio][nimi]
+	except KeyError:
+		return nimi
+
+def sivun_kieli():
+	from flask import request
+	if request.args.get('sv') is not None:
+		return 'sv'
+	elif request.args.get('en') is not None:
+		return 'en'
+	elif request.args.get('ru') is not None:
+		return 'ru'
+	elif request.args.get('kääntämätön') is None:
+		return 'fi'
+	else:
+		return None
+
+@app.route('/pysäkki/<tunniste>')
+def pysäkkiaikataulu(tunniste):
+	from buses import pysäkit
+	from math import ceil
+	aikataulu = []
+	try:
+		pysäkki = pysäkit[tunniste]
+	except KeyError:
+		abort(404)
+	for (aika, pysähdys) in pysäkki.aikataulu(100):
+		kyltti = supista_reitti(pysähdys.ajo.suppea_reitti(pysähdys))
+		kyltti = [käännä(paikka, 'paikat') for paikka in kyltti]
+		kylttiesitys = ' - '.join(kyltti)
+		if len(kylttiesitys) > 25:
+			k = ceil(len(kyltti) / 2)
+			kylttiesitys = ' - '.join(kyltti[:k]) + '\n' + ' - '.join(kyltti[k:])
+		aikataulu.append({
+			'aika': muotoile_aika(aika),
+			'linja': pysähdys.ajo.linja.viite,
+			'kyltti': kylttiesitys,
+			'ajovuoro': pysähdys.ajo.nimi,
+			'yö': yö(aika),
+		})
+	return render_template(
+		'pysäkki.html',
+		aikataulu = aikataulu,
+		viite = tunniste,
+		nimi = käännä(pysäkki.nimi, 'pysäkit'),
+		linkki_karttaan = pysäkki.linkki_karttaan,
+		alue = pysäkki.alue,
+		sijainti = pysäkki.sijainti,
+	)
+
+@app.route('/ajovuoro/<numero>')
+def ajoreitti(numero):
+	from flask import request
+	from buses import ajot
+	try:
+		ajovuoro = ajot[numero]
+	except KeyError:
+		abort(404)
+	suppea = request.args.get('suppea') is not None
+	reitti = []
+	suppea_reitti = []
+	käydyt_alueet = set()
+	for pysähdys in ajovuoro.reitti:
+		aika = datetime.combine(tänään(), time()) + pysähdys.saapumisaika
+		muotoiltu_aika = muotoile_aika(aika)
+		reitti.append({
+			'aika': muotoiltu_aika,
+			'tunniste': pysähdys.pysäkki.tunniste,
+			'alue': käännä(pysähdys.pysäkki.alue or '', 'paikat'),
+			'nimi': käännä(pysähdys.pysäkki.nimi, 'pysäkit'),
+		})
+		alue = pysähdys.pysäkki.alue
+		if alue:
+			if alue not in käydyt_alueet:
+				suppea_reitti.append({
+					'aika': muotoiltu_aika,
+					'alue': alue,
+				})
+				käydyt_alueet.add(alue)
+	kyltti = supista_reitti([k['alue'] for k in suppea_reitti], kokonainen = True)
+	sivu = suppea and 'ajovuoro-suppea.html' or 'ajovuoro.html'
+	return render_template(sivu, reitti = reitti, suppea_reitti = suppea_reitti,
+						numero = numero, linja = ajovuoro.linja.viite,
+						selite = ' - '.join(käännä(paikka, 'paikat') for paikka in kyltti),
+						yö = yö(datetime.combine(tänään(), time()) + ajovuoro.reitti[-1].saapumisaika),
+						)
+
+if __name__ == '__main__':
+	from argparse import ArgumentParser
+	parser = ArgumentParser()
+	parser.add_argument('-p', '--port', type = int, default = 5000)
+	args = parser.parse_args()
+	app.run(debug = True, port = args.port)

mercurial