fix: commiting from linux
248
.gitignore
vendored
@@ -1,125 +1,125 @@
|
|||||||
# Editors
|
# Editors
|
||||||
.vscode/
|
.vscode/
|
||||||
.idea/
|
.idea/
|
||||||
|
|
||||||
# Vagrant
|
# Vagrant
|
||||||
.vagrant/
|
.vagrant/
|
||||||
|
|
||||||
# Mac/OSX
|
# Mac/OSX
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
|
||||||
# Windows
|
# Windows
|
||||||
Thumbs.db
|
Thumbs.db
|
||||||
|
|
||||||
# Source for the following rules: https://raw.githubusercontent.com/github/gitignore/master/Python.gitignore
|
# Source for the following rules: https://raw.githubusercontent.com/github/gitignore/master/Python.gitignore
|
||||||
# Byte-compiled / optimized / DLL files
|
# Byte-compiled / optimized / DLL files
|
||||||
__pycache__/
|
__pycache__/
|
||||||
*.py[cod]
|
*.py[cod]
|
||||||
*$py.class
|
*$py.class
|
||||||
|
|
||||||
# C extensions
|
# C extensions
|
||||||
*.so
|
*.so
|
||||||
|
|
||||||
# Distribution / packaging
|
# Distribution / packaging
|
||||||
.Python
|
.Python
|
||||||
build/
|
build/
|
||||||
develop-eggs/
|
develop-eggs/
|
||||||
dist/
|
dist/
|
||||||
downloads/
|
downloads/
|
||||||
eggs/
|
eggs/
|
||||||
.eggs/
|
.eggs/
|
||||||
lib/
|
lib/
|
||||||
lib64/
|
lib64/
|
||||||
parts/
|
parts/
|
||||||
sdist/
|
sdist/
|
||||||
var/
|
var/
|
||||||
wheels/
|
wheels/
|
||||||
*.egg-info/
|
*.egg-info/
|
||||||
.installed.cfg
|
.installed.cfg
|
||||||
*.egg
|
*.egg
|
||||||
MANIFEST
|
MANIFEST
|
||||||
|
|
||||||
# PyInstaller
|
# PyInstaller
|
||||||
# Usually these files are written by a python script from a template
|
# Usually these files are written by a python script from a template
|
||||||
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
||||||
*.manifest
|
*.manifest
|
||||||
*.spec
|
*.spec
|
||||||
|
|
||||||
# Installer logs
|
# Installer logs
|
||||||
pip-log.txt
|
pip-log.txt
|
||||||
pip-delete-this-directory.txt
|
pip-delete-this-directory.txt
|
||||||
|
|
||||||
# Unit test / coverage reports
|
# Unit test / coverage reports
|
||||||
htmlcov/
|
htmlcov/
|
||||||
.tox/
|
.tox/
|
||||||
.nox/
|
.nox/
|
||||||
.coverage
|
.coverage
|
||||||
.coverage.*
|
.coverage.*
|
||||||
.cache
|
.cache
|
||||||
nosetests.xml
|
nosetests.xml
|
||||||
coverage.xml
|
coverage.xml
|
||||||
*.cover
|
*.cover
|
||||||
.hypothesis/
|
.hypothesis/
|
||||||
.pytest_cache/
|
.pytest_cache/
|
||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
*.mo
|
*.mo
|
||||||
*.pot
|
*.pot
|
||||||
|
|
||||||
# Django stuff:
|
# Django stuff:
|
||||||
*.log
|
*.log
|
||||||
local_settings.py
|
local_settings.py
|
||||||
db.sqlite3
|
db.sqlite3
|
||||||
|
|
||||||
# Flask stuff:
|
# Flask stuff:
|
||||||
instance/
|
instance/
|
||||||
.webassets-cache
|
.webassets-cache
|
||||||
|
|
||||||
# Scrapy stuff:
|
# Scrapy stuff:
|
||||||
.scrapy
|
.scrapy
|
||||||
|
|
||||||
# Sphinx documentation
|
# Sphinx documentation
|
||||||
docs/_build/
|
docs/_build/
|
||||||
|
|
||||||
# PyBuilder
|
# PyBuilder
|
||||||
target/
|
target/
|
||||||
|
|
||||||
# Jupyter Notebook
|
# Jupyter Notebook
|
||||||
.ipynb_checkpoints
|
.ipynb_checkpoints
|
||||||
|
|
||||||
# IPython
|
# IPython
|
||||||
profile_default/
|
profile_default/
|
||||||
ipython_config.py
|
ipython_config.py
|
||||||
|
|
||||||
# pyenv
|
# pyenv
|
||||||
.python-version
|
.python-version
|
||||||
|
|
||||||
# celery beat schedule file
|
# celery beat schedule file
|
||||||
celerybeat-schedule
|
celerybeat-schedule
|
||||||
|
|
||||||
# SageMath parsed files
|
# SageMath parsed files
|
||||||
*.sage.py
|
*.sage.py
|
||||||
|
|
||||||
# Environments
|
# Environments
|
||||||
.env
|
.env
|
||||||
.venv
|
.venv
|
||||||
env/
|
env/
|
||||||
venv/
|
venv/
|
||||||
ENV/
|
ENV/
|
||||||
env.bak/
|
env.bak/
|
||||||
venv.bak/
|
venv.bak/
|
||||||
|
|
||||||
# Spyder project settings
|
# Spyder project settings
|
||||||
.spyderproject
|
.spyderproject
|
||||||
.spyproject
|
.spyproject
|
||||||
|
|
||||||
# Rope project settings
|
# Rope project settings
|
||||||
.ropeproject
|
.ropeproject
|
||||||
|
|
||||||
# mkdocs documentation
|
# mkdocs documentation
|
||||||
/site
|
/site
|
||||||
|
|
||||||
# mypy
|
# mypy
|
||||||
.mypy_cache/
|
.mypy_cache/
|
||||||
.dmypy.json
|
.dmypy.json
|
||||||
dmypy.jsons
|
dmypy.jsons
|
||||||
42
LICENSE
@@ -1,21 +1,21 @@
|
|||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
Copyright (c) 2021 Lucas Oskorep
|
Copyright (c) 2021 Lucas Oskorep
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
in the Software without restriction, including without limitation the rights
|
in the Software without restriction, including without limitation the rights
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
furnished to do so, subject to the following conditions:
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
The above copyright notice and this permission notice shall be included in all
|
||||||
copies or substantial portions of the Software.
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
SOFTWARE.
|
SOFTWARE.
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
# pi-mta-sign
|
# pi-mta-sign
|
||||||
|
|
||||||
Code and documentation for project for turning a raspberry pi into your very own MTA subway sign.
|
Code and documentation for project for turning a raspberry pi into your very own MTA subway sign.
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
{
|
{
|
||||||
"ACE": "https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/nyct%2Fgtfs-ace",
|
"ACE": "https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/nyct%2Fgtfs-ace",
|
||||||
"BDFM": "https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/nyct%2Fgtfs-bdfm",
|
"BDFM": "https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/nyct%2Fgtfs-bdfm",
|
||||||
"G": "https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/nyct%2Fgtfs-g",
|
"G": "https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/nyct%2Fgtfs-g",
|
||||||
"JZ": "https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/nyct%2Fgtfs-jz",
|
"JZ": "https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/nyct%2Fgtfs-jz",
|
||||||
"NQRW": "https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/nyct%2Fgtfs-nqrw",
|
"NQRW": "https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/nyct%2Fgtfs-nqrw",
|
||||||
"L": "https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/nyct%2Fgtfs-l",
|
"L": "https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/nyct%2Fgtfs-l",
|
||||||
"SIR": "https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/nyct%2Fgtfs-si",
|
"SIR": "https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/nyct%2Fgtfs-si",
|
||||||
"1234567": "https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/nyct%2Fgtfs"
|
"1234567": "https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/nyct%2Fgtfs"
|
||||||
}
|
}
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
from .mta import *
|
from .mta import *
|
||||||
from .train import *
|
from .train import *
|
||||||
from .stop import *
|
from .stop import *
|
||||||
|
|||||||
@@ -1,117 +1,117 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
import requests
|
import requests
|
||||||
import json
|
import json
|
||||||
|
|
||||||
from google.transit import gtfs_realtime_pb2
|
from google.transit import gtfs_realtime_pb2
|
||||||
from protobuf_to_dict import protobuf_to_dict
|
from protobuf_to_dict import protobuf_to_dict
|
||||||
from time import time
|
from time import time
|
||||||
from .train import Train
|
from .train import Train
|
||||||
|
|
||||||
|
|
||||||
class MTA(object):
|
class MTA(object):
|
||||||
# Create a data filter object.
|
# Create a data filter object.
|
||||||
# Then be able to update that object on the fly.
|
# Then be able to update that object on the fly.
|
||||||
# This filter should return all possible trains and stations by default.
|
# This filter should return all possible trains and stations by default.
|
||||||
# If anything is added it gets filtered out.
|
# If anything is added it gets filtered out.
|
||||||
def __init__(self, api_key: str, routes, station_ids, timing_callbacks=None, alert_callbacks=None,
|
def __init__(self, api_key: str, routes, station_ids, timing_callbacks=None, alert_callbacks=None,
|
||||||
endpoints_file="./endpoints.json", callback_frequency=10, max_arrival_time=30):
|
endpoints_file="./endpoints.json", callback_frequency=10, max_arrival_time=30):
|
||||||
self.header = {
|
self.header = {
|
||||||
"x-api-key": api_key
|
"x-api-key": api_key
|
||||||
}
|
}
|
||||||
self.routes = routes
|
self.routes = routes
|
||||||
self.station_ids = station_ids
|
self.station_ids = station_ids
|
||||||
self.timing_callbacks = timing_callbacks if timing_callbacks else []
|
self.timing_callbacks = timing_callbacks if timing_callbacks else []
|
||||||
self.is_running = False
|
self.is_running = False
|
||||||
self.callback_frequency = callback_frequency
|
self.callback_frequency = callback_frequency
|
||||||
self.max_arrival_time = max_arrival_time
|
self.max_arrival_time = max_arrival_time
|
||||||
with open(endpoints_file, "r") as f:
|
with open(endpoints_file, "r") as f:
|
||||||
self.endpoints = json.load(f)
|
self.endpoints = json.load(f)
|
||||||
self.set_valid_endpoints()
|
self.set_valid_endpoints()
|
||||||
|
|
||||||
def set_valid_endpoints(self):
|
def set_valid_endpoints(self):
|
||||||
self.valid_endpoints = {}
|
self.valid_endpoints = {}
|
||||||
for key, value in self.endpoints.items():
|
for key, value in self.endpoints.items():
|
||||||
valid_routes = [x for x in self.routes if x in key]
|
valid_routes = [x for x in self.routes if x in key]
|
||||||
if valid_routes:
|
if valid_routes:
|
||||||
self.valid_endpoints[value] = valid_routes
|
self.valid_endpoints[value] = valid_routes
|
||||||
print(self.valid_endpoints)
|
print(self.valid_endpoints)
|
||||||
|
|
||||||
def start_updates(self):
|
def start_updates(self):
|
||||||
print("starting updates")
|
print("starting updates")
|
||||||
loop = asyncio.new_event_loop()
|
loop = asyncio.new_event_loop()
|
||||||
asyncio.set_event_loop(loop)
|
asyncio.set_event_loop(loop)
|
||||||
loop.run_until_complete(self._get_updates())
|
loop.run_until_complete(self._get_updates())
|
||||||
|
|
||||||
def stop_updates(self):
|
def stop_updates(self):
|
||||||
self.is_running = False
|
self.is_running = False
|
||||||
|
|
||||||
async def get_data(self):
|
async def get_data(self):
|
||||||
trains = []
|
trains = []
|
||||||
for endpoint, valid_lines in self.valid_endpoints.items():
|
for endpoint, valid_lines in self.valid_endpoints.items():
|
||||||
r = requests.get(endpoint, headers=self.header)
|
r = requests.get(endpoint, headers=self.header)
|
||||||
feed = gtfs_realtime_pb2.FeedMessage()
|
feed = gtfs_realtime_pb2.FeedMessage()
|
||||||
feed.ParseFromString(r.content)
|
feed.ParseFromString(r.content)
|
||||||
subway_feed = protobuf_to_dict(feed)['entity']
|
subway_feed = protobuf_to_dict(feed)['entity']
|
||||||
trains.extend([train for train in [Train.get_train_from_dict(train_dict) for train_dict in subway_feed] if train is not None])
|
trains.extend([train for train in [Train.get_train_from_dict(train_dict) for train_dict in subway_feed] if train is not None])
|
||||||
return trains
|
return trains
|
||||||
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_trains_for_routes(routes, trains):
|
def get_trains_for_routes(routes, trains):
|
||||||
return [train for train in trains if train.route in routes]
|
return [train for train in trains if train.route in routes]
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_trains_for_route(route, trains):
|
def get_trains_for_route(route, trains):
|
||||||
return MTA.get_trains_for_routes([route], trains)
|
return MTA.get_trains_for_routes([route], trains)
|
||||||
|
|
||||||
|
|
||||||
async def get_train_information(self):
|
async def get_train_information(self):
|
||||||
# Might need to not filter these trains.
|
# Might need to not filter these trains.
|
||||||
valid_trains = [train for train in await self.get_data() if True]
|
valid_trains = [train for train in await self.get_data() if True]
|
||||||
# MTA.trains_arriving_at_stations(self.train_lines, self.station_ids, train, self.max_arrival_time)]
|
# MTA.trains_arriving_at_stations(self.train_lines, self.station_ids, train, self.max_arrival_time)]
|
||||||
return valid_trains
|
return valid_trains
|
||||||
|
|
||||||
async def _get_updates(self):
|
async def _get_updates(self):
|
||||||
self.is_running = True
|
self.is_running = True
|
||||||
while (self.is_running):
|
while (self.is_running):
|
||||||
t = time()
|
t = time()
|
||||||
data = self.get_train_information()
|
data = self.get_train_information()
|
||||||
data = await data
|
data = await data
|
||||||
await self.process_callbacks(data)
|
await self.process_callbacks(data)
|
||||||
await asyncio.sleep(self.callback_frequency - (time() - t))
|
await asyncio.sleep(self.callback_frequency - (time() - t))
|
||||||
|
|
||||||
async def process_callbacks(self, data):
|
async def process_callbacks(self, data):
|
||||||
for callback in self.timing_callbacks:
|
for callback in self.timing_callbacks:
|
||||||
await callback(data)
|
await callback(data)
|
||||||
|
|
||||||
def add_train_line(self, train_line: str):
|
def add_train_line(self, train_line: str):
|
||||||
self.routes.append(train_line)
|
self.routes.append(train_line)
|
||||||
self.set_valid_endpoints()
|
self.set_valid_endpoints()
|
||||||
|
|
||||||
def remove_train_line(self, train_line: str):
|
def remove_train_line(self, train_line: str):
|
||||||
self.routes.remove(train_line)
|
self.routes.remove(train_line)
|
||||||
self.set_valid_endpoints()
|
self.set_valid_endpoints()
|
||||||
|
|
||||||
def add_station_id(self, station_id: str):
|
def add_station_id(self, station_id: str):
|
||||||
self.station_ids.append(station_id)
|
self.station_ids.append(station_id)
|
||||||
|
|
||||||
def remove_station_id(self, station_id: str):
|
def remove_station_id(self, station_id: str):
|
||||||
self.station_ids.remove(station_id)
|
self.station_ids.remove(station_id)
|
||||||
|
|
||||||
def add_callback(self, callback_func):
|
def add_callback(self, callback_func):
|
||||||
self.timing_callbacks.append(callback_func)
|
self.timing_callbacks.append(callback_func)
|
||||||
|
|
||||||
def remove_callback(self, callback_func):
|
def remove_callback(self, callback_func):
|
||||||
self.timing_callbacks.remove(callback_func)
|
self.timing_callbacks.remove(callback_func)
|
||||||
|
|
||||||
def get_time_arriving_at_stations(self, trains):
|
def get_time_arriving_at_stations(self, trains):
|
||||||
station_first = {}
|
station_first = {}
|
||||||
for station_id in self.station_ids:
|
for station_id in self.station_ids:
|
||||||
line_first = {}
|
line_first = {}
|
||||||
for route in self.routes:
|
for route in self.routes:
|
||||||
valid_trains = [train.get_arrival_at(station_id) for train in MTA.get_trains_for_route(route, trains) if train.arriving_at_station_in_time(station_id, self.max_arrival_time)]
|
valid_trains = [train.get_arrival_at(station_id) for train in MTA.get_trains_for_route(route, trains) if train.arriving_at_station_in_time(station_id, self.max_arrival_time)]
|
||||||
if valid_trains:
|
if valid_trains:
|
||||||
line_first[route] = valid_trains
|
line_first[route] = valid_trains
|
||||||
if line_first:
|
if line_first:
|
||||||
station_first[station_id] = line_first
|
station_first[station_id] = line_first
|
||||||
return station_first
|
return station_first
|
||||||
|
|||||||
@@ -1,27 +1,27 @@
|
|||||||
|
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from math import trunc
|
from math import trunc
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Stop(object):
|
class Stop(object):
|
||||||
def __init__(self, id, arrival_time, departure_time, ):
|
def __init__(self, id, arrival_time, departure_time, ):
|
||||||
self.id = id
|
self.id = id
|
||||||
self.arrival_time = arrival_time
|
self.arrival_time = arrival_time
|
||||||
self.departure_time = departure_time
|
self.departure_time = departure_time
|
||||||
|
|
||||||
def arrival_minutes(self):
|
def arrival_minutes(self):
|
||||||
return trunc(((datetime.fromtimestamp(self.arrival_time) - datetime.now()).total_seconds()) / 60)
|
return trunc(((datetime.fromtimestamp(self.arrival_time) - datetime.now()).total_seconds()) / 60)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
now = datetime.now()
|
now = datetime.now()
|
||||||
time = datetime.fromtimestamp(self.arrival_time)
|
time = datetime.fromtimestamp(self.arrival_time)
|
||||||
time_minutes = trunc(((time - now).total_seconds()) / 60)
|
time_minutes = trunc(((time - now).total_seconds()) / 60)
|
||||||
return f"stop_id:{self.id}| arr:{time_minutes}| dep:{self.departure_time}"
|
return f"stop_id:{self.id}| arr:{time_minutes}| dep:{self.departure_time}"
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_stop_from_dict(obj):
|
def get_stop_from_dict(obj):
|
||||||
if "arrival" in obj and "departure" in obj and "stop_id" in obj:
|
if "arrival" in obj and "departure" in obj and "stop_id" in obj:
|
||||||
return Stop(obj["stop_id"], obj["arrival"]["time"], obj["departure"]["time"])
|
return Stop(obj["stop_id"], obj["arrival"]["time"], obj["departure"]["time"])
|
||||||
return None
|
return None
|
||||||
|
|||||||
@@ -1,42 +1,42 @@
|
|||||||
from .stop import Stop
|
from .stop import Stop
|
||||||
|
|
||||||
class Train(object):
|
class Train(object):
|
||||||
def __init__(self, id, route, stops):
|
def __init__(self, id, route, stops):
|
||||||
self.id = id
|
self.id = id
|
||||||
self.route = route
|
self.route = route
|
||||||
self.stops = stops
|
self.stops = stops
|
||||||
|
|
||||||
def get_arrival_at(self, stop_id):
|
def get_arrival_at(self, stop_id):
|
||||||
"""
|
"""
|
||||||
returns the routes stop time at a given stop ID in minutes
|
returns the routes stop time at a given stop ID in minutes
|
||||||
if not found, returns None
|
if not found, returns None
|
||||||
:param stop_id: stop ID of arrival station
|
:param stop_id: stop ID of arrival station
|
||||||
:return: arrival time in minutes
|
:return: arrival time in minutes
|
||||||
"""
|
"""
|
||||||
for stop in self.stops:
|
for stop in self.stops:
|
||||||
if stop.id == stop_id:
|
if stop.id == stop_id:
|
||||||
return stop.arrival_minutes()
|
return stop.arrival_minutes()
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def arriving_at_station_in_time(self, station_id, max_time):
|
def arriving_at_station_in_time(self, station_id, max_time):
|
||||||
for stop in self.stops:
|
for stop in self.stops:
|
||||||
minutes_to_arrival = stop.arrival_minutes()
|
minutes_to_arrival = stop.arrival_minutes()
|
||||||
if stop.id == station_id:
|
if stop.id == station_id:
|
||||||
if minutes_to_arrival > 0 and minutes_to_arrival < max_time:
|
if minutes_to_arrival > 0 and minutes_to_arrival < max_time:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
formatted_stops = '\n'.join([str(stop) for stop in self.stops])
|
formatted_stops = '\n'.join([str(stop) for stop in self.stops])
|
||||||
return f"train_id:{self.id} | line_name:{self.route}| stops:\n {formatted_stops}"
|
return f"train_id:{self.id} | line_name:{self.route}| stops:\n {formatted_stops}"
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_train_from_dict(obj):
|
def get_train_from_dict(obj):
|
||||||
if "trip_update" in obj and "stop_time_update" in obj["trip_update"]:
|
if "trip_update" in obj and "stop_time_update" in obj["trip_update"]:
|
||||||
# data we need is here create object
|
# data we need is here create object
|
||||||
id = obj["id"]
|
id = obj["id"]
|
||||||
route = obj["trip_update"]["trip"]["route_id"]
|
route = obj["trip_update"]["trip"]["route_id"]
|
||||||
all_stops = [Stop.get_stop_from_dict(x) for x in obj["trip_update"]["stop_time_update"]]
|
all_stops = [Stop.get_stop_from_dict(x) for x in obj["trip_update"]["stop_time_update"]]
|
||||||
valid_stops = [valid_stop for valid_stop in all_stops if valid_stop is not None]
|
valid_stops = [valid_stop for valid_stop in all_stops if valid_stop is not None]
|
||||||
return Train(id, route, valid_stops)
|
return Train(id, route, valid_stops)
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
118
mta_test.py
@@ -1,60 +1,58 @@
|
|||||||
import os
|
import os
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
from mta_manager import MTA
|
from mta_manager import MTA
|
||||||
import threading
|
import threading
|
||||||
import time
|
import time
|
||||||
from time import sleep
|
from time import sleep
|
||||||
from pprint import pprint
|
from pprint import pprint
|
||||||
|
|
||||||
load_dotenv()
|
load_dotenv()
|
||||||
|
|
||||||
api_key = os.getenv('MTA_API_KEY', '')
|
api_key = os.getenv('MTA_API_KEY', '')
|
||||||
mtaController = MTA(
|
mtaController = MTA(
|
||||||
api_key,
|
api_key,
|
||||||
["A", "C", "E", "1", "2", "3"],
|
["A", "C", "E", "1", "2", "3"],
|
||||||
["127S", "127N", "A27N", "A27S"]
|
["127S", "127N", "A27N", "A27S"]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
async def mta_callback(trains):
|
||||||
|
print("We are inside of the call back now")
|
||||||
async def mta_callback(trains):
|
print(len(trains))
|
||||||
print("We are inside of the call back now")
|
pprint([str(route) for route in trains])
|
||||||
print(len(trains))
|
pprint(mtaController.get_time_arriving_at_stations(trains))
|
||||||
pprint([str(route) for route in trains])
|
|
||||||
pprint(mtaController.get_time_arriving_at_stations(trains))
|
class threadWrapper(threading.Thread):
|
||||||
|
def __init__(self, run):
|
||||||
class threadWrapper(threading.Thread):
|
threading.Thread.__init__(self)
|
||||||
def __init__(self, run):
|
self.run = run
|
||||||
threading.Thread.__init__(self)
|
|
||||||
self.run = run
|
def run(self):
|
||||||
|
self.run()
|
||||||
def run(self):
|
|
||||||
self.run()
|
def start_mta():
|
||||||
|
mtaController.add_callback(mta_callback)
|
||||||
def start_mta():
|
mtaController.start_updates()
|
||||||
mtaController.add_callback(mta_callback)
|
|
||||||
mtaController.start_updates()
|
def stop_mta():
|
||||||
|
sleep(10)
|
||||||
def stop_mta():
|
mtaController.stop_updates()
|
||||||
sleep(10)
|
|
||||||
mtaController.stop_updates()
|
threadLock = threading.Lock()
|
||||||
|
threads = []
|
||||||
threadLock = threading.Lock()
|
|
||||||
threads = []
|
# Create new threads
|
||||||
|
thread1 = threadWrapper(start_mta)
|
||||||
# Create new threads
|
thread2 = threadWrapper(stop_mta)
|
||||||
thread1 = threadWrapper(start_mta)
|
|
||||||
thread2 = threadWrapper(stop_mta)
|
|
||||||
|
thread1.start()
|
||||||
|
thread2.start()
|
||||||
thread1.start()
|
|
||||||
thread2.start()
|
# Add threads to thread list
|
||||||
|
threads.append(thread1)
|
||||||
# Add threads to thread list
|
threads.append(thread2)
|
||||||
threads.append(thread1)
|
|
||||||
threads.append(thread2)
|
# Wait for all threads to complete
|
||||||
|
for t in threads:
|
||||||
# Wait for all threads to complete
|
t.join()
|
||||||
for t in threads:
|
print ("Exiting Main Thread")
|
||||||
t.join()
|
|
||||||
print ("Exiting Main Thread")
|
|
||||||
|
|||||||
BIN
requirements.txt
272
server.py
@@ -1,136 +1,136 @@
|
|||||||
import os
|
import os
|
||||||
import threading
|
import threading
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
|
|
||||||
from deepdiff import DeepDiff
|
from deepdiff import DeepDiff
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
from flask import Flask, jsonify, render_template, request, abort
|
from flask import Flask, jsonify, render_template, request, abort
|
||||||
from mta_manager import MTA
|
from mta_manager import MTA
|
||||||
|
|
||||||
load_dotenv()
|
load_dotenv()
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
app.secret_key = "SuperSecretDontEvenTryToGuessMeGGEZNoRe"
|
app.secret_key = "SuperSecretDontEvenTryToGuessMeGGEZNoRe"
|
||||||
app._static_folder = os.path.abspath("templates/static/")
|
app._static_folder = os.path.abspath("templates/static/")
|
||||||
|
|
||||||
stops = pd.read_csv("stops.txt")
|
stops = pd.read_csv("stops.txt")
|
||||||
stop_ids = ["127S", "127N", "A27N", "A27S"]
|
stop_ids = ["127S", "127N", "A27N", "A27S"]
|
||||||
|
|
||||||
start_time = datetime.now().strftime("%d/%m/%Y %H:%M:%S")
|
start_time = datetime.now().strftime("%d/%m/%Y %H:%M:%S")
|
||||||
|
|
||||||
|
|
||||||
def link_to_station(data) -> {}:
|
def link_to_station(data) -> {}:
|
||||||
linked_data = {}
|
linked_data = {}
|
||||||
for key, value in data.items():
|
for key, value in data.items():
|
||||||
stop_name = stops.loc[stops["stop_id"] == key]
|
stop_name = stops.loc[stops["stop_id"] == key]
|
||||||
stop_name = stop_name["stop_name"].values[0]
|
stop_name = stop_name["stop_name"].values[0]
|
||||||
if stop_name not in linked_data:
|
if stop_name not in linked_data:
|
||||||
linked_data[stop_name] = {}
|
linked_data[stop_name] = {}
|
||||||
if "N" in key:
|
if "N" in key:
|
||||||
linked_data[stop_name]["North"] = value
|
linked_data[stop_name]["North"] = value
|
||||||
elif "S" in key:
|
elif "S" in key:
|
||||||
linked_data[stop_name]["South"] = value
|
linked_data[stop_name]["South"] = value
|
||||||
return linked_data
|
return linked_data
|
||||||
|
|
||||||
|
|
||||||
@app.route("/", methods=["GET"])
|
@app.route("/", methods=["GET"])
|
||||||
def index():
|
def index():
|
||||||
# TODO: Shove this into a sqlite database
|
# TODO: Shove this into a sqlite database
|
||||||
station_names = sorted(list(set(stops["stop_name"].to_list())))
|
station_names = sorted(list(set(stops["stop_name"].to_list())))
|
||||||
return render_template(
|
return render_template(
|
||||||
"layouts/index.html",
|
"layouts/index.html",
|
||||||
station_names=station_names,
|
station_names=station_names,
|
||||||
station_1="42 St-Port Authority Bus Terminal",
|
station_1="42 St-Port Authority Bus Terminal",
|
||||||
station_2="Times Sq-42 St"
|
station_2="Times Sq-42 St"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@app.route("/start_time", methods=["GET"])
|
@app.route("/start_time", methods=["GET"])
|
||||||
def get_start_time():
|
def get_start_time():
|
||||||
return start_time
|
return start_time
|
||||||
|
|
||||||
|
|
||||||
@app.route("/mta_data", methods=["POST"])
|
@app.route("/mta_data", methods=["POST"])
|
||||||
def get_mta_data():
|
def get_mta_data():
|
||||||
global subway_data
|
global subway_data
|
||||||
station = request.json["station"]
|
station = request.json["station"]
|
||||||
if station in subway_data:
|
if station in subway_data:
|
||||||
mta_data = subway_data[station]
|
mta_data = subway_data[station]
|
||||||
mta_data["LastUpdated"] = subway_data["LastUpdated"]
|
mta_data["LastUpdated"] = subway_data["LastUpdated"]
|
||||||
return jsonify(
|
return jsonify(
|
||||||
mta_data
|
mta_data
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
abort(404)
|
abort(404)
|
||||||
|
|
||||||
|
|
||||||
@app.route("/stops", methods=["GET"])
|
@app.route("/stops", methods=["GET"])
|
||||||
def get_routes():
|
def get_routes():
|
||||||
return jsonify()
|
return jsonify()
|
||||||
|
|
||||||
|
|
||||||
@app.route("/get_stop_id", methods=["POST"])
|
@app.route("/get_stop_id", methods=["POST"])
|
||||||
def get_stop_id():
|
def get_stop_id():
|
||||||
stop_name = request.json["stop_name"]
|
stop_name = request.json["stop_name"]
|
||||||
rows = stops.loc[stops["stop_name"] == stop_name]
|
rows = stops.loc[stops["stop_name"] == stop_name]
|
||||||
return jsonify({"station_changed": True})
|
return jsonify({"station_changed": True})
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
api_key = os.getenv('MTA_API_KEY', '')
|
api_key = os.getenv('MTA_API_KEY', '')
|
||||||
|
|
||||||
old_data = None
|
old_data = None
|
||||||
last_updated = datetime.now().strftime("%d/%m/%Y %H:%M:%S")
|
last_updated = datetime.now().strftime("%d/%m/%Y %H:%M:%S")
|
||||||
|
|
||||||
|
|
||||||
async def mta_callback(trains):
|
async def mta_callback(trains):
|
||||||
global subway_data, old_data, last_updated
|
global subway_data, old_data, last_updated
|
||||||
subway_data = link_to_station(mtaController.get_time_arriving_at_stations(trains))
|
subway_data = link_to_station(mtaController.get_time_arriving_at_stations(trains))
|
||||||
subway_data["LastUpdated"] = last_updated
|
subway_data["LastUpdated"] = last_updated
|
||||||
if old_data is None:
|
if old_data is None:
|
||||||
old_data = subway_data
|
old_data = subway_data
|
||||||
data_diff = DeepDiff(old_data, subway_data, ignore_order=True)
|
data_diff = DeepDiff(old_data, subway_data, ignore_order=True)
|
||||||
if data_diff != {}:
|
if data_diff != {}:
|
||||||
old_data = subway_data
|
old_data = subway_data
|
||||||
last_updated = datetime.now().strftime("%d/%m/%Y %H:%M:%S")
|
last_updated = datetime.now().strftime("%d/%m/%Y %H:%M:%S")
|
||||||
app.logger.info(f"Updated Subway Data - {subway_data}")
|
app.logger.info(f"Updated Subway Data - {subway_data}")
|
||||||
|
|
||||||
|
|
||||||
class threadWrapper(threading.Thread):
|
class threadWrapper(threading.Thread):
|
||||||
def __init__(self, run):
|
def __init__(self, run):
|
||||||
threading.Thread.__init__(self)
|
threading.Thread.__init__(self)
|
||||||
self.run = run
|
self.run = run
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
self.run()
|
self.run()
|
||||||
|
|
||||||
|
|
||||||
mtaController = MTA(
|
mtaController = MTA(
|
||||||
api_key,
|
api_key,
|
||||||
["A", "C", "E", "1", "2", "3"],
|
["A", "C", "E", "1", "2", "3"],
|
||||||
["127S", "127N", "A27N", "A27S"]
|
["127S", "127N", "A27N", "A27S"]
|
||||||
)
|
)
|
||||||
mtaController.add_callback(mta_callback)
|
mtaController.add_callback(mta_callback)
|
||||||
|
|
||||||
|
|
||||||
def start_mta():
|
def start_mta():
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
mtaController.start_updates()
|
mtaController.start_updates()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
app.logger.info(f"Exception found in update function - {e}")
|
app.logger.info(f"Exception found in update function - {e}")
|
||||||
|
|
||||||
|
|
||||||
threadLock = threading.Lock()
|
threadLock = threading.Lock()
|
||||||
threads = [threadWrapper(start_mta)]
|
threads = [threadWrapper(start_mta)]
|
||||||
|
|
||||||
for t in threads:
|
for t in threads:
|
||||||
t.start()
|
t.start()
|
||||||
|
|
||||||
debug = os.getenv("DEBUG", 'False').lower() in ('true', '1', 't')
|
debug = os.getenv("DEBUG", 'False').lower() in ('true', '1', 't')
|
||||||
app.run(host="localhost", debug=True, port=5000)
|
app.run(host="localhost", debug=True, port=5000)
|
||||||
|
|
||||||
for t in threads:
|
for t in threads:
|
||||||
t.join()
|
t.join()
|
||||||
print("Exiting Main Thread")
|
print("Exiting Main Thread")
|
||||||
|
|||||||
@@ -1,220 +1,220 @@
|
|||||||
<!doctype html>
|
<!doctype html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<!-- Required meta tags -->
|
<!-- Required meta tags -->
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
<link rel="stylesheet" href="/static/css/style.css">
|
<link rel="stylesheet" href="/static/css/style.css">
|
||||||
<!-- Bootstrap CSS -->
|
<!-- Bootstrap CSS -->
|
||||||
<script src="https://cdn.socket.io/3.1.3/socket.io.min.js"
|
<script src="https://cdn.socket.io/3.1.3/socket.io.min.js"
|
||||||
integrity="sha384-cPwlPLvBTa3sKAgddT6krw0cJat7egBga3DJepJyrLl4Q9/5WLra3rrnMcyTyOnh"
|
integrity="sha384-cPwlPLvBTa3sKAgddT6krw0cJat7egBga3DJepJyrLl4Q9/5WLra3rrnMcyTyOnh"
|
||||||
crossorigin="anonymous"></script>
|
crossorigin="anonymous"></script>
|
||||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap-dark-5@1.0.2/dist/css/bootstrap-night.min.css" rel="stylesheet">
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap-dark-5@1.0.2/dist/css/bootstrap-night.min.css" rel="stylesheet">
|
||||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js"
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js"
|
||||||
integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM"
|
integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM"
|
||||||
crossorigin="anonymous"></script>
|
crossorigin="anonymous"></script>
|
||||||
<script
|
<script
|
||||||
src="https://code.jquery.com/jquery-3.6.0.min.js"
|
src="https://code.jquery.com/jquery-3.6.0.min.js"
|
||||||
integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4="
|
integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4="
|
||||||
crossorigin="anonymous"></script>
|
crossorigin="anonymous"></script>
|
||||||
<script src="/static/js/MtaData.js"></script>
|
<script src="/static/js/MtaData.js"></script>
|
||||||
|
|
||||||
<title>Pi MTA Display!</title>
|
<title>Pi MTA Display!</title>
|
||||||
</head>
|
</head>
|
||||||
<body class="dark">
|
<body class="dark">
|
||||||
<nav class="navbar navbar-dark bg-dark py-2">
|
<nav class="navbar navbar-dark bg-dark py-2">
|
||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
<a class="site-title navbar-brand" href="#">
|
<a class="site-title navbar-brand" href="#">
|
||||||
<h1 class="display-1">
|
<h1 class="display-1">
|
||||||
<img src="/static/images/RPI-LOGO.png" alt="" width="43" height="50"
|
<img src="/static/images/RPI-LOGO.png" alt="" width="43" height="50"
|
||||||
class="d-inline-block align-baseline">
|
class="d-inline-block align-baseline">
|
||||||
Pi MTA Display!
|
Pi MTA Display!
|
||||||
</h1>
|
</h1>
|
||||||
</a>
|
</a>
|
||||||
<div>
|
<div>
|
||||||
<div>
|
<div>
|
||||||
<h3>
|
<h3>
|
||||||
Last Updated: <span id="last_updated"></span>
|
Last Updated: <span id="last_updated"></span>
|
||||||
</h3>
|
</h3>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<h3 style="float:right">
|
<h3 style="float:right">
|
||||||
Started: <span style="float:right" id="start_time"></span>
|
Started: <span style="float:right" id="start_time"></span>
|
||||||
</h3>
|
</h3>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
<div id="station_1">
|
<div id="station_1">
|
||||||
<nav class="navbar navbar-dark bg-dark">
|
<nav class="navbar navbar-dark bg-dark">
|
||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
<span class="navbar-brand mb-0 h1 station-name">{{station_1}}</span>
|
<span class="navbar-brand mb-0 h1 station-name">{{station_1}}</span>
|
||||||
<div class="dropdown">
|
<div class="dropdown">
|
||||||
<button class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButton2"
|
<button class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButton2"
|
||||||
data-bs-toggle="dropdown" aria-expanded="false">
|
data-bs-toggle="dropdown" aria-expanded="false">
|
||||||
Select a Station
|
Select a Station
|
||||||
</button>
|
</button>
|
||||||
<ul class="dropdown-menu dropdown-menu-dark" aria-labelledby="dropdownMenuButton2">
|
<ul class="dropdown-menu dropdown-menu-dark" aria-labelledby="dropdownMenuButton2">
|
||||||
{% for item in station_names %}
|
{% for item in station_names %}
|
||||||
<li><a class="dropdown-item" onclick="javascript:setStation(this)">{{ item }}</a></li>
|
<li><a class="dropdown-item" onclick="javascript:setStation(this)">{{ item }}</a></li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
<div class="container-fluid content-row g-0">
|
<div class="container-fluid content-row g-0">
|
||||||
<div class="row h-50 g-0">
|
<div class="row h-50 g-0">
|
||||||
<div class="col-sm-6 ">
|
<div class="col-sm-6 ">
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
<h1 class="display-4">
|
<h1 class="display-4">
|
||||||
North
|
North
|
||||||
</h1>
|
</h1>
|
||||||
</div>
|
</div>
|
||||||
<ul class="list-group list-group-flush">
|
<ul class="list-group list-group-flush">
|
||||||
<li class="list-group-item station-info">
|
<li class="list-group-item station-info">
|
||||||
<img src="/static/images/lines/A.svg" alt="" width="60" height="60"
|
<img src="/static/images/lines/A.svg" alt="" width="60" height="60"
|
||||||
class="align-middle">
|
class="align-middle">
|
||||||
<h1 class="display-4 align-middle">
|
<h1 class="display-4 align-middle">
|
||||||
Pi MTA Display!
|
Pi MTA Display!
|
||||||
</h1>
|
</h1>
|
||||||
</li>
|
</li>
|
||||||
<li class="list-group-item station-info">
|
<li class="list-group-item station-info">
|
||||||
<img src="/static/images/lines/C.svg" alt="" width="60" height="60"
|
<img src="/static/images/lines/C.svg" alt="" width="60" height="60"
|
||||||
class="align-middle">
|
class="align-middle">
|
||||||
<h1 class="display-4">
|
<h1 class="display-4">
|
||||||
Pi MTA Display!
|
Pi MTA Display!
|
||||||
</h1>
|
</h1>
|
||||||
</li>
|
</li>
|
||||||
<li class="list-group-item station-info">
|
<li class="list-group-item station-info">
|
||||||
<img src="/static/images/lines/E.svg" alt="" width="60" height="60"
|
<img src="/static/images/lines/E.svg" alt="" width="60" height="60"
|
||||||
class="align-middle">
|
class="align-middle">
|
||||||
<h1 class="display-4">
|
<h1 class="display-4">
|
||||||
Pi MTA Display!
|
Pi MTA Display!
|
||||||
</h1>
|
</h1>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-6 ">
|
<div class="col-sm-6 ">
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
<h1 class="display-4">
|
<h1 class="display-4">
|
||||||
South
|
South
|
||||||
</h1>
|
</h1>
|
||||||
</div>
|
</div>
|
||||||
<ul class="list-group list-group-flush">
|
<ul class="list-group list-group-flush">
|
||||||
<li class="list-group-item station-info">
|
<li class="list-group-item station-info">
|
||||||
<img src="/static/images/lines/A.svg" alt="" width="60" height="60"
|
<img src="/static/images/lines/A.svg" alt="" width="60" height="60"
|
||||||
class="align-middle">
|
class="align-middle">
|
||||||
<h1 class="display-4 align-middle">
|
<h1 class="display-4 align-middle">
|
||||||
Pi MTA Display!
|
Pi MTA Display!
|
||||||
</h1>
|
</h1>
|
||||||
</li>
|
</li>
|
||||||
<li class="list-group-item station-info">
|
<li class="list-group-item station-info">
|
||||||
<img src="/static/images/lines/C.svg" alt="" width="60" height="60"
|
<img src="/static/images/lines/C.svg" alt="" width="60" height="60"
|
||||||
class="align-middle">
|
class="align-middle">
|
||||||
<h1 class="display-4">
|
<h1 class="display-4">
|
||||||
Pi MTA Display!
|
Pi MTA Display!
|
||||||
</h1>
|
</h1>
|
||||||
</li>
|
</li>
|
||||||
<li class="list-group-item station-info">
|
<li class="list-group-item station-info">
|
||||||
<img src="/static/images/lines/E.svg" alt="" width="60" height="60"
|
<img src="/static/images/lines/E.svg" alt="" width="60" height="60"
|
||||||
class="align-middle">
|
class="align-middle">
|
||||||
<h1 class="display-4">
|
<h1 class="display-4">
|
||||||
Pi MTA Display!
|
Pi MTA Display!
|
||||||
</h1>
|
</h1>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="station_2">
|
<div id="station_2">
|
||||||
<nav class="navbar navbar-dark bg-dark">
|
<nav class="navbar navbar-dark bg-dark">
|
||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
<span class="navbar-brand mb-0 h1 station-name">{{station_2}}</span>
|
<span class="navbar-brand mb-0 h1 station-name">{{station_2}}</span>
|
||||||
<div class="dropdown">
|
<div class="dropdown">
|
||||||
<button class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButton3"
|
<button class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButton3"
|
||||||
data-bs-toggle="dropdown" aria-expanded="false">
|
data-bs-toggle="dropdown" aria-expanded="false">
|
||||||
Select a Station
|
Select a Station
|
||||||
</button>
|
</button>
|
||||||
<ul class="dropdown-menu dropdown-menu-dark" aria-labelledby="dropdownMenuButton3">
|
<ul class="dropdown-menu dropdown-menu-dark" aria-labelledby="dropdownMenuButton3">
|
||||||
{% for item in station_names %}
|
{% for item in station_names %}
|
||||||
<li><a class="dropdown-item" onclick="javascript:setStation(this)">{{ item }}</a></li>
|
<li><a class="dropdown-item" onclick="javascript:setStation(this)">{{ item }}</a></li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
<div class="container-fluid content-row g-0">
|
<div class="container-fluid content-row g-0">
|
||||||
<div class="row h-50 g-0">
|
<div class="row h-50 g-0">
|
||||||
<div class="col-sm-6 ">
|
<div class="col-sm-6 ">
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
<h1 class="display-4">
|
<h1 class="display-4">
|
||||||
North
|
North
|
||||||
</h1>
|
</h1>
|
||||||
</div>
|
</div>
|
||||||
<ul class="list-group list-group-flush">
|
<ul class="list-group list-group-flush">
|
||||||
<li class="list-group-item station-info">
|
<li class="list-group-item station-info">
|
||||||
<img src="/static/images/lines/A.svg" alt="" width="60" height="60"
|
<img src="/static/images/lines/A.svg" alt="" width="60" height="60"
|
||||||
class="align-middle">
|
class="align-middle">
|
||||||
<h1 class="display-4 align-middle">
|
<h1 class="display-4 align-middle">
|
||||||
Pi MTA Display!
|
Pi MTA Display!
|
||||||
</h1>
|
</h1>
|
||||||
</li>
|
</li>
|
||||||
<li class="list-group-item station-info">
|
<li class="list-group-item station-info">
|
||||||
<img src="/static/images/lines/C.svg" alt="" width="60" height="60"
|
<img src="/static/images/lines/C.svg" alt="" width="60" height="60"
|
||||||
class="align-middle">
|
class="align-middle">
|
||||||
<h1 class="display-4">
|
<h1 class="display-4">
|
||||||
Pi MTA Display!
|
Pi MTA Display!
|
||||||
</h1>
|
</h1>
|
||||||
</li>
|
</li>
|
||||||
<li class="list-group-item station-info">
|
<li class="list-group-item station-info">
|
||||||
<img src="/static/images/lines/E.svg" alt="" width="60" height="60"
|
<img src="/static/images/lines/E.svg" alt="" width="60" height="60"
|
||||||
class="align-middle">
|
class="align-middle">
|
||||||
<h1 class="display-4">
|
<h1 class="display-4">
|
||||||
Pi MTA Display!
|
Pi MTA Display!
|
||||||
</h1>
|
</h1>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-6 ">
|
<div class="col-sm-6 ">
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
<h1 class="display-4">
|
<h1 class="display-4">
|
||||||
South
|
South
|
||||||
</h1>
|
</h1>
|
||||||
</div>
|
</div>
|
||||||
<ul class="list-group list-group-flush">
|
<ul class="list-group list-group-flush">
|
||||||
<li class="list-group-item station-info">
|
<li class="list-group-item station-info">
|
||||||
<img src="/static/images/lines/A.svg" alt="" width="60" height="60"
|
<img src="/static/images/lines/A.svg" alt="" width="60" height="60"
|
||||||
class="align-middle">
|
class="align-middle">
|
||||||
<h1 class="display-4 align-middle">
|
<h1 class="display-4 align-middle">
|
||||||
Pi MTA Display!
|
Pi MTA Display!
|
||||||
</h1>
|
</h1>
|
||||||
</li>
|
</li>
|
||||||
<li class="list-group-item station-info">
|
<li class="list-group-item station-info">
|
||||||
<img src="/static/images/lines/C.svg" alt="" width="60" height="60"
|
<img src="/static/images/lines/C.svg" alt="" width="60" height="60"
|
||||||
class="align-middle">
|
class="align-middle">
|
||||||
<h1 class="display-4">
|
<h1 class="display-4">
|
||||||
Pi MTA Display!
|
Pi MTA Display!
|
||||||
</h1>
|
</h1>
|
||||||
</li>
|
</li>
|
||||||
<li class="list-group-item station-info">
|
<li class="list-group-item station-info">
|
||||||
<img src="/static/images/lines/E.svg" alt="" width="60" height="60"
|
<img src="/static/images/lines/E.svg" alt="" width="60" height="60"
|
||||||
class="align-middle">
|
class="align-middle">
|
||||||
<h1 class="display-4">
|
<h1 class="display-4">
|
||||||
Pi MTA Display!
|
Pi MTA Display!
|
||||||
</h1>
|
</h1>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -1,43 +1,43 @@
|
|||||||
.site-title {
|
.site-title {
|
||||||
font-size: 4rem;
|
font-size: 4rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.card-header {
|
.card-header {
|
||||||
font-size: 3rem !important;
|
font-size: 3rem !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.station-name {
|
.station-name {
|
||||||
font-size: 3.5rem !important;
|
font-size: 3.5rem !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.station-info {
|
.station-info {
|
||||||
font-size: 2.5rem !important;
|
font-size: 2.5rem !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.station-info h1 {
|
.station-info h1 {
|
||||||
float: right;
|
float: right;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dropdown-menu {
|
.dropdown-menu {
|
||||||
max-height: 280px;
|
max-height: 280px;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@media screen and (max-width: 1000px) {
|
@media screen and (max-width: 1000px) {
|
||||||
.site-title {
|
.site-title {
|
||||||
font-size: 2rem !important;
|
font-size: 2rem !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.card-header {
|
.card-header {
|
||||||
font-size: 1.5rem !important;
|
font-size: 1.5rem !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.station-name {
|
.station-name {
|
||||||
font-size: 1.75rem !important;
|
font-size: 1.75rem !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.station-info {
|
.station-info {
|
||||||
font-size: 1.25rem !important;
|
font-size: 1.25rem !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
<svg width="100%" height="100%" viewBox="0 0 100 100" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
<svg width="100%" height="100%" viewBox="0 0 100 100" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
||||||
<g id="_6-Diamond" serif:id="6 Diamond">
|
<g id="_6-Diamond" serif:id="6 Diamond">
|
||||||
<g transform="matrix(0.539996,0.539996,-0.555556,0.555556,51.4781,-4.07742)">
|
<g transform="matrix(0.539996,0.539996,-0.555556,0.555556,51.4781,-4.07742)">
|
||||||
<rect x="2.407" y="5" width="92.593" height="90" style="fill:rgb(0,147,59);"/>
|
<rect x="2.407" y="5" width="92.593" height="90" style="fill:rgb(0,147,59);"/>
|
||||||
</g>
|
</g>
|
||||||
<g transform="matrix(1.26802,0,0,1.26802,21.9029,39.5201)">
|
<g transform="matrix(1.26802,0,0,1.26802,21.9029,39.5201)">
|
||||||
<path d="M18.141,20.305C19.219,21.571 20.588,22.204 22.248,22.204C23.874,22.204 25.153,21.593 26.086,20.369C27.019,19.145 27.485,17.558 27.485,15.607C27.485,13.433 26.954,11.769 25.893,10.614C24.832,9.458 23.532,8.881 21.991,8.881C20.742,8.881 19.638,9.257 18.68,10.01C17.242,11.123 16.523,12.92 16.523,15.401C16.523,17.404 17.062,19.038 18.141,20.305ZM26.818,-0.669C26.818,-1.268 26.587,-1.927 26.124,-2.646C25.337,-3.809 24.148,-4.391 22.556,-4.391C20.177,-4.391 18.483,-3.056 17.473,-0.387C16.925,1.085 16.549,3.259 16.344,6.134C17.251,5.056 18.303,4.269 19.501,3.772C20.699,3.276 22.068,3.028 23.609,3.028C26.912,3.028 29.62,4.149 31.734,6.391C33.847,8.633 34.904,11.499 34.904,14.991C34.904,18.465 33.869,21.528 31.798,24.181C29.727,26.834 26.51,28.16 22.145,28.16C17.456,28.16 13.999,26.201 11.774,22.281C10.045,19.218 9.181,15.265 9.181,10.421C9.181,7.58 9.301,5.27 9.541,3.49C9.968,0.324 10.799,-2.312 12.031,-4.417C13.092,-6.214 14.482,-7.66 16.202,-8.756C17.922,-9.851 19.98,-10.398 22.376,-10.398C25.834,-10.398 28.589,-9.513 30.643,-7.741C32.696,-5.97 33.852,-3.613 34.108,-0.669L26.818,-0.669Z" style="fill:white;fill-rule:nonzero;"/>
|
<path d="M18.141,20.305C19.219,21.571 20.588,22.204 22.248,22.204C23.874,22.204 25.153,21.593 26.086,20.369C27.019,19.145 27.485,17.558 27.485,15.607C27.485,13.433 26.954,11.769 25.893,10.614C24.832,9.458 23.532,8.881 21.991,8.881C20.742,8.881 19.638,9.257 18.68,10.01C17.242,11.123 16.523,12.92 16.523,15.401C16.523,17.404 17.062,19.038 18.141,20.305ZM26.818,-0.669C26.818,-1.268 26.587,-1.927 26.124,-2.646C25.337,-3.809 24.148,-4.391 22.556,-4.391C20.177,-4.391 18.483,-3.056 17.473,-0.387C16.925,1.085 16.549,3.259 16.344,6.134C17.251,5.056 18.303,4.269 19.501,3.772C20.699,3.276 22.068,3.028 23.609,3.028C26.912,3.028 29.62,4.149 31.734,6.391C33.847,8.633 34.904,11.499 34.904,14.991C34.904,18.465 33.869,21.528 31.798,24.181C29.727,26.834 26.51,28.16 22.145,28.16C17.456,28.16 13.999,26.201 11.774,22.281C10.045,19.218 9.181,15.265 9.181,10.421C9.181,7.58 9.301,5.27 9.541,3.49C9.968,0.324 10.799,-2.312 12.031,-4.417C13.092,-6.214 14.482,-7.66 16.202,-8.756C17.922,-9.851 19.98,-10.398 22.376,-10.398C25.834,-10.398 28.589,-9.513 30.643,-7.741C32.696,-5.97 33.852,-3.613 34.108,-0.669L26.818,-0.669Z" style="fill:white;fill-rule:nonzero;"/>
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB |
@@ -1,12 +1,12 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
<svg width="100%" height="100%" viewBox="0 0 100 100" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
<svg width="100%" height="100%" viewBox="0 0 100 100" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
||||||
<g id="_7-Diamond" serif:id="7 Diamond">
|
<g id="_7-Diamond" serif:id="7 Diamond">
|
||||||
<g transform="matrix(0.539996,0.539996,-0.555556,0.555556,51.4781,-4.07742)">
|
<g transform="matrix(0.539996,0.539996,-0.555556,0.555556,51.4781,-4.07742)">
|
||||||
<rect x="2.407" y="5" width="92.593" height="90" style="fill:rgb(185,51,174);"/>
|
<rect x="2.407" y="5" width="92.593" height="90" style="fill:rgb(185,51,174);"/>
|
||||||
</g>
|
</g>
|
||||||
<g transform="matrix(1.26802,0,0,1.26802,21.9029,39.5201)">
|
<g transform="matrix(1.26802,0,0,1.26802,21.9029,39.5201)">
|
||||||
<path d="M35.264,-3.827C34.168,-2.748 32.645,-0.827 30.694,1.937C28.743,4.701 27.109,7.554 25.791,10.498C24.747,12.809 23.805,15.632 22.967,18.97C22.128,22.307 21.709,25.045 21.709,27.185L14.11,27.185C14.333,20.51 16.523,13.57 20.682,6.365C23.369,1.898 25.62,-1.217 27.434,-2.979L8.873,-2.979L8.976,-9.551L35.264,-9.551L35.264,-3.827Z" style="fill:white;fill-rule:nonzero;"/>
|
<path d="M35.264,-3.827C34.168,-2.748 32.645,-0.827 30.694,1.937C28.743,4.701 27.109,7.554 25.791,10.498C24.747,12.809 23.805,15.632 22.967,18.97C22.128,22.307 21.709,25.045 21.709,27.185L14.11,27.185C14.333,20.51 16.523,13.57 20.682,6.365C23.369,1.898 25.62,-1.217 27.434,-2.979L8.873,-2.979L8.976,-9.551L35.264,-9.551L35.264,-3.827Z" style="fill:white;fill-rule:nonzero;"/>
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.2 KiB |
@@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" standalone="no"?>
|
<?xml version="1.0" standalone="no"?>
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
||||||
<g id="A">
|
<g id="A">
|
||||||
<circle cx="45" cy="45" r="45" style="fill:rgb(40,82,173);"/>
|
<circle cx="45" cy="45" r="45" style="fill:rgb(40,82,173);"/>
|
||||||
<path d="M39.1243,50.8594L51.2988,50.8594L45.3092,31.9792L39.1243,50.8594ZM39.7428,21.0091L51.071,21.0091L68.0632,68.9909L57.1908,68.9909L54.0983,59.1276L36.4225,59.1276L33.1022,68.9909L22.6204,68.9909L39.7428,21.0091Z" style="fill:white;fill-rule:nonzero;"/>
|
<path d="M39.1243,50.8594L51.2988,50.8594L45.3092,31.9792L39.1243,50.8594ZM39.7428,21.0091L51.071,21.0091L68.0632,68.9909L57.1908,68.9909L54.0983,59.1276L36.4225,59.1276L33.1022,68.9909L22.6204,68.9909L39.7428,21.0091Z" style="fill:white;fill-rule:nonzero;"/>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 765 B After Width: | Height: | Size: 773 B |
@@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" standalone="no"?>
|
<?xml version="1.0" standalone="no"?>
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
||||||
<g id="B">
|
<g id="B">
|
||||||
<circle cx="45" cy="45" r="45" style="fill:rgb(255,98,25);"/>
|
<circle cx="45" cy="45" r="45" style="fill:rgb(255,98,25);"/>
|
||||||
<path d="M35.7389,29.3424L35.7389,39.9219L47.5228,39.9219C49.6278,39.9219 51.3368,39.5258 52.6497,38.7337C53.9627,37.9416 54.6191,36.5365 54.6191,34.5182C54.6191,32.283 53.7511,30.8073 52.015,30.0911C50.5176,29.592 48.6079,29.3424 46.2858,29.3424L35.7389,29.3424ZM35.7389,47.8646L35.7389,60.6576L47.5228,60.6576C49.6278,60.6576 51.2663,60.3754 52.4382,59.8112C54.5649,58.7695 55.6283,56.773 55.6283,53.8216C55.6283,51.326 54.5974,49.6115 52.5358,48.6784C51.3856,48.1576 49.7689,47.8863 47.6855,47.8646L35.7389,47.8646ZM61.9759,26.1198C63.4516,28.1597 64.1895,30.6011 64.1895,33.444C64.1895,36.3737 63.4516,38.7283 61.9759,40.5078C61.1513,41.5061 59.936,42.4175 58.3301,43.2422C60.7823,44.1319 62.6324,45.5425 63.8802,47.474C65.128,49.4054 65.752,51.7491 65.752,54.5052C65.752,57.3481 65.0358,59.898 63.6035,62.1549C62.6921,63.6523 61.5527,64.911 60.1855,65.931C58.6447,67.1029 56.8273,67.9058 54.7331,68.3398C52.6389,68.7739 50.3657,68.9909 47.9134,68.9909L26.1686,68.9909L26.1686,21.0091L49.4759,21.0091C55.357,21.0959 59.5237,22.7995 61.9759,26.1198Z" style="fill:white;fill-rule:nonzero;"/>
|
<path d="M35.7389,29.3424L35.7389,39.9219L47.5228,39.9219C49.6278,39.9219 51.3368,39.5258 52.6497,38.7337C53.9627,37.9416 54.6191,36.5365 54.6191,34.5182C54.6191,32.283 53.7511,30.8073 52.015,30.0911C50.5176,29.592 48.6079,29.3424 46.2858,29.3424L35.7389,29.3424ZM35.7389,47.8646L35.7389,60.6576L47.5228,60.6576C49.6278,60.6576 51.2663,60.3754 52.4382,59.8112C54.5649,58.7695 55.6283,56.773 55.6283,53.8216C55.6283,51.326 54.5974,49.6115 52.5358,48.6784C51.3856,48.1576 49.7689,47.8863 47.6855,47.8646L35.7389,47.8646ZM61.9759,26.1198C63.4516,28.1597 64.1895,30.6011 64.1895,33.444C64.1895,36.3737 63.4516,38.7283 61.9759,40.5078C61.1513,41.5061 59.936,42.4175 58.3301,43.2422C60.7823,44.1319 62.6324,45.5425 63.8802,47.474C65.128,49.4054 65.752,51.7491 65.752,54.5052C65.752,57.3481 65.0358,59.898 63.6035,62.1549C62.6921,63.6523 61.5527,64.911 60.1855,65.931C58.6447,67.1029 56.8273,67.9058 54.7331,68.3398C52.6389,68.7739 50.3657,68.9909 47.9134,68.9909L26.1686,68.9909L26.1686,21.0091L49.4759,21.0091C55.357,21.0959 59.5237,22.7995 61.9759,26.1198Z" style="fill:white;fill-rule:nonzero;"/>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
@@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" standalone="no"?>
|
<?xml version="1.0" standalone="no"?>
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
||||||
<g id="C">
|
<g id="C">
|
||||||
<circle cx="45" cy="45" r="45" style="fill:rgb(40,82,173);"/>
|
<circle cx="45" cy="45" r="45" style="fill:rgb(40,82,173);"/>
|
||||||
<path d="M30.6608,26.0221C34.5671,22.0725 39.5367,20.0977 45.5697,20.0977C53.6426,20.0977 59.5454,22.7452 63.278,28.0404C65.3396,31.0135 66.4464,33.9974 66.5983,36.9922L56.5723,36.9922C55.9212,34.6918 55.0857,32.9557 54.0658,31.7839C52.2428,29.7005 49.541,28.6589 45.9603,28.6589C42.3145,28.6589 39.439,30.1291 37.334,33.0697C35.2289,36.0102 34.1764,40.1714 34.1764,45.5534C34.1764,50.9353 35.2886,54.9664 37.513,57.6465C39.7374,60.3266 42.564,61.6667 45.9928,61.6667C49.5085,61.6667 52.1886,60.5165 54.0332,58.2161C55.0532,56.9792 55.8995,55.1237 56.5723,52.6497L66.5007,52.6497C65.6326,57.8798 63.4136,62.1332 59.8438,65.4102C56.2739,68.6871 51.7003,70.3255 46.123,70.3255C39.222,70.3255 33.7967,68.112 29.847,63.6849C25.8974,59.2361 23.9225,53.138 23.9225,45.3906C23.9225,37.0139 26.1686,30.5577 30.6608,26.0221Z" style="fill:white;fill-rule:nonzero;"/>
|
<path d="M30.6608,26.0221C34.5671,22.0725 39.5367,20.0977 45.5697,20.0977C53.6426,20.0977 59.5454,22.7452 63.278,28.0404C65.3396,31.0135 66.4464,33.9974 66.5983,36.9922L56.5723,36.9922C55.9212,34.6918 55.0857,32.9557 54.0658,31.7839C52.2428,29.7005 49.541,28.6589 45.9603,28.6589C42.3145,28.6589 39.439,30.1291 37.334,33.0697C35.2289,36.0102 34.1764,40.1714 34.1764,45.5534C34.1764,50.9353 35.2886,54.9664 37.513,57.6465C39.7374,60.3266 42.564,61.6667 45.9928,61.6667C49.5085,61.6667 52.1886,60.5165 54.0332,58.2161C55.0532,56.9792 55.8995,55.1237 56.5723,52.6497L66.5007,52.6497C65.6326,57.8798 63.4136,62.1332 59.8438,65.4102C56.2739,68.6871 51.7003,70.3255 46.123,70.3255C39.222,70.3255 33.7967,68.112 29.847,63.6849C25.8974,59.2361 23.9225,53.138 23.9225,45.3906C23.9225,37.0139 26.1686,30.5577 30.6608,26.0221Z" style="fill:white;fill-rule:nonzero;"/>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
@@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" standalone="no"?>
|
<?xml version="1.0" standalone="no"?>
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
||||||
<g id="D">
|
<g id="D">
|
||||||
<circle cx="45" cy="45" r="45" style="fill:rgb(255,98,25);"/>
|
<circle cx="45" cy="45" r="45" style="fill:rgb(255,98,25);"/>
|
||||||
<path d="M35.7389,29.3424L35.7389,60.6576L44.9837,60.6576C49.7146,60.6576 53.0132,58.3247 54.8796,53.6589C55.8995,51.0981 56.4095,48.049 56.4095,44.5117C56.4095,39.6289 55.6445,35.88 54.1146,33.265C52.5846,30.65 49.541,29.3424 44.9837,29.3424L35.7389,29.3424ZM54.0983,22.0508C57.462,23.1576 60.1855,25.1866 62.2689,28.138C63.9399,30.5252 65.0792,33.1076 65.6868,35.8854C66.2945,38.6632 66.5983,41.3108 66.5983,43.8281C66.5983,50.2083 65.3179,55.612 62.7572,60.0391C59.2849,66.0069 53.9247,68.9909 46.6764,68.9909L26.0059,68.9909L26.0059,21.0091L46.6764,21.0091C49.6495,21.0525 52.1235,21.3997 54.0983,22.0508Z" style="fill:white;fill-rule:nonzero;"/>
|
<path d="M35.7389,29.3424L35.7389,60.6576L44.9837,60.6576C49.7146,60.6576 53.0132,58.3247 54.8796,53.6589C55.8995,51.0981 56.4095,48.049 56.4095,44.5117C56.4095,39.6289 55.6445,35.88 54.1146,33.265C52.5846,30.65 49.541,29.3424 44.9837,29.3424L35.7389,29.3424ZM54.0983,22.0508C57.462,23.1576 60.1855,25.1866 62.2689,28.138C63.9399,30.5252 65.0792,33.1076 65.6868,35.8854C66.2945,38.6632 66.5983,41.3108 66.5983,43.8281C66.5983,50.2083 65.3179,55.612 62.7572,60.0391C59.2849,66.0069 53.9247,68.9909 46.6764,68.9909L26.0059,68.9909L26.0059,21.0091L46.6764,21.0091C49.6495,21.0525 52.1235,21.3997 54.0983,22.0508Z" style="fill:white;fill-rule:nonzero;"/>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
@@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" standalone="no"?>
|
<?xml version="1.0" standalone="no"?>
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
||||||
<g id="E">
|
<g id="E">
|
||||||
<circle cx="45" cy="45" r="45" style="fill:rgb(40,82,173);"/>
|
<circle cx="45" cy="45" r="45" style="fill:rgb(40,82,173);"/>
|
||||||
<path d="M63.3268,29.5052L37.9362,29.5052L37.9362,39.694L61.2435,39.694L61.2435,48.0273L37.9362,48.0273L37.9362,60.3646L64.4987,60.3646L64.4987,68.9909L28.138,68.9909L28.138,21.0091L63.3268,21.0091L63.3268,29.5052Z" style="fill:white;fill-rule:nonzero;"/>
|
<path d="M63.3268,29.5052L37.9362,29.5052L37.9362,39.694L61.2435,39.694L61.2435,48.0273L37.9362,48.0273L37.9362,60.3646L64.4987,60.3646L64.4987,68.9909L28.138,68.9909L28.138,21.0091L63.3268,21.0091L63.3268,29.5052Z" style="fill:white;fill-rule:nonzero;"/>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 761 B After Width: | Height: | Size: 769 B |
@@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" standalone="no"?>
|
<?xml version="1.0" standalone="no"?>
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
||||||
<g id="F">
|
<g id="F">
|
||||||
<circle cx="45" cy="45" r="45" style="fill:rgb(255,98,25);"/>
|
<circle cx="45" cy="45" r="45" style="fill:rgb(255,98,25);"/>
|
||||||
<path d="M29.7168,21.0742L63.7337,21.0742L63.7337,29.5052L39.6777,29.5052L39.6777,40.5404L60.7389,40.5404L60.7389,48.8737L39.6777,48.8737L39.6777,68.9909L29.7168,68.9909L29.7168,21.0742Z" style="fill:white;fill-rule:nonzero;"/>
|
<path d="M29.7168,21.0742L63.7337,21.0742L63.7337,29.5052L39.6777,29.5052L39.6777,40.5404L60.7389,40.5404L60.7389,48.8737L39.6777,48.8737L39.6777,68.9909L29.7168,68.9909L29.7168,21.0742Z" style="fill:white;fill-rule:nonzero;"/>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 733 B After Width: | Height: | Size: 741 B |
@@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" standalone="no"?>
|
<?xml version="1.0" standalone="no"?>
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
||||||
<g id="G">
|
<g id="G">
|
||||||
<circle cx="45" cy="45" r="45" style="fill:rgb(109,190,69);"/>
|
<circle cx="45" cy="45" r="45" style="fill:rgb(109,190,69);"/>
|
||||||
<path d="M56.4095,35.9831C55.65,32.7062 53.7945,30.4167 50.8431,29.1146C49.1938,28.3984 47.36,28.0404 45.3418,28.0404C41.4789,28.0404 38.3051,29.4998 35.8203,32.4186C33.3355,35.3375 32.0931,39.7266 32.0931,45.5859C32.0931,51.4887 33.4386,55.6662 36.1296,58.1185C38.8205,60.5707 41.8804,61.7969 45.3092,61.7969C48.673,61.7969 51.429,60.8257 53.5775,58.8835C55.7259,56.9412 57.0497,54.3967 57.5488,51.25L46.4486,51.25L46.4486,43.2422L66.4355,43.2422L66.4355,68.9909L59.7949,68.9909L58.7858,63.0013C56.8544,65.2799 55.1183,66.8859 53.5775,67.819C50.9299,69.4466 47.6747,70.2604 43.8118,70.2604C37.4533,70.2604 32.245,68.0577 28.1868,63.6523C23.9551,59.2253 21.8392,53.1706 21.8392,45.4883C21.8392,37.7192 23.9768,31.4909 28.252,26.8034C32.5271,22.1159 38.1803,19.7721 45.2116,19.7721C51.3097,19.7721 56.2088,21.3184 59.9089,24.4108C63.6089,27.5033 65.7303,31.3607 66.2728,35.9831L56.4095,35.9831Z" style="fill:white;fill-rule:nonzero;"/>
|
<path d="M56.4095,35.9831C55.65,32.7062 53.7945,30.4167 50.8431,29.1146C49.1938,28.3984 47.36,28.0404 45.3418,28.0404C41.4789,28.0404 38.3051,29.4998 35.8203,32.4186C33.3355,35.3375 32.0931,39.7266 32.0931,45.5859C32.0931,51.4887 33.4386,55.6662 36.1296,58.1185C38.8205,60.5707 41.8804,61.7969 45.3092,61.7969C48.673,61.7969 51.429,60.8257 53.5775,58.8835C55.7259,56.9412 57.0497,54.3967 57.5488,51.25L46.4486,51.25L46.4486,43.2422L66.4355,43.2422L66.4355,68.9909L59.7949,68.9909L58.7858,63.0013C56.8544,65.2799 55.1183,66.8859 53.5775,67.819C50.9299,69.4466 47.6747,70.2604 43.8118,70.2604C37.4533,70.2604 32.245,68.0577 28.1868,63.6523C23.9551,59.2253 21.8392,53.1706 21.8392,45.4883C21.8392,37.7192 23.9768,31.4909 28.252,26.8034C32.5271,22.1159 38.1803,19.7721 45.2116,19.7721C51.3097,19.7721 56.2088,21.3184 59.9089,24.4108C63.6089,27.5033 65.7303,31.3607 66.2728,35.9831L56.4095,35.9831Z" style="fill:white;fill-rule:nonzero;"/>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
@@ -1,14 +1,14 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
||||||
<g transform="matrix(1,0,0,1,-5,-5)">
|
<g transform="matrix(1,0,0,1,-5,-5)">
|
||||||
<g id="H">
|
<g id="H">
|
||||||
<g transform="matrix(1.02285,0,0,1.02285,-0.474267,-1.17657)">
|
<g transform="matrix(1.02285,0,0,1.02285,-0.474267,-1.17657)">
|
||||||
<circle cx="49.347" cy="50.033" r="43.995" style="fill:rgb(40,82,173);"/>
|
<circle cx="49.347" cy="50.033" r="43.995" style="fill:rgb(40,82,173);"/>
|
||||||
</g>
|
</g>
|
||||||
<g transform="matrix(1.26802,0,0,1.26802,21.9029,39.5201)">
|
<g transform="matrix(1.26802,0,0,1.26802,21.9029,39.5201)">
|
||||||
<path d="M7.127,27.185L7.127,-10.655L14.957,-10.655L14.957,3.772L29.744,3.772L29.744,-10.655L37.6,-10.655L37.6,27.185L29.744,27.185L29.744,10.293L14.957,10.293L14.957,27.185L7.127,27.185Z" style="fill:white;fill-rule:nonzero;"/>
|
<path d="M7.127,27.185L7.127,-10.655L14.957,-10.655L14.957,3.772L29.744,3.772L29.744,-10.655L37.6,-10.655L37.6,27.185L29.744,27.185L29.744,10.293L14.957,10.293L14.957,27.185L7.127,27.185Z" style="fill:white;fill-rule:nonzero;"/>
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.0 KiB |
@@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" standalone="no"?>
|
<?xml version="1.0" standalone="no"?>
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
||||||
<g id="J">
|
<g id="J">
|
||||||
<circle cx="45" cy="45" r="45" style="fill:rgb(153,100,51);"/>
|
<circle cx="45" cy="45" r="45" style="fill:rgb(153,100,51);"/>
|
||||||
<path d="M37.3991,50.7943L37.3991,51.901C37.4859,55.612 37.8928,58.2216 38.6198,59.7298C39.3468,61.2381 40.9039,61.9922 43.291,61.9922C45.6565,61.9922 47.219,61.1675 47.9785,59.5182C48.4342,58.5417 48.6621,56.8924 48.6621,54.5703L48.6621,21.0091L58.6882,21.0091L58.6882,54.4076C58.6882,58.4874 57.9829,61.7209 56.5723,64.1081C54.1851,68.1445 49.8774,70.1628 43.6491,70.1628C37.4208,70.1628 33.2433,68.5297 31.1165,65.2637C28.9898,61.9976 27.9264,57.5434 27.9264,51.901L27.9264,50.7943L37.3991,50.7943Z" style="fill:white;fill-rule:nonzero;"/>
|
<path d="M37.3991,50.7943L37.3991,51.901C37.4859,55.612 37.8928,58.2216 38.6198,59.7298C39.3468,61.2381 40.9039,61.9922 43.291,61.9922C45.6565,61.9922 47.219,61.1675 47.9785,59.5182C48.4342,58.5417 48.6621,56.8924 48.6621,54.5703L48.6621,21.0091L58.6882,21.0091L58.6882,54.4076C58.6882,58.4874 57.9829,61.7209 56.5723,64.1081C54.1851,68.1445 49.8774,70.1628 43.6491,70.1628C37.4208,70.1628 33.2433,68.5297 31.1165,65.2637C28.9898,61.9976 27.9264,57.5434 27.9264,51.901L27.9264,50.7943L37.3991,50.7943Z" style="fill:white;fill-rule:nonzero;"/>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.0 KiB |
@@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" standalone="no"?>
|
<?xml version="1.0" standalone="no"?>
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
||||||
<g id="L">
|
<g id="L">
|
||||||
<circle cx="45" cy="45" r="45" style="fill:rgb(167,169,172);"/>
|
<circle cx="45" cy="45" r="45" style="fill:rgb(167,169,172);"/>
|
||||||
<path d="M29.7168,21.0091L39.7428,21.0091L39.7428,60.3646L63.5059,60.3646L63.5059,68.9909L29.7168,68.9909L29.7168,21.0091Z" style="fill:white;fill-rule:nonzero;"/>
|
<path d="M29.7168,21.0091L39.7428,21.0091L39.7428,60.3646L63.5059,60.3646L63.5059,68.9909L29.7168,68.9909L29.7168,21.0091Z" style="fill:white;fill-rule:nonzero;"/>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 671 B After Width: | Height: | Size: 679 B |
@@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" standalone="no"?>
|
<?xml version="1.0" standalone="no"?>
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
||||||
<g id="M">
|
<g id="M">
|
||||||
<circle cx="45" cy="45" r="45" style="fill:rgb(255,98,25);"/>
|
<circle cx="45" cy="45" r="45" style="fill:rgb(255,98,25);"/>
|
||||||
<path d="M54.1146,21.0091L68.5352,21.0091L68.5352,68.9909L59.1927,68.9909L59.1927,36.5365C59.1927,35.6033 59.2036,34.2958 59.2253,32.6139C59.247,30.9321 59.2578,29.6354 59.2578,28.724L50.1758,68.9909L40.4427,68.9909L31.4258,28.724C31.4258,29.6354 31.4366,30.9321 31.4583,32.6139C31.48,34.2958 31.4909,35.6033 31.4909,36.5365L31.4909,68.9909L22.1484,68.9909L22.1484,21.0091L36.7318,21.0091L45.4557,58.737L54.1146,21.0091Z" style="fill:white;fill-rule:nonzero;"/>
|
<path d="M54.1146,21.0091L68.5352,21.0091L68.5352,68.9909L59.1927,68.9909L59.1927,36.5365C59.1927,35.6033 59.2036,34.2958 59.2253,32.6139C59.247,30.9321 59.2578,29.6354 59.2578,28.724L50.1758,68.9909L40.4427,68.9909L31.4258,28.724C31.4258,29.6354 31.4366,30.9321 31.4583,32.6139C31.48,34.2958 31.4909,35.6033 31.4909,36.5365L31.4909,68.9909L22.1484,68.9909L22.1484,21.0091L36.7318,21.0091L45.4557,58.737L54.1146,21.0091Z" style="fill:white;fill-rule:nonzero;"/>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 967 B After Width: | Height: | Size: 975 B |
@@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" standalone="no"?>
|
<?xml version="1.0" standalone="no"?>
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
||||||
<g id="N">
|
<g id="N">
|
||||||
<circle cx="45" cy="45" r="45" style="fill:rgb(252,204,10);"/>
|
<circle cx="45" cy="45" r="45" style="fill:rgb(252,204,10);"/>
|
||||||
<path d="M25.8431,21.0091L36.3574,21.0091L55.4655,54.5052L55.4655,21.0091L64.8079,21.0091L64.8079,68.9909L54.7819,68.9909L35.1855,34.9089L35.1855,68.9909L25.8431,68.9909L25.8431,21.0091Z" style="fill:black;fill-rule:nonzero;"/>
|
<path d="M25.8431,21.0091L36.3574,21.0091L55.4655,54.5052L55.4655,21.0091L64.8079,21.0091L64.8079,68.9909L54.7819,68.9909L35.1855,34.9089L35.1855,68.9909L25.8431,68.9909L25.8431,21.0091Z" style="fill:black;fill-rule:nonzero;"/>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 734 B After Width: | Height: | Size: 742 B |
@@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" standalone="no"?>
|
<?xml version="1.0" standalone="no"?>
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
||||||
<g id="Q">
|
<g id="Q">
|
||||||
<circle cx="45" cy="45" r="45" style="fill:rgb(252,204,10);"/>
|
<circle cx="45" cy="45" r="45" style="fill:rgb(252,204,10);"/>
|
||||||
<path d="M48.597,61.4063C49.1829,61.2543 49.9316,60.9831 50.8431,60.5924L45.9928,55.9701L51.1686,50.5664L56.0189,55.1888C56.7784,53.6263 57.3101,52.2591 57.6139,51.0872C58.0914,49.3294 58.3301,47.2786 58.3301,44.9349C58.3301,39.553 57.2287,35.3917 55.026,32.4512C52.8234,29.5106 49.6061,28.0404 45.3743,28.0404C41.403,28.0404 38.2346,29.451 35.8691,32.2721C33.5037,35.0933 32.321,39.3142 32.321,44.9349C32.321,51.5104 34.0137,56.2196 37.3991,59.0625C39.5909,60.9071 42.2168,61.8294 45.2767,61.8294C46.4269,61.8294 47.5336,61.6884 48.597,61.4063ZM66.7936,54.9609C65.9473,57.717 64.6994,60.0065 63.0501,61.8294L68.584,67.0052L63.3431,72.474L57.5488,67.0052C55.791,68.0686 54.2719,68.8173 52.9915,69.2513C50.8431,69.9674 48.2715,70.3255 45.2767,70.3255C39.0267,70.3255 33.8618,68.4592 29.7819,64.7266C24.834,60.2344 22.36,53.6372 22.36,44.9349C22.36,36.1675 24.8991,29.5378 29.9772,25.0456C34.1222,21.378 39.2763,19.5443 45.4395,19.5443C51.6461,19.5443 56.8544,21.4865 61.0645,25.3711C65.9256,29.8633 68.3561,36.1458 68.3561,44.2188C68.3561,48.4939 67.8353,52.0747 66.7936,54.9609Z" style="fill:black;fill-rule:nonzero;"/>
|
<path d="M48.597,61.4063C49.1829,61.2543 49.9316,60.9831 50.8431,60.5924L45.9928,55.9701L51.1686,50.5664L56.0189,55.1888C56.7784,53.6263 57.3101,52.2591 57.6139,51.0872C58.0914,49.3294 58.3301,47.2786 58.3301,44.9349C58.3301,39.553 57.2287,35.3917 55.026,32.4512C52.8234,29.5106 49.6061,28.0404 45.3743,28.0404C41.403,28.0404 38.2346,29.451 35.8691,32.2721C33.5037,35.0933 32.321,39.3142 32.321,44.9349C32.321,51.5104 34.0137,56.2196 37.3991,59.0625C39.5909,60.9071 42.2168,61.8294 45.2767,61.8294C46.4269,61.8294 47.5336,61.6884 48.597,61.4063ZM66.7936,54.9609C65.9473,57.717 64.6994,60.0065 63.0501,61.8294L68.584,67.0052L63.3431,72.474L57.5488,67.0052C55.791,68.0686 54.2719,68.8173 52.9915,69.2513C50.8431,69.9674 48.2715,70.3255 45.2767,70.3255C39.0267,70.3255 33.8618,68.4592 29.7819,64.7266C24.834,60.2344 22.36,53.6372 22.36,44.9349C22.36,36.1675 24.8991,29.5378 29.9772,25.0456C34.1222,21.378 39.2763,19.5443 45.4395,19.5443C51.6461,19.5443 56.8544,21.4865 61.0645,25.3711C65.9256,29.8633 68.3561,36.1458 68.3561,44.2188C68.3561,48.4939 67.8353,52.0747 66.7936,54.9609Z" style="fill:black;fill-rule:nonzero;"/>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
@@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" standalone="no"?>
|
<?xml version="1.0" standalone="no"?>
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
||||||
<g id="R">
|
<g id="R">
|
||||||
<circle cx="45" cy="45" r="45" style="fill:rgb(252,204,10);"/>
|
<circle cx="45" cy="45" r="45" style="fill:rgb(252,204,10);"/>
|
||||||
<path d="M36.0319,29.3424L36.0319,42.2331L47.3926,42.2331C49.6495,42.2331 51.3422,41.9727 52.4707,41.4518C54.4672,40.5404 55.4655,38.7391 55.4655,36.0482C55.4655,33.1402 54.4998,31.1871 52.5684,30.1888C51.4833,29.6246 49.8557,29.3424 47.6855,29.3424L36.0319,29.3424ZM57.5326,22.2461C59.3446,23.0056 60.88,24.1233 62.1387,25.599C63.1803,26.8142 64.005,28.1597 64.6126,29.6354C65.2203,31.1111 65.5241,32.793 65.5241,34.681C65.5241,36.9596 64.949,39.2003 63.7988,41.403C62.6487,43.6057 60.7498,45.1628 58.1022,46.0742C60.3158,46.964 61.8837,48.2281 62.806,49.8665C63.7283,51.505 64.1895,54.0061 64.1895,57.3698L64.1895,60.5924C64.1895,62.7843 64.2763,64.2708 64.4499,65.0521C64.7103,66.2891 65.3179,67.2005 66.2728,67.7865L66.2728,68.9909L55.2376,68.9909C54.9338,67.9275 54.7168,67.0703 54.5866,66.4193C54.3262,65.0738 54.1851,63.6957 54.1634,62.2852L54.0983,57.8255C54.0549,54.7656 53.4961,52.7257 52.4219,51.7057C51.3477,50.6858 49.3349,50.1758 46.3835,50.1758L36.0319,50.1758L36.0319,68.9909L26.2337,68.9909L26.2337,21.0091L49.7689,21.0091C53.1326,21.0742 55.7205,21.4865 57.5326,22.2461Z" style="fill:black;fill-rule:nonzero;"/>
|
<path d="M36.0319,29.3424L36.0319,42.2331L47.3926,42.2331C49.6495,42.2331 51.3422,41.9727 52.4707,41.4518C54.4672,40.5404 55.4655,38.7391 55.4655,36.0482C55.4655,33.1402 54.4998,31.1871 52.5684,30.1888C51.4833,29.6246 49.8557,29.3424 47.6855,29.3424L36.0319,29.3424ZM57.5326,22.2461C59.3446,23.0056 60.88,24.1233 62.1387,25.599C63.1803,26.8142 64.005,28.1597 64.6126,29.6354C65.2203,31.1111 65.5241,32.793 65.5241,34.681C65.5241,36.9596 64.949,39.2003 63.7988,41.403C62.6487,43.6057 60.7498,45.1628 58.1022,46.0742C60.3158,46.964 61.8837,48.2281 62.806,49.8665C63.7283,51.505 64.1895,54.0061 64.1895,57.3698L64.1895,60.5924C64.1895,62.7843 64.2763,64.2708 64.4499,65.0521C64.7103,66.2891 65.3179,67.2005 66.2728,67.7865L66.2728,68.9909L55.2376,68.9909C54.9338,67.9275 54.7168,67.0703 54.5866,66.4193C54.3262,65.0738 54.1851,63.6957 54.1634,62.2852L54.0983,57.8255C54.0549,54.7656 53.4961,52.7257 52.4219,51.7057C51.3477,50.6858 49.3349,50.1758 46.3835,50.1758L36.0319,50.1758L36.0319,68.9909L26.2337,68.9909L26.2337,21.0091L49.7689,21.0091C53.1326,21.0742 55.7205,21.4865 57.5326,22.2461Z" style="fill:black;fill-rule:nonzero;"/>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
@@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" standalone="no"?>
|
<?xml version="1.0" standalone="no"?>
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
||||||
<g id="S">
|
<g id="S">
|
||||||
<circle cx="45" cy="45" r="45" style="fill:rgb(128,129,131);"/>
|
<circle cx="45" cy="45" r="45" style="fill:rgb(128,129,131);"/>
|
||||||
<path d="M35.1042,54.1797C35.408,56.3715 36.0048,58.01 36.8945,59.0951C38.5221,61.0699 41.3108,62.0573 45.2604,62.0573C47.6259,62.0573 49.5464,61.7969 51.0221,61.276C53.8216,60.2778 55.2214,58.4223 55.2214,55.7096C55.2214,54.1254 54.5269,52.8993 53.138,52.0313C51.7491,51.1849 49.5681,50.4362 46.5951,49.7852L41.5169,48.6458C36.5256,47.5174 33.0751,46.2912 31.1654,44.9674C27.9319,42.7539 26.3151,39.2925 26.3151,34.5833C26.3151,30.2865 27.8776,26.7166 31.0026,23.8737C34.1276,21.0308 38.7174,19.6094 44.7721,19.6094C49.8286,19.6094 54.1417,20.9494 57.7116,23.6296C61.2815,26.3097 63.1532,30.1997 63.3268,35.2995L53.6914,35.2995C53.5178,32.4132 52.2591,30.3624 49.9154,29.1471C48.3529,28.3442 46.4106,27.9427 44.0885,27.9427C41.5061,27.9427 39.4444,28.4635 37.9036,29.5052C36.3628,30.5469 35.5924,32.0009 35.5924,33.8672C35.5924,35.5816 36.352,36.862 37.8711,37.7083C38.8477,38.2726 40.931,38.9345 44.1211,39.694L52.3893,41.6797C56.0135,42.5477 58.7478,43.7088 60.5924,45.1628C63.457,47.4197 64.8893,50.6858 64.8893,54.9609C64.8893,59.3446 63.2129,62.985 59.86,65.8822C56.5072,68.7793 51.7708,70.2279 45.651,70.2279C39.401,70.2279 34.4857,68.801 30.9049,65.9473C27.3242,63.0935 25.5339,59.171 25.5339,54.1797L35.1042,54.1797Z" style="fill:white;fill-rule:nonzero;"/>
|
<path d="M35.1042,54.1797C35.408,56.3715 36.0048,58.01 36.8945,59.0951C38.5221,61.0699 41.3108,62.0573 45.2604,62.0573C47.6259,62.0573 49.5464,61.7969 51.0221,61.276C53.8216,60.2778 55.2214,58.4223 55.2214,55.7096C55.2214,54.1254 54.5269,52.8993 53.138,52.0313C51.7491,51.1849 49.5681,50.4362 46.5951,49.7852L41.5169,48.6458C36.5256,47.5174 33.0751,46.2912 31.1654,44.9674C27.9319,42.7539 26.3151,39.2925 26.3151,34.5833C26.3151,30.2865 27.8776,26.7166 31.0026,23.8737C34.1276,21.0308 38.7174,19.6094 44.7721,19.6094C49.8286,19.6094 54.1417,20.9494 57.7116,23.6296C61.2815,26.3097 63.1532,30.1997 63.3268,35.2995L53.6914,35.2995C53.5178,32.4132 52.2591,30.3624 49.9154,29.1471C48.3529,28.3442 46.4106,27.9427 44.0885,27.9427C41.5061,27.9427 39.4444,28.4635 37.9036,29.5052C36.3628,30.5469 35.5924,32.0009 35.5924,33.8672C35.5924,35.5816 36.352,36.862 37.8711,37.7083C38.8477,38.2726 40.931,38.9345 44.1211,39.694L52.3893,41.6797C56.0135,42.5477 58.7478,43.7088 60.5924,45.1628C63.457,47.4197 64.8893,50.6858 64.8893,54.9609C64.8893,59.3446 63.2129,62.985 59.86,65.8822C56.5072,68.7793 51.7708,70.2279 45.651,70.2279C39.401,70.2279 34.4857,68.801 30.9049,65.9473C27.3242,63.0935 25.5339,59.171 25.5339,54.1797L35.1042,54.1797Z" style="fill:white;fill-rule:nonzero;"/>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
@@ -1,14 +1,14 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
||||||
<g transform="matrix(1,0,0,1,-5,-5)">
|
<g transform="matrix(1,0,0,1,-5,-5)">
|
||||||
<g id="T">
|
<g id="T">
|
||||||
<g transform="matrix(1.02285,0,0,1.02285,-0.474267,-1.17657)">
|
<g transform="matrix(1.02285,0,0,1.02285,-0.474267,-1.17657)">
|
||||||
<circle cx="49.347" cy="50.033" r="43.995" style="fill:rgb(0,174,239);"/>
|
<circle cx="49.347" cy="50.033" r="43.995" style="fill:rgb(0,174,239);"/>
|
||||||
</g>
|
</g>
|
||||||
<g transform="matrix(1.26802,0,0,1.26802,21.9029,39.5201)">
|
<g transform="matrix(1.26802,0,0,1.26802,21.9029,39.5201)">
|
||||||
<path d="M37.6,-10.655L37.6,-3.955L26.278,-3.955L26.278,27.185L18.32,27.185L18.32,-3.955L6.948,-3.955L6.948,-10.655L37.6,-10.655Z" style="fill:white;fill-rule:nonzero;"/>
|
<path d="M37.6,-10.655L37.6,-3.955L26.278,-3.955L26.278,27.185L18.32,27.185L18.32,-3.955L6.948,-3.955L6.948,-10.655L37.6,-10.655Z" style="fill:white;fill-rule:nonzero;"/>
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 997 B After Width: | Height: | Size: 1011 B |
@@ -1,14 +1,14 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
||||||
<g transform="matrix(1,0,0,1,-5,-5)">
|
<g transform="matrix(1,0,0,1,-5,-5)">
|
||||||
<g id="W">
|
<g id="W">
|
||||||
<g transform="matrix(1.02285,0,0,1.02285,-0.474267,-1.17657)">
|
<g transform="matrix(1.02285,0,0,1.02285,-0.474267,-1.17657)">
|
||||||
<circle cx="49.347" cy="50.033" r="43.995" style="fill:rgb(252,204,10);"/>
|
<circle cx="49.347" cy="50.033" r="43.995" style="fill:rgb(252,204,10);"/>
|
||||||
</g>
|
</g>
|
||||||
<g transform="matrix(1.26802,0,0,1.26802,21.9029,39.5201)">
|
<g transform="matrix(1.26802,0,0,1.26802,21.9029,39.5201)">
|
||||||
<path d="M6.511,-10.655L11.517,11.012L12.596,17.044L13.699,11.14L17.961,-10.655L26.304,-10.655L30.797,11.012L31.952,17.044L33.107,11.243L38.164,-10.655L46.2,-10.655L35.546,27.185L27.998,27.185L23.429,5.056L22.094,-2.261L20.759,5.056L16.19,27.185L8.847,27.185L-1.883,-10.655L6.511,-10.655Z" style="fill:black;fill-rule:nonzero;"/>
|
<path d="M6.511,-10.655L11.517,11.012L12.596,17.044L13.699,11.14L17.961,-10.655L26.304,-10.655L30.797,11.012L31.952,17.044L33.107,11.243L38.164,-10.655L46.2,-10.655L35.546,27.185L27.998,27.185L23.429,5.056L22.094,-2.261L20.759,5.056L16.19,27.185L8.847,27.185L-1.883,-10.655L6.511,-10.655Z" style="fill:black;fill-rule:nonzero;"/>
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
@@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" standalone="no"?>
|
<?xml version="1.0" standalone="no"?>
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
<svg width="100%" height="100%" viewBox="0 0 90 90" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
||||||
<g id="Z">
|
<g id="Z">
|
||||||
<circle cx="45" cy="45" r="45" style="fill:rgb(153,100,51);"/>
|
<circle cx="45" cy="45" r="45" style="fill:rgb(153,100,51);"/>
|
||||||
<path d="M26.3314,60.5273L51.1035,29.5052L26.9499,29.5052L26.9499,21.0091L63.6035,21.0091L63.6035,29.0495L38.5059,60.5273L63.6686,60.5273L63.6686,68.9909L26.3314,68.9909L26.3314,60.5273Z" style="fill:white;fill-rule:nonzero;"/>
|
<path d="M26.3314,60.5273L51.1035,29.5052L26.9499,29.5052L26.9499,21.0091L63.6035,21.0091L63.6035,29.0495L38.5059,60.5273L63.6686,60.5273L63.6686,68.9909L26.3314,68.9909L26.3314,60.5273Z" style="fill:white;fill-rule:nonzero;"/>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 734 B After Width: | Height: | Size: 742 B |
@@ -1,123 +1,123 @@
|
|||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
|
|
||||||
function updateStationData(station) {
|
function updateStationData(station) {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
type: "POST",
|
type: "POST",
|
||||||
url: '/mta_data',
|
url: '/mta_data',
|
||||||
contentType: "application/json",
|
contentType: "application/json",
|
||||||
dataType: "json",
|
dataType: "json",
|
||||||
async: true,
|
async: true,
|
||||||
data: JSON.stringify({"station": station.find('.station-name:first').get(0).innerText}, null, '\t'),
|
data: JSON.stringify({"station": station.find('.station-name:first').get(0).innerText}, null, '\t'),
|
||||||
success: function (data) {
|
success: function (data) {
|
||||||
updateStation(station, data)
|
updateStation(station, data)
|
||||||
},
|
},
|
||||||
error: function (request) {
|
error: function (request) {
|
||||||
console.log(request.responseText);
|
console.log(request.responseText);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function updateStartTime() {
|
function updateStartTime() {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
type: "get",
|
type: "get",
|
||||||
url: '/start_time',
|
url: '/start_time',
|
||||||
async: true,
|
async: true,
|
||||||
success: function (data) {
|
success: function (data) {
|
||||||
console.log("GETTING TIME")
|
console.log("GETTING TIME")
|
||||||
console.log(data);
|
console.log(data);
|
||||||
$("#start_time").text(data)
|
$("#start_time").text(data)
|
||||||
},
|
},
|
||||||
error: function (request) {
|
error: function (request) {
|
||||||
console.log(request.responseText);
|
console.log(request.responseText);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateStation(station, data) {
|
function updateStation(station, data) {
|
||||||
updateDirections(station, data, "North");
|
updateDirections(station, data, "North");
|
||||||
updateDirections(station, data, "South");
|
updateDirections(station, data, "South");
|
||||||
updateTime(data["LastUpdated"])
|
updateTime(data["LastUpdated"])
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateTime(lastUpdated) {
|
function updateTime(lastUpdated) {
|
||||||
console.log(lastUpdated)
|
console.log(lastUpdated)
|
||||||
$("#last_updated").text(lastUpdated)
|
$("#last_updated").text(lastUpdated)
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateDirections(station, data, direction) {
|
function updateDirections(station, data, direction) {
|
||||||
n = data[direction]
|
n = data[direction]
|
||||||
list_items = station.find(".card:".concat(direction === "North" ? "first" : "last")).find(".station-info")
|
list_items = station.find(".card:".concat(direction === "North" ? "first" : "last")).find(".station-info")
|
||||||
var i = 0;
|
var i = 0;
|
||||||
for (var train in n) {
|
for (var train in n) {
|
||||||
updateLineItem(list_items.get(i), n[train], train)
|
updateLineItem(list_items.get(i), n[train], train)
|
||||||
i = i + 1
|
i = i + 1
|
||||||
}
|
}
|
||||||
if (i < 3) {
|
if (i < 3) {
|
||||||
console.log("Only 2 items updated")
|
console.log("Only 2 items updated")
|
||||||
for (let remainingIndex = i; remainingIndex < 3; remainingIndex++) {
|
for (let remainingIndex = i; remainingIndex < 3; remainingIndex++) {
|
||||||
updateLineItem(list_items.get(i), "No Trains Available", "N/A")
|
updateLineItem(list_items.get(i), "No Trains Available", "N/A")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateLineItem(listItem, times, train) {
|
function updateLineItem(listItem, times, train) {
|
||||||
var timeString;
|
var timeString;
|
||||||
if (typeof times === 'string' || times instanceof String) {
|
if (typeof times === 'string' || times instanceof String) {
|
||||||
timeString = times;
|
timeString = times;
|
||||||
} else {
|
} else {
|
||||||
timeString = times.sort(function (a, b) {
|
timeString = times.sort(function (a, b) {
|
||||||
return a - b;
|
return a - b;
|
||||||
}).join(", ");
|
}).join(", ");
|
||||||
}
|
}
|
||||||
$(listItem).find("h1").text(timeString);
|
$(listItem).find("h1").text(timeString);
|
||||||
if (imageExists("/static/images/lines/" + train + ".svg")) {
|
if (imageExists("/static/images/lines/" + train + ".svg")) {
|
||||||
|
|
||||||
$(listItem).show()
|
$(listItem).show()
|
||||||
$(listItem).find("img").attr("src", "/static/images/lines/" + train + ".svg")
|
$(listItem).find("img").attr("src", "/static/images/lines/" + train + ".svg")
|
||||||
} else if (train === "N/A") {
|
} else if (train === "N/A") {
|
||||||
console.log("Route Is NA - Disabling Route")
|
console.log("Route Is NA - Disabling Route")
|
||||||
console.log($(listItem))
|
console.log($(listItem))
|
||||||
$(listItem).hide()
|
$(listItem).hide()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function imageExists(image_url) {
|
function imageExists(image_url) {
|
||||||
var http = new XMLHttpRequest();
|
var http = new XMLHttpRequest();
|
||||||
http.open('HEAD', image_url, false);
|
http.open('HEAD', image_url, false);
|
||||||
http.send();
|
http.send();
|
||||||
return http.status != 404;
|
return http.status != 404;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const interval = setInterval(function () {
|
const interval = setInterval(function () {
|
||||||
updateStationData($('#station_1'))
|
updateStationData($('#station_1'))
|
||||||
}, 5000);
|
}, 5000);
|
||||||
const interval2 = setInterval(function () {
|
const interval2 = setInterval(function () {
|
||||||
updateStationData($('#station_2'))
|
updateStationData($('#station_2'))
|
||||||
}, 6000);
|
}, 6000);
|
||||||
updateStartTime();
|
updateStartTime();
|
||||||
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
function setStation(ele) {
|
function setStation(ele) {
|
||||||
console.log(ele)
|
console.log(ele)
|
||||||
console.log($(ele).text())
|
console.log($(ele).text())
|
||||||
var stop_name = ele.text;
|
var stop_name = ele.text;
|
||||||
|
|
||||||
$.ajax({
|
$.ajax({
|
||||||
type: "POST",
|
type: "POST",
|
||||||
//the url where you want to sent the userName and password to
|
//the url where you want to sent the userName and password to
|
||||||
url: '/get_stop_id',
|
url: '/get_stop_id',
|
||||||
contentType: "application/json",
|
contentType: "application/json",
|
||||||
dataType: "json",
|
dataType: "json",
|
||||||
async: true,
|
async: true,
|
||||||
//json object to sent to the authentication url
|
//json object to sent to the authentication url
|
||||||
data: JSON.stringify({"stop_name": stop_name}, null, '\t'),
|
data: JSON.stringify({"stop_name": stop_name}, null, '\t'),
|
||||||
success: function (data, text) {
|
success: function (data, text) {
|
||||||
alert(JSON.stringify(data));
|
alert(JSON.stringify(data));
|
||||||
},
|
},
|
||||||
error: function (request, status, error) {
|
error: function (request, status, error) {
|
||||||
alert(request.responseText);
|
alert(request.responseText);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||