Compare commits
3 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
cb977a2719 | ||
|
e1b4b12024 | ||
|
f435a6e6fa |
@ -1,17 +1,10 @@
|
|||||||
urllib3==1.26.7
|
|
||||||
requests==2.28.1
|
|
||||||
PyNaCl==1.5.0
|
PyNaCl==1.5.0
|
||||||
gevent==21.12.0
|
|
||||||
Flask==2.1.3
|
|
||||||
PySocks==1.7.1
|
PySocks==1.7.1
|
||||||
stem==1.8.0
|
stem==1.8.0
|
||||||
deadsimplekv==0.3.2
|
|
||||||
unpaddedbase32==0.2.0
|
unpaddedbase32==0.2.0
|
||||||
toomanyobjs==1.1.0
|
|
||||||
niceware==0.2.1
|
niceware==0.2.1
|
||||||
psutil==5.9.1
|
psutil==5.9.1
|
||||||
filenuke==0.0.0
|
filenuke==0.0.0
|
||||||
watchdog==2.1.9
|
|
||||||
ujson==5.4.0
|
ujson==5.4.0
|
||||||
cffi==1.15.1
|
cffi==1.15.1
|
||||||
onionrblocks==7.0.0
|
onionrblocks==7.0.0
|
||||||
|
@ -4,36 +4,14 @@
|
|||||||
#
|
#
|
||||||
# pip-compile
|
# pip-compile
|
||||||
#
|
#
|
||||||
certifi==2018.11.29
|
|
||||||
# via requests
|
|
||||||
cffi==1.15.1
|
cffi==1.15.1
|
||||||
# via
|
# via
|
||||||
# -r requirements.in
|
# -r requirements.in
|
||||||
# pynacl
|
# pynacl
|
||||||
charset-normalizer==2.0.9
|
|
||||||
# via requests
|
|
||||||
click==8.0.3
|
|
||||||
# via flask
|
|
||||||
deadsimplekv==0.3.2
|
|
||||||
# via -r requirements.in
|
|
||||||
filenuke==0.0.0
|
filenuke==0.0.0
|
||||||
# via -r requirements.in
|
# via -r requirements.in
|
||||||
flask==2.1.3
|
|
||||||
# via -r requirements.in
|
|
||||||
gevent==21.12.0
|
|
||||||
# via -r requirements.in
|
|
||||||
greenlet==1.1.2
|
|
||||||
# via gevent
|
|
||||||
idna==2.7
|
|
||||||
# via requests
|
|
||||||
itsdangerous==2.0.1
|
|
||||||
# via flask
|
|
||||||
jinja2==3.0.3
|
|
||||||
# via flask
|
|
||||||
kasten==3.0.0
|
kasten==3.0.0
|
||||||
# via onionrblocks
|
# via onionrblocks
|
||||||
markupsafe==2.0.1
|
|
||||||
# via jinja2
|
|
||||||
mimcvdf==1.2.1
|
mimcvdf==1.2.1
|
||||||
# via kasten
|
# via kasten
|
||||||
msgpack==1.0.3
|
msgpack==1.0.3
|
||||||
@ -54,28 +32,9 @@ pynacl==1.5.0
|
|||||||
# onionrblocks
|
# onionrblocks
|
||||||
pysocks==1.7.1
|
pysocks==1.7.1
|
||||||
# via -r requirements.in
|
# via -r requirements.in
|
||||||
requests==2.28.1
|
|
||||||
# via -r requirements.in
|
|
||||||
stem==1.8.0
|
stem==1.8.0
|
||||||
# via -r requirements.in
|
# via -r requirements.in
|
||||||
toomanyobjs==1.1.0
|
|
||||||
# via -r requirements.in
|
|
||||||
ujson==5.4.0
|
ujson==5.4.0
|
||||||
# via -r requirements.in
|
# via -r requirements.in
|
||||||
unpaddedbase32==0.2.0
|
unpaddedbase32==0.2.0
|
||||||
# via -r requirements.in
|
# via -r requirements.in
|
||||||
urllib3==1.26.7
|
|
||||||
# via
|
|
||||||
# -r requirements.in
|
|
||||||
# requests
|
|
||||||
watchdog==2.1.9
|
|
||||||
# via -r requirements.in
|
|
||||||
werkzeug==2.0.2
|
|
||||||
# via flask
|
|
||||||
zope-event==4.4
|
|
||||||
# via gevent
|
|
||||||
zope-interface==5.1.0
|
|
||||||
# via gevent
|
|
||||||
|
|
||||||
# The following packages are considered to be unsafe in a requirements file:
|
|
||||||
# setuptools
|
|
||||||
|
@ -46,14 +46,6 @@ locale.setlocale(locale.LC_ALL, '') # noqa
|
|||||||
ran_as_script = False
|
ran_as_script = False
|
||||||
if __name__ == "__main__": ran_as_script = True
|
if __name__ == "__main__": ran_as_script = True
|
||||||
|
|
||||||
# Import standard libraries
|
|
||||||
|
|
||||||
try:
|
|
||||||
from onionrutils import dependencycheck # noqa
|
|
||||||
except ModuleNotFoundError as e:
|
|
||||||
print('Missing requirement: ' + str(e) + ' installed')
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
# Import 3rd party libraries
|
# Import 3rd party libraries
|
||||||
|
|
||||||
from filenuke import nuke # noqa
|
from filenuke import nuke # noqa
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
# API Servers
|
|
||||||
|
|
||||||
Contains the WSGI servers Onionr uses for remote peer communication and local daemon control
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
* \_\_init\_\_.py: Exposes the server classes
|
|
||||||
* private: Contains the client API (the server used to interact with the local Onionr daemon, and view the web UI)
|
|
||||||
* public: Contains the public API (the server used by remote peers to talk to our daemon)
|
|
@ -1,9 +0,0 @@
|
|||||||
"""Flask WSGI apps for the public and private API servers.
|
|
||||||
|
|
||||||
Public is net-facing server meant for other nodes
|
|
||||||
Private is meant for controlling and accessing this node
|
|
||||||
"""
|
|
||||||
|
|
||||||
from . import private
|
|
||||||
|
|
||||||
private_api = private.private_api
|
|
@ -1,8 +0,0 @@
|
|||||||
# Private API Server
|
|
||||||
|
|
||||||
Private API server, used to access the web interface locally and control Onionr
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
* \_\_init\_\_.py: Sets up the server and a few misc functions
|
|
||||||
* register_private_blueprints.py: Adds in flask blueprints for various sub-APIs
|
|
@ -1,121 +0,0 @@
|
|||||||
"""Onionr - Private P2P Communication.
|
|
||||||
|
|
||||||
This file handles all incoming http requests to the client, using Flask
|
|
||||||
"""
|
|
||||||
from typing import Dict
|
|
||||||
from typing import Set
|
|
||||||
from typing import TYPE_CHECKING
|
|
||||||
import hmac
|
|
||||||
|
|
||||||
import flask
|
|
||||||
from gevent.pywsgi import WSGIServer
|
|
||||||
|
|
||||||
from onionrutils import epoch
|
|
||||||
import httpapi
|
|
||||||
from filepaths import private_API_host_file
|
|
||||||
import logger
|
|
||||||
|
|
||||||
from onionrutils import waitforsetvar
|
|
||||||
from . import register_private_blueprints
|
|
||||||
import config
|
|
||||||
|
|
||||||
"""
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
class PrivateAPI:
|
|
||||||
"""Client HTTP api for controlling onionr and using UI."""
|
|
||||||
|
|
||||||
callbacks: Dict[str, Dict] = {'public': {}, 'private': {}}
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
"""Initialize the api server, preping variables for later use.
|
|
||||||
|
|
||||||
This initialization defines all of the API entry points
|
|
||||||
and handlers for the endpoints and errors
|
|
||||||
This also saves the used host (random localhost IP address)
|
|
||||||
to the data folder in host.txt
|
|
||||||
"""
|
|
||||||
self.config = config
|
|
||||||
|
|
||||||
self.startTime = epoch.get_epoch()
|
|
||||||
app = flask.Flask(__name__)
|
|
||||||
|
|
||||||
|
|
||||||
self.httpServer = ''
|
|
||||||
|
|
||||||
self.queueResponse = {}
|
|
||||||
register_private_blueprints.register_private_blueprints(self, app)
|
|
||||||
httpapi.load_plugin_blueprints(app)
|
|
||||||
self.app = app
|
|
||||||
|
|
||||||
def start(self):
|
|
||||||
"""Start client gevent API web server with flask client app."""
|
|
||||||
|
|
||||||
fd_handler = httpapi.fdsafehandler.FDSafeHandler
|
|
||||||
|
|
||||||
self.clientToken = config.get('client.webpassword')
|
|
||||||
if config.get('general.bind_address'):
|
|
||||||
with open(private_API_host_file, 'w') as bindFile:
|
|
||||||
bindFile.write(config.get('general.bind_address'))
|
|
||||||
self.host = config.get('general.bind_address')
|
|
||||||
else:
|
|
||||||
self.host = httpapi.apiutils.setbindip.set_bind_IP(
|
|
||||||
private_API_host_file)
|
|
||||||
bind_port = int(config.get('client.client.port', 59496))
|
|
||||||
self.bindPort = bind_port
|
|
||||||
|
|
||||||
self.httpServer = WSGIServer((self.host, self.bindPort),
|
|
||||||
self.app, log=None,
|
|
||||||
handler_class=fd_handler)
|
|
||||||
logger.info(f'Running API on {self.host}:{self.bindPort}', terminal=True)
|
|
||||||
self.httpServer.serve_forever()
|
|
||||||
|
|
||||||
def setPublicAPIInstance(self, inst):
|
|
||||||
"""Dynamically set public API instance."""
|
|
||||||
self.publicAPI = inst
|
|
||||||
|
|
||||||
def validateToken(self, token):
|
|
||||||
"""Validate that the client token matches the given token.
|
|
||||||
|
|
||||||
Used to prevent CSRF and other attacks.
|
|
||||||
"""
|
|
||||||
if not self.clientToken:
|
|
||||||
logger.error("client password needs to be set")
|
|
||||||
return False
|
|
||||||
try:
|
|
||||||
return hmac.compare_digest(self.clientToken, token)
|
|
||||||
except TypeError:
|
|
||||||
return False
|
|
||||||
|
|
||||||
def getUptime(self) -> int:
|
|
||||||
"""Safely wait for uptime to be set and return it."""
|
|
||||||
while True:
|
|
||||||
try:
|
|
||||||
return epoch.get_epoch() - self.startTime
|
|
||||||
except (AttributeError, NameError):
|
|
||||||
# Don't error on race condition with startup
|
|
||||||
pass
|
|
||||||
|
|
||||||
def getBlockData(self, bHash, decrypt=False, raw=False,
|
|
||||||
headerOnly=False) -> bytes:
|
|
||||||
"""Returns block data bytes."""
|
|
||||||
return self.get_block_data.get_block_data(bHash,
|
|
||||||
decrypt=decrypt,
|
|
||||||
raw=raw,
|
|
||||||
headerOnly=headerOnly)
|
|
||||||
|
|
||||||
|
|
||||||
private_api = PrivateAPI()
|
|
@ -1,46 +0,0 @@
|
|||||||
"""Onionr - Private P2P Communication.
|
|
||||||
|
|
||||||
This file registers blueprints for the private api server
|
|
||||||
"""
|
|
||||||
from threading import Thread
|
|
||||||
from gevent import sleep
|
|
||||||
|
|
||||||
from httpapi import security, friendsapi, configapi
|
|
||||||
from httpapi import miscclientapi, apiutils
|
|
||||||
from httpapi import themeapi
|
|
||||||
from httpapi import fileoffsetreader
|
|
||||||
from httpapi.sse.private import private_sse_blueprint
|
|
||||||
from httpapi import addblock
|
|
||||||
|
|
||||||
"""
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
def register_private_blueprints(private_api, app):
|
|
||||||
"""Register private API plask blueprints."""
|
|
||||||
app.register_blueprint(security.client.ClientAPISecurity(
|
|
||||||
private_api).client_api_security_bp)
|
|
||||||
app.register_blueprint(friendsapi.friends)
|
|
||||||
app.register_blueprint(configapi.config_BP)
|
|
||||||
app.register_blueprint(miscclientapi.endpoints.PrivateEndpoints(
|
|
||||||
private_api).private_endpoints_bp)
|
|
||||||
app.register_blueprint(apiutils.shutdown.shutdown_bp)
|
|
||||||
app.register_blueprint(miscclientapi.staticfiles.static_files_bp)
|
|
||||||
app.register_blueprint(themeapi.theme_blueprint)
|
|
||||||
app.register_blueprint(private_sse_blueprint)
|
|
||||||
app.register_blueprint(fileoffsetreader.offset_reader_api)
|
|
||||||
app.register_blueprint(addblock.blockapi_blueprint)
|
|
||||||
|
|
||||||
return app
|
|
@ -20,6 +20,7 @@ upload_list = home + 'upload-list.json'
|
|||||||
config_file = home + 'config.json'
|
config_file = home + 'config.json'
|
||||||
daemon_mark_file = home + '/daemon-true.txt'
|
daemon_mark_file = home + '/daemon-true.txt'
|
||||||
lock_file = home + 'onionr.lock'
|
lock_file = home + 'onionr.lock'
|
||||||
|
pid_file = home + 'onionr.pid'
|
||||||
|
|
||||||
site_cache = home + 'onionr-sites.txt'
|
site_cache = home + 'onionr-sites.txt'
|
||||||
|
|
||||||
|
@ -1,13 +0,0 @@
|
|||||||
# httpapi
|
|
||||||
|
|
||||||
The httpapi contains collections of endpoints for the client and public API servers.
|
|
||||||
|
|
||||||
## Files:
|
|
||||||
|
|
||||||
configapi: manage onionr configuration from the client http api
|
|
||||||
|
|
||||||
friendsapi: add, remove and list friends from the client http api
|
|
||||||
|
|
||||||
miscpublicapi: misculanious onionr network interaction from the **public** httpapi, such as announcements, block fetching and uploading.
|
|
||||||
|
|
||||||
profilesapi: work in progress in returning a profile page for an Onionr user
|
|
@ -1,36 +0,0 @@
|
|||||||
"""
|
|
||||||
Onionr - Private P2P Communication
|
|
||||||
|
|
||||||
Register plugins flask blueprints for the client http server
|
|
||||||
"""
|
|
||||||
import onionrplugins
|
|
||||||
import config
|
|
||||||
from .fdsafehandler import FDSafeHandler
|
|
||||||
"""
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
def load_plugin_blueprints(flaskapp, blueprint: str = 'flask_blueprint'):
|
|
||||||
"""Iterate enabled plugins and load any http endpoints they have"""
|
|
||||||
config.reload()
|
|
||||||
disabled = config.get('plugins.disabled', [])
|
|
||||||
for plugin in onionrplugins.get_enabled_plugins():
|
|
||||||
if plugin in disabled:
|
|
||||||
continue
|
|
||||||
plugin = onionrplugins.get_plugin(plugin)
|
|
||||||
try:
|
|
||||||
flaskapp.register_blueprint(getattr(plugin, blueprint))
|
|
||||||
except AttributeError:
|
|
||||||
pass
|
|
@ -1,45 +0,0 @@
|
|||||||
"""Onionr - Private P2P Communication.
|
|
||||||
|
|
||||||
Serialized APIs
|
|
||||||
"""
|
|
||||||
|
|
||||||
from asyncio.log import logger
|
|
||||||
import secrets
|
|
||||||
from flask import Blueprint, Response, request
|
|
||||||
|
|
||||||
from onionrblocks import Block
|
|
||||||
import blockdb
|
|
||||||
|
|
||||||
import logger
|
|
||||||
from gossip import blockqueues
|
|
||||||
from gossip.constants import BLOCK_ID_SIZE
|
|
||||||
|
|
||||||
"""
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
"""
|
|
||||||
blockapi_blueprint = Blueprint('blockapi', __name__)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Add a block that we generated (or received from a transport like LAN/sneakernet)
|
|
||||||
@blockapi_blueprint.route('/addvdfblock', methods=['POST'])
|
|
||||||
def block_serialized():
|
|
||||||
stream_to_use = secrets.randbits(1)
|
|
||||||
req_data = request.data
|
|
||||||
block_id = req_data[:BLOCK_ID_SIZE]
|
|
||||||
block_data = req_data[BLOCK_ID_SIZE:]
|
|
||||||
#blockdb.add_block_to_db(Block(block_id, block_data, auto_verify=False))
|
|
||||||
blockqueues.gossip_block_queues[stream_to_use].put(
|
|
||||||
Block(block_id, block_data, auto_verify=False), block=False)
|
|
||||||
return "ok"
|
|
@ -1 +0,0 @@
|
|||||||
from . import shutdown, setbindip
|
|
@ -1,42 +0,0 @@
|
|||||||
import gevent
|
|
||||||
from gevent import socket, sleep
|
|
||||||
import secrets, random
|
|
||||||
import config, logger
|
|
||||||
import os
|
|
||||||
|
|
||||||
# Hacky monkey patch so we can bind random localhosts without gevent trying to switch with an empty hub
|
|
||||||
socket.getfqdn = lambda n: n
|
|
||||||
|
|
||||||
def _get_acceptable_random_number()->int:
|
|
||||||
"""Return a cryptographically random number in the inclusive range (1, 255)"""
|
|
||||||
number = 0
|
|
||||||
while number == 0:
|
|
||||||
number = secrets.randbelow(0xFF)
|
|
||||||
return number
|
|
||||||
|
|
||||||
def set_bind_IP(filePath=''):
|
|
||||||
'''Set a random localhost IP to a specified file (intended for private or public API localhost IPs)'''
|
|
||||||
if config.get('general.random_bind_ip', True):
|
|
||||||
hostOctets = []
|
|
||||||
# Build the random localhost address
|
|
||||||
for i in range(3):
|
|
||||||
hostOctets.append(str(_get_acceptable_random_number()))
|
|
||||||
hostOctets = ['127'] + hostOctets
|
|
||||||
# Convert the localhost address to a normal string address
|
|
||||||
data = '.'.join(hostOctets)
|
|
||||||
|
|
||||||
# Try to bind IP. Some platforms like Mac block non normal 127.x.x.x
|
|
||||||
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
||||||
try:
|
|
||||||
s.bind((data, 0))
|
|
||||||
except OSError:
|
|
||||||
# if mac/non-bindable, show warning and default to 127.0.0.1
|
|
||||||
logger.warn('Your platform appears to not support random local host addresses 127.x.x.x. Falling back to 127.0.0.1.')
|
|
||||||
data = '127.0.0.1'
|
|
||||||
s.close()
|
|
||||||
else:
|
|
||||||
data = '127.0.0.1'
|
|
||||||
if filePath != '':
|
|
||||||
with open(filePath, 'w') as bindFile:
|
|
||||||
bindFile.write(data)
|
|
||||||
return data
|
|
@ -1,30 +0,0 @@
|
|||||||
"""Onionr - Private P2P Communication.
|
|
||||||
|
|
||||||
Shutdown the node either hard or cleanly
|
|
||||||
"""
|
|
||||||
from flask import Blueprint, Response
|
|
||||||
from flask import g
|
|
||||||
"""
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
"""
|
|
||||||
|
|
||||||
shutdown_bp = Blueprint('shutdown', __name__)
|
|
||||||
|
|
||||||
|
|
||||||
def shutdown(client_api_inst):
|
|
||||||
try:
|
|
||||||
client_api_inst.httpServer.stop()
|
|
||||||
except AttributeError:
|
|
||||||
pass
|
|
||||||
return Response("bye")
|
|
@ -1,66 +0,0 @@
|
|||||||
"""
|
|
||||||
Onionr - Private P2P Communication
|
|
||||||
|
|
||||||
This file handles configuration setting and getting from the HTTP API
|
|
||||||
"""
|
|
||||||
"""
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
"""
|
|
||||||
from json import JSONDecodeError
|
|
||||||
import ujson as json
|
|
||||||
from flask import Blueprint, request, Response, abort
|
|
||||||
|
|
||||||
import config, onionrutils
|
|
||||||
|
|
||||||
from onionrutils.bytesconverter import bytes_to_str
|
|
||||||
config.reload()
|
|
||||||
|
|
||||||
config_BP = Blueprint('config_BP', __name__)
|
|
||||||
|
|
||||||
@config_BP.route('/config/get')
|
|
||||||
def get_all_config():
|
|
||||||
"""Simply return all configuration as JSON string"""
|
|
||||||
return Response(json.dumps(config.get_config(), indent=4, sort_keys=True))
|
|
||||||
|
|
||||||
@config_BP.route('/config/get/<key>')
|
|
||||||
def get_by_key(key):
|
|
||||||
"""Return a config setting by key"""
|
|
||||||
return Response(json.dumps(config.get(key)))
|
|
||||||
|
|
||||||
@config_BP.route('/config/setall', methods=['POST'])
|
|
||||||
def set_all_config():
|
|
||||||
"""Overwrite existing JSON config with new JSON string"""
|
|
||||||
try:
|
|
||||||
new_config = request.get_json(force=True)
|
|
||||||
except JSONDecodeError:
|
|
||||||
abort(400)
|
|
||||||
else:
|
|
||||||
config.set_config(new_config)
|
|
||||||
config.save()
|
|
||||||
return Response('success')
|
|
||||||
|
|
||||||
@config_BP.route('/config/set/<key>', methods=['POST'])
|
|
||||||
def set_by_key(key):
|
|
||||||
"""Overwrite/set only 1 config key"""
|
|
||||||
"""
|
|
||||||
{
|
|
||||||
'data': data
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
try:
|
|
||||||
data = json.loads(bytes_to_str(request.data))
|
|
||||||
except (JSONDecodeError, KeyError):
|
|
||||||
abort(400)
|
|
||||||
config.set(key, data, True)
|
|
||||||
return Response('success')
|
|
@ -1,16 +0,0 @@
|
|||||||
from gevent.pywsgi import WSGIServer, WSGIHandler
|
|
||||||
from gevent import Timeout
|
|
||||||
|
|
||||||
|
|
||||||
class FDSafeHandler(WSGIHandler):
|
|
||||||
'''Our WSGI handler. Doesn't do much non-default except timeouts'''
|
|
||||||
def handle(self):
|
|
||||||
self.timeout = Timeout(120, Exception)
|
|
||||||
self.timeout.start()
|
|
||||||
try:
|
|
||||||
WSGIHandler.handle(self)
|
|
||||||
except Timeout as ex:
|
|
||||||
if ex is self.timeout:
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
raise
|
|
@ -1,30 +0,0 @@
|
|||||||
from os.path import exists, dirname
|
|
||||||
|
|
||||||
import ujson
|
|
||||||
from flask import Blueprint, Response, request
|
|
||||||
|
|
||||||
from utils.identifyhome import identify_home
|
|
||||||
from utils.readoffset import read_from_offset
|
|
||||||
|
|
||||||
offset_reader_api = Blueprint('offsetreaderapi', __name__)
|
|
||||||
|
|
||||||
|
|
||||||
@offset_reader_api.route('/readfileoffset/<name>')
|
|
||||||
def offset_reader_endpoint(name):
|
|
||||||
if not name[:-4].isalnum():
|
|
||||||
return Response(400, "Path must be alphanumeric except for file ext")
|
|
||||||
|
|
||||||
path = identify_home() + name
|
|
||||||
|
|
||||||
if not exists(path):
|
|
||||||
return Response(404, "Path not found in Onionr data directory")
|
|
||||||
|
|
||||||
offset = request.args.get('offset')
|
|
||||||
|
|
||||||
if not offset:
|
|
||||||
offset = 0
|
|
||||||
else:
|
|
||||||
offset = int(offset)
|
|
||||||
result = read_from_offset(path, offset)._asdict()
|
|
||||||
|
|
||||||
return ujson.dumps(result, reject_bytes=False)
|
|
@ -1,75 +0,0 @@
|
|||||||
"""Onionr - Private P2P Communication.
|
|
||||||
|
|
||||||
This file creates http endpoints for friend management
|
|
||||||
"""
|
|
||||||
import ujson as json
|
|
||||||
|
|
||||||
from onionrusers import contactmanager
|
|
||||||
from flask import Blueprint, Response, request, abort, redirect
|
|
||||||
from coredb import keydb
|
|
||||||
"""
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
"""
|
|
||||||
friends = Blueprint('friends', __name__)
|
|
||||||
|
|
||||||
|
|
||||||
@friends.route('/friends/list')
|
|
||||||
def list_friends():
|
|
||||||
pubkey_list = {}
|
|
||||||
friend_list = contactmanager.ContactManager.list_friends()
|
|
||||||
for friend in friend_list:
|
|
||||||
pubkey_list[friend.publicKey] = {'name': friend.get_info('name')}
|
|
||||||
return json.dumps(pubkey_list)
|
|
||||||
|
|
||||||
|
|
||||||
@friends.route('/friends/add/<pubkey>', methods=['POST'])
|
|
||||||
def add_friend(pubkey):
|
|
||||||
contactmanager.ContactManager(pubkey, saveUser=True).setTrust(1)
|
|
||||||
try:
|
|
||||||
return redirect(request.referrer + '#' + request.form['token'])
|
|
||||||
except TypeError:
|
|
||||||
return Response(
|
|
||||||
"Added, but referrer not set, cannot return to friends page")
|
|
||||||
|
|
||||||
|
|
||||||
@friends.route('/friends/remove/<pubkey>', methods=['POST'])
|
|
||||||
def remove_friend(pubkey):
|
|
||||||
contactmanager.ContactManager(pubkey).setTrust(0)
|
|
||||||
contactmanager.ContactManager(pubkey).delete_contact()
|
|
||||||
keydb.removekeys.remove_user(pubkey)
|
|
||||||
try:
|
|
||||||
return redirect(request.referrer + '#' + request.form['token'])
|
|
||||||
except TypeError:
|
|
||||||
return Response(
|
|
||||||
"Friend removed, but referrer not set, cannot return to page")
|
|
||||||
|
|
||||||
|
|
||||||
@friends.route('/friends/setinfo/<pubkey>/<key>', methods=['POST'])
|
|
||||||
def set_info(pubkey, key):
|
|
||||||
data = request.form['data']
|
|
||||||
contactmanager.ContactManager(pubkey).set_info(key, data)
|
|
||||||
try:
|
|
||||||
return redirect(request.referrer + '#' + request.form['token'])
|
|
||||||
except TypeError:
|
|
||||||
return Response(
|
|
||||||
"Info set, but referrer not set, cannot return to friends page")
|
|
||||||
|
|
||||||
|
|
||||||
@friends.route('/friends/getinfo/<pubkey>/<key>')
|
|
||||||
def get_info(pubkey, key):
|
|
||||||
ret_data = contactmanager.ContactManager(pubkey).get_info(key)
|
|
||||||
if ret_data is None:
|
|
||||||
abort(404)
|
|
||||||
else:
|
|
||||||
return ret_data
|
|
@ -1,35 +0,0 @@
|
|||||||
'''
|
|
||||||
Onionr - Private P2P Communication
|
|
||||||
|
|
||||||
Set default onionr http headers
|
|
||||||
'''
|
|
||||||
'''
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
'''
|
|
||||||
FEATURE_POLICY = """vibrate; vr; webauthn; usb; sync-xhr; speaker;
|
|
||||||
picture-in-picture; payment; midi; microphone; magnetometer; gyroscope;
|
|
||||||
geolocation; fullscreen; encrypted-media; document-domain;
|
|
||||||
camera; accelerometer; ambient-light-sensor""".replace('\n', '') # have to remove \n for flask
|
|
||||||
def set_default_onionr_http_headers(flask_response):
|
|
||||||
'''Response headers'''
|
|
||||||
flask_response.headers['Content-Security-Policy'] = "default-src 'none'; style-src data: 'unsafe-inline'; img-src data:"
|
|
||||||
flask_response.headers['X-Frame-Options'] = 'deny'
|
|
||||||
flask_response.headers['X-Content-Type-Options'] = "nosniff"
|
|
||||||
flask_response.headers['Server'] = ''
|
|
||||||
flask_response.headers['Date'] = 'Thu, 1 Jan 1970 00:00:00 GMT' # Clock info is probably useful to attackers. Set to unix epoch.
|
|
||||||
flask_response.headers['Connection'] = "close"
|
|
||||||
flask_response.headers['Clear-Site-Data'] = '"cache", "cookies", "storage", "executionContexts"'
|
|
||||||
flask_response.headers['Feature-Policy'] = FEATURE_POLICY
|
|
||||||
flask_response.headers['Referrer-Policy'] = 'same-origin'
|
|
||||||
return flask_response
|
|
@ -1 +0,0 @@
|
|||||||
from . import staticfiles, endpoints
|
|
@ -1,111 +0,0 @@
|
|||||||
"""Onionr - Private P2P Communication.
|
|
||||||
|
|
||||||
Misc client API endpoints too small to need their own file and that need access to the client api inst
|
|
||||||
"""
|
|
||||||
import os
|
|
||||||
import subprocess
|
|
||||||
import platform
|
|
||||||
from sys import stdout as sys_stdout
|
|
||||||
|
|
||||||
from flask import Response, Blueprint, request, send_from_directory, abort
|
|
||||||
from flask import g
|
|
||||||
from gevent import sleep
|
|
||||||
import unpaddedbase32
|
|
||||||
|
|
||||||
from httpapi import apiutils
|
|
||||||
import onionrcrypto
|
|
||||||
import config
|
|
||||||
from onionrutils import mnemonickeys
|
|
||||||
from onionrutils import bytesconverter
|
|
||||||
import onionrvalues
|
|
||||||
from utils import reconstructhash
|
|
||||||
"""
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
"""
|
|
||||||
|
|
||||||
pub_key = onionrcrypto.pub_key.replace('=', '')
|
|
||||||
|
|
||||||
SCRIPT_NAME = os.path.dirname(os.path.realpath(__file__)) + \
|
|
||||||
f'/../../../{onionrvalues.SCRIPT_NAME}'
|
|
||||||
|
|
||||||
|
|
||||||
class PrivateEndpoints:
|
|
||||||
def __init__(self, client_api):
|
|
||||||
private_endpoints_bp = Blueprint('privateendpoints', __name__)
|
|
||||||
self.private_endpoints_bp = private_endpoints_bp
|
|
||||||
|
|
||||||
|
|
||||||
@private_endpoints_bp.route('/www/<path:path>', endpoint='www')
|
|
||||||
def wwwPublic(path):
|
|
||||||
if not config.get("www.private.run", True):
|
|
||||||
abort(403)
|
|
||||||
return send_from_directory(config.get('www.private.path',
|
|
||||||
'static-data/www/private/'), path)
|
|
||||||
|
|
||||||
@private_endpoints_bp.route('/getpid')
|
|
||||||
def get_pid():
|
|
||||||
return Response(str(os.getpid()))
|
|
||||||
|
|
||||||
@private_endpoints_bp.route('/isatty')
|
|
||||||
def get_is_atty():
|
|
||||||
return Response(str(sys_stdout.isatty()).lower())
|
|
||||||
|
|
||||||
|
|
||||||
@private_endpoints_bp.route('/ping')
|
|
||||||
def ping():
|
|
||||||
# Used to check if client api is working
|
|
||||||
return Response("pong!")
|
|
||||||
|
|
||||||
|
|
||||||
@private_endpoints_bp.route('/shutdown')
|
|
||||||
def shutdown():
|
|
||||||
return apiutils.shutdown.shutdown(client_api)
|
|
||||||
|
|
||||||
@private_endpoints_bp.route('/restartclean')
|
|
||||||
def restart_clean():
|
|
||||||
subprocess.Popen([SCRIPT_NAME, 'restart'])
|
|
||||||
return Response("bye")
|
|
||||||
|
|
||||||
|
|
||||||
@private_endpoints_bp.route('/getuptime')
|
|
||||||
def show_uptime():
|
|
||||||
return Response(str(client_api.getUptime()))
|
|
||||||
|
|
||||||
@private_endpoints_bp.route('/getActivePubkey')
|
|
||||||
def get_active_pubkey():
|
|
||||||
return Response(pub_key)
|
|
||||||
|
|
||||||
@private_endpoints_bp.route('/getHumanReadable')
|
|
||||||
def get_human_readable_default():
|
|
||||||
return Response(mnemonickeys.get_human_readable_ID())
|
|
||||||
|
|
||||||
@private_endpoints_bp.route('/getHumanReadable/<name>')
|
|
||||||
def get_human_readable(name):
|
|
||||||
name = unpaddedbase32.repad(bytesconverter.str_to_bytes(name))
|
|
||||||
return Response(mnemonickeys.get_human_readable_ID(name))
|
|
||||||
|
|
||||||
@private_endpoints_bp.route('/getBase32FromHumanReadable/<words>')
|
|
||||||
def get_base32_from_human_readable(words):
|
|
||||||
return Response(
|
|
||||||
bytesconverter.bytes_to_str(mnemonickeys.get_base32(words)))
|
|
||||||
|
|
||||||
@private_endpoints_bp.route('/setonboarding', methods=['POST'])
|
|
||||||
def set_onboarding():
|
|
||||||
return Response(
|
|
||||||
config.onboarding.set_config_from_onboarding(request.get_json()))
|
|
||||||
|
|
||||||
@private_endpoints_bp.route('/os')
|
|
||||||
def get_os_system():
|
|
||||||
return Response(platform.system().lower())
|
|
||||||
|
|
@ -1,80 +0,0 @@
|
|||||||
"""Onionr - Private P2P Communication
|
|
||||||
|
|
||||||
Register static file routes
|
|
||||||
"""
|
|
||||||
import os
|
|
||||||
import mimetypes
|
|
||||||
from flask import Blueprint, send_from_directory
|
|
||||||
"""
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
# Was having some mime type issues on windows, this appeared to fix it.
|
|
||||||
# we have no-sniff set, so if the mime types are invalid sripts can't load.
|
|
||||||
mimetypes.add_type('application/javascript', '.js')
|
|
||||||
mimetypes.add_type('text/css', '.css')
|
|
||||||
|
|
||||||
static_files_bp = Blueprint('staticfiles', __name__)
|
|
||||||
|
|
||||||
# should be set to onionr install directory from onionr startup
|
|
||||||
root = os.path.dirname(os.path.realpath(__file__)) + \
|
|
||||||
'/../../../static-data/www/'
|
|
||||||
|
|
||||||
|
|
||||||
@static_files_bp.route('/onboarding/', endpoint='onboardingIndex')
|
|
||||||
def onboard():
|
|
||||||
return send_from_directory(f'{root}onboarding/', "index.html")
|
|
||||||
|
|
||||||
|
|
||||||
@static_files_bp.route('/onboarding/<path:path>', endpoint='onboarding')
|
|
||||||
def onboard_files(path):
|
|
||||||
return send_from_directory(f'{root}onboarding/', path)
|
|
||||||
|
|
||||||
|
|
||||||
@static_files_bp.route('/friends/<path:path>', endpoint='friends')
|
|
||||||
def loadContacts(path):
|
|
||||||
return send_from_directory(root + 'friends/', path)
|
|
||||||
|
|
||||||
|
|
||||||
@static_files_bp.route('/friends/', endpoint='friendsindex')
|
|
||||||
def loadContacts():
|
|
||||||
return send_from_directory(root + 'friends/', 'index.html')
|
|
||||||
|
|
||||||
|
|
||||||
@static_files_bp.route('/profiles/<path:path>', endpoint='profiles')
|
|
||||||
def loadContacts(path):
|
|
||||||
return send_from_directory(root + 'profiles/', path)
|
|
||||||
|
|
||||||
|
|
||||||
@static_files_bp.route('/profiles/', endpoint='profilesindex')
|
|
||||||
def loadContacts():
|
|
||||||
return send_from_directory(root + 'profiles/', 'index.html')
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@static_files_bp.route('/shared/<path:path>', endpoint='sharedContent')
|
|
||||||
def sharedContent(path):
|
|
||||||
return send_from_directory(root + 'shared/', path)
|
|
||||||
|
|
||||||
|
|
||||||
@static_files_bp.route('/', endpoint='onionrhome')
|
|
||||||
def hello():
|
|
||||||
# ui home
|
|
||||||
return send_from_directory(root + 'private/', 'index.html')
|
|
||||||
|
|
||||||
|
|
||||||
@static_files_bp.route('/private/<path:path>', endpoint='homedata')
|
|
||||||
def homedata(path):
|
|
||||||
return send_from_directory(root + 'private/', path)
|
|
@ -1 +0,0 @@
|
|||||||
from . import client
|
|
@ -1,102 +0,0 @@
|
|||||||
"""Onionr - Private P2P Communication.
|
|
||||||
|
|
||||||
Process incoming requests to the client api server to validate
|
|
||||||
that they are legitimate and not DNSR/XSRF or other local adversary
|
|
||||||
"""
|
|
||||||
from ipaddress import ip_address
|
|
||||||
import hmac
|
|
||||||
|
|
||||||
from flask import Blueprint, request, abort, g
|
|
||||||
|
|
||||||
from httpapi import httpheaders
|
|
||||||
from . import pluginwhitelist
|
|
||||||
import config
|
|
||||||
import logger
|
|
||||||
"""
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
"""
|
|
||||||
|
|
||||||
# Be extremely mindful of this.
|
|
||||||
# These are endpoints available without a password
|
|
||||||
whitelist_endpoints = [
|
|
||||||
'www', 'staticfiles.homedata',
|
|
||||||
'staticfiles.sharedContent',
|
|
||||||
'staticfiles.friends', 'staticfiles.friendsindex', 'siteapi.site',
|
|
||||||
'siteapi.siteFile', 'staticfiles.onionrhome',
|
|
||||||
'themes.getTheme', 'staticfiles.onboarding', 'staticfiles.onboardingIndex']
|
|
||||||
|
|
||||||
remote_safe_whitelist = ['www', 'staticfiles']
|
|
||||||
|
|
||||||
public_remote_enabled = config.get('ui.public_remote_enabled', False)
|
|
||||||
public_remote_hostnames = config.get('ui.public_remote_hosts', [])
|
|
||||||
|
|
||||||
|
|
||||||
class ClientAPISecurity:
|
|
||||||
def __init__(self, client_api):
|
|
||||||
client_api_security_bp = Blueprint('clientapisecurity', __name__)
|
|
||||||
self.client_api_security_bp = client_api_security_bp
|
|
||||||
self.client_api = client_api
|
|
||||||
pluginwhitelist.load_plugin_security_whitelist_endpoints(
|
|
||||||
whitelist_endpoints)
|
|
||||||
|
|
||||||
@client_api_security_bp.before_app_request
|
|
||||||
def validate_request():
|
|
||||||
"""Validate request has set password & is the correct hostname."""
|
|
||||||
# For the purpose of preventing DNS rebinding attacks
|
|
||||||
if ip_address(client_api.host).is_loopback:
|
|
||||||
localhost = True
|
|
||||||
if request.host != '%s:%s' % \
|
|
||||||
(client_api.host, client_api.bindPort):
|
|
||||||
localhost = False
|
|
||||||
|
|
||||||
if not localhost and public_remote_enabled:
|
|
||||||
if request.host not in public_remote_hostnames:
|
|
||||||
logger.warn(
|
|
||||||
f'{request.host} not in {public_remote_hostnames}')
|
|
||||||
abort(403)
|
|
||||||
else:
|
|
||||||
if not localhost:
|
|
||||||
logger.warn(
|
|
||||||
f'Possible DNS rebinding attack by {request.host}')
|
|
||||||
abort(403)
|
|
||||||
|
|
||||||
# Static files for Onionr sites
|
|
||||||
if request.path.startswith('/site/'):
|
|
||||||
return
|
|
||||||
|
|
||||||
if request.endpoint in whitelist_endpoints:
|
|
||||||
return
|
|
||||||
|
|
||||||
try:
|
|
||||||
if not hmac.compare_digest(
|
|
||||||
request.headers['token'], client_api.clientToken):
|
|
||||||
if not hmac.compare_digest(
|
|
||||||
request.form['token'], client_api.clientToken):
|
|
||||||
abort(403)
|
|
||||||
except KeyError:
|
|
||||||
if not hmac.compare_digest(
|
|
||||||
request.form['token'], client_api.clientToken):
|
|
||||||
abort(403)
|
|
||||||
|
|
||||||
@client_api_security_bp.after_app_request
|
|
||||||
def after_req(resp):
|
|
||||||
# Security headers
|
|
||||||
resp = httpheaders.set_default_onionr_http_headers(resp)
|
|
||||||
if request.endpoint in ('siteapi.site', 'siteapi.siteFile'):
|
|
||||||
resp.headers['Content-Security-Policy'] = \
|
|
||||||
"default-src 'none'; style-src 'self' data: 'unsafe-inline'; img-src 'self' data:; media-src 'self' data:" # noqa
|
|
||||||
else:
|
|
||||||
resp.headers['Content-Security-Policy'] = \
|
|
||||||
"default-src 'none'; script-src 'self'; object-src 'none'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; media-src 'self'; frame-src 'none'; font-src 'self'; connect-src 'self'" # noqa
|
|
||||||
return resp
|
|
@ -1,67 +0,0 @@
|
|||||||
"""Onionr - Private P2P Communication.
|
|
||||||
|
|
||||||
Process incoming requests to the public api server for certain attacks
|
|
||||||
"""
|
|
||||||
from flask import Blueprint, request, abort, g
|
|
||||||
from httpapi import httpheaders
|
|
||||||
from onionrutils import epoch
|
|
||||||
from lan import getip
|
|
||||||
"""
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
class LANAPISecurity:
|
|
||||||
def __init__(self, lan_client):
|
|
||||||
lan_api_security_bp = Blueprint('lanapisecurity', __name__)
|
|
||||||
self.lan_api_security_bp = lan_api_security_bp
|
|
||||||
|
|
||||||
@lan_api_security_bp.before_app_request
|
|
||||||
def validate_request():
|
|
||||||
"""Validate request has the correct hostname"""
|
|
||||||
# If high security level, deny requests to public
|
|
||||||
# (HS should be disabled anyway for Tor, but might not be for I2P)
|
|
||||||
transports = getip.lan_ips
|
|
||||||
if lan_client.config.get('general.security_level', default=1) > 0:
|
|
||||||
abort(403)
|
|
||||||
if request.host not in transports:
|
|
||||||
# Abort conn if wrong HTTP hostname, to prevent DNS rebinding
|
|
||||||
abort(403)
|
|
||||||
lan_client.hitCount += 1 # raise hit count for valid requests
|
|
||||||
try:
|
|
||||||
if 'onionr' in request.headers['User-Agent'].lower():
|
|
||||||
g.is_onionr_client = True
|
|
||||||
else:
|
|
||||||
g.is_onionr_client = False
|
|
||||||
except KeyError:
|
|
||||||
g.is_onionr_client = False
|
|
||||||
|
|
||||||
@lan_api_security_bp.after_app_request
|
|
||||||
def send_headers(resp):
|
|
||||||
"""Send api, access control headers"""
|
|
||||||
resp = httpheaders.set_default_onionr_http_headers(resp)
|
|
||||||
# Network API version
|
|
||||||
resp.headers['X-API'] = lan_client.API_VERSION
|
|
||||||
# Delete some HTTP headers for Onionr user agents
|
|
||||||
NON_NETWORK_HEADERS = ('Content-Security-Policy', 'X-Frame-Options',
|
|
||||||
'X-Content-Type-Options', 'Feature-Policy',
|
|
||||||
'Clear-Site-Data', 'Referrer-Policy')
|
|
||||||
try:
|
|
||||||
if g.is_onionr_client:
|
|
||||||
for header in NON_NETWORK_HEADERS:
|
|
||||||
del resp.headers[header]
|
|
||||||
except AttributeError:
|
|
||||||
abort(403)
|
|
||||||
lan_client.lastRequest = epoch.get_rounded_epoch(roundS=5)
|
|
||||||
return resp
|
|
@ -1,33 +0,0 @@
|
|||||||
"""Onionr - Private P2P Communication.
|
|
||||||
|
|
||||||
Load web UI client endpoints into the whitelist from plugins
|
|
||||||
"""
|
|
||||||
import onionrplugins
|
|
||||||
"""
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
def load_plugin_security_whitelist_endpoints(whitelist: list):
|
|
||||||
"""Accept a list reference of whitelist endpoints from security/client.py and
|
|
||||||
append plugin's specified endpoints to them by attribute"""
|
|
||||||
for plugin in onionrplugins.get_enabled_plugins():
|
|
||||||
try:
|
|
||||||
plugin = onionrplugins.get_plugin(plugin)
|
|
||||||
except FileNotFoundError:
|
|
||||||
continue
|
|
||||||
try:
|
|
||||||
whitelist.extend(getattr(plugin, "security_whitelist"))
|
|
||||||
except AttributeError:
|
|
||||||
pass
|
|
@ -1,6 +0,0 @@
|
|||||||
# sse
|
|
||||||
|
|
||||||
This folder contains a wrapper for handling server sent event loops
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
"""Onionr - Private P2P Communication.
|
|
||||||
|
|
||||||
server sent event modules, incl a wrapper and endpoints for client + public api
|
|
||||||
"""
|
|
||||||
"""
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
"""
|
|
@ -1,41 +0,0 @@
|
|||||||
"""Onionr - Private P2P Communication.
|
|
||||||
|
|
||||||
SSE API for node client access
|
|
||||||
"""
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
from flask import g, Blueprint
|
|
||||||
from gevent import sleep
|
|
||||||
import gevent
|
|
||||||
import ujson
|
|
||||||
|
|
||||||
from onionrutils.epoch import get_epoch
|
|
||||||
from .. import wrapper
|
|
||||||
"""
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
"""
|
|
||||||
|
|
||||||
private_sse_blueprint = Blueprint('privatesse', __name__)
|
|
||||||
SSEWrapper = wrapper.SSEWrapper()
|
|
||||||
|
|
||||||
gevent.hub.Hub.NOT_ERROR = (gevent.GreenletExit, SystemExit, Exception)
|
|
||||||
|
|
||||||
@private_sse_blueprint.route('/hello')
|
|
||||||
def stream_hello():
|
|
||||||
def print_hello():
|
|
||||||
while True:
|
|
||||||
yield "hello\n\n"
|
|
||||||
sleep(1)
|
|
||||||
return SSEWrapper.handle_sse_request(print_hello)
|
|
||||||
|
|
@ -1,34 +0,0 @@
|
|||||||
"""Onionr - Private P2P Communication.
|
|
||||||
|
|
||||||
wrapper for server sent event endpoints
|
|
||||||
"""
|
|
||||||
from typing import Callable
|
|
||||||
|
|
||||||
from flask import Response
|
|
||||||
|
|
||||||
"""
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
class SSEWrapper:
|
|
||||||
def __init__(self):
|
|
||||||
self.active_count: int = 0
|
|
||||||
|
|
||||||
def handle_sse_request(self, handler: Callable):
|
|
||||||
self.active_count += 1
|
|
||||||
resp = Response(handler())
|
|
||||||
resp.content_type = "text/event-stream"
|
|
||||||
self.active_count -= 1
|
|
||||||
return resp
|
|
@ -1,46 +0,0 @@
|
|||||||
"""
|
|
||||||
Onionr - Private P2P Communication
|
|
||||||
|
|
||||||
API to get current CSS theme for the client web UI
|
|
||||||
"""
|
|
||||||
"""
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
"""
|
|
||||||
from flask import Blueprint, Response
|
|
||||||
|
|
||||||
import config
|
|
||||||
from utils import readstatic
|
|
||||||
|
|
||||||
theme_blueprint = Blueprint('themes', __name__)
|
|
||||||
|
|
||||||
LIGHT_THEME_FILES = ['bulma-light.min.css', 'styles-light.css']
|
|
||||||
DARK_THEME_FILES = ['bulma-dark.min.css', 'styles-dark.css']
|
|
||||||
|
|
||||||
def _load_from_files(file_list: list)->str:
|
|
||||||
"""Loads multiple static dir files and returns them in combined string format (non-binary)"""
|
|
||||||
combo_data = ''
|
|
||||||
for f in file_list:
|
|
||||||
combo_data += readstatic.read_static('www/shared/main/themes/' + f)
|
|
||||||
return combo_data
|
|
||||||
|
|
||||||
@theme_blueprint.route('/gettheme', endpoint='getTheme')
|
|
||||||
def get_theme_file()->Response:
|
|
||||||
"""Returns the css theme data"""
|
|
||||||
css: str
|
|
||||||
theme = config.get('ui.theme', 'dark').lower()
|
|
||||||
if theme == 'dark':
|
|
||||||
css = _load_from_files(DARK_THEME_FILES)
|
|
||||||
elif theme == 'light':
|
|
||||||
css = _load_from_files(LIGHT_THEME_FILES)
|
|
||||||
return Response(css, mimetype='text/css')
|
|
@ -1,55 +0,0 @@
|
|||||||
"""Onionr - Private P2P Communication.
|
|
||||||
|
|
||||||
Desktop notification wrapper
|
|
||||||
"""
|
|
||||||
from subprocess import Popen
|
|
||||||
|
|
||||||
try:
|
|
||||||
import simplenotifications as simplenotify
|
|
||||||
except ImportError:
|
|
||||||
notifications_enabled = False
|
|
||||||
else:
|
|
||||||
notifications_enabled = True
|
|
||||||
|
|
||||||
from utils.readstatic import get_static_dir
|
|
||||||
import config
|
|
||||||
from onionrplugins.onionrevents import event as plugin_api_event
|
|
||||||
"""
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
"""
|
|
||||||
|
|
||||||
if not config.get('general.show_notifications', True):
|
|
||||||
notifications_enabled = False
|
|
||||||
|
|
||||||
notification_sound_file = get_static_dir() + "sounds/notification1.mp3"
|
|
||||||
|
|
||||||
|
|
||||||
def notify(title: str = "Onionr", message: str = ""):
|
|
||||||
"""Cross platform method to show a notification."""
|
|
||||||
if not notifications_enabled:
|
|
||||||
return
|
|
||||||
plugin_api_event("notification", data={"title": title, "message": message})
|
|
||||||
simplenotify.notify(title, message)
|
|
||||||
|
|
||||||
|
|
||||||
def notification_with_sound(sound='', **kwargs):
|
|
||||||
if not notifications_enabled:
|
|
||||||
return
|
|
||||||
if not sound:
|
|
||||||
sound = notification_sound_file
|
|
||||||
try:
|
|
||||||
Popen(["mpv", sound])
|
|
||||||
except FileNotFoundError:
|
|
||||||
pass
|
|
||||||
notify(**kwargs)
|
|
@ -3,26 +3,20 @@
|
|||||||
launch the api servers and communicator
|
launch the api servers and communicator
|
||||||
"""
|
"""
|
||||||
import os
|
import os
|
||||||
import queue
|
from time import sleep
|
||||||
import sys
|
import sys
|
||||||
import platform
|
import platform
|
||||||
import signal
|
import signal
|
||||||
from threading import Thread
|
from threading import Thread
|
||||||
|
|
||||||
from stem.connection import IncorrectPassword
|
|
||||||
import toomanyobjs
|
|
||||||
import filenuke
|
import filenuke
|
||||||
from deadsimplekv import DeadSimpleKV
|
|
||||||
import psutil
|
import psutil
|
||||||
from ordered_set import OrderedSet
|
|
||||||
|
|
||||||
import config
|
import config
|
||||||
|
|
||||||
import apiservers
|
|
||||||
import logger
|
import logger
|
||||||
from onionrplugins import onionrevents as events
|
from onionrplugins import onionrevents as events
|
||||||
|
|
||||||
from onionrutils import localcommand
|
|
||||||
from utils import identifyhome
|
from utils import identifyhome
|
||||||
import filepaths
|
import filepaths
|
||||||
import onionrvalues
|
import onionrvalues
|
||||||
@ -30,13 +24,11 @@ from onionrutils import cleanup
|
|||||||
from onionrcrypto import getourkeypair
|
from onionrcrypto import getourkeypair
|
||||||
from onionrthreads import add_onionr_thread
|
from onionrthreads import add_onionr_thread
|
||||||
from blockdb.blockcleaner import clean_block_database
|
from blockdb.blockcleaner import clean_block_database
|
||||||
import runtests
|
|
||||||
from .. import version
|
from .. import version
|
||||||
from .killdaemon import kill_daemon # noqa
|
from .killdaemon import kill_daemon # noqa
|
||||||
from .showlogo import show_logo
|
from .showlogo import show_logo
|
||||||
import gossip
|
import gossip
|
||||||
|
|
||||||
from setupkvvars import setup_kv
|
|
||||||
"""
|
"""
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -53,11 +45,6 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
def _proper_shutdown():
|
|
||||||
localcommand.local_command('shutdown')
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
|
|
||||||
def _show_info_messages():
|
def _show_info_messages():
|
||||||
version.version(verbosity=5, function=logger.info)
|
version.version(verbosity=5, function=logger.info)
|
||||||
logger.debug('Python version %s' % platform.python_version())
|
logger.debug('Python version %s' % platform.python_version())
|
||||||
@ -74,35 +61,13 @@ def daemon():
|
|||||||
"""Start Onionr's primary threads for communicator, API server, node, and LAN."""
|
"""Start Onionr's primary threads for communicator, API server, node, and LAN."""
|
||||||
|
|
||||||
def _handle_sig_term(signum, frame):
|
def _handle_sig_term(signum, frame):
|
||||||
pid = str(os.getpid())
|
|
||||||
main_pid = localcommand.local_command('/getpid')
|
|
||||||
#logger.info(main_pid, terminal=True)
|
|
||||||
if main_pid and main_pid == pid:
|
|
||||||
logger.info(
|
|
||||||
f"Received sigterm, shutting down gracefully. PID: {pid}", terminal=True)
|
|
||||||
localcommand.local_command('/shutdown')
|
|
||||||
else:
|
|
||||||
logger.info(
|
|
||||||
f"Recieved sigterm in child process or fork, exiting. PID: {pid}")
|
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
|
with open(filepaths.pid_file, 'w') as f:
|
||||||
|
f.write(str(os.getpid()))
|
||||||
|
|
||||||
signal.signal(signal.SIGTERM, _handle_sig_term)
|
signal.signal(signal.SIGTERM, _handle_sig_term)
|
||||||
|
|
||||||
# Create shared objects
|
|
||||||
|
|
||||||
shared_state = toomanyobjs.TooMany()
|
|
||||||
|
|
||||||
# Add DeadSimpleKV for quasi-global variables (ephemeral key-value)
|
|
||||||
shared_state.get(DeadSimpleKV)
|
|
||||||
|
|
||||||
# Initialize the quasi-global variables
|
|
||||||
setup_kv(shared_state.get(DeadSimpleKV))
|
|
||||||
|
|
||||||
# Init run time tester
|
|
||||||
# (ensures Onionr is running right, for testing purposes)
|
|
||||||
# Run time tests are not normally run
|
|
||||||
shared_state.get(runtests.OnionrRunTestManager)
|
|
||||||
|
|
||||||
shared_state.share_object() # share the parent object to the threads
|
|
||||||
|
|
||||||
show_logo()
|
show_logo()
|
||||||
|
|
||||||
@ -123,12 +88,11 @@ def daemon():
|
|||||||
name='start_gossip_threads').start()
|
name='start_gossip_threads').start()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
apiservers.private_api.start()
|
while True:
|
||||||
events.event('shutdown', threaded=False)
|
sleep(60)
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
cleanup.delete_run_files()
|
cleanup.delete_run_files()
|
||||||
if security_level >= 2:
|
if security_level >= 2:
|
||||||
filenuke.nuke.clean_tree(identifyhome.identify_home())
|
filenuke.nuke.clean_tree(identifyhome.identify_home())
|
||||||
|
@ -2,15 +2,11 @@
|
|||||||
|
|
||||||
Gracefully stop Onionr daemon
|
Gracefully stop Onionr daemon
|
||||||
"""
|
"""
|
||||||
import sqlite3
|
|
||||||
import os
|
import os
|
||||||
|
from signal import SIGTERM
|
||||||
|
|
||||||
from gevent import spawn
|
from filepaths import pid_file
|
||||||
|
|
||||||
from onionrplugins import events
|
|
||||||
from onionrutils import localcommand
|
|
||||||
import logger
|
import logger
|
||||||
import config
|
|
||||||
"""
|
"""
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -29,27 +25,14 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|||||||
|
|
||||||
def kill_daemon():
|
def kill_daemon():
|
||||||
"""Shutdown the Onionr daemon (communicator)."""
|
"""Shutdown the Onionr daemon (communicator)."""
|
||||||
config.reload()
|
try:
|
||||||
|
with open(pid_file, 'r') as pid:
|
||||||
|
os.kill(int(pid.read()), SIGTERM)
|
||||||
|
except FileNotFoundError:
|
||||||
|
logger.error("Daemon not running/pid file missing")
|
||||||
logger.warn('Stopping the running daemon, if one exists...', timestamp=False,
|
logger.warn('Stopping the running daemon, if one exists...', timestamp=False,
|
||||||
terminal=True)
|
terminal=True)
|
||||||
|
|
||||||
# On platforms where we can, fork out to prevent locking
|
|
||||||
try:
|
|
||||||
pid = os.fork()
|
|
||||||
if pid != 0:
|
|
||||||
return
|
|
||||||
except (AttributeError, OSError):
|
|
||||||
pass
|
|
||||||
|
|
||||||
events.event('daemon_stop')
|
|
||||||
try:
|
|
||||||
spawn(
|
|
||||||
localcommand.local_command,
|
|
||||||
'/shutdown'
|
|
||||||
).get(timeout=5)
|
|
||||||
except sqlite3.OperationalError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
kill_daemon.onionr_help = "Gracefully stops the " # type: ignore
|
kill_daemon.onionr_help = "Gracefully stops the " # type: ignore
|
||||||
kill_daemon.onionr_help += "Onionr API servers" # type: ignore
|
kill_daemon.onionr_help += "Onionr API servers" # type: ignore
|
@ -1,59 +0,0 @@
|
|||||||
"""Onionr - Private P2P Communication.
|
|
||||||
|
|
||||||
Open the web interface properly into a web browser
|
|
||||||
"""
|
|
||||||
import webbrowser
|
|
||||||
from time import sleep
|
|
||||||
|
|
||||||
import logger
|
|
||||||
from onionrutils import getclientapiserver
|
|
||||||
import config
|
|
||||||
from onionrutils.localcommand import local_command
|
|
||||||
|
|
||||||
from .daemonlaunch import geturl
|
|
||||||
"""
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def get_url() -> str:
|
|
||||||
"""Build UI URL string and return it."""
|
|
||||||
return geturl.get_url(config)
|
|
||||||
|
|
||||||
|
|
||||||
get_url.onionr_help = "Shows the Onionr " # type: ignore
|
|
||||||
get_url.onionr_help += "web interface URL with API key" # type: ignore
|
|
||||||
|
|
||||||
|
|
||||||
def open_home():
|
|
||||||
"""Command to open web interface URL in default browser."""
|
|
||||||
try:
|
|
||||||
url = getclientapiserver.get_client_API_server()
|
|
||||||
except FileNotFoundError:
|
|
||||||
logger.error(
|
|
||||||
'Onionr seems to not be running (could not get api host)',
|
|
||||||
terminal=True)
|
|
||||||
else:
|
|
||||||
sleep(3) # Sleep a little to wait for web UI to init some vars it needs
|
|
||||||
url = get_url()
|
|
||||||
logger.info(
|
|
||||||
'If Onionr does not open automatically, use this URL: ' + url,
|
|
||||||
terminal=True)
|
|
||||||
webbrowser.open_new_tab(url)
|
|
||||||
|
|
||||||
|
|
||||||
open_home.onionr_help = "Opens the Onionr UI in the default " # type: ignore
|
|
||||||
open_home.onionr_help += "browser. Node must be running." # type: ignore
|
|
@ -5,12 +5,8 @@ Sets CLI arguments for Onionr
|
|||||||
from typing import Callable
|
from typing import Callable
|
||||||
|
|
||||||
from .. import onionrstatistics, version, daemonlaunch
|
from .. import onionrstatistics, version, daemonlaunch
|
||||||
from .. import openwebinterface
|
|
||||||
from .. import pubkeymanager # commands to add or change id
|
from .. import pubkeymanager # commands to add or change id
|
||||||
from .. import resetplugins # command to reinstall default plugins
|
from .. import resetplugins # command to reinstall default plugins
|
||||||
from .. import softreset # command to delete onionr blocks
|
|
||||||
from .. import restartonionr # command to restart Onionr
|
|
||||||
from .. import runtimetestcmd # cmd to execute the runtime integration tests
|
|
||||||
|
|
||||||
|
|
||||||
import onionrexceptions
|
import onionrexceptions
|
||||||
@ -42,15 +38,9 @@ def get_arguments() -> dict:
|
|||||||
('version',): version.version,
|
('version',): version.version,
|
||||||
('start', 'daemon'): daemonlaunch.start,
|
('start', 'daemon'): daemonlaunch.start,
|
||||||
('stop', 'kill'): daemonlaunch.kill_daemon,
|
('stop', 'kill'): daemonlaunch.kill_daemon,
|
||||||
('restart',): restartonionr.restart,
|
|
||||||
('openhome', 'gui', 'openweb',
|
|
||||||
'open-home', 'open-web'): openwebinterface.open_home,
|
|
||||||
('get-url', 'url', 'get-web'): openwebinterface.get_url,
|
|
||||||
('addid', 'add-id'): pubkeymanager.add_ID,
|
('addid', 'add-id'): pubkeymanager.add_ID,
|
||||||
('changeid', 'change-id'): pubkeymanager.change_ID,
|
('changeid', 'change-id'): pubkeymanager.change_ID,
|
||||||
('resetplugins', 'reset-plugins'): resetplugins.reset,
|
('resetplugins', 'reset-plugins'): resetplugins.reset
|
||||||
('soft-reset', 'softreset'): softreset.soft_reset,
|
|
||||||
('runtime-test', 'runtimetest'): runtimetestcmd.do_runtime_test
|
|
||||||
}
|
}
|
||||||
return args
|
return args
|
||||||
|
|
||||||
|
@ -1,78 +0,0 @@
|
|||||||
"""Onionr - Private P2P Communication.
|
|
||||||
|
|
||||||
Command to restart Onionr
|
|
||||||
"""
|
|
||||||
from threading import local
|
|
||||||
import time
|
|
||||||
import os
|
|
||||||
import subprocess # nosec
|
|
||||||
|
|
||||||
from psutil import Process
|
|
||||||
|
|
||||||
import onionrvalues
|
|
||||||
from onionrutils import cleanup
|
|
||||||
from onionrutils import localcommand
|
|
||||||
import logger
|
|
||||||
import filepaths
|
|
||||||
|
|
||||||
from . import daemonlaunch
|
|
||||||
"""
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
"""
|
|
||||||
|
|
||||||
DEVNULL = subprocess.DEVNULL
|
|
||||||
SCRIPT_NAME = os.path.dirname(os.path.realpath(
|
|
||||||
__file__)) + f'/../../{onionrvalues.SCRIPT_NAME}'
|
|
||||||
|
|
||||||
|
|
||||||
def restart():
|
|
||||||
"""Tell the Onionr daemon to restart."""
|
|
||||||
|
|
||||||
logger.info('Restarting Onionr', terminal=True)
|
|
||||||
|
|
||||||
daemon_terminal = localcommand.local_command("getpid")
|
|
||||||
terminal = None
|
|
||||||
if daemon_terminal:
|
|
||||||
terminal = Process(int(daemon_terminal)).terminal()
|
|
||||||
else:
|
|
||||||
terminal = Process().terminal()
|
|
||||||
|
|
||||||
# On platforms where we can, fork out to prevent locking
|
|
||||||
try:
|
|
||||||
pid = os.fork()
|
|
||||||
if pid != 0:
|
|
||||||
return
|
|
||||||
except (AttributeError, OSError):
|
|
||||||
logger.warn('Could not fork on restart')
|
|
||||||
with open(filepaths.restarting_indicator, 'w') as f:
|
|
||||||
f.write('t')
|
|
||||||
daemonlaunch.kill_daemon()
|
|
||||||
while localcommand.local_command('ping', max_wait=8) == 'pong!':
|
|
||||||
time.sleep(0.3)
|
|
||||||
time.sleep(15)
|
|
||||||
while (os.path.exists(filepaths.private_API_host_file) or
|
|
||||||
(os.path.exists(filepaths.daemon_mark_file))):
|
|
||||||
time.sleep(1)
|
|
||||||
|
|
||||||
cleanup.delete_run_files()
|
|
||||||
|
|
||||||
with open(terminal, 'ab') as term:
|
|
||||||
subprocess.Popen(
|
|
||||||
[SCRIPT_NAME, 'start'],
|
|
||||||
stdout=term,
|
|
||||||
stdin=term,
|
|
||||||
stderr=term)
|
|
||||||
|
|
||||||
|
|
||||||
restart.onionr_help = 'Gracefully restart Onionr' # type: ignore
|
|
@ -1,37 +0,0 @@
|
|||||||
"""Onionr - Private P2P Communication.
|
|
||||||
|
|
||||||
Command to tell daemon to do run time tests
|
|
||||||
"""
|
|
||||||
from gevent import spawn
|
|
||||||
|
|
||||||
from onionrutils import localcommand
|
|
||||||
"""
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
def do_runtime_test():
|
|
||||||
"""Send runtime test daemon queue command."""
|
|
||||||
spawn(
|
|
||||||
localcommand.local_command,
|
|
||||||
f'daemon-event/test_runtime',
|
|
||||||
post=True,
|
|
||||||
is_json=True,
|
|
||||||
post_data={},
|
|
||||||
max_wait=300
|
|
||||||
).get(300)
|
|
||||||
|
|
||||||
|
|
||||||
do_runtime_test.onionr_help = "If Onionr is running, " # type: ignore
|
|
||||||
do_runtime_test.onionr_help += "run runtime tests (check logs)" # type: ignore
|
|
@ -1,58 +0,0 @@
|
|||||||
"""Onionr - Private P2P Communication.
|
|
||||||
|
|
||||||
Command to soft-reset Onionr (deletes blocks)
|
|
||||||
"""
|
|
||||||
import os
|
|
||||||
import shutil
|
|
||||||
|
|
||||||
from onionrutils import localcommand
|
|
||||||
from coredb import dbfiles
|
|
||||||
import filepaths
|
|
||||||
from onionrplugins import onionrevents
|
|
||||||
import logger
|
|
||||||
"""
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
def _ignore_not_found_delete(path):
|
|
||||||
try:
|
|
||||||
os.remove(path)
|
|
||||||
except FileNotFoundError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
def soft_reset():
|
|
||||||
"""Command to soft reset Onionr home data.
|
|
||||||
|
|
||||||
Onionr must not be running
|
|
||||||
"""
|
|
||||||
if localcommand.local_command('/ping') == 'pong!':
|
|
||||||
logger.warn('Cannot soft reset while Onionr is running',
|
|
||||||
terminal=True)
|
|
||||||
return
|
|
||||||
path = filepaths.block_data_location
|
|
||||||
shutil.rmtree(path)
|
|
||||||
_ignore_not_found_delete(dbfiles.block_meta_db)
|
|
||||||
_ignore_not_found_delete(filepaths.upload_list)
|
|
||||||
_ignore_not_found_delete(filepaths.usage_file)
|
|
||||||
onionrevents.event('softreset')
|
|
||||||
logger.info("Soft reset Onionr", terminal=True)
|
|
||||||
|
|
||||||
|
|
||||||
soft_reset.onionr_help = "Deletes Onionr blocks and their " # type: ignore
|
|
||||||
soft_reset.onionr_help += "associated metadata, except for " # type: ignore
|
|
||||||
soft_reset.onionr_help += "any exported block files. Does NOT " # type: ignore
|
|
||||||
soft_reset.onionr_help += "delete data on " # type: ignore
|
|
||||||
soft_reset.onionr_help += "other nodes in the network." # type: ignore
|
|
@ -19,7 +19,7 @@
|
|||||||
'''
|
'''
|
||||||
|
|
||||||
import onionrplugins, logger
|
import onionrplugins, logger
|
||||||
from onionrutils import localcommand
|
|
||||||
|
|
||||||
class PluginAPI:
|
class PluginAPI:
|
||||||
def __init__(self, pluginapi):
|
def __init__(self, pluginapi):
|
||||||
|
@ -1,21 +0,0 @@
|
|||||||
from audioop import mul
|
|
||||||
import multiprocessing
|
|
||||||
|
|
||||||
|
|
||||||
def run_func_in_new_process(func, *args, **kwargs):
|
|
||||||
queue = multiprocessing.Queue()
|
|
||||||
|
|
||||||
def _wrap_func():
|
|
||||||
if args and kwargs:
|
|
||||||
queue.put(func(*args, **kwargs))
|
|
||||||
elif args:
|
|
||||||
queue.put(func(*args))
|
|
||||||
elif kwargs:
|
|
||||||
queue.put(func(**kwargs))
|
|
||||||
else:
|
|
||||||
queue.put(func())
|
|
||||||
|
|
||||||
proc = multiprocessing.Process(target=_wrap_func, daemon=True)
|
|
||||||
proc.start()
|
|
||||||
return queue.get()
|
|
||||||
|
|
@ -10,7 +10,6 @@ import ujson as json
|
|||||||
import config
|
import config
|
||||||
import logger
|
import logger
|
||||||
import onionrvalues
|
import onionrvalues
|
||||||
from onionrutils import getopenport
|
|
||||||
from logger.settings import *
|
from logger.settings import *
|
||||||
from utils import readstatic
|
from utils import readstatic
|
||||||
"""
|
"""
|
||||||
@ -77,14 +76,3 @@ def setup_config():
|
|||||||
set_level(map[verbosity])
|
set_level(map[verbosity])
|
||||||
else:
|
else:
|
||||||
logger.warn('Verbosity level %s is not valid, using default verbosity.' % verbosity)
|
logger.warn('Verbosity level %s is not valid, using default verbosity.' % verbosity)
|
||||||
|
|
||||||
if type(config.get('client.webpassword')) is type(None):
|
|
||||||
config.set('client.webpassword', base64.b16encode(os.urandom(32)).decode('utf-8'), savefile=True)
|
|
||||||
if type(config.get('client.client.port')) is type(None):
|
|
||||||
randomPort = getopenport.get_open_port()
|
|
||||||
config.set('client.client.port', randomPort, savefile=True)
|
|
||||||
if type(config.get('client.public.port')) is type(None):
|
|
||||||
randomPort = getopenport.get_open_port()
|
|
||||||
config.set('client.public.port', randomPort, savefile=True)
|
|
||||||
if type(config.get('client.api_version')) is type(None):
|
|
||||||
config.set('client.api_version', onionrvalues.API_VERSION, savefile=True)
|
|
@ -38,3 +38,4 @@ def delete_run_files():
|
|||||||
_safe_remove(filepaths.daemon_mark_file)
|
_safe_remove(filepaths.daemon_mark_file)
|
||||||
_safe_remove(filepaths.lock_file)
|
_safe_remove(filepaths.lock_file)
|
||||||
_safe_remove(filepaths.gossip_server_socket_file)
|
_safe_remove(filepaths.gossip_server_socket_file)
|
||||||
|
_safe_remove(filepaths.pid_file)
|
||||||
|
@ -1 +0,0 @@
|
|||||||
from urllib3.contrib.socks import SOCKSProxyManager # noqa
|
|
@ -1,37 +0,0 @@
|
|||||||
'''
|
|
||||||
Onionr - Private P2P Communication
|
|
||||||
|
|
||||||
Return the client api server address and port, which is usually random
|
|
||||||
'''
|
|
||||||
'''
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
'''
|
|
||||||
import filepaths
|
|
||||||
import config
|
|
||||||
def get_client_API_server():
|
|
||||||
config.reload()
|
|
||||||
retData = ''
|
|
||||||
getconf = lambda: config.get('client.client.port')
|
|
||||||
port = getconf()
|
|
||||||
if port is None:
|
|
||||||
config.reload()
|
|
||||||
port = getconf()
|
|
||||||
try:
|
|
||||||
with open(filepaths.private_API_host_file, 'r') as host:
|
|
||||||
hostname = host.read()
|
|
||||||
except FileNotFoundError:
|
|
||||||
raise FileNotFoundError
|
|
||||||
else:
|
|
||||||
retData += '%s:%s' % (hostname, port)
|
|
||||||
return retData
|
|
@ -1,29 +0,0 @@
|
|||||||
'''
|
|
||||||
Onionr - Private P2P Communication
|
|
||||||
|
|
||||||
get an open port
|
|
||||||
'''
|
|
||||||
'''
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
'''
|
|
||||||
import socket
|
|
||||||
def get_open_port():
|
|
||||||
# taken from (but modified) https://stackoverflow.com/a/2838309 by https://stackoverflow.com/users/133374/albert ccy-by-sa-3 https://creativecommons.org/licenses/by-sa/3.0/
|
|
||||||
# changes from source: import moved to top of file, bind specifically to localhost
|
|
||||||
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
||||||
s.bind(("127.0.0.1",0))
|
|
||||||
s.listen(1)
|
|
||||||
port = s.getsockname()[1]
|
|
||||||
s.close()
|
|
||||||
return port
|
|
@ -1,103 +0,0 @@
|
|||||||
"""Onionr - Private P2P Communication.
|
|
||||||
|
|
||||||
send a command to the local API server
|
|
||||||
"""
|
|
||||||
import urllib
|
|
||||||
import time
|
|
||||||
|
|
||||||
import requests
|
|
||||||
import deadsimplekv
|
|
||||||
|
|
||||||
import logger
|
|
||||||
import config
|
|
||||||
|
|
||||||
from . import getclientapiserver
|
|
||||||
import filepaths
|
|
||||||
"""
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
"""
|
|
||||||
config.reload()
|
|
||||||
|
|
||||||
cache = deadsimplekv.DeadSimpleKV(filepaths.cached_storage,
|
|
||||||
refresh_seconds=1000)
|
|
||||||
|
|
||||||
|
|
||||||
def get_hostname():
|
|
||||||
hostname = ''
|
|
||||||
waited = 0
|
|
||||||
max_wait = 3
|
|
||||||
while True:
|
|
||||||
if cache.get('client_api') is None:
|
|
||||||
try:
|
|
||||||
hostname = getclientapiserver.get_client_API_server()
|
|
||||||
except FileNotFoundError:
|
|
||||||
hostname = False
|
|
||||||
else:
|
|
||||||
cache.put('hostname', hostname)
|
|
||||||
cache.flush()
|
|
||||||
else:
|
|
||||||
hostname = cache.get('hostname')
|
|
||||||
if hostname == '' or hostname is None:
|
|
||||||
time.sleep(1)
|
|
||||||
if waited == max_wait:
|
|
||||||
return False
|
|
||||||
else:
|
|
||||||
return hostname
|
|
||||||
|
|
||||||
|
|
||||||
def local_command(command, data='', silent=True, post=False,
|
|
||||||
post_data={}, max_wait=20,
|
|
||||||
is_json=False
|
|
||||||
):
|
|
||||||
"""Send a command to the local http API server, securely.
|
|
||||||
Intended for local clients, DO NOT USE for remote peers."""
|
|
||||||
hostname = get_hostname()
|
|
||||||
# if the api host cannot be reached, return False
|
|
||||||
if not hostname:
|
|
||||||
return False
|
|
||||||
|
|
||||||
if data:
|
|
||||||
data = '&data=' + urllib.parse.quote_plus(data)
|
|
||||||
payload = 'http://%s/%s%s' % (hostname, command, data)
|
|
||||||
if not config.get('client.webpassword'):
|
|
||||||
config.reload()
|
|
||||||
|
|
||||||
try:
|
|
||||||
if post:
|
|
||||||
if is_json:
|
|
||||||
ret_data = requests.post(
|
|
||||||
payload,
|
|
||||||
json=post_data,
|
|
||||||
headers={'token': config.get('client.webpassword'),
|
|
||||||
'Connection': 'close'},
|
|
||||||
timeout=(max_wait, max_wait)).text
|
|
||||||
else:
|
|
||||||
ret_data = requests.post(
|
|
||||||
payload,
|
|
||||||
data=post_data,
|
|
||||||
headers={'token': config.get('client.webpassword'),
|
|
||||||
'Connection': 'close'},
|
|
||||||
timeout=(max_wait, max_wait)).text
|
|
||||||
else:
|
|
||||||
ret_data = requests.get(payload,
|
|
||||||
headers={'token':
|
|
||||||
config.get('client.webpassword'),
|
|
||||||
'Connection': 'close'},
|
|
||||||
timeout=(max_wait, max_wait)).text
|
|
||||||
except Exception as error:
|
|
||||||
if not silent:
|
|
||||||
logger.error('Failed to make local request (command: %s):%s' %
|
|
||||||
(command, error), terminal=True)
|
|
||||||
ret_data = False
|
|
||||||
return ret_data
|
|
@ -1,49 +1,30 @@
|
|||||||
'''
|
"""
|
||||||
Onionr - Private P2P Communication
|
Onionr - Private P2P Communication
|
||||||
|
|
||||||
validate various string data types
|
validate various string data types
|
||||||
'''
|
"""
|
||||||
'''
|
import base64
|
||||||
This program is free software: you can redistribute it and/or modify
|
import string
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
'''
|
|
||||||
import base64, string
|
|
||||||
import unpaddedbase32, nacl.signing, nacl.encoding
|
import unpaddedbase32, nacl.signing, nacl.encoding
|
||||||
from onionrutils import bytesconverter
|
from onionrutils import bytesconverter
|
||||||
def validate_hash(data, length=64):
|
"""
|
||||||
'''
|
This program is free software: you can redistribute it and/or modify
|
||||||
Validate if a string is a valid hash hex digest (does not compare, just checks length and charset)
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
Length is only invalid if its *more* than the specified
|
This program is distributed in the hope that it will be useful,
|
||||||
'''
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
retVal = True
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
if data == False or data == True:
|
GNU General Public License for more details.
|
||||||
return False
|
|
||||||
data = data.strip()
|
You should have received a copy of the GNU General Public License
|
||||||
if len(data) > length:
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
retVal = False
|
"""
|
||||||
else:
|
|
||||||
try:
|
|
||||||
int(data, 16)
|
|
||||||
except ValueError:
|
|
||||||
retVal = False
|
|
||||||
|
|
||||||
return retVal
|
|
||||||
|
|
||||||
def validate_pub_key(key):
|
def validate_pub_key(key):
|
||||||
'''
|
"""Validate if a string is a valid base32 encoded Ed25519 key"""
|
||||||
Validate if a string is a valid base32 encoded Ed25519 key
|
|
||||||
'''
|
|
||||||
if type(key) is type(None):
|
if type(key) is type(None):
|
||||||
return False
|
return False
|
||||||
# Accept keys that have no = padding
|
# Accept keys that have no = padding
|
||||||
@ -54,18 +35,8 @@ def validate_pub_key(key):
|
|||||||
nacl.signing.SigningKey(seed=key, encoder=nacl.encoding.Base32Encoder)
|
nacl.signing.SigningKey(seed=key, encoder=nacl.encoding.Base32Encoder)
|
||||||
except nacl.exceptions.ValueError:
|
except nacl.exceptions.ValueError:
|
||||||
pass
|
pass
|
||||||
except base64.binascii.Error as err:
|
except base64.binascii.Error as _:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
retVal = True
|
retVal = True
|
||||||
return retVal
|
return retVal
|
||||||
|
|
||||||
|
|
||||||
def is_integer_string(data):
|
|
||||||
'''Check if a string is a valid base10 integer (also returns true if already an int)'''
|
|
||||||
try:
|
|
||||||
int(data)
|
|
||||||
except (ValueError, TypeError) as e:
|
|
||||||
return False
|
|
||||||
else:
|
|
||||||
return True
|
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
import notifier
|
|
||||||
|
|
||||||
|
|
||||||
def update_event(bl):
|
|
||||||
"""Show update notification if available, return bool of if update happened"""
|
|
||||||
if not bl.isSigner(onionrvalues.UPDATE_SIGN_KEY): raise onionrexceptions.InvalidUpdate
|
|
||||||
onionr.notifier.notify(message="A new Onionr update is available. Stay updated to remain secure.")
|
|
@ -1,127 +0,0 @@
|
|||||||
"""Onionr - Private P2P Communication.
|
|
||||||
|
|
||||||
validate new block's metadata
|
|
||||||
"""
|
|
||||||
from json import JSONDecodeError
|
|
||||||
import ujson as json
|
|
||||||
|
|
||||||
import logger, onionrexceptions
|
|
||||||
import onionrvalues
|
|
||||||
from . import stringvalidators, epoch, bytesconverter
|
|
||||||
import config, filepaths, onionrcrypto
|
|
||||||
"""
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
def validate_metadata(metadata, block_data) -> bool:
|
|
||||||
"""Validate metadata meets onionr spec (does not validate proof value computation), take in either dictionary or json string"""
|
|
||||||
|
|
||||||
ret_data = False
|
|
||||||
max_clock_difference = onionrvalues.MAX_BLOCK_CLOCK_SKEW
|
|
||||||
|
|
||||||
# convert to dict if it is json string
|
|
||||||
if type(metadata) is str:
|
|
||||||
try:
|
|
||||||
metadata = json.loads(metadata)
|
|
||||||
except JSONDecodeError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
# Validate metadata dict for invalid keys to sizes that are too large
|
|
||||||
maxAge = onionrvalues.DEFAULT_EXPIRE
|
|
||||||
if type(metadata) is dict:
|
|
||||||
for i in metadata:
|
|
||||||
try:
|
|
||||||
onionrvalues.BLOCK_METADATA_LENGTHS[i]
|
|
||||||
except KeyError:
|
|
||||||
logger.warn('Block has invalid metadata key ' + i)
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
testData = metadata[i]
|
|
||||||
try:
|
|
||||||
testData = len(testData)
|
|
||||||
except (TypeError, AttributeError) as e:
|
|
||||||
testData = len(str(testData))
|
|
||||||
if onionrvalues.BLOCK_METADATA_LENGTHS[i] < testData:
|
|
||||||
logger.warn('Block metadata key ' + i + ' exceeded maximum size')
|
|
||||||
break
|
|
||||||
if i == 'time':
|
|
||||||
if not stringvalidators.is_integer_string(metadata[i]):
|
|
||||||
logger.warn('Block metadata time stamp is not integer string or int')
|
|
||||||
break
|
|
||||||
isFuture = (metadata[i] - epoch.get_epoch())
|
|
||||||
if isFuture > max_clock_difference:
|
|
||||||
logger.warn('Block timestamp is skewed to the future over the max %s: %s', (max_clock_difference, isFuture))
|
|
||||||
break
|
|
||||||
if (epoch.get_epoch() - metadata[i]) > maxAge:
|
|
||||||
logger.warn('Block is outdated: %s' % (metadata[i],))
|
|
||||||
break
|
|
||||||
elif i == 'expire':
|
|
||||||
try:
|
|
||||||
if not int(metadata[i]) > epoch.get_epoch(): raise ValueError
|
|
||||||
except ValueError:
|
|
||||||
logger.warn('Block is expired: %s less than %s' % (metadata[i], epoch.get_epoch()))
|
|
||||||
break
|
|
||||||
elif i == 'encryptType':
|
|
||||||
try:
|
|
||||||
if not metadata[i] in ('asym', 'sym', ''): raise ValueError
|
|
||||||
except ValueError:
|
|
||||||
logger.warn('Invalid encryption mode')
|
|
||||||
break
|
|
||||||
elif i == 'sig':
|
|
||||||
try:
|
|
||||||
metadata['encryptType']
|
|
||||||
except KeyError:
|
|
||||||
signer = metadata['signer']
|
|
||||||
sig = metadata['sig']
|
|
||||||
encodedMeta = bytesconverter.str_to_bytes(metadata['meta'])
|
|
||||||
encodedBlock = bytesconverter.str_to_bytes(block_data)
|
|
||||||
if not onionrcrypto.signing.ed_verify(encodedMeta + encodedBlock[1:], signer, sig):
|
|
||||||
logger.warn(f'Block was signed by {signer}, but signature failed')
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
# if metadata loop gets no errors, it does not break, therefore metadata is valid
|
|
||||||
# make sure we do not have another block with the same data content (prevent data duplication and replay attacks)
|
|
||||||
|
|
||||||
# Make sure time is set (validity was checked above if it is)
|
|
||||||
if not config.get('general.store_plaintext_blocks', True):
|
|
||||||
try:
|
|
||||||
if not metadata['encryptType']:
|
|
||||||
raise onionrexceptions.PlaintextNotSupported
|
|
||||||
except KeyError:
|
|
||||||
raise onionrexceptions.PlaintextNotSupported
|
|
||||||
try:
|
|
||||||
metadata['time']
|
|
||||||
except KeyError:
|
|
||||||
logger.warn("Time header not set")
|
|
||||||
return False
|
|
||||||
|
|
||||||
nonce = bytesconverter.bytes_to_str(onionrcrypto.hashers.sha3_hash(block_data))
|
|
||||||
try:
|
|
||||||
with open(filepaths.data_nonce_file, 'r') as nonceFile:
|
|
||||||
if nonce in nonceFile.read():
|
|
||||||
# we've seen that nonce before, so we can't pass metadata
|
|
||||||
raise onionrexceptions.DataExists
|
|
||||||
except FileNotFoundError:
|
|
||||||
ret_data = True
|
|
||||||
except onionrexceptions.DataExists:
|
|
||||||
# do not set ret_data to True, because data has been seen before
|
|
||||||
logger.warn(f'{nonce} seen before')
|
|
||||||
raise onionrexceptions.DataExists
|
|
||||||
else:
|
|
||||||
ret_data = True
|
|
||||||
else:
|
|
||||||
logger.warn('In call to utils.validateMetadata, metadata must be JSON string or a dictionary object')
|
|
||||||
|
|
||||||
return ret_data
|
|
@ -1,77 +0,0 @@
|
|||||||
"""Onionr - Private P2P Communication.
|
|
||||||
|
|
||||||
Test Onionr as it is running
|
|
||||||
"""
|
|
||||||
import os
|
|
||||||
from secrets import SystemRandom
|
|
||||||
|
|
||||||
import logger
|
|
||||||
from onionrutils import epoch
|
|
||||||
|
|
||||||
from . import uicheck
|
|
||||||
from .webpasstest import webpass_test
|
|
||||||
from .osver import test_os_ver_endpoint
|
|
||||||
from .dnsrebindingtest import test_dns_rebinding
|
|
||||||
"""
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
"""
|
|
||||||
|
|
||||||
RUN_TESTS = [uicheck.check_ui,
|
|
||||||
webpass_test,
|
|
||||||
test_os_ver_endpoint,
|
|
||||||
]
|
|
||||||
|
|
||||||
SUCCESS_FILE = os.path.dirname(os.path.realpath(__file__)) + '/../../tests/runtime-result.txt'
|
|
||||||
|
|
||||||
|
|
||||||
class OnionrRunTestManager:
|
|
||||||
def __init__(self):
|
|
||||||
self.success: bool = True
|
|
||||||
self.run_date: int = 0
|
|
||||||
|
|
||||||
def run_tests(self):
|
|
||||||
tests = list(RUN_TESTS)
|
|
||||||
SystemRandom().shuffle(tests)
|
|
||||||
cur_time = epoch.get_epoch()
|
|
||||||
logger.info(f"Doing runtime tests at {cur_time}")
|
|
||||||
|
|
||||||
try:
|
|
||||||
os.remove(SUCCESS_FILE)
|
|
||||||
except FileNotFoundError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
done_count: int = 0
|
|
||||||
total_to_do: int = len(tests)
|
|
||||||
|
|
||||||
try:
|
|
||||||
for i in tests:
|
|
||||||
last = i
|
|
||||||
logger.info("[RUNTIME TEST] " + last.__name__ + " started",
|
|
||||||
terminal=True, timestamp=True)
|
|
||||||
i(self)
|
|
||||||
done_count += 1
|
|
||||||
logger.info("[RUNTIME TEST] " + last.__name__ +
|
|
||||||
f" passed {done_count}/{total_to_do}",
|
|
||||||
terminal=True, timestamp=True)
|
|
||||||
except (ValueError, AttributeError):
|
|
||||||
logger.error(last.__name__ + ' failed assertions', terminal=True)
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(last.__name__ + ' failed with non-asserting exception')
|
|
||||||
logger.error(str(e))
|
|
||||||
else:
|
|
||||||
ep = str(epoch.get_epoch())
|
|
||||||
logger.info(f'All runtime tests passed at {ep}', terminal=True)
|
|
||||||
with open(SUCCESS_FILE, 'w') as f:
|
|
||||||
f.write(ep)
|
|
||||||
|
|
@ -1,46 +0,0 @@
|
|||||||
"""Onionr - Private P2P Communication.
|
|
||||||
|
|
||||||
Test apis for dns rebinding
|
|
||||||
"""
|
|
||||||
import config
|
|
||||||
import requests
|
|
||||||
from filepaths import private_API_host_file, public_API_host_file
|
|
||||||
import logger
|
|
||||||
"""
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
def test_dns_rebinding(test_manager):
|
|
||||||
f = ''
|
|
||||||
with open(private_API_host_file, 'r') as f:
|
|
||||||
host = f.read()
|
|
||||||
private_api_port = config.get('client.client.port')
|
|
||||||
|
|
||||||
if requests.get(f'http://{host}:{private_api_port}/ping', headers={'host': 'example.com'}) == 'pong!':
|
|
||||||
raise ValueError('DNS rebinding failed')
|
|
||||||
logger.info('It is normal to see 403 errors right now', terminal=True)
|
|
||||||
|
|
||||||
if config.get('general.security_level', 0) > 0 or not config.get('transports.tor', True):
|
|
||||||
return
|
|
||||||
public_api_port = config.get('client.public.port')
|
|
||||||
f = ''
|
|
||||||
with open(public_API_host_file, 'r') as f:
|
|
||||||
host = f.read()
|
|
||||||
|
|
||||||
if requests.get(f'http://{host}:{public_api_port}/ping', headers={'host': 'example.com'}) == 'pong!':
|
|
||||||
raise ValueError('DNS rebinding failed')
|
|
||||||
logger.info('It is normal to see 403 errors right now', terminal=True)
|
|
||||||
|
|
||||||
|
|
@ -1,8 +0,0 @@
|
|||||||
import platform
|
|
||||||
|
|
||||||
from onionrutils import localcommand
|
|
||||||
|
|
||||||
|
|
||||||
def test_os_ver_endpoint(test_manager):
|
|
||||||
if localcommand.local_command('os') != platform.system().lower():
|
|
||||||
raise ValueError('could not get proper os platform from endpoint /os')
|
|
@ -1,9 +0,0 @@
|
|||||||
from onionrutils import localcommand
|
|
||||||
def check_ui(test_manager):
|
|
||||||
endpoints = ['/']
|
|
||||||
for point in endpoints:
|
|
||||||
result = localcommand.local_command(point)
|
|
||||||
if not result: raise ValueError
|
|
||||||
result = result.lower()
|
|
||||||
if 'script' not in result:
|
|
||||||
raise ValueError(f'uicheck failed on {point}')
|
|
@ -1,11 +0,0 @@
|
|||||||
import requests
|
|
||||||
|
|
||||||
from onionrutils import localcommand
|
|
||||||
|
|
||||||
|
|
||||||
def webpass_test(test_manager):
|
|
||||||
if requests.get('http://' + localcommand.get_hostname() + '/ping') == \
|
|
||||||
'pong!':
|
|
||||||
raise ValueError
|
|
||||||
if localcommand.local_command('ping') != 'pong!':
|
|
||||||
raise ValueError('Could not ping with normal localcommand in webpasstest')
|
|
@ -1,34 +0,0 @@
|
|||||||
"""Onionr - Private P2P Communication.
|
|
||||||
|
|
||||||
Initialize singleton deadsimplekv pseudo globals
|
|
||||||
"""
|
|
||||||
import queue
|
|
||||||
|
|
||||||
from typing import TYPE_CHECKING
|
|
||||||
|
|
||||||
from onionrutils import epoch
|
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
|
||||||
from deadsimplekv import DeadSimpleKV
|
|
||||||
"""
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
def setup_kv(shared_vars: 'DeadSimpleKV'):
|
|
||||||
"""Init initial pseudo-globals."""
|
|
||||||
shared_vars.put('shutdown', False)
|
|
||||||
shared_vars.put('generating_blocks', [])
|
|
||||||
shared_vars.put('startTime', epoch.get_epoch())
|
|
||||||
shared_vars.put('isOnline', True)
|
|
@ -1,30 +0,0 @@
|
|||||||
"""Onionr - Private P2P Communication.
|
|
||||||
|
|
||||||
greenlet safe sleep, ignoring ctrl-c
|
|
||||||
"""
|
|
||||||
from gevent import sleep
|
|
||||||
from onionrutils.epoch import get_epoch
|
|
||||||
"""
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
def better_sleep(wait: int):
|
|
||||||
"""Sleep catching ctrl c for wait seconds."""
|
|
||||||
start = get_epoch()
|
|
||||||
try:
|
|
||||||
sleep(wait)
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
better_sleep(wait - (get_epoch() - start))
|
|
||||||
|
|
@ -1,17 +0,0 @@
|
|||||||
"""Onionr - Private P2P Communication.
|
|
||||||
|
|
||||||
read from a file from an offset (efficiently)
|
|
||||||
"""
|
|
||||||
from collections import namedtuple
|
|
||||||
|
|
||||||
OffsetReadResult = namedtuple('OffsetReadResult', ['data', 'new_offset'])
|
|
||||||
|
|
||||||
|
|
||||||
def read_from_offset(file_path, offset=0):
|
|
||||||
with open(file_path, 'rb') as f:
|
|
||||||
if offset:
|
|
||||||
f.seek(offset)
|
|
||||||
data = f.read()
|
|
||||||
offset = f.tell()
|
|
||||||
|
|
||||||
return OffsetReadResult(data, offset)
|
|
@ -1,51 +0,0 @@
|
|||||||
'''
|
|
||||||
Onionr - Private P2P Communication
|
|
||||||
|
|
||||||
z-fill (zero fill) a string to a specific length
|
|
||||||
intended for reconstructing block hashes
|
|
||||||
'''
|
|
||||||
from typing import Union
|
|
||||||
'''
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
'''
|
|
||||||
|
|
||||||
|
|
||||||
def reconstruct_hash(hex_hash: Union[str, bytes],
|
|
||||||
length: int = 64) -> Union[str, bytes]:
|
|
||||||
"""Pad hash hex string with zeros, return result"""
|
|
||||||
return hex_hash.zfill(length)
|
|
||||||
|
|
||||||
|
|
||||||
def deconstruct_hash(hex_hash: Union[str, bytes]) -> Union[str, bytes]:
|
|
||||||
"""Remove leading zeros from hex hash, return result"""
|
|
||||||
new_hash = ''
|
|
||||||
ret_bytes = False
|
|
||||||
try:
|
|
||||||
hex_hash = hex_hash.decode()
|
|
||||||
ret_bytes = True
|
|
||||||
except AttributeError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
c = 0
|
|
||||||
for x in hex_hash:
|
|
||||||
if x == '0':
|
|
||||||
c += 1
|
|
||||||
else:
|
|
||||||
break
|
|
||||||
new_hash = hex_hash[c:]
|
|
||||||
|
|
||||||
if ret_bytes:
|
|
||||||
|
|
||||||
new_hash = new_hash.encode()
|
|
||||||
return new_hash
|
|
@ -13,4 +13,4 @@ echo "Future Onionr commands will use your set or default Onionr home directory,
|
|||||||
echo "Ultimately, a live boot operating system such as Tails or Debian would be better for you to use."
|
echo "Ultimately, a live boot operating system such as Tails or Debian would be better for you to use."
|
||||||
$(dirname $0)/onionr.sh start & disown
|
$(dirname $0)/onionr.sh start & disown
|
||||||
sleep 2
|
sleep 2
|
||||||
$(dirname $0)/onionr.sh open-home
|
#$(dirname $0)/onionr.sh open-home
|
||||||
|
@ -1 +0,0 @@
|
|||||||
https://duckduckgogg42xjoc72x3sjasowoarfbgcmvfimaftt6twagswzczad.onion/robots.txt,http://2gzyxa5ihm7nsggfxnu52rck2vv4rvmdlkiu3zzui5du4xyclen53wid.onion/robots.txt,http://rurcblzhmdk22kttfkel2zduhyu3r6to7knyc7wiorzrx5gw4c3lftad.onion/
|
|
@ -19,7 +19,6 @@ import onionrblocks
|
|||||||
locale.setlocale(locale.LC_ALL, '')
|
locale.setlocale(locale.LC_ALL, '')
|
||||||
sys.path.insert(0, os.path.dirname(os.path.realpath(__file__)))
|
sys.path.insert(0, os.path.dirname(os.path.realpath(__file__)))
|
||||||
# import after path insert
|
# import after path insert
|
||||||
from onionrutils.localcommand import local_command
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
@ -43,12 +42,6 @@ PLUGIN_VERSION = '0.0.0'
|
|||||||
|
|
||||||
def on_blocktest_cmd(api, data=None):
|
def on_blocktest_cmd(api, data=None):
|
||||||
bl = onionrblocks.create_anonvdf_block(input("Enter a message:").encode('utf-8'), b"tst", 3600)
|
bl = onionrblocks.create_anonvdf_block(input("Enter a message:").encode('utf-8'), b"tst", 3600)
|
||||||
logger.info(
|
|
||||||
local_command(
|
|
||||||
'/addvdfblock',
|
|
||||||
post_data=bl.id + bl.raw,
|
|
||||||
silent=False, post=True),
|
|
||||||
terminal=True)
|
|
||||||
|
|
||||||
|
|
||||||
def on_printtest_cmd(api, data=None):
|
def on_printtest_cmd(api, data=None):
|
||||||
|
Binary file not shown.
@ -1,96 +0,0 @@
|
|||||||
/*
|
|
||||||
Onionr - Private P2P Communication
|
|
||||||
|
|
||||||
This file handles the UI for managing friends/contacts
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
friendListDisplay = document.getElementById('friendList')
|
|
||||||
addForm = document.getElementById('addFriend')
|
|
||||||
|
|
||||||
function removeFriend(pubkey){
|
|
||||||
post_to_url('/friends/remove/' + pubkey, {'token': webpass})
|
|
||||||
}
|
|
||||||
|
|
||||||
addForm.onsubmit = function(){
|
|
||||||
var friend = document.getElementsByName('addKey')[0]
|
|
||||||
var alias = document.getElementsByName('data')[0]
|
|
||||||
if (alias.value.toLowerCase().trim() == 'anonymous'){
|
|
||||||
PNotify.error({
|
|
||||||
text: "Anonymous is a reserved alias name"
|
|
||||||
})
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
fetch('/friends/add/' + friend.value, {
|
|
||||||
method: 'POST',
|
|
||||||
headers: {
|
|
||||||
"token": webpass
|
|
||||||
}}).then(function(data) {
|
|
||||||
if (alias.value.trim().length > 0){
|
|
||||||
post_to_url('/friends/setinfo/' + friend.value + '/name', {'data': alias.value, 'token': webpass})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
fetch('/friends/list', {
|
|
||||||
headers: {
|
|
||||||
"token": webpass
|
|
||||||
}})
|
|
||||||
.then((resp) => resp.json()) // Transform the data into json
|
|
||||||
.then(function(resp) {
|
|
||||||
var keys = [];
|
|
||||||
for(var k in resp) keys.push(k);
|
|
||||||
console.log(keys)
|
|
||||||
|
|
||||||
if (keys.length == 0){
|
|
||||||
friendListDisplay.innerText = "None yet :("
|
|
||||||
}
|
|
||||||
for (var i = 0; i < keys.length; i++){
|
|
||||||
var peer = keys[i]
|
|
||||||
var name = resp[keys[i]]['name']
|
|
||||||
if (name === null || name === ''){
|
|
||||||
name = peer
|
|
||||||
}
|
|
||||||
var entry = document.createElement('div')
|
|
||||||
var nameText = document.createElement('input')
|
|
||||||
removeButton = document.createElement('button')
|
|
||||||
removeButton.classList.add('friendRemove')
|
|
||||||
removeButton.classList.add('button', 'is-danger')
|
|
||||||
entry.setAttribute('data-pubkey', peer)
|
|
||||||
removeButton.innerText = 'X'
|
|
||||||
nameText.value = name
|
|
||||||
nameText.readOnly = true
|
|
||||||
nameText.style.fontStyle = "italic"
|
|
||||||
entry.style.paddingTop = '8px'
|
|
||||||
entry.appendChild(removeButton)
|
|
||||||
entry.appendChild(nameText)
|
|
||||||
friendListDisplay.appendChild(entry)
|
|
||||||
}
|
|
||||||
// If friend delete buttons are pressed
|
|
||||||
|
|
||||||
var friendRemoveBtns = document.getElementsByClassName('friendRemove')
|
|
||||||
|
|
||||||
for (var x = 0; x < friendRemoveBtns.length; x++){
|
|
||||||
var friendKey = friendRemoveBtns[x].parentElement.getAttribute('data-pubkey')
|
|
||||||
friendRemoveBtns[x].onclick = function(){
|
|
||||||
removeFriend(friendKey)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
})
|
|
@ -1,160 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
|
|
||||||
<head>
|
|
||||||
<meta charset='utf-8'>
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
<title>
|
|
||||||
Friends
|
|
||||||
</title>
|
|
||||||
<link rel='shortcut icon' type='image/ico' href='/shared/images/favicon.ico'>
|
|
||||||
<link rel="stylesheet" href="/shared/fontawesome-free-5.10.2/css/all.min.css">
|
|
||||||
<link rel='stylesheet' href='/shared/main/PNotifyBrightTheme.css'>
|
|
||||||
<link rel="stylesheet" href="/gettheme">
|
|
||||||
<link rel='stylesheet' href='/friends/style.css'>
|
|
||||||
<script defer src="/shared/node_modules/pnotify/dist/iife/PNotify.js"></script>
|
|
||||||
<script defer src="/shared/node_modules/pnotify/dist/iife/PNotifyButtons.js"></script>
|
|
||||||
<script defer src="/shared/misc.js"></script>
|
|
||||||
<script defer src="/friends/friends.js"></script>
|
|
||||||
<script defer src="/shared/navbar.js"></script>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
|
|
||||||
<nav class="navbar is-dark" role="navigation" aria-label="main navigation">
|
|
||||||
<div class="navbar-brand">
|
|
||||||
<a class="navbar-item idLink" href="/">
|
|
||||||
<img src="/shared/images/favicon.ico" class="navbarLogo">
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<a role="button" class="navbar-burger burger" aria-label="menu" aria-expanded="false"
|
|
||||||
data-target="navbarBasic">
|
|
||||||
<span aria-hidden="true"></span>
|
|
||||||
<span aria-hidden="true"></span>
|
|
||||||
<span aria-hidden="true"></span>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="navbarBasic" class="navbar-menu">
|
|
||||||
<div class="navbar-start">
|
|
||||||
<a class="navbar-item idLink" href="/mail/">Mail</a>
|
|
||||||
<a class="navbar-item idLink" href="/friends/">Friends</a>
|
|
||||||
<a class="navbar-item idLink" href="/board/">Circles</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
|
|
||||||
<!--Hero (Dark Section)-->
|
|
||||||
<section class="hero is-small is-dark">
|
|
||||||
<div class="hero-body">
|
|
||||||
<div class="container">
|
|
||||||
<div class="columns">
|
|
||||||
<div class="column">
|
|
||||||
<h1 class="title">
|
|
||||||
Friends
|
|
||||||
</h1>
|
|
||||||
<h2 class="subtitle">
|
|
||||||
Manage your friend list
|
|
||||||
</h2>
|
|
||||||
</div>
|
|
||||||
<div class="column is-7">
|
|
||||||
<div class="field">
|
|
||||||
<div class="field has-addons">
|
|
||||||
<p class="control">
|
|
||||||
<a class="button is-static">
|
|
||||||
<i class="fas fa-fingerprint"></i>
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
<p class="control is-expanded">
|
|
||||||
<input id="myPub" class="input myPub" type="text" readonly>
|
|
||||||
</p>
|
|
||||||
<p class="control">
|
|
||||||
<a id="myPubCopy" class="button is-primary">Copy</a>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<br>
|
|
||||||
|
|
||||||
<!--Start Content-->
|
|
||||||
<div class="container">
|
|
||||||
<div class="columns">
|
|
||||||
<!--Add Friend-->
|
|
||||||
<div class="column is-one-third">
|
|
||||||
<div class="card">
|
|
||||||
<header class="card-header">
|
|
||||||
<p class="card-header-title">
|
|
||||||
Add Friend
|
|
||||||
</p>
|
|
||||||
</header>
|
|
||||||
<div class="card-content">
|
|
||||||
<div class="content">
|
|
||||||
<form id='addFriend' action='/' method='POST'>
|
|
||||||
<div class="field">
|
|
||||||
<label class="label">Friend ID</label>
|
|
||||||
<p class="control is-expanded">
|
|
||||||
<input id="" class="input" type="text" name='addKey' placeholder='Public Key/ID'
|
|
||||||
minlength="52" maxlength="500" required>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="field">
|
|
||||||
<label class="label">Alias</label>
|
|
||||||
<p class="control is-expanded">
|
|
||||||
<input id="" class="input" type="text" name='data' placeholder='Name' required>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<footer class="card-footer">
|
|
||||||
<a class="card-footer-item">
|
|
||||||
<button class="button is-success" type='submit'>Add Friend</button>
|
|
||||||
</a>
|
|
||||||
</footer>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!--Friend List-->
|
|
||||||
<div class="column">
|
|
||||||
<div class="card">
|
|
||||||
<header class="card-header">
|
|
||||||
<p class="card-header-title">
|
|
||||||
Friend List
|
|
||||||
</p>
|
|
||||||
</header>
|
|
||||||
<div class="card-content">
|
|
||||||
<div class="content">
|
|
||||||
<div id='friendList'>
|
|
||||||
<!--Friend list is appended here-->
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<!--Template markup for friend list-->
|
|
||||||
<template id="friendTemplate">
|
|
||||||
<div class="box">
|
|
||||||
<div class="columns">
|
|
||||||
<div class="column is-narrow" id='friendName'>
|
|
||||||
Name
|
|
||||||
</div>
|
|
||||||
<div class="column" id='friendPubkey'>
|
|
||||||
Public Key
|
|
||||||
</div>
|
|
||||||
<div class="column is-narrow friendRemove" id='defriend'>
|
|
||||||
<a class="">Delete</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</body>
|
|
||||||
|
|
||||||
</html>
|
|
@ -1,4 +0,0 @@
|
|||||||
#friendList button{
|
|
||||||
display: inline;
|
|
||||||
margin-right: 10px;
|
|
||||||
}
|
|
@ -1,24 +0,0 @@
|
|||||||
let skipConsentBtns = function(){
|
|
||||||
var skipBtn = document.getElementsByClassName('skipToConsent')[0]
|
|
||||||
var sections = document.getElementsByClassName('step-item')
|
|
||||||
var content = document.getElementsByClassName('step-content')
|
|
||||||
skipBtn.onclick = function(e){
|
|
||||||
e.preventDefault()
|
|
||||||
for (el of document.querySelectorAll('.steps-action a')){
|
|
||||||
el.classList.add('is-hidden')
|
|
||||||
}
|
|
||||||
for (el of content){
|
|
||||||
el.classList.remove('is-active')
|
|
||||||
var last = el
|
|
||||||
}
|
|
||||||
last.classList.add('is-active')
|
|
||||||
for (el = 0; el <= sections.length; el++){
|
|
||||||
sections[el].classList.add('is-completed')
|
|
||||||
sections[el].classList.remove('is-active')
|
|
||||||
var last = sections[el]
|
|
||||||
}
|
|
||||||
last.classList.add('is-active')
|
|
||||||
|
|
||||||
//is-completed
|
|
||||||
}
|
|
||||||
}()
|
|
@ -1,13 +0,0 @@
|
|||||||
.donateHeader{
|
|
||||||
font-size: 2em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.donateFinished{
|
|
||||||
display: block;
|
|
||||||
margin-top: 1em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.donateBody p{
|
|
||||||
padding-top: 1em;
|
|
||||||
text-align: justify;
|
|
||||||
}
|
|
@ -1,17 +0,0 @@
|
|||||||
<b class='donateHeader'>Donate</b>
|
|
||||||
|
|
||||||
<br><br>
|
|
||||||
|
|
||||||
<p>Onionr is a volunteer-driven project, and infrastructure is paid for out of pocket.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
Please donate the price of a cup of coffee to sustain development.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<br>
|
|
||||||
|
|
||||||
Paypal/Card: <a href="https://ko-fi.com/beardogkf" target="_blank" rel="noopener">Ko-fi</a>
|
|
||||||
<br>
|
|
||||||
Bitcoin: <a href="bitcoin:1onion55FXzm6h8KQw3zFw2igpHcV7LPq">1onion55FXzm6h8KQw3zFw2igpHcV7LPq</a>
|
|
||||||
|
|
||||||
<button class="button donateFinished is-success">Done</button>
|
|
@ -1,45 +0,0 @@
|
|||||||
/*
|
|
||||||
Onionr - Private P2P Communication
|
|
||||||
|
|
||||||
Handles onboarding donations for Onionr
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
let donateFinishedButtons = document.getElementsByClassName('donateFinished')
|
|
||||||
configInfo = {}
|
|
||||||
|
|
||||||
let openDonateModal = function(newConfigInfo){
|
|
||||||
fetch('donate-modal.html')
|
|
||||||
.then((resp) => resp.text())
|
|
||||||
.then(function(resp) {
|
|
||||||
document.getElementsByClassName('donateModal')[0].classList.add('is-active')
|
|
||||||
|
|
||||||
// Load the donate modal html and display it
|
|
||||||
let donateBody = document.getElementsByClassName('donateBody')[0]
|
|
||||||
|
|
||||||
donateBody.innerHTML = resp
|
|
||||||
|
|
||||||
let donateFinishedButton = document.getElementsByClassName('donateFinished')[0]
|
|
||||||
|
|
||||||
for (i = 0; i < donateFinishedButtons.length; i++){
|
|
||||||
donateFinishedButtons[i].onclick = function(){
|
|
||||||
document.getElementsByClassName('donateModal')[0].classList.remove('is-active')
|
|
||||||
sendConfig(configInfo)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
})
|
|
||||||
}
|
|
@ -1,291 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<!--Mobile responsive-->
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
<title>
|
|
||||||
Onionr
|
|
||||||
</title>
|
|
||||||
<link rel="shortcut icon" type="image/ico" href="/shared/images/favicon.ico">
|
|
||||||
<link rel="stylesheet" href="/private/main.css">
|
|
||||||
<link rel="stylesheet" href="/shared/fontawesome-free-5.10.2/css/all.min.css">
|
|
||||||
<link rel="stylesheet" href="/gettheme">
|
|
||||||
<link rel="stylesheet" href="/shared/bulma-steps.min.css">
|
|
||||||
<link rel="stylesheet" href="/shared/bulma-tooltip.min.css">
|
|
||||||
<link rel="stylesheet" href="donate-modal.css">
|
|
||||||
<link rel="stylesheet" href="onboarding.css">
|
|
||||||
|
|
||||||
<script defer src="/shared/loadabout.js"></script>
|
|
||||||
<script defer src="/shared/misc.js"></script>
|
|
||||||
<script defer src="/private/js/console.js"></script>
|
|
||||||
<script defer src="donate.js"></script>
|
|
||||||
<script defer src="onboarding.js"></script>
|
|
||||||
<script defer src="/shared/panel.js"></script>
|
|
||||||
<script defer src="/shared/bulma-steps.min.js"></script>
|
|
||||||
<script defer src="consentskip.js"></script>
|
|
||||||
<script>alert("Content security policy appears to not be working. Your browser security is weak!")</script>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<div id="shutdownNotice" class="overlay">
|
|
||||||
<div>
|
|
||||||
<p>Your node will shutdown. Thank you for using Onionr.</p>
|
|
||||||
<p>If you are using random bind IPs (default in non dev mode), Onionr will have a different URL next time.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!--Hero (Dark Bar)-->
|
|
||||||
<section class="hero is-small is-dark">
|
|
||||||
<div class="hero-body">
|
|
||||||
<div class="container">
|
|
||||||
<div class="columns">
|
|
||||||
<div class="column">
|
|
||||||
<div class="image is-128x128">
|
|
||||||
<img src="/shared/images/onionr-text.png">
|
|
||||||
</div>
|
|
||||||
<h2 class="subtitle">
|
|
||||||
Private Decentralized Communication
|
|
||||||
</h2>
|
|
||||||
</div>
|
|
||||||
<div class="column is-7">
|
|
||||||
<div class="field is-grouped is-pulled-right">
|
|
||||||
<p class="control">
|
|
||||||
<a class="button is-danger is-outlined" id="shutdownNode">
|
|
||||||
Shutdown
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<br>
|
|
||||||
|
|
||||||
<div class="modal donateModal">
|
|
||||||
<div class="modal-background"></div>
|
|
||||||
<div class="modal-card">
|
|
||||||
<header class="modal-card-head">
|
|
||||||
<button class="closeAboutModal delete" aria-label="close"></button>
|
|
||||||
</header>
|
|
||||||
<section class="modal-card-body donateBody">
|
|
||||||
Loading... <i class="fas fa-spinner fa-spin"></i>
|
|
||||||
</section>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="container">
|
|
||||||
<div class="onboarding">
|
|
||||||
<noscript><h1>Unfortunately, this requires JavaScript. Don't worry, all scripts are open source and locally loaded.</h1></noscript>
|
|
||||||
<form method="post" id="onboardingForm">
|
|
||||||
<div class="columns">
|
|
||||||
<div class="column">
|
|
||||||
<div class="steps" id="stepsDemo">
|
|
||||||
<div class="step-item is-active">
|
|
||||||
<div class="step-marker">1</div>
|
|
||||||
<div class="step-details">
|
|
||||||
<p class="step-title">Welcome</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="step-item">
|
|
||||||
<div class="step-marker">2</div>
|
|
||||||
<div class="step-details">
|
|
||||||
<p class="step-title">Security</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="step-item">
|
|
||||||
<div class="step-marker">3</div>
|
|
||||||
<div class="step-details">
|
|
||||||
<p class="step-title">Plugins</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="step-item">
|
|
||||||
<div class="step-marker">4</div>
|
|
||||||
<div class="step-details">
|
|
||||||
<p class="step-title">Options</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="step-item">
|
|
||||||
<div class="step-marker">5</div>
|
|
||||||
<div class="step-details">
|
|
||||||
<p class="step-title">Consent</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="steps-content">
|
|
||||||
<div class="step-content has-text-justified is-active">
|
|
||||||
<div class="box">
|
|
||||||
<p>The default settings are intended to be safe for most users.</p>
|
|
||||||
<p>Use the button below to skip to the end.</p>
|
|
||||||
<nav class="level">
|
|
||||||
<div class="level-left">
|
|
||||||
<div class="level-item">
|
|
||||||
<button class="button is-primary formBtn skipToConsent">Use default setup</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="level-right">
|
|
||||||
<div class="level-item has-text-danger">
|
|
||||||
<small class="is-danger">Those targeted by powerful actors (governments, organized crime,
|
|
||||||
<span data-tooltip="advanced persistent threats">APTs</span>) should press next instead.</small>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="step-content has-text-justified">
|
|
||||||
<div class="box">
|
|
||||||
<p>Configure Onionr according to one's <a href="https://ssd.eff.org/en/module/your-security-plan" target="_blank" rel="noopener">threat model</a></p>
|
|
||||||
<p>I am concerned about the following:</p>
|
|
||||||
<div class="columns">
|
|
||||||
<div class="column is-4">
|
|
||||||
<div class="box">
|
|
||||||
<nav class="level">
|
|
||||||
<div class="level-left">
|
|
||||||
<div class="level-item"><i class="icon fas fa-eye" for="state"></i> <input type="checkbox" name="state" checked></div>
|
|
||||||
<label for="state">Mass surveillance</label>
|
|
||||||
</div>
|
|
||||||
<div class="level-right">
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="column is-4">
|
|
||||||
<div class="box">
|
|
||||||
<nav class="level">
|
|
||||||
<div class="level-left">
|
|
||||||
<div class="level-item">
|
|
||||||
<i class="icon fas fa-university" for="stateTarget"></i> <input type="checkbox" name="stateTarget">
|
|
||||||
</div>
|
|
||||||
<label for="stateTarget">State actor</label>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="column is-4">
|
|
||||||
<div class="box">
|
|
||||||
<i class="icon fas fa-binoculars" for="local"></i> <input type="checkbox" name="local"> <label for="local">Nearby threat</label>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="step-content has-text-justified">
|
|
||||||
<div class="box">
|
|
||||||
<div class="columns">
|
|
||||||
<div class="column is-4">
|
|
||||||
<div class="box">
|
|
||||||
<nav class="level">
|
|
||||||
<div class="level-left">
|
|
||||||
<i class="icon fas fa-envelope" for="useMail"></i> <input type="checkbox" name="useMail" checked> <label for="useMail">Use OnionrMail</label>
|
|
||||||
</div>
|
|
||||||
<div class="level-right">
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="column is-4">
|
|
||||||
<div class="box">
|
|
||||||
<nav class="level">
|
|
||||||
<div class="level-left">
|
|
||||||
<i class="icon fas fa-comments" for="useCircles"></i> <input type="checkbox" name="useCircles" checked> <label for="useCircles">Use Circles (message board system)</label>
|
|
||||||
</div>
|
|
||||||
<div class="level-right">
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="step-content has-text-justified">
|
|
||||||
<div class="box">
|
|
||||||
<div class="columns">
|
|
||||||
<div class="column is-4">
|
|
||||||
<div class="box">
|
|
||||||
<nav class="level">
|
|
||||||
<div class="level-left">
|
|
||||||
<i class="icon fas fa-palette" for="useDarkTheme"></i> <input type="checkbox" name="useDarkTheme" checked> <label for="useDarkTheme">Use Dark Theme</label>
|
|
||||||
</div>
|
|
||||||
<div class="level-right">
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="column is-4">
|
|
||||||
<div class="box">
|
|
||||||
<nav class="level">
|
|
||||||
<div class="level-left">
|
|
||||||
<div class="level-item">
|
|
||||||
<i class="icon fas fa-dollar-sign" for="donate"></i> <input type="checkbox" name="donate"> <label for="donate">Donate the price of a coffee</label>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="column is-4">
|
|
||||||
<div class="box">
|
|
||||||
<nav class="level">
|
|
||||||
<div class="level-left">
|
|
||||||
<div class="level-item">
|
|
||||||
<i class="icon fas fa-microchip" for="optimize"></i> <input type="checkbox" name="optimize"> <label for="optimize">Optimize CPU</label>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="step-content has-text-justified">
|
|
||||||
<div class="box">
|
|
||||||
<p>I want to contribute resources to the following...</p>
|
|
||||||
<div class="columns">
|
|
||||||
<div class="column is-4">
|
|
||||||
<div class="box">
|
|
||||||
<nav class="level">
|
|
||||||
<div class="level-left">
|
|
||||||
<div class="level-item">
|
|
||||||
<i class="icon fas fa-book-open" for="networkContributionPlain"></i> <input checked type="checkbox" name="networkContributionPlain"> <label for="networkContributionPlain">Sharing and storing plaintext data</label>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="level-right">
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="column is-4">
|
|
||||||
<div class="box">
|
|
||||||
<nav class="level">
|
|
||||||
<div class="level-left">
|
|
||||||
<div class="level-item">
|
|
||||||
<i class="icon fas fa-network-wired" for="networkContribution"></i> <input checked type="checkbox" name="networkContribution"> <label for="networkContribution">Sharing and storing encrypted data</label>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<input type="submit" class="button is-primary" value="Complete Setup">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="steps-actions">
|
|
||||||
<div class="steps-action">
|
|
||||||
<a data-nav="previous" class="button is-light">Previous</a>
|
|
||||||
</div>
|
|
||||||
<div class="steps-action">
|
|
||||||
<a data-nav="next" class="button is-light">Next</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,48 +0,0 @@
|
|||||||
img{
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
.navbarLogo{
|
|
||||||
display: inline;
|
|
||||||
}
|
|
||||||
|
|
||||||
.onboarding{
|
|
||||||
padding-left: 5%;
|
|
||||||
text-align: justify;
|
|
||||||
font-size: 1.8em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.icon{
|
|
||||||
padding-right: 1em;
|
|
||||||
}
|
|
||||||
form{
|
|
||||||
margin-left: 2%;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
noscript{
|
|
||||||
font-size: 2em;
|
|
||||||
color: yellow;
|
|
||||||
}
|
|
||||||
|
|
||||||
p{
|
|
||||||
font-size: 1.3em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.formBtn{
|
|
||||||
margin-top: 1em;
|
|
||||||
}
|
|
||||||
.steps-content{
|
|
||||||
min-height: 200px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.step-content .box{
|
|
||||||
padding: 2em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.step-content .box span{
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
.steps-content input[type='checkbox'] {
|
|
||||||
margin-right: 10px;
|
|
||||||
}
|
|
@ -1,86 +0,0 @@
|
|||||||
/*
|
|
||||||
Onionr - Private P2P Communication
|
|
||||||
|
|
||||||
Handles onboarding for Onionr
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>
|
|
||||||
*/
|
|
||||||
|
|
||||||
fetch('/getnewkeys', {
|
|
||||||
headers: {
|
|
||||||
"token": webpass
|
|
||||||
}})
|
|
||||||
.then((resp) => resp.text())
|
|
||||||
.then(function(resp) {
|
|
||||||
keys = resp.split('')
|
|
||||||
})
|
|
||||||
|
|
||||||
function getCheckValue(elName){
|
|
||||||
return document.getElementsByName(elName)[0].checked
|
|
||||||
}
|
|
||||||
|
|
||||||
function sendConfig(configInfo){
|
|
||||||
fetch('/setonboarding', {
|
|
||||||
method: 'POST',
|
|
||||||
headers: {
|
|
||||||
"token": webpass,
|
|
||||||
'Content-Type': 'application/json'
|
|
||||||
},
|
|
||||||
body: JSON.stringify({configInfo})
|
|
||||||
}).then(function(data) {
|
|
||||||
window.location.href = window.location.origin + '/' + window.location.hash
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
document.getElementById('onboardingForm').onsubmit = function(e){
|
|
||||||
submitInfo = {}
|
|
||||||
submitInfo.massSurveil = getCheckValue('state')
|
|
||||||
submitInfo.stateTarget = getCheckValue('stateTarget')
|
|
||||||
submitInfo.localThreat = getCheckValue('local')
|
|
||||||
submitInfo.networkContrib = getCheckValue('networkContribution')
|
|
||||||
submitInfo.plainContrib = getCheckValue('networkContributionPlain')
|
|
||||||
submitInfo.donate = getCheckValue('donate')
|
|
||||||
//submitInfo.deterministic = getCheckValue('useDeterministic')
|
|
||||||
submitInfo.mail = getCheckValue('useMail')
|
|
||||||
submitInfo.circles = getCheckValue('useCircles')
|
|
||||||
submitInfo.useDark = getCheckValue('useDarkTheme')
|
|
||||||
|
|
||||||
if (submitInfo.donate){
|
|
||||||
openDonateModal(submitInfo)
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
sendConfig(submitInfo)
|
|
||||||
|
|
||||||
e.preventDefault()
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Fix label clicking since bulma is weird */
|
|
||||||
|
|
||||||
let labelClickFix = function(labels) {
|
|
||||||
for (i = 0; i < labels.length; i++){
|
|
||||||
labels[i].onclick = function(event){
|
|
||||||
document.getElementsByName(event.target.getAttribute("for"))[0].checked ^= 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
let setupLabelFix = function(){
|
|
||||||
var labels = document.getElementsByTagName('label')
|
|
||||||
var icons = document.getElementsByTagName('i')
|
|
||||||
labelClickFix(labels)
|
|
||||||
labelClickFix(icons)
|
|
||||||
}
|
|
||||||
setupLabelFix()
|
|
Binary file not shown.
Before Width: | Height: | Size: 18 KiB |
Binary file not shown.
Before Width: | Height: | Size: 4.1 KiB |
@ -1,373 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
<title>
|
|
||||||
Onionr
|
|
||||||
</title>
|
|
||||||
<link rel="shortcut icon" type="image/ico" href="/shared/images/favicon.ico">
|
|
||||||
<link rel="stylesheet" href="/private/main.css">
|
|
||||||
<link rel="stylesheet" href="/shared/fontawesome-free-5.10.2/css/all.min.css">
|
|
||||||
<link rel="stylesheet" href="/shared/main/PNotifyBrightTheme.css">
|
|
||||||
<link rel="stylesheet" href="/shared/bulma-quickview.min.css">
|
|
||||||
<link rel="stylesheet" href="/shared/bulma-tooltip.min.css">
|
|
||||||
<link rel="stylesheet" href="/gettheme">
|
|
||||||
<link rel="stylesheet" href="/shared/sidebar/sidebar.css">
|
|
||||||
<script defer src="/shared/node_modules/pnotify/dist/iife/PNotify.js"></script>
|
|
||||||
<script defer src="/shared/node_modules/pnotify/dist/iife/PNotifyButtons.js"></script>
|
|
||||||
<script defer src="/shared/bulma-quickview.js"></script>
|
|
||||||
<script defer src="/shared/eventsource.js"></script>
|
|
||||||
<script defer src="/shared/main/particles.js"></script>
|
|
||||||
<script defer src="/shared/loadabout.js"></script>
|
|
||||||
<script defer src="/shared/misc.js"></script>
|
|
||||||
<script defer src="/shared/getos.js"></script>
|
|
||||||
<script defer src="/shared/main/stats.js"></script>
|
|
||||||
<script defer src="/shared/main/recent.js"></script>
|
|
||||||
<script defer src="/shared/main/torstats.js"></script>
|
|
||||||
<script defer src="/shared/panel.js"></script>
|
|
||||||
<script defer src="/shared/configeditor.js"></script>
|
|
||||||
<script defer src="/shared/sites.js"></script>
|
|
||||||
<script defer src="/shared/main/apicheck.js"></script>
|
|
||||||
<script defer src="/private/js/console.js"></script>
|
|
||||||
<script defer src="/private/js/motd.js"></script>
|
|
||||||
<script defer src="/shared/navbar.js"></script>
|
|
||||||
<script defer src="/shared/sidebar/sidebar.js"></script>
|
|
||||||
<script defer src="/shared/main/loadTransport.js"></script>
|
|
||||||
<script>alert("Content security policy appears to not be working. Your browser security is weak!")</script>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<div id="shutdownNotice" class="overlay">
|
|
||||||
<div>
|
|
||||||
<p>Your node will shutdown. Thank you for using Onionr.</p>
|
|
||||||
<p>If you are using random bind IPs (default in non dev mode), Onionr will have a different URL next time.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<span id="sidebarContainer"></span>
|
|
||||||
<nav class="navbar is-dark" role="navigation" aria-label="main navigation">
|
|
||||||
<div class="navbar-brand">
|
|
||||||
<a class="navbar-item idLink" href="/">
|
|
||||||
<img src="/shared/images/favicon.ico" class="navbarLogo">
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<a role="button" class="navbar-burger burger" aria-label="menu" aria-expanded="false"
|
|
||||||
data-target="navbarBasic">
|
|
||||||
<span aria-hidden="true"></span>
|
|
||||||
<span aria-hidden="true"></span>
|
|
||||||
<span aria-hidden="true"></span>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="navbarBasic" class="navbar-menu">
|
|
||||||
<div class="navbar-start">
|
|
||||||
<a class="navbar-item idLink" href="/mail/">Mail</a>
|
|
||||||
<a class="navbar-item idLink" href="/friends/">Friends</a>
|
|
||||||
<a class="navbar-item idLink" href="/board/">Circles</a>
|
|
||||||
</div>
|
|
||||||
<div class="navbar-end">
|
|
||||||
<a class="navbar-item idLink aboutLink">About</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
|
|
||||||
<!--Hero (Dark Bar)-->
|
|
||||||
<section class="hero is-small is-dark">
|
|
||||||
<div class="hero-body">
|
|
||||||
<div class="container">
|
|
||||||
<div class="columns">
|
|
||||||
<div class="column">
|
|
||||||
<h1 class="title">
|
|
||||||
Onionr
|
|
||||||
</h1>
|
|
||||||
<h2 class="subtitle">
|
|
||||||
Private Decentralized Communication
|
|
||||||
</h2>
|
|
||||||
</div>
|
|
||||||
<div class="column is-7">
|
|
||||||
<div class="field is-grouped is-grouped-centered">
|
|
||||||
<p class="control">
|
|
||||||
<a class="button is-danger is-outlined" id="shutdownNode">
|
|
||||||
Shutdown
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
<p class="control">
|
|
||||||
<a class="button is-warning is-outlined" id="restartNode">
|
|
||||||
Restart
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<br>
|
|
||||||
|
|
||||||
|
|
||||||
<!--Start of content-->
|
|
||||||
<div class="container mainCont">
|
|
||||||
<div class="columns">
|
|
||||||
<div class="column">
|
|
||||||
<!--Onionr Card-->
|
|
||||||
<div class="card">
|
|
||||||
<header class="card-header">
|
|
||||||
<span class="card-header-icon">
|
|
||||||
<span class="icon">
|
|
||||||
<i class="fas fa-link"></i>
|
|
||||||
</span>
|
|
||||||
</span>
|
|
||||||
<p class="card-header-title">
|
|
||||||
Onionr Sites
|
|
||||||
</p>
|
|
||||||
</header>
|
|
||||||
<div class="card-content">
|
|
||||||
<div class="content">
|
|
||||||
<div class="field" data-tooltip="Site public key or hash (not onion)">
|
|
||||||
<label class="label">Open Site</label>
|
|
||||||
<div class="field has-addons">
|
|
||||||
<p class="control is-expanded">
|
|
||||||
<input class="input" type="text" id="siteViewer" placeholder="Site ID">
|
|
||||||
</p>
|
|
||||||
<p class="control">
|
|
||||||
<a id="openSite" class="button is-info">Open</a>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="card motdCard">
|
|
||||||
<header class="card-header">
|
|
||||||
<span class="card-header-icon">
|
|
||||||
<span class="icon">
|
|
||||||
<i class="fas fa-newspaper"></i>
|
|
||||||
</span>
|
|
||||||
</span>
|
|
||||||
<p class="card-header-title" title="message of the day">
|
|
||||||
Onionr MOTD
|
|
||||||
</p>
|
|
||||||
</header>
|
|
||||||
<div class="card-content">
|
|
||||||
<div class="content motdContent">
|
|
||||||
No MOTD currently.
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<br>
|
|
||||||
<div class="card transportCard">
|
|
||||||
<header class="card-header">
|
|
||||||
<span class="card-header-icon">
|
|
||||||
<span class="icon">
|
|
||||||
<img src="/shared/images/privacy.png" alt="">
|
|
||||||
</span>
|
|
||||||
</span>
|
|
||||||
<p class="card-header-title">
|
|
||||||
Networking Statistics
|
|
||||||
</p>
|
|
||||||
</header>
|
|
||||||
<div class="card-content">
|
|
||||||
<div class="content torInfo">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="column">
|
|
||||||
<div class="card">
|
|
||||||
<header class="card-header">
|
|
||||||
<span class="card-header-icon">
|
|
||||||
<span class="icon">
|
|
||||||
<i class="fas fa-tachometer-alt"></i>
|
|
||||||
</span>
|
|
||||||
</span>
|
|
||||||
<p class="card-header-title">
|
|
||||||
Dashboard
|
|
||||||
</p>
|
|
||||||
</header>
|
|
||||||
<div class="card-content">
|
|
||||||
<div class="content">
|
|
||||||
<div class="columns">
|
|
||||||
<div class="column">
|
|
||||||
<div class="field">
|
|
||||||
<div class="field has-addons">
|
|
||||||
<p class="control">
|
|
||||||
<a class="button is-static">
|
|
||||||
<i class="fas fa-fingerprint"></i>
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
<p class="control is-expanded">
|
|
||||||
<input id="myPub" class="input myPub" type="text" readonly>
|
|
||||||
</p>
|
|
||||||
<p class="control">
|
|
||||||
<a id="myPubCopy" class="button is-primary"><i class="fas fa-copy"></i></a>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="columns">
|
|
||||||
<div class="column">
|
|
||||||
<span class="icon">
|
|
||||||
<i class="fas fa-lock"></i>
|
|
||||||
</span>
|
|
||||||
Security level: <span id="securityLevel"></span>
|
|
||||||
</div>
|
|
||||||
<div class="column">
|
|
||||||
<i class="fas fa-clock"></i>
|
|
||||||
Uptime: <span id="uptime"></span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!--
|
|
||||||
<div class="columns">
|
|
||||||
<div class="column">
|
|
||||||
<div class="field has-addons">
|
|
||||||
<p class="control">
|
|
||||||
<button class="button is-info">
|
|
||||||
<span class="icon is-small">
|
|
||||||
<i class="fas fa-cubes"></i>
|
|
||||||
</span>
|
|
||||||
<span>Blocks</span>
|
|
||||||
</button>
|
|
||||||
</p>
|
|
||||||
<p class="control">
|
|
||||||
<button class="button is-info">
|
|
||||||
<span class="icon is-small">
|
|
||||||
<i class="fas fa-book-open"></i>
|
|
||||||
</span>
|
|
||||||
<span>Help Book</span>
|
|
||||||
</button>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
-->
|
|
||||||
<h4>Connections</h4>
|
|
||||||
<div class="columns">
|
|
||||||
<div class="column">
|
|
||||||
️ Last Received: <span id="lastIncoming">None since start</span>
|
|
||||||
</div>
|
|
||||||
<div class="column">
|
|
||||||
<i class="fas fa-arrow-down"></i>
|
|
||||||
Total Requests: <span id="totalRec">None since start</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="field has-addons torTransportField">
|
|
||||||
<p class="control">
|
|
||||||
<a class="button is-static">
|
|
||||||
<i class="fas fa-adjust"></i>
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
<p class="control is-expanded">
|
|
||||||
<input class="input myTor" type="text" readonly>
|
|
||||||
</p>
|
|
||||||
<p class="control">
|
|
||||||
<a class="button is-primary myTorCopy"><i class="fas fa-copy"></i></a>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<i class="fas fa-link"></i>
|
|
||||||
Outgoing Connections:
|
|
||||||
<div class="container connectedNodesControl">
|
|
||||||
<pre id="connectedNodes">Unable to get nodes</pre>
|
|
||||||
</div>
|
|
||||||
<br>
|
|
||||||
<div class="field">
|
|
||||||
<p class="control">
|
|
||||||
<a class="button is-light restartTor" data-tooltip="Use if there have been no incoming or outgoing connections in a long time">Restart Tor</a>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<br>
|
|
||||||
<h4>Blocks</h4>
|
|
||||||
<div class="columns">
|
|
||||||
<div class="column">
|
|
||||||
<i class="fas fa-hdd"></i>
|
|
||||||
Stored blocks: <span id="storedBlocks"></span>
|
|
||||||
</div>
|
|
||||||
<div class="column">
|
|
||||||
<i class="fas fa-mail-bulk"></i>
|
|
||||||
Blocks to download: <span id="blockQueue"></span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="columns">
|
|
||||||
<div class="column">
|
|
||||||
<p class="buttons">
|
|
||||||
<button class="button is-small recentBlocksBtn">
|
|
||||||
<span class="icon is-small">
|
|
||||||
<i class="fas fa-stream"></i>
|
|
||||||
</span>
|
|
||||||
<span>Recent blocks</span>
|
|
||||||
</button>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<h4>Process</h4>
|
|
||||||
<div class="columns">
|
|
||||||
<div class="column">
|
|
||||||
<i class="fas fa-microchip"></i>
|
|
||||||
Current threads: <span id="threads"></span>
|
|
||||||
</div>
|
|
||||||
<div class="column">
|
|
||||||
<i class="fas fa-memory"></i>
|
|
||||||
RAM usage: <span id="ramPercent"></span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<h4>Storage</h4>
|
|
||||||
<div class="columns">
|
|
||||||
<div class="column">
|
|
||||||
<i class="fas fa-folder-open"></i>
|
|
||||||
File descriptors: <span id="fileDescriptors"></span>
|
|
||||||
</div>
|
|
||||||
<div class="column">
|
|
||||||
<i class="fas fa-hdd"></i>
|
|
||||||
Disk Usage: <span id="diskUsage"></span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<a class="button is-white" id="configToggle">Configuration</a>
|
|
||||||
|
|
||||||
<div id="configContent">
|
|
||||||
<div class="content">
|
|
||||||
<p><em>Warning: </em><b>Some values can be dangerous to change. Use caution.</b></p>
|
|
||||||
<textarea class="textarea configEditor" rows="20"></textarea>
|
|
||||||
<br>
|
|
||||||
<a class="button is-primary saveConfig">Save Config</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div id="particles-js"></div>
|
|
||||||
<br>
|
|
||||||
<div class="modal aboutModal">
|
|
||||||
<div class="modal-background"></div>
|
|
||||||
<div class="modal-card">
|
|
||||||
<header class="modal-card-head">
|
|
||||||
<button class="closeAboutModal delete" aria-label="close"></button>
|
|
||||||
</header>
|
|
||||||
<section class="modal-card-body aboutBody">
|
|
||||||
Loading... <i class="fas fa-spinner fa-spin"></i>
|
|
||||||
</section>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="modal recentModal">
|
|
||||||
<div class="modal-background"></div>
|
|
||||||
<div class="modal-card">
|
|
||||||
<header class="modal-card-head">
|
|
||||||
<button class="closeRecentModal delete" aria-label="close"></button>
|
|
||||||
</header>
|
|
||||||
<section class="modal-card-body recentBody">
|
|
||||||
Keep this open to see new blocks as they come in (or are created)!
|
|
||||||
<pre class="recentBlockList"></pre>
|
|
||||||
</section>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
|
|
||||||
</html>
|
|
@ -1,2 +0,0 @@
|
|||||||
console.log('%c Welcome to Onionr 🧅', 'border: 1px solid purple; float: left; font-weight: bold; font-size: 50px;color: purple; padding: 3em; background-color: black;');
|
|
||||||
console.log('See the documentation at https://gitlab.com/beardog/Onionr/tree/master/docs')
|
|
@ -1,13 +0,0 @@
|
|||||||
fetch('/getmotd', {
|
|
||||||
headers: {
|
|
||||||
"token": webpass
|
|
||||||
}})
|
|
||||||
.then((resp) => resp.text())
|
|
||||||
.then(function(resp) {
|
|
||||||
resp = resp.trim()
|
|
||||||
if (resp.length <= 1){return}
|
|
||||||
let motds = document.getElementsByClassName("motdContent")
|
|
||||||
for (x = 0; x < motds.length; x++){
|
|
||||||
motds[x].innerText = resp
|
|
||||||
}
|
|
||||||
})
|
|
@ -1,63 +0,0 @@
|
|||||||
.idLink{
|
|
||||||
-webkit-touch-callout: none; /* iOS Safari */
|
|
||||||
-webkit-user-select: none; /* Safari */
|
|
||||||
-moz-user-select: none; /* Firefox */
|
|
||||||
-ms-user-select: none; /* Internet Explorer/Edge */
|
|
||||||
user-select: none; /* Non-prefixed version, currently
|
|
||||||
supported by Chrome and Opera */
|
|
||||||
}
|
|
||||||
#refreshStats{
|
|
||||||
margin: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.motdCard{
|
|
||||||
margin-top: 1em;
|
|
||||||
}
|
|
||||||
|
|
||||||
#connectedNodes{
|
|
||||||
overflow-y: hidden;
|
|
||||||
max-height: 300px;
|
|
||||||
max-width: 300px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#configToggle, #configContent{
|
|
||||||
margin-left: 1em;
|
|
||||||
margin-right: 1em;
|
|
||||||
margin-bottom: 1em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.modal img{
|
|
||||||
border-radius: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.torStats{
|
|
||||||
color: red;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ---- reset ---- */
|
|
||||||
|
|
||||||
|
|
||||||
canvas {
|
|
||||||
display: block;
|
|
||||||
vertical-align: bottom;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ---- particles.js container ---- */
|
|
||||||
|
|
||||||
#particles-js {
|
|
||||||
position:absolute;
|
|
||||||
width:100%;
|
|
||||||
height:100%;
|
|
||||||
top:0;
|
|
||||||
z-index:-1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.mainCont{
|
|
||||||
z-index: 2;
|
|
||||||
position: fixed;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
.torTransportField {
|
|
||||||
margin-top: 2em;
|
|
||||||
}
|
|
@ -1,38 +0,0 @@
|
|||||||
<img src="shared/images/onionr-text.png" class="aboutLogo" alt="Onionr">
|
|
||||||
|
|
||||||
<p>Onionr is a private decentralized communication network</p>
|
|
||||||
<p><i class="fab fa-gitlab"></i> <a href="https://gitlab.com/beardog/onionr">Source code</a></p>
|
|
||||||
<p><i class="fa fa-dollar-sign"></i> Please donate to keep the project alive. See info in readme</p>
|
|
||||||
<br><br>
|
|
||||||
|
|
||||||
<b>Core developers:</b>
|
|
||||||
<ul>
|
|
||||||
<li><a href="https://www.chaoswebs.net/">Kevin Froman</a> - original author & project lead</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<b>Contributors:</b>
|
|
||||||
<ul>
|
|
||||||
<li><a href="https://www.aaronesau.com/">Aaron Esau</a> logger, config modules + advice/support</li>
|
|
||||||
<li><a href="https://invisamage.com/">Travis Kipp</a> CSS help</li>
|
|
||||||
<li><a href="https://k7dxs.net/">Duncan Simpson</a> packaging help</li>
|
|
||||||
<li><a href="https://www.siue.edu/~njohnag/">Nicholas Johnson</a> bug fixes</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<br>
|
|
||||||
|
|
||||||
<b>Onionr is built with:</b>
|
|
||||||
<br>
|
|
||||||
<ul>
|
|
||||||
<li><a href="https://torproject.org/">Tor</a> - Onionr routes all traffic through Tor by default - 3-clause BSD license</li>
|
|
||||||
<li><a href="https://stem.torproject.org/">Stem</a> - Python library to interact with Tor - LGPLv3</li>
|
|
||||||
<li><a href="https://palletsprojects.com/p/flask/">Flask</a> - Lightweight Python web framework - 3-clause BSD license</li>
|
|
||||||
<li><a href="http://gevent.org">Gevent</a> - For the thread-safe WSGI servers - MIT license</li>
|
|
||||||
<li><a href="https://2.python-requests.org/en/master/">Requests</a> - HTTP requests for humans - Apache 2.0 license</li>
|
|
||||||
<li><a href="https://github.com/pyca/pynacl/">PyNaCl</a> - Python libsodium binding - Apache 2.0 license</li>
|
|
||||||
<li><a href="https://download.libsodium.org/doc/">libsodium</a> - modern crypto library - ISC license</li>
|
|
||||||
<li><a href="https://fontawesome.com/license/free">Font Awesome</a> - Icon set and toolkit - MIT license & CC-By 4.0</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<br>
|
|
||||||
<a href="https://bulma.io/"><img src="private/images/made-with-bulma--dark.png" class="aboutLogo" alt="made with Bulma"></a>
|
|
||||||
<a href="https://python.org/"><img src="private/images/python-powered.png" class="aboutLogo" alt="made with Python"></a>
|
|
@ -1,469 +0,0 @@
|
|||||||
/*
|
|
||||||
* [hi-base32]{@link https://github.com/emn178/hi-base32}
|
|
||||||
*
|
|
||||||
* @version 0.5.0
|
|
||||||
* @author Chen, Yi-Cyuan [emn178@gmail.com]
|
|
||||||
* @copyright Chen, Yi-Cyuan 2015-2018
|
|
||||||
* @license MIT
|
|
||||||
* /*
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
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
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
|
||||||
/*jslint bitwise: true */
|
|
||||||
(function () {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
var root = typeof window === 'object' ? window : {};
|
|
||||||
var NODE_JS = !root.HI_BASE32_NO_NODE_JS && typeof process === 'object' && process.versions && process.versions.node;
|
|
||||||
if (NODE_JS) {
|
|
||||||
root = global;
|
|
||||||
}
|
|
||||||
var COMMON_JS = !root.HI_BASE32_NO_COMMON_JS && typeof module === 'object' && module.exports;
|
|
||||||
var AMD = typeof define === 'function' && define.amd;
|
|
||||||
var BASE32_ENCODE_CHAR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'.split('');
|
|
||||||
var BASE32_DECODE_CHAR = {
|
|
||||||
'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': 4, 'F': 5, 'G': 6, 'H': 7, 'I': 8,
|
|
||||||
'J': 9, 'K': 10, 'L': 11, 'M': 12, 'N': 13, 'O': 14, 'P': 15, 'Q': 16,
|
|
||||||
'R': 17, 'S': 18, 'T': 19, 'U': 20, 'V': 21, 'W': 22, 'X': 23, 'Y': 24,
|
|
||||||
'Z': 25, '2': 26, '3': 27, '4': 28, '5': 29, '6': 30, '7': 31
|
|
||||||
};
|
|
||||||
|
|
||||||
var blocks = [0, 0, 0, 0, 0, 0, 0, 0];
|
|
||||||
|
|
||||||
var throwInvalidUtf8 = function (position, partial) {
|
|
||||||
if (partial.length > 10) {
|
|
||||||
partial = '...' + partial.substr(-10);
|
|
||||||
}
|
|
||||||
var err = new Error('Decoded data is not valid UTF-8.'
|
|
||||||
+ ' Maybe try base32.decode.asBytes()?'
|
|
||||||
+ ' Partial data after reading ' + position + ' bytes: ' + partial + ' <-');
|
|
||||||
err.position = position;
|
|
||||||
throw err;
|
|
||||||
};
|
|
||||||
|
|
||||||
var toUtf8String = function (bytes) {
|
|
||||||
var str = '', length = bytes.length, i = 0, followingChars = 0, b, c;
|
|
||||||
while (i < length) {
|
|
||||||
b = bytes[i++];
|
|
||||||
if (b <= 0x7F) {
|
|
||||||
str += String.fromCharCode(b);
|
|
||||||
continue;
|
|
||||||
} else if (b > 0xBF && b <= 0xDF) {
|
|
||||||
c = b & 0x1F;
|
|
||||||
followingChars = 1;
|
|
||||||
} else if (b <= 0xEF) {
|
|
||||||
c = b & 0x0F;
|
|
||||||
followingChars = 2;
|
|
||||||
} else if (b <= 0xF7) {
|
|
||||||
c = b & 0x07;
|
|
||||||
followingChars = 3;
|
|
||||||
} else {
|
|
||||||
throwInvalidUtf8(i, str);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var j = 0; j < followingChars; ++j) {
|
|
||||||
b = bytes[i++];
|
|
||||||
if (b < 0x80 || b > 0xBF) {
|
|
||||||
throwInvalidUtf8(i, str);
|
|
||||||
}
|
|
||||||
c <<= 6;
|
|
||||||
c += b & 0x3F;
|
|
||||||
}
|
|
||||||
if (c >= 0xD800 && c <= 0xDFFF) {
|
|
||||||
throwInvalidUtf8(i, str);
|
|
||||||
}
|
|
||||||
if (c > 0x10FFFF) {
|
|
||||||
throwInvalidUtf8(i, str);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (c <= 0xFFFF) {
|
|
||||||
str += String.fromCharCode(c);
|
|
||||||
} else {
|
|
||||||
c -= 0x10000;
|
|
||||||
str += String.fromCharCode((c >> 10) + 0xD800);
|
|
||||||
str += String.fromCharCode((c & 0x3FF) + 0xDC00);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return str;
|
|
||||||
};
|
|
||||||
|
|
||||||
var decodeAsBytes = function (base32Str) {
|
|
||||||
if (!/^[A-Z2-7=]+$/.test(base32Str)) {
|
|
||||||
throw new Error('Invalid base32 characters');
|
|
||||||
}
|
|
||||||
base32Str = base32Str.replace(/=/g, '');
|
|
||||||
var v1, v2, v3, v4, v5, v6, v7, v8, bytes = [], index = 0, length = base32Str.length;
|
|
||||||
|
|
||||||
// 4 char to 3 bytes
|
|
||||||
for (var i = 0, count = length >> 3 << 3; i < count;) {
|
|
||||||
v1 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v2 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v3 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v4 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v5 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v6 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v7 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v8 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
bytes[index++] = (v1 << 3 | v2 >>> 2) & 255;
|
|
||||||
bytes[index++] = (v2 << 6 | v3 << 1 | v4 >>> 4) & 255;
|
|
||||||
bytes[index++] = (v4 << 4 | v5 >>> 1) & 255;
|
|
||||||
bytes[index++] = (v5 << 7 | v6 << 2 | v7 >>> 3) & 255;
|
|
||||||
bytes[index++] = (v7 << 5 | v8) & 255;
|
|
||||||
}
|
|
||||||
|
|
||||||
// remain bytes
|
|
||||||
var remain = length - count;
|
|
||||||
if (remain === 2) {
|
|
||||||
v1 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v2 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
bytes[index++] = (v1 << 3 | v2 >>> 2) & 255;
|
|
||||||
} else if (remain === 4) {
|
|
||||||
v1 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v2 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v3 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v4 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
bytes[index++] = (v1 << 3 | v2 >>> 2) & 255;
|
|
||||||
bytes[index++] = (v2 << 6 | v3 << 1 | v4 >>> 4) & 255;
|
|
||||||
} else if (remain === 5) {
|
|
||||||
v1 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v2 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v3 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v4 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v5 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
bytes[index++] = (v1 << 3 | v2 >>> 2) & 255;
|
|
||||||
bytes[index++] = (v2 << 6 | v3 << 1 | v4 >>> 4) & 255;
|
|
||||||
bytes[index++] = (v4 << 4 | v5 >>> 1) & 255;
|
|
||||||
} else if (remain === 7) {
|
|
||||||
v1 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v2 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v3 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v4 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v5 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v6 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v7 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
bytes[index++] = (v1 << 3 | v2 >>> 2) & 255;
|
|
||||||
bytes[index++] = (v2 << 6 | v3 << 1 | v4 >>> 4) & 255;
|
|
||||||
bytes[index++] = (v4 << 4 | v5 >>> 1) & 255;
|
|
||||||
bytes[index++] = (v5 << 7 | v6 << 2 | v7 >>> 3) & 255;
|
|
||||||
}
|
|
||||||
return bytes;
|
|
||||||
};
|
|
||||||
|
|
||||||
var encodeAscii = function (str) {
|
|
||||||
var v1, v2, v3, v4, v5, base32Str = '', length = str.length;
|
|
||||||
for (var i = 0, count = parseInt(length / 5) * 5; i < count;) {
|
|
||||||
v1 = str.charCodeAt(i++);
|
|
||||||
v2 = str.charCodeAt(i++);
|
|
||||||
v3 = str.charCodeAt(i++);
|
|
||||||
v4 = str.charCodeAt(i++);
|
|
||||||
v5 = str.charCodeAt(i++);
|
|
||||||
base32Str += BASE32_ENCODE_CHAR[v1 >>> 3] +
|
|
||||||
BASE32_ENCODE_CHAR[(v1 << 2 | v2 >>> 6) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v2 >>> 1) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v2 << 4 | v3 >>> 4) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v3 << 1 | v4 >>> 7) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v4 >>> 2) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v4 << 3 | v5 >>> 5) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[v5 & 31];
|
|
||||||
}
|
|
||||||
|
|
||||||
// remain char
|
|
||||||
var remain = length - count;
|
|
||||||
if (remain === 1) {
|
|
||||||
v1 = str.charCodeAt(i);
|
|
||||||
base32Str += BASE32_ENCODE_CHAR[v1 >>> 3] +
|
|
||||||
BASE32_ENCODE_CHAR[(v1 << 2) & 31] +
|
|
||||||
'======';
|
|
||||||
} else if (remain === 2) {
|
|
||||||
v1 = str.charCodeAt(i++);
|
|
||||||
v2 = str.charCodeAt(i);
|
|
||||||
base32Str += BASE32_ENCODE_CHAR[v1 >>> 3] +
|
|
||||||
BASE32_ENCODE_CHAR[(v1 << 2 | v2 >>> 6) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v2 >>> 1) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v2 << 4) & 31] +
|
|
||||||
'====';
|
|
||||||
} else if (remain === 3) {
|
|
||||||
v1 = str.charCodeAt(i++);
|
|
||||||
v2 = str.charCodeAt(i++);
|
|
||||||
v3 = str.charCodeAt(i);
|
|
||||||
base32Str += BASE32_ENCODE_CHAR[v1 >>> 3] +
|
|
||||||
BASE32_ENCODE_CHAR[(v1 << 2 | v2 >>> 6) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v2 >>> 1) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v2 << 4 | v3 >>> 4) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v3 << 1) & 31] +
|
|
||||||
'===';
|
|
||||||
} else if (remain === 4) {
|
|
||||||
v1 = str.charCodeAt(i++);
|
|
||||||
v2 = str.charCodeAt(i++);
|
|
||||||
v3 = str.charCodeAt(i++);
|
|
||||||
v4 = str.charCodeAt(i);
|
|
||||||
base32Str += BASE32_ENCODE_CHAR[v1 >>> 3] +
|
|
||||||
BASE32_ENCODE_CHAR[(v1 << 2 | v2 >>> 6) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v2 >>> 1) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v2 << 4 | v3 >>> 4) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v3 << 1 | v4 >>> 7) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v4 >>> 2) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v4 << 3) & 31] +
|
|
||||||
'=';
|
|
||||||
}
|
|
||||||
return base32Str;
|
|
||||||
};
|
|
||||||
|
|
||||||
var encodeUtf8 = function (str) {
|
|
||||||
var v1, v2, v3, v4, v5, code, end = false, base32Str = '',
|
|
||||||
index = 0, i, start = 0, bytes = 0, length = str.length;
|
|
||||||
do {
|
|
||||||
blocks[0] = blocks[5];
|
|
||||||
blocks[1] = blocks[6];
|
|
||||||
blocks[2] = blocks[7];
|
|
||||||
for (i = start; index < length && i < 5; ++index) {
|
|
||||||
code = str.charCodeAt(index);
|
|
||||||
if (code < 0x80) {
|
|
||||||
blocks[i++] = code;
|
|
||||||
} else if (code < 0x800) {
|
|
||||||
blocks[i++] = 0xc0 | (code >> 6);
|
|
||||||
blocks[i++] = 0x80 | (code & 0x3f);
|
|
||||||
} else if (code < 0xd800 || code >= 0xe000) {
|
|
||||||
blocks[i++] = 0xe0 | (code >> 12);
|
|
||||||
blocks[i++] = 0x80 | ((code >> 6) & 0x3f);
|
|
||||||
blocks[i++] = 0x80 | (code & 0x3f);
|
|
||||||
} else {
|
|
||||||
code = 0x10000 + (((code & 0x3ff) << 10) | (str.charCodeAt(++index) & 0x3ff));
|
|
||||||
blocks[i++] = 0xf0 | (code >> 18);
|
|
||||||
blocks[i++] = 0x80 | ((code >> 12) & 0x3f);
|
|
||||||
blocks[i++] = 0x80 | ((code >> 6) & 0x3f);
|
|
||||||
blocks[i++] = 0x80 | (code & 0x3f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
bytes += i - start;
|
|
||||||
start = i - 5;
|
|
||||||
if (index === length) {
|
|
||||||
++index;
|
|
||||||
}
|
|
||||||
if (index > length && i < 6) {
|
|
||||||
end = true;
|
|
||||||
}
|
|
||||||
v1 = blocks[0];
|
|
||||||
if (i > 4) {
|
|
||||||
v2 = blocks[1];
|
|
||||||
v3 = blocks[2];
|
|
||||||
v4 = blocks[3];
|
|
||||||
v5 = blocks[4];
|
|
||||||
base32Str += BASE32_ENCODE_CHAR[v1 >>> 3] +
|
|
||||||
BASE32_ENCODE_CHAR[(v1 << 2 | v2 >>> 6) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v2 >>> 1) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v2 << 4 | v3 >>> 4) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v3 << 1 | v4 >>> 7) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v4 >>> 2) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v4 << 3 | v5 >>> 5) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[v5 & 31];
|
|
||||||
} else if (i === 1) {
|
|
||||||
base32Str += BASE32_ENCODE_CHAR[v1 >>> 3] +
|
|
||||||
BASE32_ENCODE_CHAR[(v1 << 2) & 31] +
|
|
||||||
'======';
|
|
||||||
} else if (i === 2) {
|
|
||||||
v2 = blocks[1];
|
|
||||||
base32Str += BASE32_ENCODE_CHAR[v1 >>> 3] +
|
|
||||||
BASE32_ENCODE_CHAR[(v1 << 2 | v2 >>> 6) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v2 >>> 1) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v2 << 4) & 31] +
|
|
||||||
'====';
|
|
||||||
} else if (i === 3) {
|
|
||||||
v2 = blocks[1];
|
|
||||||
v3 = blocks[2];
|
|
||||||
base32Str += BASE32_ENCODE_CHAR[v1 >>> 3] +
|
|
||||||
BASE32_ENCODE_CHAR[(v1 << 2 | v2 >>> 6) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v2 >>> 1) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v2 << 4 | v3 >>> 4) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v3 << 1) & 31] +
|
|
||||||
'===';
|
|
||||||
} else {
|
|
||||||
v2 = blocks[1];
|
|
||||||
v3 = blocks[2];
|
|
||||||
v4 = blocks[3];
|
|
||||||
base32Str += BASE32_ENCODE_CHAR[v1 >>> 3] +
|
|
||||||
BASE32_ENCODE_CHAR[(v1 << 2 | v2 >>> 6) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v2 >>> 1) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v2 << 4 | v3 >>> 4) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v3 << 1 | v4 >>> 7) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v4 >>> 2) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v4 << 3) & 31] +
|
|
||||||
'=';
|
|
||||||
}
|
|
||||||
} while (!end);
|
|
||||||
return base32Str;
|
|
||||||
};
|
|
||||||
|
|
||||||
var encodeBytes = function (bytes) {
|
|
||||||
var v1, v2, v3, v4, v5, base32Str = '', length = bytes.length;
|
|
||||||
for (var i = 0, count = parseInt(length / 5) * 5; i < count;) {
|
|
||||||
v1 = bytes[i++];
|
|
||||||
v2 = bytes[i++];
|
|
||||||
v3 = bytes[i++];
|
|
||||||
v4 = bytes[i++];
|
|
||||||
v5 = bytes[i++];
|
|
||||||
base32Str += BASE32_ENCODE_CHAR[v1 >>> 3] +
|
|
||||||
BASE32_ENCODE_CHAR[(v1 << 2 | v2 >>> 6) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v2 >>> 1) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v2 << 4 | v3 >>> 4) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v3 << 1 | v4 >>> 7) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v4 >>> 2) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v4 << 3 | v5 >>> 5) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[v5 & 31];
|
|
||||||
}
|
|
||||||
|
|
||||||
// remain char
|
|
||||||
var remain = length - count;
|
|
||||||
if (remain === 1) {
|
|
||||||
v1 = bytes[i];
|
|
||||||
base32Str += BASE32_ENCODE_CHAR[v1 >>> 3] +
|
|
||||||
BASE32_ENCODE_CHAR[(v1 << 2) & 31] +
|
|
||||||
'======';
|
|
||||||
} else if (remain === 2) {
|
|
||||||
v1 = bytes[i++];
|
|
||||||
v2 = bytes[i];
|
|
||||||
base32Str += BASE32_ENCODE_CHAR[v1 >>> 3] +
|
|
||||||
BASE32_ENCODE_CHAR[(v1 << 2 | v2 >>> 6) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v2 >>> 1) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v2 << 4) & 31] +
|
|
||||||
'====';
|
|
||||||
} else if (remain === 3) {
|
|
||||||
v1 = bytes[i++];
|
|
||||||
v2 = bytes[i++];
|
|
||||||
v3 = bytes[i];
|
|
||||||
base32Str += BASE32_ENCODE_CHAR[v1 >>> 3] +
|
|
||||||
BASE32_ENCODE_CHAR[(v1 << 2 | v2 >>> 6) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v2 >>> 1) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v2 << 4 | v3 >>> 4) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v3 << 1) & 31] +
|
|
||||||
'===';
|
|
||||||
} else if (remain === 4) {
|
|
||||||
v1 = bytes[i++];
|
|
||||||
v2 = bytes[i++];
|
|
||||||
v3 = bytes[i++];
|
|
||||||
v4 = bytes[i];
|
|
||||||
base32Str += BASE32_ENCODE_CHAR[v1 >>> 3] +
|
|
||||||
BASE32_ENCODE_CHAR[(v1 << 2 | v2 >>> 6) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v2 >>> 1) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v2 << 4 | v3 >>> 4) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v3 << 1 | v4 >>> 7) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v4 >>> 2) & 31] +
|
|
||||||
BASE32_ENCODE_CHAR[(v4 << 3) & 31] +
|
|
||||||
'=';
|
|
||||||
}
|
|
||||||
return base32Str;
|
|
||||||
};
|
|
||||||
|
|
||||||
var encode = function (input, asciiOnly) {
|
|
||||||
var notString = typeof(input) !== 'string';
|
|
||||||
if (notString && input.constructor === ArrayBuffer) {
|
|
||||||
input = new Uint8Array(input);
|
|
||||||
}
|
|
||||||
if (notString) {
|
|
||||||
return encodeBytes(input);
|
|
||||||
} else if (asciiOnly) {
|
|
||||||
return encodeAscii(input);
|
|
||||||
} else {
|
|
||||||
return encodeUtf8(input);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
var decode = function (base32Str, asciiOnly) {
|
|
||||||
if (!asciiOnly) {
|
|
||||||
return toUtf8String(decodeAsBytes(base32Str));
|
|
||||||
}
|
|
||||||
if (!/^[A-Z2-7=]+$/.test(base32Str)) {
|
|
||||||
throw new Error('Invalid base32 characters');
|
|
||||||
}
|
|
||||||
var v1, v2, v3, v4, v5, v6, v7, v8, str = '', length = base32Str.indexOf('=');
|
|
||||||
if (length === -1) {
|
|
||||||
length = base32Str.length;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 8 char to 5 bytes
|
|
||||||
for (var i = 0, count = length >> 3 << 3; i < count;) {
|
|
||||||
v1 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v2 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v3 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v4 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v5 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v6 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v7 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v8 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
str += String.fromCharCode((v1 << 3 | v2 >>> 2) & 255) +
|
|
||||||
String.fromCharCode((v2 << 6 | v3 << 1 | v4 >>> 4) & 255) +
|
|
||||||
String.fromCharCode((v4 << 4 | v5 >>> 1) & 255) +
|
|
||||||
String.fromCharCode((v5 << 7 | v6 << 2 | v7 >>> 3) & 255) +
|
|
||||||
String.fromCharCode((v7 << 5 | v8) & 255);
|
|
||||||
}
|
|
||||||
|
|
||||||
// remain bytes
|
|
||||||
var remain = length - count;
|
|
||||||
if (remain === 2) {
|
|
||||||
v1 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v2 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
str += String.fromCharCode((v1 << 3 | v2 >>> 2) & 255);
|
|
||||||
} else if (remain === 4) {
|
|
||||||
v1 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v2 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v3 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v4 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
str += String.fromCharCode((v1 << 3 | v2 >>> 2) & 255) +
|
|
||||||
String.fromCharCode((v2 << 6 | v3 << 1 | v4 >>> 4) & 255);
|
|
||||||
} else if (remain === 5) {
|
|
||||||
v1 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v2 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v3 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v4 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v5 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
str += String.fromCharCode((v1 << 3 | v2 >>> 2) & 255) +
|
|
||||||
String.fromCharCode((v2 << 6 | v3 << 1 | v4 >>> 4) & 255) +
|
|
||||||
String.fromCharCode((v4 << 4 | v5 >>> 1) & 255);
|
|
||||||
} else if (remain === 7) {
|
|
||||||
v1 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v2 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v3 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v4 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v5 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v6 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
v7 = BASE32_DECODE_CHAR[base32Str.charAt(i++)];
|
|
||||||
str += String.fromCharCode((v1 << 3 | v2 >>> 2) & 255) +
|
|
||||||
String.fromCharCode((v2 << 6 | v3 << 1 | v4 >>> 4) & 255) +
|
|
||||||
String.fromCharCode((v4 << 4 | v5 >>> 1) & 255) +
|
|
||||||
String.fromCharCode((v5 << 7 | v6 << 2 | v7 >>> 3) & 255);
|
|
||||||
}
|
|
||||||
return str;
|
|
||||||
};
|
|
||||||
|
|
||||||
var exports = {
|
|
||||||
encode: encode,
|
|
||||||
decode: decode
|
|
||||||
};
|
|
||||||
decode.asBytes = decodeAsBytes;
|
|
||||||
|
|
||||||
if (COMMON_JS) {
|
|
||||||
module.exports = exports;
|
|
||||||
} else {
|
|
||||||
root.base32 = exports;
|
|
||||||
if (AMD) {
|
|
||||||
define(function() {
|
|
||||||
return exports;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})();
|
|
@ -1,436 +0,0 @@
|
|||||||
/*
|
|
||||||
MIT License
|
|
||||||
|
|
||||||
Copyright (c) 2017 Wikiki
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
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
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
|
||||||
(function webpackUniversalModuleDefinition(root, factory) {
|
|
||||||
if(typeof exports === 'object' && typeof module === 'object')
|
|
||||||
module.exports = factory();
|
|
||||||
else if(typeof define === 'function' && define.amd)
|
|
||||||
define([], factory);
|
|
||||||
else if(typeof exports === 'object')
|
|
||||||
exports["bulmaQuickview"] = factory();
|
|
||||||
else
|
|
||||||
root["bulmaQuickview"] = factory();
|
|
||||||
})(typeof self !== 'undefined' ? self : this, function() {
|
|
||||||
return /******/ (function(modules) { // webpackBootstrap
|
|
||||||
/******/ // The module cache
|
|
||||||
/******/ var installedModules = {};
|
|
||||||
/******/
|
|
||||||
/******/ // The require function
|
|
||||||
/******/ function __webpack_require__(moduleId) {
|
|
||||||
/******/
|
|
||||||
/******/ // Check if module is in cache
|
|
||||||
/******/ if(installedModules[moduleId]) {
|
|
||||||
/******/ return installedModules[moduleId].exports;
|
|
||||||
/******/ }
|
|
||||||
/******/ // Create a new module (and put it into the cache)
|
|
||||||
/******/ var module = installedModules[moduleId] = {
|
|
||||||
/******/ i: moduleId,
|
|
||||||
/******/ l: false,
|
|
||||||
/******/ exports: {}
|
|
||||||
/******/ };
|
|
||||||
/******/
|
|
||||||
/******/ // Execute the module function
|
|
||||||
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
|
|
||||||
/******/
|
|
||||||
/******/ // Flag the module as loaded
|
|
||||||
/******/ module.l = true;
|
|
||||||
/******/
|
|
||||||
/******/ // Return the exports of the module
|
|
||||||
/******/ return module.exports;
|
|
||||||
/******/ }
|
|
||||||
/******/
|
|
||||||
/******/
|
|
||||||
/******/ // expose the modules object (__webpack_modules__)
|
|
||||||
/******/ __webpack_require__.m = modules;
|
|
||||||
/******/
|
|
||||||
/******/ // expose the module cache
|
|
||||||
/******/ __webpack_require__.c = installedModules;
|
|
||||||
/******/
|
|
||||||
/******/ // define getter function for harmony exports
|
|
||||||
/******/ __webpack_require__.d = function(exports, name, getter) {
|
|
||||||
/******/ if(!__webpack_require__.o(exports, name)) {
|
|
||||||
/******/ Object.defineProperty(exports, name, {
|
|
||||||
/******/ configurable: false,
|
|
||||||
/******/ enumerable: true,
|
|
||||||
/******/ get: getter
|
|
||||||
/******/ });
|
|
||||||
/******/ }
|
|
||||||
/******/ };
|
|
||||||
/******/
|
|
||||||
/******/ // getDefaultExport function for compatibility with non-harmony modules
|
|
||||||
/******/ __webpack_require__.n = function(module) {
|
|
||||||
/******/ var getter = module && module.__esModule ?
|
|
||||||
/******/ function getDefault() { return module['default']; } :
|
|
||||||
/******/ function getModuleExports() { return module; };
|
|
||||||
/******/ __webpack_require__.d(getter, 'a', getter);
|
|
||||||
/******/ return getter;
|
|
||||||
/******/ };
|
|
||||||
/******/
|
|
||||||
/******/ // Object.prototype.hasOwnProperty.call
|
|
||||||
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
|
|
||||||
/******/
|
|
||||||
/******/ // __webpack_public_path__
|
|
||||||
/******/ __webpack_require__.p = "";
|
|
||||||
/******/
|
|
||||||
/******/ // Load entry module and return exports
|
|
||||||
/******/ return __webpack_require__(__webpack_require__.s = 0);
|
|
||||||
/******/ })
|
|
||||||
/************************************************************************/
|
|
||||||
/******/ ([
|
|
||||||
/* 0 */
|
|
||||||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
|
|
||||||
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__events__ = __webpack_require__(1);
|
|
||||||
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__defaultOptions__ = __webpack_require__(2);
|
|
||||||
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
|
||||||
|
|
||||||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
|
||||||
|
|
||||||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
||||||
|
|
||||||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
||||||
|
|
||||||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var onQuickviewShowClick = Symbol('onQuickviewShowClick');
|
|
||||||
var onQuickviewDismissClick = Symbol('onQuickviewDismissClick');
|
|
||||||
|
|
||||||
var bulmaQuickview = function (_EventEmitter) {
|
|
||||||
_inherits(bulmaQuickview, _EventEmitter);
|
|
||||||
|
|
||||||
function bulmaQuickview(selector) {
|
|
||||||
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
||||||
|
|
||||||
_classCallCheck(this, bulmaQuickview);
|
|
||||||
|
|
||||||
var _this = _possibleConstructorReturn(this, (bulmaQuickview.__proto__ || Object.getPrototypeOf(bulmaQuickview)).call(this));
|
|
||||||
|
|
||||||
_this.element = typeof selector === 'string' ? document.querySelector(selector) : selector;
|
|
||||||
// An invalid selector or non-DOM node has been provided.
|
|
||||||
if (!_this.element) {
|
|
||||||
throw new Error('An invalid selector or non-DOM node has been provided.');
|
|
||||||
}
|
|
||||||
|
|
||||||
_this._clickEvents = ['click'];
|
|
||||||
/// Set default options and merge with instance defined
|
|
||||||
_this.options = _extends({}, __WEBPACK_IMPORTED_MODULE_1__defaultOptions__["a" /* default */], options);
|
|
||||||
|
|
||||||
_this[onQuickviewShowClick] = _this[onQuickviewShowClick].bind(_this);
|
|
||||||
_this[onQuickviewDismissClick] = _this[onQuickviewDismissClick].bind(_this);
|
|
||||||
|
|
||||||
_this.init();
|
|
||||||
return _this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initiate all DOM element containing carousel class
|
|
||||||
* @method
|
|
||||||
* @return {Array} Array of all Carousel instances
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
_createClass(bulmaQuickview, [{
|
|
||||||
key: 'init',
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initiate plugin
|
|
||||||
* @method init
|
|
||||||
* @return {void}
|
|
||||||
*/
|
|
||||||
value: function init() {
|
|
||||||
this.quickview = document.getElementById(this.element.dataset['target']);
|
|
||||||
this.dismissElements = document.querySelectorAll('[data-dismiss="quickview"]');
|
|
||||||
|
|
||||||
this._bindEvents();
|
|
||||||
|
|
||||||
this.emit('quickview:ready', {
|
|
||||||
element: this.element,
|
|
||||||
quickview: this.quickview
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Bind all events
|
|
||||||
* @method _bindEvents
|
|
||||||
* @return {void}
|
|
||||||
*/
|
|
||||||
|
|
||||||
}, {
|
|
||||||
key: '_bindEvents',
|
|
||||||
value: function _bindEvents() {
|
|
||||||
var _this2 = this;
|
|
||||||
|
|
||||||
this._clickEvents.forEach(function (event) {
|
|
||||||
_this2.element.addEventListener(event, _this2[onQuickviewShowClick], false);
|
|
||||||
});
|
|
||||||
|
|
||||||
[].forEach.call(this.dismissElements, function (dismissElement) {
|
|
||||||
_this2._clickEvents.forEach(function (event) {
|
|
||||||
dismissElement.addEventListener(event, _this2[onQuickviewDismissClick], false);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: onQuickviewShowClick,
|
|
||||||
value: function value(e) {
|
|
||||||
this.quickview.classList.add('is-active');
|
|
||||||
|
|
||||||
this.emit('quickview:show', {
|
|
||||||
element: this.element,
|
|
||||||
quickview: this.quickview
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: onQuickviewDismissClick,
|
|
||||||
value: function value(e) {
|
|
||||||
this.quickview.classList.remove('is-active');
|
|
||||||
|
|
||||||
this.emit('quickview:hide', {
|
|
||||||
element: this.element,
|
|
||||||
quickview: this.quickview
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}], [{
|
|
||||||
key: 'attach',
|
|
||||||
value: function attach() {
|
|
||||||
var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '[data-show="quickview"]';
|
|
||||||
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
||||||
|
|
||||||
var instances = new Array();
|
|
||||||
|
|
||||||
var elements = document.querySelectorAll(selector);
|
|
||||||
[].forEach.call(elements, function (element) {
|
|
||||||
setTimeout(function () {
|
|
||||||
instances.push(new bulmaQuickview(element, options));
|
|
||||||
}, 100);
|
|
||||||
});
|
|
||||||
return instances;
|
|
||||||
}
|
|
||||||
}]);
|
|
||||||
|
|
||||||
return bulmaQuickview;
|
|
||||||
}(__WEBPACK_IMPORTED_MODULE_0__events__["a" /* default */]);
|
|
||||||
|
|
||||||
/* harmony default export */ __webpack_exports__["default"] = (bulmaQuickview);
|
|
||||||
|
|
||||||
/***/ }),
|
|
||||||
/* 1 */
|
|
||||||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
|
||||||
|
|
||||||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
||||||
|
|
||||||
var EventEmitter = function () {
|
|
||||||
function EventEmitter() {
|
|
||||||
var listeners = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
|
||||||
|
|
||||||
_classCallCheck(this, EventEmitter);
|
|
||||||
|
|
||||||
this._listeners = new Map(listeners);
|
|
||||||
this._middlewares = new Map();
|
|
||||||
}
|
|
||||||
|
|
||||||
_createClass(EventEmitter, [{
|
|
||||||
key: "listenerCount",
|
|
||||||
value: function listenerCount(eventName) {
|
|
||||||
if (!this._listeners.has(eventName)) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
var eventListeners = this._listeners.get(eventName);
|
|
||||||
return eventListeners.length;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: "removeListeners",
|
|
||||||
value: function removeListeners() {
|
|
||||||
var _this = this;
|
|
||||||
|
|
||||||
var eventName = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
|
|
||||||
var middleware = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
||||||
|
|
||||||
if (eventName !== null) {
|
|
||||||
if (Array.isArray(eventName)) {
|
|
||||||
name.forEach(function (e) {
|
|
||||||
return _this.removeListeners(e, middleware);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
this._listeners.delete(eventName);
|
|
||||||
|
|
||||||
if (middleware) {
|
|
||||||
this.removeMiddleware(eventName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this._listeners = new Map();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: "middleware",
|
|
||||||
value: function middleware(eventName, fn) {
|
|
||||||
var _this2 = this;
|
|
||||||
|
|
||||||
if (Array.isArray(eventName)) {
|
|
||||||
name.forEach(function (e) {
|
|
||||||
return _this2.middleware(e, fn);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
if (!Array.isArray(this._middlewares.get(eventName))) {
|
|
||||||
this._middlewares.set(eventName, []);
|
|
||||||
}
|
|
||||||
|
|
||||||
this._middlewares.get(eventName).push(fn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: "removeMiddleware",
|
|
||||||
value: function removeMiddleware() {
|
|
||||||
var _this3 = this;
|
|
||||||
|
|
||||||
var eventName = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
|
|
||||||
|
|
||||||
if (eventName !== null) {
|
|
||||||
if (Array.isArray(eventName)) {
|
|
||||||
name.forEach(function (e) {
|
|
||||||
return _this3.removeMiddleware(e);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
this._middlewares.delete(eventName);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this._middlewares = new Map();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: "on",
|
|
||||||
value: function on(name, callback) {
|
|
||||||
var _this4 = this;
|
|
||||||
|
|
||||||
var once = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
||||||
|
|
||||||
if (Array.isArray(name)) {
|
|
||||||
name.forEach(function (e) {
|
|
||||||
return _this4.on(e, callback);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
name = name.toString();
|
|
||||||
var split = name.split(/,|, | /);
|
|
||||||
|
|
||||||
if (split.length > 1) {
|
|
||||||
split.forEach(function (e) {
|
|
||||||
return _this4.on(e, callback);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
if (!Array.isArray(this._listeners.get(name))) {
|
|
||||||
this._listeners.set(name, []);
|
|
||||||
}
|
|
||||||
|
|
||||||
this._listeners.get(name).push({ once: once, callback: callback });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: "once",
|
|
||||||
value: function once(name, callback) {
|
|
||||||
this.on(name, callback, true);
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: "emit",
|
|
||||||
value: function emit(name, data) {
|
|
||||||
var _this5 = this;
|
|
||||||
|
|
||||||
var silent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
||||||
|
|
||||||
name = name.toString();
|
|
||||||
var listeners = this._listeners.get(name);
|
|
||||||
var middlewares = null;
|
|
||||||
var doneCount = 0;
|
|
||||||
var execute = silent;
|
|
||||||
|
|
||||||
if (Array.isArray(listeners)) {
|
|
||||||
listeners.forEach(function (listener, index) {
|
|
||||||
// Start Middleware checks unless we're doing a silent emit
|
|
||||||
if (!silent) {
|
|
||||||
middlewares = _this5._middlewares.get(name);
|
|
||||||
// Check and execute Middleware
|
|
||||||
if (Array.isArray(middlewares)) {
|
|
||||||
middlewares.forEach(function (middleware) {
|
|
||||||
middleware(data, function () {
|
|
||||||
var newData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
|
|
||||||
|
|
||||||
if (newData !== null) {
|
|
||||||
data = newData;
|
|
||||||
}
|
|
||||||
doneCount++;
|
|
||||||
}, name);
|
|
||||||
});
|
|
||||||
|
|
||||||
if (doneCount >= middlewares.length) {
|
|
||||||
execute = true;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
execute = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If Middleware checks have been passed, execute
|
|
||||||
if (execute) {
|
|
||||||
if (listener.once) {
|
|
||||||
listeners[index] = null;
|
|
||||||
}
|
|
||||||
listener.callback(data);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Dirty way of removing used Events
|
|
||||||
while (listeners.indexOf(null) !== -1) {
|
|
||||||
listeners.splice(listeners.indexOf(null), 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}]);
|
|
||||||
|
|
||||||
return EventEmitter;
|
|
||||||
}();
|
|
||||||
|
|
||||||
/* harmony default export */ __webpack_exports__["a"] = (EventEmitter);
|
|
||||||
|
|
||||||
/***/ }),
|
|
||||||
/* 2 */
|
|
||||||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
var defaultOptions = {};
|
|
||||||
|
|
||||||
/* harmony default export */ __webpack_exports__["a"] = (defaultOptions);
|
|
||||||
|
|
||||||
/***/ })
|
|
||||||
/******/ ])["default"];
|
|
||||||
});
|
|
24
static-data/www/shared/bulma-quickview.min.css
vendored
24
static-data/www/shared/bulma-quickview.min.css
vendored
@ -1,24 +0,0 @@
|
|||||||
/*
|
|
||||||
MIT License
|
|
||||||
|
|
||||||
Copyright (c) 2017 Wikiki
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
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
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
|
||||||
@-webkit-keyframes spinAround{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spinAround{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.quickview{display:flex;flex-direction:column;background-color:#fff;max-width:calc(100% - 50px);position:fixed;top:0;bottom:0;z-index:35;-webkit-transform:translateZ(0);transform:translateZ(0);transition:.3s ease;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;perspective:1000;will-change:transform}.quickview.is-marginless{max-width:100%}@media screen and (max-width:768px){.quickview{width:100%;right:-100%}}@media screen and (min-width:769px),print{.quickview{width:50%;right:-50%}}@media screen and (min-width:1088px){.quickview{width:35%;right:-35%}}@media screen and (min-width:1280px){.quickview{width:30%;right:-30%}}@media screen and (min-width:1472px){.quickview{width:25%;right:-25%}}@media screen and (max-width:768px){.quickview.is-left{left:-100%}}@media screen and (min-width:769px),print{.quickview.is-left{left:-50%}}@media screen and (min-width:1088px){.quickview.is-left{left:-35%}}@media screen and (min-width:1280px){.quickview.is-left{left:-30%}}@media screen and (min-width:1472px){.quickview.is-left{left:-25%}}.quickview.is-active{right:0;box-shadow:5px 0 13px 3px rgba(0,0,0,.1)}.quickview.is-active.is-left{left:0}.quickview-header{display:flex;justify-content:space-between;align-items:center;padding:0 1rem;min-height:3.25em!important;border-bottom:1px solid #dbdbdb}.quickview-header.is-white{background-color:#fff}.quickview-header.is-white .title{color:#0a0a0a}.quickview-header.is-black{background-color:#0a0a0a}.quickview-header.is-black .title{color:#fff}.quickview-header.is-light{background-color:#f5f5f5}.quickview-header.is-light .title{color:#363636}.quickview-header.is-dark{background-color:#363636}.quickview-header.is-dark .title{color:#f5f5f5}.quickview-header.is-primary{background-color:#00d1b2}.quickview-header.is-primary .title{color:#fff}.quickview-header.is-link{background-color:#3273dc}.quickview-header.is-link .title{color:#fff}.quickview-header.is-info{background-color:#209cee}.quickview-header.is-info .title{color:#fff}.quickview-header.is-success{background-color:#23d160}.quickview-header.is-success .title{color:#fff}.quickview-header.is-warning{background-color:#ffdd57}.quickview-header.is-warning .title{color:rgba(0,0,0,.7)}.quickview-header.is-danger{background-color:#ff3860}.quickview-header.is-danger .title{color:#fff}.quickview-header .title{font-size:1rem;font-weight:300;margin-bottom:0}.quickview-header .title img{max-height:2em}.quickview-body{flex:1 1 0%;overflow-y:auto}.quickview-footer{display:flex;justify-content:space-between;align-items:center;padding:0 1rem;min-height:4rem;background-color:#f5f5f5;border-top:1px solid #dbdbdb}.quickview-footer>*{margin:0 .4rem}
|
|
24
static-data/www/shared/bulma-steps.min.css
vendored
24
static-data/www/shared/bulma-steps.min.css
vendored
File diff suppressed because one or more lines are too long
618
static-data/www/shared/bulma-steps.min.js
vendored
618
static-data/www/shared/bulma-steps.min.js
vendored
@ -1,618 +0,0 @@
|
|||||||
/*
|
|
||||||
MIT License
|
|
||||||
|
|
||||||
Copyright (c) 2017 Wikiki
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
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
|
|
||||||
SOFTWARE.
|
|
||||||
*/
|
|
||||||
(function webpackUniversalModuleDefinition(root, factory) {
|
|
||||||
if(typeof exports === 'object' && typeof module === 'object')
|
|
||||||
module.exports = factory();
|
|
||||||
else if(typeof define === 'function' && define.amd)
|
|
||||||
define([], factory);
|
|
||||||
else if(typeof exports === 'object')
|
|
||||||
exports["bulmaSteps"] = factory();
|
|
||||||
else
|
|
||||||
root["bulmaSteps"] = factory();
|
|
||||||
})(typeof self !== 'undefined' ? self : this, function() {
|
|
||||||
return /******/ (function(modules) { // webpackBootstrap
|
|
||||||
/******/ // The module cache
|
|
||||||
/******/ var installedModules = {};
|
|
||||||
/******/
|
|
||||||
/******/ // The require function
|
|
||||||
/******/ function __webpack_require__(moduleId) {
|
|
||||||
/******/
|
|
||||||
/******/ // Check if module is in cache
|
|
||||||
/******/ if(installedModules[moduleId]) {
|
|
||||||
/******/ return installedModules[moduleId].exports;
|
|
||||||
/******/ }
|
|
||||||
/******/ // Create a new module (and put it into the cache)
|
|
||||||
/******/ var module = installedModules[moduleId] = {
|
|
||||||
/******/ i: moduleId,
|
|
||||||
/******/ l: false,
|
|
||||||
/******/ exports: {}
|
|
||||||
/******/ };
|
|
||||||
/******/
|
|
||||||
/******/ // Execute the module function
|
|
||||||
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
|
|
||||||
/******/
|
|
||||||
/******/ // Flag the module as loaded
|
|
||||||
/******/ module.l = true;
|
|
||||||
/******/
|
|
||||||
/******/ // Return the exports of the module
|
|
||||||
/******/ return module.exports;
|
|
||||||
/******/ }
|
|
||||||
/******/
|
|
||||||
/******/
|
|
||||||
/******/ // expose the modules object (__webpack_modules__)
|
|
||||||
/******/ __webpack_require__.m = modules;
|
|
||||||
/******/
|
|
||||||
/******/ // expose the module cache
|
|
||||||
/******/ __webpack_require__.c = installedModules;
|
|
||||||
/******/
|
|
||||||
/******/ // define getter function for harmony exports
|
|
||||||
/******/ __webpack_require__.d = function(exports, name, getter) {
|
|
||||||
/******/ if(!__webpack_require__.o(exports, name)) {
|
|
||||||
/******/ Object.defineProperty(exports, name, {
|
|
||||||
/******/ configurable: false,
|
|
||||||
/******/ enumerable: true,
|
|
||||||
/******/ get: getter
|
|
||||||
/******/ });
|
|
||||||
/******/ }
|
|
||||||
/******/ };
|
|
||||||
/******/
|
|
||||||
/******/ // getDefaultExport function for compatibility with non-harmony modules
|
|
||||||
/******/ __webpack_require__.n = function(module) {
|
|
||||||
/******/ var getter = module && module.__esModule ?
|
|
||||||
/******/ function getDefault() { return module['default']; } :
|
|
||||||
/******/ function getModuleExports() { return module; };
|
|
||||||
/******/ __webpack_require__.d(getter, 'a', getter);
|
|
||||||
/******/ return getter;
|
|
||||||
/******/ };
|
|
||||||
/******/
|
|
||||||
/******/ // Object.prototype.hasOwnProperty.call
|
|
||||||
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
|
|
||||||
/******/
|
|
||||||
/******/ // __webpack_public_path__
|
|
||||||
/******/ __webpack_require__.p = "";
|
|
||||||
/******/
|
|
||||||
/******/ // Load entry module and return exports
|
|
||||||
/******/ return __webpack_require__(__webpack_require__.s = 0);
|
|
||||||
/******/ })
|
|
||||||
/************************************************************************/
|
|
||||||
/******/ ([
|
|
||||||
/* 0 */
|
|
||||||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
|
|
||||||
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__events__ = __webpack_require__(1);
|
|
||||||
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__defaultOptions__ = __webpack_require__(2);
|
|
||||||
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
|
||||||
|
|
||||||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
|
||||||
|
|
||||||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
||||||
|
|
||||||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
||||||
|
|
||||||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var onStepsPrevious = Symbol('onStepsPrevious');
|
|
||||||
var onStepsNext = Symbol('onStepsNext');
|
|
||||||
|
|
||||||
var bulmaSteps = function (_EventEmitter) {
|
|
||||||
_inherits(bulmaSteps, _EventEmitter);
|
|
||||||
|
|
||||||
function bulmaSteps(selector) {
|
|
||||||
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
||||||
|
|
||||||
_classCallCheck(this, bulmaSteps);
|
|
||||||
|
|
||||||
var _this = _possibleConstructorReturn(this, (bulmaSteps.__proto__ || Object.getPrototypeOf(bulmaSteps)).call(this));
|
|
||||||
|
|
||||||
_this.element = typeof selector === 'string' ? document.querySelector(selector) : selector;
|
|
||||||
// An invalid selector or non-DOM node has been provided.
|
|
||||||
if (!_this.element) {
|
|
||||||
throw new Error('An invalid selector or non-DOM node has been provided.');
|
|
||||||
}
|
|
||||||
|
|
||||||
_this._clickEvents = ['click'];
|
|
||||||
/// Set default options and merge with instance defined
|
|
||||||
_this.options = _extends({}, __WEBPACK_IMPORTED_MODULE_1__defaultOptions__["a" /* default */], options);
|
|
||||||
|
|
||||||
_this[onStepsPrevious] = _this[onStepsPrevious].bind(_this);
|
|
||||||
_this[onStepsNext] = _this[onStepsNext].bind(_this);
|
|
||||||
|
|
||||||
_this.init();
|
|
||||||
return _this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initiate all DOM element containing carousel class
|
|
||||||
* @method
|
|
||||||
* @return {Array} Array of all Carousel instances
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
_createClass(bulmaSteps, [{
|
|
||||||
key: 'init',
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initiate plugin
|
|
||||||
* @method init
|
|
||||||
* @return {void}
|
|
||||||
*/
|
|
||||||
value: function init() {
|
|
||||||
this._id = 'bulmaSteps' + new Date().getTime() + Math.floor(Math.random() * Math.floor(9999));
|
|
||||||
|
|
||||||
this.steps = this.element.querySelectorAll(this.options.selector);
|
|
||||||
this.contents = this.element.querySelectorAll(this.options.selector_content);
|
|
||||||
this.previous_btn = this.element.querySelector(this.options.previous_selector);
|
|
||||||
this.next_btn = this.element.querySelector(this.options.next_selector);
|
|
||||||
|
|
||||||
[].forEach.call(this.steps, function (step, index) {
|
|
||||||
step.setAttribute('data-step-id', index);
|
|
||||||
});
|
|
||||||
|
|
||||||
if (this.steps && this.steps.length) {
|
|
||||||
this.activate_step(0);
|
|
||||||
this.updateActions(this.steps[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
this._bindEvents();
|
|
||||||
|
|
||||||
this.emit('bulmasteps:ready', this.element.value);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Bind all events
|
|
||||||
* @method _bindEvents
|
|
||||||
* @return {void}
|
|
||||||
*/
|
|
||||||
|
|
||||||
}, {
|
|
||||||
key: '_bindEvents',
|
|
||||||
value: function _bindEvents() {
|
|
||||||
var _this2 = this;
|
|
||||||
|
|
||||||
if (this.previous_btn != null) {
|
|
||||||
this._clickEvents.forEach(function (event) {
|
|
||||||
_this2.previous_btn.addEventListener(event, _this2[onStepsPrevious], false);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.next_btn != null) {
|
|
||||||
this._clickEvents.forEach(function (event) {
|
|
||||||
_this2.next_btn.addEventListener(event, _this2[onStepsNext], false);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.options.stepClickable) {
|
|
||||||
[].forEach.call(this.steps, function (step, index) {
|
|
||||||
_this2._clickEvents.forEach(function (event) {
|
|
||||||
while (index > _this2.current_id) {
|
|
||||||
_this2[onStepsNext](event);
|
|
||||||
}
|
|
||||||
while (index < _this2.current_id) {
|
|
||||||
_this2[onStepsPrevious](event);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: onStepsPrevious,
|
|
||||||
value: function value(e) {
|
|
||||||
e.preventDefault();
|
|
||||||
|
|
||||||
if (!e.target.getAttribute('disabled')) {
|
|
||||||
this.previous_step();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: onStepsNext,
|
|
||||||
value: function value(e) {
|
|
||||||
e.preventDefault();
|
|
||||||
|
|
||||||
if (!e.target.getAttribute('disabled')) {
|
|
||||||
this.next_step();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'get_current_step_id',
|
|
||||||
value: function get_current_step_id() {
|
|
||||||
for (var i = 0; i < this.steps.length; i++) {
|
|
||||||
var step = this.steps[i];
|
|
||||||
|
|
||||||
if (step.classList.contains(this.options.active_class)) {
|
|
||||||
return parseInt(step.getAttribute('data-step-id'));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'updateActions',
|
|
||||||
value: function updateActions(step) {
|
|
||||||
var stepId = parseInt(step.getAttribute('data-step-id'));
|
|
||||||
if (stepId == 0) {
|
|
||||||
if (this.previous_btn != null) {
|
|
||||||
this.previous_btn.setAttribute('disabled', 'disabled');
|
|
||||||
}
|
|
||||||
if (this.next_btn != null) {
|
|
||||||
this.next_btn.removeAttribute('disabled', 'disabled');
|
|
||||||
}
|
|
||||||
} else if (stepId == this.steps.length - 1) {
|
|
||||||
if (this.previous_btn != null) {
|
|
||||||
this.previous_btn.removeAttribute('disabled', 'disabled');
|
|
||||||
}
|
|
||||||
if (this.next_btn != null) {
|
|
||||||
this.next_btn.setAttribute('disabled', 'disabled');
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (this.previous_btn != null) {
|
|
||||||
this.previous_btn.removeAttribute('disabled', 'disabled');
|
|
||||||
}
|
|
||||||
if (this.next_btn != null) {
|
|
||||||
this.next_btn.removeAttribute('disabled', 'disabled');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'next_step',
|
|
||||||
value: function next_step() {
|
|
||||||
var current_id = this.get_current_step_id();
|
|
||||||
|
|
||||||
if (current_id == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var next_id = current_id + 1,
|
|
||||||
errors = [];
|
|
||||||
|
|
||||||
if (typeof this.options.beforeNext != 'undefined' && this.options.beforeNext != null && this.options.beforeNext) {
|
|
||||||
errors = this.options.beforeNext(current_id);
|
|
||||||
}
|
|
||||||
this.emit('bulmasteps:before:next', current_id);
|
|
||||||
|
|
||||||
if (typeof errors == 'undefined') {
|
|
||||||
errors = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (errors.length > 0) {
|
|
||||||
this.emit('bulmasteps:errors', errors);
|
|
||||||
for (var i = 0; i < errors.length; i++) {
|
|
||||||
if (typeof this.options.onError != 'undefined' && this.options.onError != null && this.options.onError) {
|
|
||||||
this.options.onError(errors[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (next_id >= this.steps.length) {
|
|
||||||
if (typeof this.options.onFinish != 'undefined' && this.options.onFinish != null && this.options.onFinish) {
|
|
||||||
this.options.onFinish(current_id);
|
|
||||||
}
|
|
||||||
this.emit('bulmasteps:finish', current_id);
|
|
||||||
this.deactivate_step(current_id);
|
|
||||||
} else {
|
|
||||||
this.complete_step(current_id);
|
|
||||||
this.activate_step(next_id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'previous_step',
|
|
||||||
value: function previous_step() {
|
|
||||||
var current_id = this.get_current_step_id();
|
|
||||||
if (current_id == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.uncomplete_step(current_id - 1);
|
|
||||||
this.activate_step(current_id - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Activate a single step,
|
|
||||||
* will deactivate all other steps.
|
|
||||||
*/
|
|
||||||
|
|
||||||
}, {
|
|
||||||
key: 'activate_step',
|
|
||||||
value: function activate_step(step_id) {
|
|
||||||
this.updateActions(this.steps[step_id]);
|
|
||||||
|
|
||||||
for (var i = 0; i < this.steps.length; i++) {
|
|
||||||
var _step = this.steps[i];
|
|
||||||
|
|
||||||
if (_step == this.steps[step_id]) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.deactivate_step(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.steps[step_id].classList.add(this.options.active_class);
|
|
||||||
if (typeof this.contents[step_id] !== 'undefined') {
|
|
||||||
this.contents[step_id].classList.add(this.options.active_class);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof this.options.onShow != 'undefined' && this.options.onShow != null && this.options.onShow) {
|
|
||||||
this.options.onShow(step_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.emit('bulmasteps:step:show', step_id);
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'complete_step',
|
|
||||||
value: function complete_step(step_id) {
|
|
||||||
this.steps[step_id].classList.add(this.options.completed_class);
|
|
||||||
this.emit('bulmasteps:step:completed', step_id);
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'uncomplete_step',
|
|
||||||
value: function uncomplete_step(step_id) {
|
|
||||||
this.steps[step_id].classList.remove(this.options.completed_class);
|
|
||||||
this.emit('bulmasteps:step:uncompleted', step_id);
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'deactivate_step',
|
|
||||||
value: function deactivate_step(step_id) {
|
|
||||||
this.steps[step_id].classList.remove(this.options.active_class);
|
|
||||||
if (typeof this.contents[step_id] !== 'undefined') {
|
|
||||||
this.contents[step_id].classList.remove(this.options.active_class);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}], [{
|
|
||||||
key: 'attach',
|
|
||||||
value: function attach() {
|
|
||||||
var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '.steps';
|
|
||||||
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
||||||
|
|
||||||
var instances = new Array();
|
|
||||||
|
|
||||||
var elements = document.querySelectorAll(selector);
|
|
||||||
[].forEach.call(elements, function (element) {
|
|
||||||
setTimeout(function () {
|
|
||||||
instances.push(new bulmaSteps(element, options));
|
|
||||||
}, 100);
|
|
||||||
});
|
|
||||||
return instances;
|
|
||||||
}
|
|
||||||
}]);
|
|
||||||
|
|
||||||
return bulmaSteps;
|
|
||||||
}(__WEBPACK_IMPORTED_MODULE_0__events__["a" /* default */]);
|
|
||||||
|
|
||||||
/* harmony default export */ __webpack_exports__["default"] = (bulmaSteps);
|
|
||||||
|
|
||||||
/***/ }),
|
|
||||||
/* 1 */
|
|
||||||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
|
||||||
|
|
||||||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
||||||
|
|
||||||
var EventEmitter = function () {
|
|
||||||
function EventEmitter() {
|
|
||||||
var listeners = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
|
||||||
|
|
||||||
_classCallCheck(this, EventEmitter);
|
|
||||||
|
|
||||||
this._listeners = new Map(listeners);
|
|
||||||
this._middlewares = new Map();
|
|
||||||
}
|
|
||||||
|
|
||||||
_createClass(EventEmitter, [{
|
|
||||||
key: "listenerCount",
|
|
||||||
value: function listenerCount(eventName) {
|
|
||||||
if (!this._listeners.has(eventName)) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
var eventListeners = this._listeners.get(eventName);
|
|
||||||
return eventListeners.length;
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: "removeListeners",
|
|
||||||
value: function removeListeners() {
|
|
||||||
var _this = this;
|
|
||||||
|
|
||||||
var eventName = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
|
|
||||||
var middleware = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
||||||
|
|
||||||
if (eventName !== null) {
|
|
||||||
if (Array.isArray(eventName)) {
|
|
||||||
name.forEach(function (e) {
|
|
||||||
return _this.removeListeners(e, middleware);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
this._listeners.delete(eventName);
|
|
||||||
|
|
||||||
if (middleware) {
|
|
||||||
this.removeMiddleware(eventName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this._listeners = new Map();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: "middleware",
|
|
||||||
value: function middleware(eventName, fn) {
|
|
||||||
var _this2 = this;
|
|
||||||
|
|
||||||
if (Array.isArray(eventName)) {
|
|
||||||
name.forEach(function (e) {
|
|
||||||
return _this2.middleware(e, fn);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
if (!Array.isArray(this._middlewares.get(eventName))) {
|
|
||||||
this._middlewares.set(eventName, []);
|
|
||||||
}
|
|
||||||
|
|
||||||
this._middlewares.get(eventName).push(fn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: "removeMiddleware",
|
|
||||||
value: function removeMiddleware() {
|
|
||||||
var _this3 = this;
|
|
||||||
|
|
||||||
var eventName = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
|
|
||||||
|
|
||||||
if (eventName !== null) {
|
|
||||||
if (Array.isArray(eventName)) {
|
|
||||||
name.forEach(function (e) {
|
|
||||||
return _this3.removeMiddleware(e);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
this._middlewares.delete(eventName);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this._middlewares = new Map();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: "on",
|
|
||||||
value: function on(name, callback) {
|
|
||||||
var _this4 = this;
|
|
||||||
|
|
||||||
var once = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
||||||
|
|
||||||
if (Array.isArray(name)) {
|
|
||||||
name.forEach(function (e) {
|
|
||||||
return _this4.on(e, callback);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
name = name.toString();
|
|
||||||
var split = name.split(/,|, | /);
|
|
||||||
|
|
||||||
if (split.length > 1) {
|
|
||||||
split.forEach(function (e) {
|
|
||||||
return _this4.on(e, callback);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
if (!Array.isArray(this._listeners.get(name))) {
|
|
||||||
this._listeners.set(name, []);
|
|
||||||
}
|
|
||||||
|
|
||||||
this._listeners.get(name).push({ once: once, callback: callback });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: "once",
|
|
||||||
value: function once(name, callback) {
|
|
||||||
this.on(name, callback, true);
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: "emit",
|
|
||||||
value: function emit(name, data) {
|
|
||||||
var _this5 = this;
|
|
||||||
|
|
||||||
var silent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
||||||
|
|
||||||
name = name.toString();
|
|
||||||
var listeners = this._listeners.get(name);
|
|
||||||
var middlewares = null;
|
|
||||||
var doneCount = 0;
|
|
||||||
var execute = silent;
|
|
||||||
|
|
||||||
if (Array.isArray(listeners)) {
|
|
||||||
listeners.forEach(function (listener, index) {
|
|
||||||
// Start Middleware checks unless we're doing a silent emit
|
|
||||||
if (!silent) {
|
|
||||||
middlewares = _this5._middlewares.get(name);
|
|
||||||
// Check and execute Middleware
|
|
||||||
if (Array.isArray(middlewares)) {
|
|
||||||
middlewares.forEach(function (middleware) {
|
|
||||||
middleware(data, function () {
|
|
||||||
var newData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
|
|
||||||
|
|
||||||
if (newData !== null) {
|
|
||||||
data = newData;
|
|
||||||
}
|
|
||||||
doneCount++;
|
|
||||||
}, name);
|
|
||||||
});
|
|
||||||
|
|
||||||
if (doneCount >= middlewares.length) {
|
|
||||||
execute = true;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
execute = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If Middleware checks have been passed, execute
|
|
||||||
if (execute) {
|
|
||||||
if (listener.once) {
|
|
||||||
listeners[index] = null;
|
|
||||||
}
|
|
||||||
listener.callback(data);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Dirty way of removing used Events
|
|
||||||
while (listeners.indexOf(null) !== -1) {
|
|
||||||
listeners.splice(listeners.indexOf(null), 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}]);
|
|
||||||
|
|
||||||
return EventEmitter;
|
|
||||||
}();
|
|
||||||
|
|
||||||
/* harmony default export */ __webpack_exports__["a"] = (EventEmitter);
|
|
||||||
|
|
||||||
/***/ }),
|
|
||||||
/* 2 */
|
|
||||||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
var defaultOptions = {
|
|
||||||
'selector': '.step-item',
|
|
||||||
'selector_content': '.step-content',
|
|
||||||
'previous_selector': '[data-nav="previous"]',
|
|
||||||
'next_selector': '[data-nav="next"]',
|
|
||||||
'active_class': 'is-active',
|
|
||||||
'completed_class': 'is-completed',
|
|
||||||
'stepClickable': false,
|
|
||||||
'beforeNext': null,
|
|
||||||
'onShow': null,
|
|
||||||
'onFinish': null,
|
|
||||||
'onError': null
|
|
||||||
};
|
|
||||||
|
|
||||||
/* harmony default export */ __webpack_exports__["a"] = (defaultOptions);
|
|
||||||
|
|
||||||
/***/ })
|
|
||||||
/******/ ])["default"];
|
|
||||||
});
|
|
||||||
bulmaSteps.attach();
|
|
24
static-data/www/shared/bulma-tooltip.min.css
vendored
24
static-data/www/shared/bulma-tooltip.min.css
vendored
File diff suppressed because one or more lines are too long
@ -1,56 +0,0 @@
|
|||||||
/*
|
|
||||||
Onionr - Private P2P Communication
|
|
||||||
|
|
||||||
This file is for configuration editing in the web interface
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
var saveBtns = document.getElementsByClassName('saveConfig')
|
|
||||||
var saveBtn = document.getElementsByClassName('saveConfig')[0]
|
|
||||||
var configEditor = document.getElementsByClassName('configEditor')[0]
|
|
||||||
var config = {}
|
|
||||||
|
|
||||||
fetch('/config/get', {
|
|
||||||
headers: {
|
|
||||||
"token": webpass
|
|
||||||
}})
|
|
||||||
.then((resp) => resp.text()) // Transform the data into text
|
|
||||||
.then(function(resp) {
|
|
||||||
configEditor.value = resp
|
|
||||||
config = JSON.parse(resp) //parse here so we can set the text field to pretty json
|
|
||||||
})
|
|
||||||
|
|
||||||
saveBtn.onclick = function(){
|
|
||||||
var postData = configEditor.value
|
|
||||||
try {
|
|
||||||
JSON.parse(postData)
|
|
||||||
} catch (e) {
|
|
||||||
alert('Configuration is not valid JSON')
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
fetch('/config/setall', {
|
|
||||||
method: 'POST',
|
|
||||||
body: postData,
|
|
||||||
headers: {
|
|
||||||
"content-type": "application/json",
|
|
||||||
"token": webpass
|
|
||||||
}})
|
|
||||||
.then((resp) => resp.text()) // Transform the data into text
|
|
||||||
.then(function(data) {
|
|
||||||
PNotify.success({
|
|
||||||
text: 'Config saved'
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
@ -1,61 +0,0 @@
|
|||||||
/*
|
|
||||||
Onionr - Private P2P Communication
|
|
||||||
|
|
||||||
Functions to detect
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>
|
|
||||||
*/
|
|
||||||
direct_connections = {}
|
|
||||||
|
|
||||||
let waitForConnection = function(pubkey){
|
|
||||||
fetch('/dc-client/isconnected/' + pubkey, {
|
|
||||||
headers: {
|
|
||||||
"token": webpass
|
|
||||||
}})
|
|
||||||
.then((resp) => resp.text())
|
|
||||||
.then(function(resp) {
|
|
||||||
if (resp === ""){
|
|
||||||
// Try to get the client address again again in a few seconds
|
|
||||||
setTimeout(function(){waitForConnection(pubkey)}, 3000)
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
// add to the dc object
|
|
||||||
direct_connections[pubkey] = resp
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
let createConnection = function(pubkey){
|
|
||||||
// Tells the Onionr daemon to create a client connection to a remote peer for generic direct connections
|
|
||||||
|
|
||||||
// If the pubkey is already connected, don't bother
|
|
||||||
if (direct_connections.hasOwnProperty(pubkey)){
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Do the request, then spawn a function to wait for the connection to be created
|
|
||||||
fetch('/dc-client/connect/' + pubkey, {
|
|
||||||
headers: {
|
|
||||||
"token": webpass
|
|
||||||
}})
|
|
||||||
.then((resp) => resp.text())
|
|
||||||
.then(function(resp) {
|
|
||||||
if (resp === "pending"){
|
|
||||||
setTimeout(function(){waitForConnection(pubkey)}, 3000)
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
direct_connections[pubkey] = resp
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
@ -1,34 +0,0 @@
|
|||||||
Font Awesome Free License
|
|
||||||
-------------------------
|
|
||||||
|
|
||||||
Font Awesome Free is free, open source, and GPL friendly. You can use it for
|
|
||||||
commercial projects, open source projects, or really almost whatever you want.
|
|
||||||
Full Font Awesome Free license: https://fontawesome.com/license/free.
|
|
||||||
|
|
||||||
# Icons: CC BY 4.0 License (https://creativecommons.org/licenses/by/4.0/)
|
|
||||||
In the Font Awesome Free download, the CC BY 4.0 license applies to all icons
|
|
||||||
packaged as SVG and JS file types.
|
|
||||||
|
|
||||||
# Fonts: SIL OFL 1.1 License (https://scripts.sil.org/OFL)
|
|
||||||
In the Font Awesome Free download, the SIL OFL license applies to all icons
|
|
||||||
packaged as web and desktop font files.
|
|
||||||
|
|
||||||
# Code: MIT License (https://opensource.org/licenses/MIT)
|
|
||||||
In the Font Awesome Free download, the MIT license applies to all non-font and
|
|
||||||
non-icon files.
|
|
||||||
|
|
||||||
# Attribution
|
|
||||||
Attribution is required by MIT, SIL OFL, and CC BY licenses. Downloaded Font
|
|
||||||
Awesome Free files already contain embedded comments with sufficient
|
|
||||||
attribution, so you shouldn't need to do anything additional when using these
|
|
||||||
files normally.
|
|
||||||
|
|
||||||
We've kept attribution comments terse, so we ask that you do not actively work
|
|
||||||
to remove them from files, especially code. They're a great way for folks to
|
|
||||||
learn about Font Awesome.
|
|
||||||
|
|
||||||
# Brand Icons
|
|
||||||
All brand icons are trademarks of their respective owners. The use of these
|
|
||||||
trademarks does not indicate endorsement of the trademark holder by Font
|
|
||||||
Awesome, nor vice versa. **Please do not use brand logos for any purpose except
|
|
||||||
to represent the company, product, or service to which they refer.**
|
|
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Before Width: | Height: | Size: 675 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,803 +0,0 @@
|
|||||||
<?xml version="1.0" standalone="no"?>
|
|
||||||
<!--
|
|
||||||
Font Awesome Free 5.10.2 by @fontawesome - https://fontawesome.com
|
|
||||||
License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
|
||||||
-->
|
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
|
|
||||||
<metadata>
|
|
||||||
Created by FontForge 20190801 at Thu Aug 22 14:41:09 2019
|
|
||||||
By Robert Madole
|
|
||||||
Copyright (c) Font Awesome
|
|
||||||
</metadata>
|
|
||||||
<defs>
|
|
||||||
<font id="FontAwesome5Free-Regular" horiz-adv-x="512" >
|
|
||||||
<font-face
|
|
||||||
font-family="Font Awesome 5 Free Regular"
|
|
||||||
font-weight="400"
|
|
||||||
font-stretch="normal"
|
|
||||||
units-per-em="512"
|
|
||||||
panose-1="2 0 5 3 0 0 0 0 0 0"
|
|
||||||
ascent="448"
|
|
||||||
descent="-64"
|
|
||||||
bbox="-0.0663408 -64.0662 640.01 448.1"
|
|
||||||
underline-thickness="25"
|
|
||||||
underline-position="-50"
|
|
||||||
unicode-range="U+0020-F5C8"
|
|
||||||
/>
|
|
||||||
<missing-glyph />
|
|
||||||
<glyph glyph-name="heart" unicode=""
|
|
||||||
d="M458.4 383.7c75.2998 -63.4004 64.0996 -166.601 10.5996 -221.3l-175.4 -178.7c-10 -10.2002 -23.2998 -15.7998 -37.5996 -15.7998c-14.2002 0 -27.5996 5.69922 -37.5996 15.8994l-175.4 178.7c-53.5996 54.7002 -64.5996 157.9 10.5996 221.2
|
|
||||||
c57.8008 48.7002 147.101 41.2998 202.4 -15c55.2998 56.2998 144.6 63.5996 202.4 15zM434.8 196.2c36.2002 36.8994 43.7998 107.7 -7.2998 150.8c-38.7002 32.5996 -98.7002 27.9004 -136.5 -10.5996l-35 -35.7002l-35 35.7002
|
|
||||||
c-37.5996 38.2998 -97.5996 43.1992 -136.5 10.5c-51.2002 -43.1006 -43.7998 -113.5 -7.2998 -150.7l175.399 -178.7c2.40039 -2.40039 4.40039 -2.40039 6.80078 0z" />
|
|
||||||
<glyph glyph-name="star" unicode="" horiz-adv-x="576"
|
|
||||||
d="M528.1 276.5c26.2002 -3.7998 36.7002 -36.0996 17.7002 -54.5996l-105.7 -103l25 -145.5c4.5 -26.3008 -23.1992 -45.9004 -46.3994 -33.7002l-130.7 68.7002l-130.7 -68.7002c-23.2002 -12.2998 -50.8994 7.39941 -46.3994 33.7002l25 145.5l-105.7 103
|
|
||||||
c-19 18.5 -8.5 50.7998 17.7002 54.5996l146.1 21.2998l65.2998 132.4c11.7998 23.8994 45.7002 23.5996 57.4004 0l65.2998 -132.4zM388.6 135.7l100.601 98l-139 20.2002l-62.2002 126l-62.2002 -126l-139 -20.2002l100.601 -98l-23.7002 -138.4l124.3 65.2998
|
|
||||||
l124.3 -65.2998z" />
|
|
||||||
<glyph glyph-name="user" unicode="" horiz-adv-x="448"
|
|
||||||
d="M313.6 144c74.2002 0 134.4 -60.2002 134.4 -134.4v-25.5996c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v25.5996c0 74.2002 60.2002 134.4 134.4 134.4c28.7998 0 42.5 -16 89.5996 -16s60.9004 16 89.5996 16zM400 -16v25.5996
|
|
||||||
c0 47.6006 -38.7998 86.4004 -86.4004 86.4004c-14.6992 0 -37.8994 -16 -89.5996 -16c-51.2998 0 -75 16 -89.5996 16c-47.6006 0 -86.4004 -38.7998 -86.4004 -86.4004v-25.5996h352zM224 160c-79.5 0 -144 64.5 -144 144s64.5 144 144 144s144 -64.5 144 -144
|
|
||||||
s-64.5 -144 -144 -144zM224 400c-52.9004 0 -96 -43.0996 -96 -96s43.0996 -96 96 -96s96 43.0996 96 96s-43.0996 96 -96 96z" />
|
|
||||||
<glyph glyph-name="clock" unicode=""
|
|
||||||
d="M256 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM256 -8c110.5 0 200 89.5 200 200s-89.5 200 -200 200s-200 -89.5 -200 -200s89.5 -200 200 -200zM317.8 96.4004l-84.8994 61.6992
|
|
||||||
c-3.10059 2.30078 -4.90039 5.90039 -4.90039 9.7002v164.2c0 6.59961 5.40039 12 12 12h32c6.59961 0 12 -5.40039 12 -12v-141.7l66.7998 -48.5996c5.40039 -3.90039 6.5 -11.4004 2.60059 -16.7998l-18.8008 -25.9004c-3.89941 -5.2998 -11.3994 -6.5 -16.7998 -2.59961z
|
|
||||||
" />
|
|
||||||
<glyph glyph-name="list-alt" unicode=""
|
|
||||||
d="M464 416c26.5098 0 48 -21.4902 48 -48v-352c0 -26.5098 -21.4902 -48 -48 -48h-416c-26.5098 0 -48 21.4902 -48 48v352c0 26.5098 21.4902 48 48 48h416zM458 16c3.31152 0 6 2.68848 6 6v340c0 3.31152 -2.68848 6 -6 6h-404c-3.31152 0 -6 -2.68848 -6 -6v-340
|
|
||||||
c0 -3.31152 2.68848 -6 6 -6h404zM416 108v-24c0 -6.62695 -5.37305 -12 -12 -12h-200c-6.62695 0 -12 5.37305 -12 12v24c0 6.62695 5.37305 12 12 12h200c6.62695 0 12 -5.37305 12 -12zM416 204v-24c0 -6.62695 -5.37305 -12 -12 -12h-200c-6.62695 0 -12 5.37305 -12 12
|
|
||||||
v24c0 6.62695 5.37305 12 12 12h200c6.62695 0 12 -5.37305 12 -12zM416 300v-24c0 -6.62695 -5.37305 -12 -12 -12h-200c-6.62695 0 -12 5.37305 -12 12v24c0 6.62695 5.37305 12 12 12h200c6.62695 0 12 -5.37305 12 -12zM164 288c0 -19.8818 -16.1182 -36 -36 -36
|
|
||||||
s-36 16.1182 -36 36s16.1182 36 36 36s36 -16.1182 36 -36zM164 192c0 -19.8818 -16.1182 -36 -36 -36s-36 16.1182 -36 36s16.1182 36 36 36s36 -16.1182 36 -36zM164 96c0 -19.8818 -16.1182 -36 -36 -36s-36 16.1182 -36 36s16.1182 36 36 36s36 -16.1182 36 -36z" />
|
|
||||||
<glyph glyph-name="flag" unicode=""
|
|
||||||
d="M336.174 368c35.4668 0 73.0195 12.6914 108.922 28.1797c31.6406 13.6514 66.9043 -9.65723 66.9043 -44.1162v-239.919c0 -16.1953 -8.1543 -31.3057 -21.7129 -40.1631c-26.5762 -17.3643 -70.0693 -39.9814 -128.548 -39.9814c-68.6084 0 -112.781 32 -161.913 32
|
|
||||||
c-56.5674 0 -89.957 -11.2803 -127.826 -28.5566v-83.4434c0 -8.83691 -7.16309 -16 -16 -16h-16c-8.83691 0 -16 7.16309 -16 16v406.438c-14.3428 8.2998 -24 23.7979 -24 41.5615c0 27.5693 23.2422 49.71 51.2012 47.8965
|
|
||||||
c22.9658 -1.49023 41.8662 -19.4717 44.4805 -42.3379c0.177734 -1.52441 0.321289 -4.00781 0.321289 -5.54199c0 -4.30176 -1.10352 -11.1035 -2.46289 -15.1846c22.418 8.68555 49.4199 15.168 80.7207 15.168c68.6084 0 112.781 -32 161.913 -32zM464 112v240
|
|
||||||
c-31.5059 -14.6338 -84.5547 -32 -127.826 -32c-59.9111 0 -101.968 32 -161.913 32c-41.4365 0 -80.4766 -16.5879 -102.261 -32v-232c31.4473 14.5967 84.4648 24 127.826 24c59.9111 0 101.968 -32 161.913 -32c41.4365 0 80.4775 16.5879 102.261 32z" />
|
|
||||||
<glyph glyph-name="bookmark" unicode="" horiz-adv-x="384"
|
|
||||||
d="M336 448c26.5098 0 48 -21.4902 48 -48v-464l-192 112l-192 -112v464c0 26.5098 21.4902 48 48 48h288zM336 19.5703v374.434c0 3.31348 -2.68555 5.99609 -6 5.99609h-276c-3.31152 0 -6 -2.68848 -6 -6v-374.43l144 84z" />
|
|
||||||
<glyph glyph-name="image" unicode=""
|
|
||||||
d="M464 384c26.5098 0 48 -21.4902 48 -48v-288c0 -26.5098 -21.4902 -48 -48 -48h-416c-26.5098 0 -48 21.4902 -48 48v288c0 26.5098 21.4902 48 48 48h416zM458 48c3.31152 0 6 2.68848 6 6v276c0 3.31152 -2.68848 6 -6 6h-404c-3.31152 0 -6 -2.68848 -6 -6v-276
|
|
||||||
c0 -3.31152 2.68848 -6 6 -6h404zM128 296c22.0908 0 40 -17.9092 40 -40s-17.9092 -40 -40 -40s-40 17.9092 -40 40s17.9092 40 40 40zM96 96v48l39.5137 39.5146c4.6875 4.68652 12.2852 4.68652 16.9717 0l39.5146 -39.5146l119.514 119.515
|
|
||||||
c4.6875 4.68652 12.2852 4.68652 16.9717 0l87.5146 -87.5146v-80h-320z" />
|
|
||||||
<glyph glyph-name="edit" unicode="" horiz-adv-x="576"
|
|
||||||
d="M402.3 103.1l32 32c5 5 13.7002 1.5 13.7002 -5.69922v-145.4c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h273.5c7.09961 0 10.7002 -8.59961 5.7002 -13.7002l-32 -32c-1.5 -1.5 -3.5 -2.2998 -5.7002 -2.2998h-241.5v-352h352
|
|
||||||
v113.5c0 2.09961 0.799805 4.09961 2.2998 5.59961zM558.9 304.9l-262.601 -262.601l-90.3994 -10c-26.2002 -2.89941 -48.5 19.2002 -45.6006 45.6006l10 90.3994l262.601 262.601c22.8994 22.8994 59.8994 22.8994 82.6992 0l43.2002 -43.2002
|
|
||||||
c22.9004 -22.9004 22.9004 -60 0.100586 -82.7998zM460.1 274l-58.0996 58.0996l-185.8 -185.899l-7.2998 -65.2998l65.2998 7.2998zM524.9 353.7l-43.2002 43.2002c-4.10059 4.09961 -10.7998 4.09961 -14.7998 0l-30.9004 -30.9004l58.0996 -58.0996l30.9004 30.8994
|
|
||||||
c4 4.2002 4 10.7998 -0.0996094 14.9004z" />
|
|
||||||
<glyph glyph-name="times-circle" unicode=""
|
|
||||||
d="M256 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM256 -8c110.5 0 200 89.5 200 200s-89.5 200 -200 200s-200 -89.5 -200 -200s89.5 -200 200 -200zM357.8 254.2l-62.2002 -62.2002l62.2002 -62.2002
|
|
||||||
c4.7002 -4.7002 4.7002 -12.2998 0 -17l-22.5996 -22.5996c-4.7002 -4.7002 -12.2998 -4.7002 -17 0l-62.2002 62.2002l-62.2002 -62.2002c-4.7002 -4.7002 -12.2998 -4.7002 -17 0l-22.5996 22.5996c-4.7002 4.7002 -4.7002 12.2998 0 17l62.2002 62.2002l-62.2002 62.2002
|
|
||||||
c-4.7002 4.7002 -4.7002 12.2998 0 17l22.5996 22.5996c4.7002 4.7002 12.2998 4.7002 17 0l62.2002 -62.2002l62.2002 62.2002c4.7002 4.7002 12.2998 4.7002 17 0l22.5996 -22.5996c4.7002 -4.7002 4.7002 -12.2998 0 -17z" />
|
|
||||||
<glyph glyph-name="check-circle" unicode=""
|
|
||||||
d="M256 440c136.967 0 248 -111.033 248 -248s-111.033 -248 -248 -248s-248 111.033 -248 248s111.033 248 248 248zM256 392c-110.549 0 -200 -89.4678 -200 -200c0 -110.549 89.4678 -200 200 -200c110.549 0 200 89.4678 200 200c0 110.549 -89.4678 200 -200 200z
|
|
||||||
M396.204 261.733c4.66699 -4.70508 4.63672 -12.3037 -0.0673828 -16.9717l-172.589 -171.204c-4.70508 -4.66797 -12.3027 -4.63672 -16.9697 0.0683594l-90.7812 91.5156c-4.66797 4.70605 -4.63672 12.3047 0.0683594 16.9717l22.7188 22.5361
|
|
||||||
c4.70508 4.66699 12.3027 4.63574 16.9697 -0.0693359l59.792 -60.2773l141.353 140.216c4.70508 4.66797 12.3027 4.6377 16.9697 -0.0673828z" />
|
|
||||||
<glyph glyph-name="question-circle" unicode=""
|
|
||||||
d="M256 440c136.957 0 248 -111.083 248 -248c0 -136.997 -111.043 -248 -248 -248s-248 111.003 -248 248c0 136.917 111.043 248 248 248zM256 -8c110.569 0 200 89.4697 200 200c0 110.529 -89.5088 200 -200 200c-110.528 0 -200 -89.5049 -200 -200
|
|
||||||
c0 -110.569 89.4678 -200 200 -200zM363.244 247.2c0 -67.0518 -72.4209 -68.084 -72.4209 -92.8633v-6.33691c0 -6.62695 -5.37305 -12 -12 -12h-45.6475c-6.62695 0 -12 5.37305 -12 12v8.65918c0 35.7451 27.1006 50.0342 47.5791 61.5156
|
|
||||||
c17.5615 9.84473 28.3242 16.541 28.3242 29.5791c0 17.2461 -21.999 28.6934 -39.7842 28.6934c-23.1885 0 -33.8936 -10.9775 -48.9424 -29.9697c-4.05664 -5.11914 -11.46 -6.07031 -16.666 -2.12402l-27.8232 21.0986
|
|
||||||
c-5.10742 3.87207 -6.25098 11.0654 -2.64453 16.3633c23.627 34.6934 53.7217 54.1846 100.575 54.1846c49.0713 0 101.45 -38.3037 101.45 -88.7998zM298 80c0 -23.1592 -18.8408 -42 -42 -42s-42 18.8408 -42 42s18.8408 42 42 42s42 -18.8408 42 -42z" />
|
|
||||||
<glyph glyph-name="eye" unicode="" horiz-adv-x="576"
|
|
||||||
d="M288 304c0.0927734 0 0.244141 0.000976562 0.336914 0.000976562c61.6641 0 111.71 -50.0469 111.71 -111.711c0 -61.6631 -50.0459 -111.71 -111.71 -111.71s-111.71 50.0469 -111.71 111.71c0 8.71289 1.95898 22.5781 4.37305 30.9502
|
|
||||||
c6.93066 -3.94141 19.0273 -7.18457 27 -7.24023c30.9121 0 56 25.0879 56 56c-0.0556641 7.97266 -3.29883 20.0693 -7.24023 27c8.42383 2.62207 22.4189 4.8623 31.2402 5zM572.52 206.6c1.9209 -3.79883 3.47949 -10.3379 3.47949 -14.5947
|
|
||||||
s-1.55859 -10.7959 -3.47949 -14.5947c-54.1992 -105.771 -161.59 -177.41 -284.52 -177.41s-230.29 71.5898 -284.52 177.4c-1.9209 3.79883 -3.47949 10.3379 -3.47949 14.5947s1.55859 10.7959 3.47949 14.5947c54.1992 105.771 161.59 177.41 284.52 177.41
|
|
||||||
s230.29 -71.5898 284.52 -177.4zM288 48c98.6602 0 189.1 55 237.93 144c-48.8398 89 -139.27 144 -237.93 144s-189.09 -55 -237.93 -144c48.8398 -89 139.279 -144 237.93 -144z" />
|
|
||||||
<glyph glyph-name="eye-slash" unicode="" horiz-adv-x="640"
|
|
||||||
d="M634 -23c3.31738 -2.65137 6.00977 -8.25098 6.00977 -12.498c0 -3.10449 -1.57715 -7.58984 -3.51953 -10.0117l-10 -12.4902c-2.65234 -3.31152 -8.24707 -6 -12.4902 -6c-3.09961 0 -7.58008 1.57227 -10 3.50977l-598 467.49
|
|
||||||
c-3.31738 2.65137 -6.00977 8.25098 -6.00977 12.498c0 3.10449 1.57715 7.58984 3.51953 10.0117l10 12.4902c2.65234 3.31152 8.24707 6 12.4902 6c3.09961 0 7.58008 -1.57227 10 -3.50977zM296.79 301.53c6.33496 1.35059 16.7324 2.45801 23.21 2.46973
|
|
||||||
c60.4805 0 109.36 -47.9102 111.58 -107.85zM343.21 82.46c-6.33496 -1.34375 -16.7334 -2.44629 -23.21 -2.45996c-60.4697 0 -109.35 47.9102 -111.58 107.84zM320 336c-19.8799 0 -39.2803 -2.7998 -58.2197 -7.09961l-46.4102 36.29
|
|
||||||
c32.9199 11.8096 67.9297 18.8096 104.63 18.8096c122.93 0 230.29 -71.5898 284.57 -177.4c1.91992 -3.79883 3.47949 -10.3379 3.47949 -14.5947s-1.55957 -10.7959 -3.47949 -14.5947c-11.7197 -22.7598 -35.4189 -56.4092 -52.9004 -75.1104l-37.7402 29.5
|
|
||||||
c14.333 15.0156 34.0449 41.9854 44 60.2002c-48.8398 89 -139.279 144 -237.93 144zM320 48c19.8896 0 39.2803 2.7998 58.2197 7.08984l46.4102 -36.2803c-32.9199 -11.7598 -67.9297 -18.8096 -104.63 -18.8096c-122.92 0 -230.28 71.5898 -284.51 177.4
|
|
||||||
c-1.9209 3.79883 -3.47949 10.3379 -3.47949 14.5947s1.55859 10.7959 3.47949 14.5947c11.7168 22.7568 35.4111 56.4014 52.8896 75.1006l37.7402 -29.5c-14.3467 -15.0107 -34.0811 -41.9756 -44.0498 -60.1904c48.8496 -89 139.279 -144 237.93 -144z" />
|
|
||||||
<glyph glyph-name="calendar-alt" unicode="" horiz-adv-x="448"
|
|
||||||
d="M148 160h-40c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12zM256 172c0 -6.59961 -5.40039 -12 -12 -12h-40c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h40
|
|
||||||
c6.59961 0 12 -5.40039 12 -12v-40zM352 172c0 -6.59961 -5.40039 -12 -12 -12h-40c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-40zM256 76c0 -6.59961 -5.40039 -12 -12 -12h-40c-6.59961 0 -12 5.40039 -12 12v40
|
|
||||||
c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-40zM160 76c0 -6.59961 -5.40039 -12 -12 -12h-40c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-40zM352 76c0 -6.59961 -5.40039 -12 -12 -12h-40
|
|
||||||
c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-40zM448 336v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h48v52c0 6.59961 5.40039 12 12 12h40
|
|
||||||
c6.59961 0 12 -5.40039 12 -12v-52h128v52c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-52h48c26.5 0 48 -21.5 48 -48zM400 -10v298h-352v-298c0 -3.2998 2.7002 -6 6 -6h340c3.2998 0 6 2.7002 6 6z" />
|
|
||||||
<glyph glyph-name="comment" unicode=""
|
|
||||||
d="M256 416c141.4 0 256 -93.0996 256 -208s-114.6 -208 -256 -208c-32.7998 0 -64 5.2002 -92.9004 14.2998c-29.0996 -20.5996 -77.5996 -46.2998 -139.1 -46.2998c-9.59961 0 -18.2998 5.7002 -22.0996 14.5c-3.80078 8.7998 -2 19 4.59961 26
|
|
||||||
c0.5 0.400391 31.5 33.7998 46.4004 73.2002c-33 35.0996 -52.9004 78.7002 -52.9004 126.3c0 114.9 114.6 208 256 208zM256 48c114.7 0 208 71.7998 208 160s-93.2998 160 -208 160s-208 -71.7998 -208 -160c0 -42.2002 21.7002 -74.0996 39.7998 -93.4004
|
|
||||||
l20.6006 -21.7998l-10.6006 -28.0996c-5.5 -14.5 -12.5996 -28.1006 -19.8994 -40.2002c23.5996 7.59961 43.1992 18.9004 57.5 29l19.5 13.7998l22.6992 -7.2002c25.3008 -8 51.7002 -12.0996 78.4004 -12.0996z" />
|
|
||||||
<glyph glyph-name="folder" unicode=""
|
|
||||||
d="M464 320c26.5098 0 48 -21.4902 48 -48v-224c0 -26.5098 -21.4902 -48 -48 -48h-416c-26.5098 0 -48 21.4902 -48 48v288c0 26.5098 21.4902 48 48 48h146.74c8.49023 0 16.6299 -3.37012 22.6299 -9.37012l54.6299 -54.6299h192zM464 48v224h-198.62
|
|
||||||
c-8.49023 0 -16.6299 3.37012 -22.6299 9.37012l-54.6299 54.6299h-140.12v-288h416z" />
|
|
||||||
<glyph glyph-name="folder-open" unicode="" horiz-adv-x="576"
|
|
||||||
d="M527.9 224c37.6992 0 60.6992 -41.5 40.6992 -73.4004l-79.8994 -128c-8.7998 -14.0996 -24.2002 -22.5996 -40.7002 -22.5996h-400c-26.5 0 -48 21.5 -48 48v288c0 26.5 21.5 48 48 48h160l64 -64h160c26.5 0 48 -21.5 48 -48v-48h47.9004zM48 330v-233.4l62.9004 104.2
|
|
||||||
c8.69922 14.4004 24.2998 23.2002 41.0996 23.2002h280v42c0 3.2998 -2.7002 6 -6 6h-173.9l-64 64h-134.1c-3.2998 0 -6 -2.7002 -6 -6zM448 48l80 128h-378.8l-77.2002 -128h376z" />
|
|
||||||
<glyph glyph-name="chart-bar" unicode=""
|
|
||||||
d="M396.8 96c-6.39941 0 -12.7998 6.40039 -12.7998 12.7998v230.4c0 6.39941 6.40039 12.7998 12.7998 12.7998h22.4004c6.39941 0 12.7998 -6.40039 12.7998 -12.7998v-230.4c0 -6.39941 -6.40039 -12.7998 -12.7998 -12.7998h-22.4004zM204.8 96
|
|
||||||
c-6.39941 0 -12.7998 6.40039 -12.7998 12.7998v198.4c0 6.39941 6.40039 12.7998 12.7998 12.7998h22.4004c6.39941 0 12.7998 -6.40039 12.7998 -12.7998v-198.4c0 -6.39941 -6.40039 -12.7998 -12.7998 -12.7998h-22.4004zM300.8 96
|
|
||||||
c-6.39941 0 -12.7998 6.40039 -12.7998 12.7998v134.4c0 6.39941 6.40039 12.7998 12.7998 12.7998h22.4004c6.39941 0 12.7998 -6.40039 12.7998 -12.7998v-134.4c0 -6.39941 -6.40039 -12.7998 -12.7998 -12.7998h-22.4004zM496 48c8.83984 0 16 -7.16016 16 -16v-16
|
|
||||||
c0 -8.83984 -7.16016 -16 -16 -16h-464c-17.6699 0 -32 14.3301 -32 32v336c0 8.83984 7.16016 16 16 16h16c8.83984 0 16 -7.16016 16 -16v-320h448zM108.8 96c-6.39941 0 -12.7998 6.40039 -12.7998 12.7998v70.4004c0 6.39941 6.40039 12.7998 12.7998 12.7998h22.4004
|
|
||||||
c6.39941 0 12.7998 -6.40039 12.7998 -12.7998v-70.4004c0 -6.39941 -6.40039 -12.7998 -12.7998 -12.7998h-22.4004z" />
|
|
||||||
<glyph glyph-name="comments" unicode="" horiz-adv-x="576"
|
|
||||||
d="M532 61.7998c15.2998 -30.7002 37.4004 -54.5 37.7998 -54.7998c6.2998 -6.7002 8 -16.5 4.40039 -25c-3.7002 -8.5 -12 -14 -21.2002 -14c-53.5996 0 -96.7002 20.2998 -125.2 38.7998c-19 -4.39941 -39 -6.7998 -59.7998 -6.7998
|
|
||||||
c-86.2002 0 -159.9 40.4004 -191.3 97.7998c-9.7002 1.2002 -19.2002 2.7998 -28.4004 4.90039c-28.5 -18.6006 -71.7002 -38.7998 -125.2 -38.7998c-9.19922 0 -17.5996 5.5 -21.1992 14c-3.7002 8.5 -1.90039 18.2998 4.39941 25
|
|
||||||
c0.400391 0.399414 22.4004 24.1992 37.7002 54.8994c-27.5 27.2002 -44 61.2002 -44 98.2002c0 88.4004 93.0996 160 208 160c86.2998 0 160.3 -40.5 191.8 -98.0996c99.7002 -11.8008 176.2 -77.9004 176.2 -157.9c0 -37.0996 -16.5 -71.0996 -44 -98.2002zM139.2 154.1
|
|
||||||
l19.7998 -4.5c16 -3.69922 32.5 -5.59961 49 -5.59961c86.7002 0 160 51.2998 160 112s-73.2998 112 -160 112s-160 -51.2998 -160 -112c0 -28.7002 16.2002 -50.5996 29.7002 -64l24.7998 -24.5l-15.5 -31.0996c-2.59961 -5.10059 -5.2998 -10.1006 -8 -14.8008
|
|
||||||
c14.5996 5.10059 29 12.3008 43.0996 21.4004zM498.3 96c13.5 13.4004 29.7002 35.2998 29.7002 64c0 49.2002 -48.2998 91.5 -112.7 106c0.299805 -3.2998 0.700195 -6.59961 0.700195 -10c0 -80.9004 -78 -147.5 -179.3 -158.3
|
|
||||||
c29.0996 -29.6006 77.2998 -49.7002 131.3 -49.7002c16.5 0 33 1.90039 49 5.59961l19.9004 4.60059l17.0996 -11.1006c14.0996 -9.09961 28.5 -16.2998 43.0996 -21.3994c-2.69922 4.7002 -5.39941 9.7002 -8 14.7998l-15.5 31.0996z" />
|
|
||||||
<glyph glyph-name="star-half" unicode="" horiz-adv-x="576"
|
|
||||||
d="M288 62.7002v-54.2998l-130.7 -68.6006c-23.3994 -12.2998 -50.8994 7.60059 -46.3994 33.7002l25 145.5l-105.7 103c-19 18.5 -8.5 50.7998 17.7002 54.5996l146.1 21.2002l65.2998 132.4c5.90039 11.8994 17.2998 17.7998 28.7002 17.7998v-68.0996l-62.2002 -126
|
|
||||||
l-139 -20.2002l100.601 -98l-23.7002 -138.4z" />
|
|
||||||
<glyph glyph-name="lemon" unicode=""
|
|
||||||
d="M484.112 420.111c28.1221 -28.123 35.9434 -68.0039 19.0215 -97.0547c-23.0576 -39.584 50.1436 -163.384 -82.3311 -295.86c-132.301 -132.298 -256.435 -59.3594 -295.857 -82.3291c-29.0459 -16.917 -68.9219 -9.11426 -97.0576 19.0205
|
|
||||||
c-28.1221 28.1221 -35.9434 68.0029 -19.0215 97.0547c23.0566 39.5859 -50.1436 163.386 82.3301 295.86c132.308 132.309 256.407 59.3496 295.862 82.332c29.0498 16.9219 68.9307 9.09863 97.0537 -19.0234zM461.707 347.217
|
|
||||||
c13.5166 23.2031 -27.7578 63.7314 -50.4883 50.4912c-66.6025 -38.7939 -165.646 45.5898 -286.081 -74.8457c-120.444 -120.445 -36.0449 -219.472 -74.8447 -286.08c-13.542 -23.2471 27.8145 -63.6953 50.4932 -50.4883
|
|
||||||
c66.6006 38.7949 165.636 -45.5996 286.076 74.8428c120.444 120.445 36.0449 219.472 74.8447 286.08zM291.846 338.481c1.37012 -10.96 -6.40332 -20.957 -17.3643 -22.3271c-54.8467 -6.85547 -135.779 -87.7871 -142.636 -142.636
|
|
||||||
c-1.37305 -10.9883 -11.3984 -18.7334 -22.3262 -17.3643c-10.9609 1.37012 -18.7344 11.3652 -17.3643 22.3262c9.16211 73.2852 104.167 168.215 177.364 177.364c10.9531 1.36816 20.9561 -6.40234 22.3262 -17.3633z" />
|
|
||||||
<glyph glyph-name="credit-card" unicode="" horiz-adv-x="576"
|
|
||||||
d="M527.9 416c26.5996 0 48.0996 -21.5 48.0996 -48v-352c0 -26.5 -21.5 -48 -48.0996 -48h-479.801c-26.5996 0 -48.0996 21.5 -48.0996 48v352c0 26.5 21.5 48 48.0996 48h479.801zM54.0996 368c-3.2998 0 -6 -2.7002 -6 -6v-42h479.801v42c0 3.2998 -2.7002 6 -6 6
|
|
||||||
h-467.801zM521.9 16c3.2998 0 6 2.7002 6 6v170h-479.801v-170c0 -3.2998 2.7002 -6 6 -6h467.801zM192 116v-40c0 -6.59961 -5.40039 -12 -12 -12h-72c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h72c6.59961 0 12 -5.40039 12 -12zM384 116v-40
|
|
||||||
c0 -6.59961 -5.40039 -12 -12 -12h-136c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h136c6.59961 0 12 -5.40039 12 -12z" />
|
|
||||||
<glyph glyph-name="hdd" unicode="" horiz-adv-x="576"
|
|
||||||
d="M567.403 212.358c5.59668 -8.04688 8.59668 -17.6113 8.59668 -27.4121v-136.946c0 -26.5098 -21.4902 -48 -48 -48h-480c-26.5098 0 -48 21.4902 -48 48v136.946c0 8.30957 3.85156 20.5898 8.59668 27.4121l105.08 151.053
|
|
||||||
c7.90625 11.3652 25.5596 20.5889 39.4033 20.5889h0.000976562h269.838h0.000976562c13.8438 0 31.4971 -9.22363 39.4033 -20.5889zM153.081 336l-77.9131 -112h425.664l-77.9131 112h-269.838zM528 48v128h-480v-128h480zM496 112c0 -17.6729 -14.3271 -32 -32 -32
|
|
||||||
s-32 14.3271 -32 32s14.3271 32 32 32s32 -14.3271 32 -32zM400 112c0 -17.6729 -14.3271 -32 -32 -32s-32 14.3271 -32 32s14.3271 32 32 32s32 -14.3271 32 -32z" />
|
|
||||||
<glyph glyph-name="hand-point-right" unicode=""
|
|
||||||
d="M428.8 310.4c45.0996 0 83.2002 -38.1016 83.2002 -83.2002c0 -45.6162 -37.7646 -83.2002 -83.2002 -83.2002h-35.6475c-1.41602 -6.36719 -4.96875 -16.252 -7.92969 -22.0645c2.50586 -22.0059 -3.50293 -44.9775 -15.9844 -62.791
|
|
||||||
c-1.14062 -52.4863 -37.3984 -91.1445 -99.9404 -91.1445h-21.2988c-60.0635 0 -98.5117 40 -127.2 40h-2.67871c-5.74707 -4.95215 -13.5361 -8 -22.1201 -8h-64c-17.6729 0 -32 12.8936 -32 28.7998v230.4c0 15.9062 14.3271 28.7998 32 28.7998h64.001
|
|
||||||
c8.58398 0 16.373 -3.04785 22.1201 -8h2.67871c6.96387 0 14.8623 6.19336 30.1816 23.6689l0.128906 0.148438l0.130859 0.145508c8.85645 9.93652 18.1162 20.8398 25.8506 33.2529c18.7051 30.2471 30.3936 78.7842 75.707 78.7842c56.9277 0 92 -35.2861 92 -83.2002
|
|
||||||
v-0.0839844c0 -6.21777 -0.974609 -16.2148 -2.17578 -22.3154h86.1768zM428.8 192c18.9756 0 35.2002 16.2246 35.2002 35.2002c0 18.7002 -16.7754 35.2002 -35.2002 35.2002h-158.399c0 17.3242 26.3994 35.1992 26.3994 70.3994c0 26.4004 -20.625 35.2002 -44 35.2002
|
|
||||||
c-8.79395 0 -20.4443 -32.7119 -34.9258 -56.0996c-9.07422 -14.5752 -19.5244 -27.2256 -30.7988 -39.875c-16.1094 -18.374 -33.8359 -36.6328 -59.0752 -39.5967v-176.753c42.79 -3.7627 74.5088 -39.6758 120 -39.6758h21.2988
|
|
||||||
c40.5244 0 57.124 22.1973 50.6006 61.3252c14.6113 8.00098 24.1514 33.9785 12.9248 53.625c19.3652 18.2246 17.7871 46.3809 4.9502 61.0498h91.0254zM88 64c0 13.2549 -10.7451 24 -24 24s-24 -10.7451 -24 -24s10.7451 -24 24 -24s24 10.7451 24 24z" />
|
|
||||||
<glyph glyph-name="hand-point-left" unicode=""
|
|
||||||
d="M0 227.2c0 45.0986 38.1006 83.2002 83.2002 83.2002h86.1758c-1.3623 6.91016 -2.17578 14.374 -2.17578 22.3994c0 47.9141 35.0723 83.2002 92 83.2002c45.3135 0 57.002 -48.5371 75.7061 -78.7852c7.73438 -12.4121 16.9951 -23.3154 25.8506 -33.2529
|
|
||||||
l0.130859 -0.145508l0.128906 -0.148438c15.3213 -17.4746 23.2197 -23.668 30.1836 -23.668h2.67871c5.74707 4.95215 13.5361 8 22.1201 8h64c17.6729 0 32 -12.8936 32 -28.7998v-230.4c0 -15.9062 -14.3271 -28.7998 -32 -28.7998h-64
|
|
||||||
c-8.58398 0 -16.373 3.04785 -22.1201 8h-2.67871c-28.6885 0 -67.1367 -40 -127.2 -40h-21.2988c-62.542 0 -98.8008 38.6582 -99.9404 91.1445c-12.4814 17.8135 -18.4922 40.7852 -15.9844 62.791c-2.96094 5.8125 -6.51367 15.6973 -7.92969 22.0645h-35.6465
|
|
||||||
c-45.4355 0 -83.2002 37.584 -83.2002 83.2002zM48 227.2c0 -18.9756 16.2246 -35.2002 35.2002 -35.2002h91.0244c-12.8369 -14.6689 -14.415 -42.8252 4.9502 -61.0498c-11.2256 -19.6465 -1.68652 -45.624 12.9248 -53.625
|
|
||||||
c-6.52246 -39.1279 10.0771 -61.3252 50.6016 -61.3252h21.2988c45.4912 0 77.21 35.9131 120 39.6768v176.752c-25.2393 2.96289 -42.9658 21.2227 -59.0752 39.5967c-11.2744 12.6494 -21.7246 25.2998 -30.7988 39.875
|
|
||||||
c-14.4814 23.3877 -26.1318 56.0996 -34.9258 56.0996c-23.375 0 -44 -8.7998 -44 -35.2002c0 -35.2002 26.3994 -53.0752 26.3994 -70.3994h-158.399c-18.4248 0 -35.2002 -16.5 -35.2002 -35.2002zM448 88c-13.2549 0 -24 -10.7451 -24 -24s10.7451 -24 24 -24
|
|
||||||
s24 10.7451 24 24s-10.7451 24 -24 24z" />
|
|
||||||
<glyph glyph-name="hand-point-up" unicode="" horiz-adv-x="448"
|
|
||||||
d="M105.6 364.8c0 45.0996 38.1016 83.2002 83.2002 83.2002c45.6162 0 83.2002 -37.7646 83.2002 -83.2002v-35.6465c6.36719 -1.41602 16.252 -4.96875 22.0645 -7.92969c22.0059 2.50684 44.9775 -3.50293 62.791 -15.9844
|
|
||||||
c52.4863 -1.14062 91.1445 -37.3984 91.1445 -99.9404v-21.2988c0 -60.0635 -40 -98.5117 -40 -127.2v-2.67871c4.95215 -5.74707 8 -13.5361 8 -22.1201v-64c0 -17.6729 -12.8936 -32 -28.7998 -32h-230.4c-15.9062 0 -28.7998 14.3271 -28.7998 32v64
|
|
||||||
c0 8.58398 3.04785 16.373 8 22.1201v2.67871c0 6.96387 -6.19336 14.8623 -23.6689 30.1816l-0.148438 0.128906l-0.145508 0.130859c-9.93652 8.85645 -20.8398 18.1162 -33.2529 25.8506c-30.2471 18.7051 -78.7842 30.3936 -78.7842 75.707
|
|
||||||
c0 56.9277 35.2861 92 83.2002 92h0.0839844c6.21777 0 16.2148 -0.974609 22.3154 -2.17578v86.1768zM224 364.8c0 18.9756 -16.2246 35.2002 -35.2002 35.2002c-18.7002 0 -35.2002 -16.7754 -35.2002 -35.2002v-158.399c-17.3242 0 -35.1992 26.3994 -70.3994 26.3994
|
|
||||||
c-26.4004 0 -35.2002 -20.625 -35.2002 -44c0 -8.79395 32.7119 -20.4443 56.0996 -34.9258c14.5752 -9.07422 27.2256 -19.5244 39.875 -30.7988c18.374 -16.1094 36.6328 -33.8359 39.5967 -59.0752h176.753c3.7627 42.79 39.6758 74.5088 39.6758 120v21.2988
|
|
||||||
c0 40.5244 -22.1973 57.124 -61.3252 50.6006c-8.00098 14.6113 -33.9785 24.1514 -53.625 12.9248c-18.2246 19.3652 -46.3809 17.7871 -61.0498 4.9502v91.0254zM352 24c-13.2549 0 -24 -10.7451 -24 -24s10.7451 -24 24 -24s24 10.7451 24 24s-10.7451 24 -24 24z" />
|
|
||||||
<glyph glyph-name="hand-point-down" unicode="" horiz-adv-x="448"
|
|
||||||
d="M188.8 -64c-45.0986 0 -83.2002 38.1006 -83.2002 83.2002v86.1758c-6.91016 -1.3623 -14.374 -2.17578 -22.3994 -2.17578c-47.9141 0 -83.2002 35.0723 -83.2002 92c0 45.3135 48.5371 57.002 78.7852 75.707c12.4121 7.73438 23.3154 16.9951 33.2529 25.8506
|
|
||||||
l0.145508 0.130859l0.148438 0.128906c17.4746 15.3213 23.668 23.2197 23.668 30.1836v2.67871c-4.95215 5.74707 -8 13.5361 -8 22.1201v64c0 17.6729 12.8936 32 28.7998 32h230.4c15.9062 0 28.7998 -14.3271 28.7998 -32v-64.001
|
|
||||||
c0 -8.58398 -3.04785 -16.373 -8 -22.1201v-2.67871c0 -28.6885 40 -67.1367 40 -127.2v-21.2988c0 -62.542 -38.6582 -98.8008 -91.1445 -99.9404c-17.8135 -12.4814 -40.7852 -18.4922 -62.791 -15.9844c-5.8125 -2.96094 -15.6973 -6.51367 -22.0645 -7.92969v-35.6465
|
|
||||||
c0 -45.4355 -37.584 -83.2002 -83.2002 -83.2002zM188.8 -16c18.9756 0 35.2002 16.2246 35.2002 35.2002v91.0244c14.6689 -12.8369 42.8252 -14.415 61.0498 4.9502c19.6465 -11.2256 45.624 -1.68652 53.625 12.9248c39.1279 -6.52246 61.3252 10.0771 61.3252 50.6016
|
|
||||||
v21.2988c0 45.4912 -35.9131 77.21 -39.6768 120h-176.752c-2.96289 -25.2393 -21.2227 -42.9658 -39.5967 -59.0752c-12.6494 -11.2744 -25.2998 -21.7246 -39.875 -30.7988c-23.3877 -14.4814 -56.0996 -26.1318 -56.0996 -34.9258c0 -23.375 8.7998 -44 35.2002 -44
|
|
||||||
c35.2002 0 53.0752 26.3994 70.3994 26.3994v-158.399c0 -18.4248 16.5 -35.2002 35.2002 -35.2002zM328 384c0 -13.2549 10.7451 -24 24 -24s24 10.7451 24 24s-10.7451 24 -24 24s-24 -10.7451 -24 -24z" />
|
|
||||||
<glyph glyph-name="copy" unicode="" horiz-adv-x="448"
|
|
||||||
d="M433.941 382.059c7.75977 -7.75977 14.0586 -22.9658 14.0586 -33.9404v-268.118c0 -26.5098 -21.4902 -48 -48 -48h-80v-48c0 -26.5098 -21.4902 -48 -48 -48h-224c-26.5098 0 -48 21.4902 -48 48v320c0 26.5098 21.4902 48 48 48h80v48c0 26.5098 21.4902 48 48 48
|
|
||||||
h172.118c10.9746 0 26.1807 -6.29883 33.9404 -14.0586zM266 -16c3.31152 0 6 2.68848 6 6v42h-96c-26.5098 0 -48 21.4902 -48 48v224h-74c-3.31152 0 -6 -2.68848 -6 -6v-308c0 -3.31152 2.68848 -6 6 -6h212zM394 80c3.31152 0 6 2.68848 6 6v202h-88
|
|
||||||
c-13.2549 0 -24 10.7451 -24 24v88h-106c-3.31152 0 -6 -2.68848 -6 -6v-308c0 -3.31152 2.68848 -6 6 -6h212zM400 336v9.63184v0.000976562c0 1.37207 -0.787109 3.27246 -1.75684 4.24219l-48.3682 48.3682c-1.12598 1.125 -2.65234 1.75684 -4.24316 1.75684h-9.63184
|
|
||||||
v-64h64z" />
|
|
||||||
<glyph glyph-name="save" unicode="" horiz-adv-x="448"
|
|
||||||
d="M433.941 318.059c7.75977 -7.75977 14.0586 -22.9658 14.0586 -33.9404v-268.118c0 -26.5098 -21.4902 -48 -48 -48h-352c-26.5098 0 -48 21.4902 -48 48v352c0 26.5098 21.4902 48 48 48h268.118c10.9746 0 26.1807 -6.29883 33.9404 -14.0586zM272 368h-128v-80h128v80
|
|
||||||
zM394 16c3.31152 0 6 2.68848 6 6v259.632v0.000976562c0 1.37207 -0.787109 3.27246 -1.75684 4.24219l-78.2432 78.2432v-100.118c0 -13.2549 -10.7451 -24 -24 -24h-176c-13.2549 0 -24 10.7451 -24 24v104h-42c-3.31152 0 -6 -2.68848 -6 -6v-340
|
|
||||||
c0 -3.31152 2.68848 -6 6 -6h340zM224 216c48.5234 0 88 -39.4766 88 -88s-39.4766 -88 -88 -88s-88 39.4766 -88 88s39.4766 88 88 88zM224 88c22.0557 0 40 17.9443 40 40s-17.9443 40 -40 40s-40 -17.9443 -40 -40s17.9443 -40 40 -40z" />
|
|
||||||
<glyph glyph-name="square" unicode="" horiz-adv-x="448"
|
|
||||||
d="M400 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352zM394 16c3.2998 0 6 2.7002 6 6v340c0 3.2998 -2.7002 6 -6 6h-340c-3.2998 0 -6 -2.7002 -6 -6v-340c0 -3.2998 2.7002 -6 6 -6h340z" />
|
|
||||||
<glyph glyph-name="envelope" unicode=""
|
|
||||||
d="M464 384c26.5098 0 48 -21.4902 48 -48v-288c0 -26.5098 -21.4902 -48 -48 -48h-416c-26.5098 0 -48 21.4902 -48 48v288c0 26.5098 21.4902 48 48 48h416zM464 336h-416v-40.8047c22.4248 -18.2627 58.1797 -46.6602 134.587 -106.49
|
|
||||||
c16.834 -13.2422 50.2051 -45.0762 73.4131 -44.7012c23.2119 -0.371094 56.5723 31.4541 73.4131 44.7012c76.4189 59.8389 112.165 88.2305 134.587 106.49v40.8047zM48 48h416v185.601c-22.915 -18.252 -55.4189 -43.8691 -104.947 -82.6523
|
|
||||||
c-22.5439 -17.748 -60.3359 -55.1787 -103.053 -54.9473c-42.9277 -0.231445 -81.2051 37.75 -103.062 54.9551c-49.5293 38.7842 -82.0244 64.3945 -104.938 82.6455v-185.602z" />
|
|
||||||
<glyph glyph-name="lightbulb" unicode="" horiz-adv-x="352"
|
|
||||||
d="M176 368c8.83984 0 16 -7.16016 16 -16s-7.16016 -16 -16 -16c-35.2803 0 -64 -28.7002 -64 -64c0 -8.83984 -7.16016 -16 -16 -16s-16 7.16016 -16 16c0 52.9404 43.0596 96 96 96zM96.0596 -11.1699l-0.0400391 43.1797h159.961l-0.0507812 -43.1797
|
|
||||||
c-0.00976562 -3.13965 -0.939453 -6.21973 -2.67969 -8.83984l-24.5098 -36.8398c-2.95996 -4.45996 -7.95996 -7.14062 -13.3203 -7.14062h-78.8496c-5.35059 0 -10.3506 2.68066 -13.3203 7.14062l-24.5098 36.8398c-1.75 2.62012 -2.68066 5.68945 -2.68066 8.83984z
|
|
||||||
M176 448c97.2002 0 176 -78.7998 176 -176c0 -44.3701 -16.4502 -84.8496 -43.5498 -115.79c-16.6406 -18.9795 -42.7402 -58.79 -52.4199 -92.1602v-0.0498047h-48v0.0996094c0.00390625 4.04199 0.999023 10.4482 2.21973 14.3008
|
|
||||||
c5.67969 17.9893 22.9902 64.8496 62.0996 109.46c20.4102 23.29 31.6504 53.1699 31.6504 84.1396c0 70.5801 -57.4199 128 -128 128c-68.2803 0 -128.15 -54.3604 -127.95 -128c0.0898438 -30.9902 11.0703 -60.71 31.6104 -84.1396
|
|
||||||
c39.3496 -44.9004 56.5801 -91.8604 62.1699 -109.67c1.42969 -4.56055 2.13965 -9.30078 2.15039 -14.0703v-0.120117h-48v0.0595703c-9.68066 33.3604 -35.7803 73.1709 -52.4209 92.1602c-27.1094 30.9307 -43.5596 71.4102 -43.5596 115.78
|
|
||||||
c0 93.0303 73.7197 176 176 176z" />
|
|
||||||
<glyph glyph-name="bell" unicode="" horiz-adv-x="448"
|
|
||||||
d="M439.39 85.71c6 -6.44043 8.66016 -14.1602 8.61035 -21.71c-0.0996094 -16.4004 -12.9805 -32 -32.0996 -32h-383.801c-19.1191 0 -31.9893 15.5996 -32.0996 32c-0.0498047 7.5498 2.61035 15.2598 8.61035 21.71c19.3193 20.7598 55.4697 51.9902 55.4697 154.29
|
|
||||||
c0 77.7002 54.4795 139.9 127.939 155.16v20.8398c0 17.6699 14.3203 32 31.9805 32s31.9805 -14.3301 31.9805 -32v-20.8398c73.46 -15.2598 127.939 -77.46 127.939 -155.16c0 -102.3 36.1504 -133.53 55.4697 -154.29zM67.5303 80h312.939
|
|
||||||
c-21.2197 27.96 -44.4199 74.3203 -44.5293 159.42c0 0.200195 0.0595703 0.379883 0.0595703 0.580078c0 61.8604 -50.1396 112 -112 112s-112 -50.1396 -112 -112c0 -0.200195 0.0595703 -0.379883 0.0595703 -0.580078
|
|
||||||
c-0.109375 -85.0898 -23.3096 -131.45 -44.5293 -159.42zM224 -64c-35.3203 0 -63.9697 28.6504 -63.9697 64h127.939c0 -35.3496 -28.6494 -64 -63.9697 -64z" />
|
|
||||||
<glyph glyph-name="hospital" unicode="" horiz-adv-x="448"
|
|
||||||
d="M128 204v40c0 6.62695 5.37305 12 12 12h40c6.62695 0 12 -5.37305 12 -12v-40c0 -6.62695 -5.37305 -12 -12 -12h-40c-6.62695 0 -12 5.37305 -12 12zM268 192c-6.62695 0 -12 5.37305 -12 12v40c0 6.62695 5.37305 12 12 12h40c6.62695 0 12 -5.37305 12 -12v-40
|
|
||||||
c0 -6.62695 -5.37305 -12 -12 -12h-40zM192 108c0 -6.62695 -5.37305 -12 -12 -12h-40c-6.62695 0 -12 5.37305 -12 12v40c0 6.62695 5.37305 12 12 12h40c6.62695 0 12 -5.37305 12 -12v-40zM268 96c-6.62695 0 -12 5.37305 -12 12v40c0 6.62695 5.37305 12 12 12h40
|
|
||||||
c6.62695 0 12 -5.37305 12 -12v-40c0 -6.62695 -5.37305 -12 -12 -12h-40zM448 -28v-36h-448v36c0 6.62695 5.37305 12 12 12h19.5v378.965c0 11.6172 10.7451 21.0352 24 21.0352h88.5v40c0 13.2549 10.7451 24 24 24h112c13.2549 0 24 -10.7451 24 -24v-40h88.5
|
|
||||||
c13.2549 0 24 -9.41797 24 -21.0352v-378.965h19.5c6.62695 0 12 -5.37305 12 -12zM79.5 -15h112.5v67c0 6.62695 5.37305 12 12 12h40c6.62695 0 12 -5.37305 12 -12v-67h112.5v351h-64.5v-24c0 -13.2549 -10.7451 -24 -24 -24h-112c-13.2549 0 -24 10.7451 -24 24v24
|
|
||||||
h-64.5v-351zM266 384h-26v26c0 3.31152 -2.68848 6 -6 6h-20c-3.31152 0 -6 -2.68848 -6 -6v-26h-26c-3.31152 0 -6 -2.68848 -6 -6v-20c0 -3.31152 2.68848 -6 6 -6h26v-26c0 -3.31152 2.68848 -6 6 -6h20c3.31152 0 6 2.68848 6 6v26h26c3.31152 0 6 2.68848 6 6v20
|
|
||||||
c0 3.31152 -2.68848 6 -6 6z" />
|
|
||||||
<glyph glyph-name="plus-square" unicode="" horiz-adv-x="448"
|
|
||||||
d="M352 208v-32c0 -6.59961 -5.40039 -12 -12 -12h-88v-88c0 -6.59961 -5.40039 -12 -12 -12h-32c-6.59961 0 -12 5.40039 -12 12v88h-88c-6.59961 0 -12 5.40039 -12 12v32c0 6.59961 5.40039 12 12 12h88v88c0 6.59961 5.40039 12 12 12h32c6.59961 0 12 -5.40039 12 -12
|
|
||||||
v-88h88c6.59961 0 12 -5.40039 12 -12zM448 368v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352c26.5 0 48 -21.5 48 -48zM400 22v340c0 3.2998 -2.7002 6 -6 6h-340c-3.2998 0 -6 -2.7002 -6 -6v-340
|
|
||||||
c0 -3.2998 2.7002 -6 6 -6h340c3.2998 0 6 2.7002 6 6z" />
|
|
||||||
<glyph glyph-name="circle" unicode=""
|
|
||||||
d="M256 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM256 -8c110.5 0 200 89.5 200 200s-89.5 200 -200 200s-200 -89.5 -200 -200s89.5 -200 200 -200z" />
|
|
||||||
<glyph glyph-name="smile" unicode="" horiz-adv-x="496"
|
|
||||||
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM168 208c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32
|
|
||||||
s32 -14.2998 32 -32s-14.2998 -32 -32 -32zM328 208c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32s32 -14.2998 32 -32s-14.2998 -32 -32 -32zM332 135.4c8.5 10.1992 23.7002 11.5 33.7998 3.09961c10.2002 -8.5 11.6006 -23.5996 3.10059 -33.7998
|
|
||||||
c-30 -36 -74.1006 -56.6006 -120.9 -56.6006s-90.9004 20.6006 -120.9 56.6006c-8.39941 10.2002 -7.09961 25.2998 3.10059 33.7998c10.0996 8.40039 25.2998 7.09961 33.7998 -3.09961c20.7998 -25.1006 51.5 -39.4004 84 -39.4004s63.2002 14.4004 84 39.4004z" />
|
|
||||||
<glyph glyph-name="frown" unicode="" horiz-adv-x="496"
|
|
||||||
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM168 208c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32
|
|
||||||
s32 -14.2998 32 -32s-14.2998 -32 -32 -32zM328 272c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32s-32 14.2998 -32 32s14.2998 32 32 32zM248 144c40.2002 0 78 -17.7002 103.8 -48.5996c8.40039 -10.2002 7.10059 -25.3008 -3.09961 -33.8008
|
|
||||||
c-10.7002 -8.7998 -25.7002 -6.59961 -33.7998 3.10059c-16.6006 20 -41 31.3994 -66.9004 31.3994s-50.2998 -11.5 -66.9004 -31.3994c-8.5 -10.2002 -23.5996 -11.5 -33.7998 -3.10059c-10.2002 8.5 -11.5996 23.6006 -3.09961 33.8008
|
|
||||||
c25.7998 30.8994 63.5996 48.5996 103.8 48.5996z" />
|
|
||||||
<glyph glyph-name="meh" unicode="" horiz-adv-x="496"
|
|
||||||
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM168 208c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32
|
|
||||||
s32 -14.2998 32 -32s-14.2998 -32 -32 -32zM328 272c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32s-32 14.2998 -32 32s14.2998 32 32 32zM336 128c13.2002 0 24 -10.7998 24 -24s-10.7998 -24 -24 -24h-176c-13.2002 0 -24 10.7998 -24 24s10.7998 24 24 24h176z
|
|
||||||
" />
|
|
||||||
<glyph glyph-name="keyboard" unicode="" horiz-adv-x="576"
|
|
||||||
d="M528 384c26.5098 0 48 -21.4902 48 -48v-288c0 -26.5098 -21.4902 -48 -48 -48h-480c-26.5098 0 -48 21.4902 -48 48v288c0 26.5098 21.4902 48 48 48h480zM536 48v288c0 4.41113 -3.58887 8 -8 8h-480c-4.41113 0 -8 -3.58887 -8 -8v-288c0 -4.41113 3.58887 -8 8 -8
|
|
||||||
h480c4.41113 0 8 3.58887 8 8zM170 178c0 -6.62695 -5.37305 -12 -12 -12h-28c-6.62695 0 -12 5.37305 -12 12v28c0 6.62695 5.37305 12 12 12h28c6.62695 0 12 -5.37305 12 -12v-28zM266 178c0 -6.62695 -5.37305 -12 -12 -12h-28c-6.62695 0 -12 5.37305 -12 12v28
|
|
||||||
c0 6.62695 5.37305 12 12 12h28c6.62695 0 12 -5.37305 12 -12v-28zM362 178c0 -6.62695 -5.37305 -12 -12 -12h-28c-6.62695 0 -12 5.37305 -12 12v28c0 6.62695 5.37305 12 12 12h28c6.62695 0 12 -5.37305 12 -12v-28zM458 178c0 -6.62695 -5.37305 -12 -12 -12h-28
|
|
||||||
c-6.62695 0 -12 5.37305 -12 12v28c0 6.62695 5.37305 12 12 12h28c6.62695 0 12 -5.37305 12 -12v-28zM122 96c0 -6.62695 -5.37305 -12 -12 -12h-28c-6.62695 0 -12 5.37305 -12 12v28c0 6.62695 5.37305 12 12 12h28c6.62695 0 12 -5.37305 12 -12v-28zM506 96
|
|
||||||
c0 -6.62695 -5.37305 -12 -12 -12h-28c-6.62695 0 -12 5.37305 -12 12v28c0 6.62695 5.37305 12 12 12h28c6.62695 0 12 -5.37305 12 -12v-28zM122 260c0 -6.62695 -5.37305 -12 -12 -12h-28c-6.62695 0 -12 5.37305 -12 12v28c0 6.62695 5.37305 12 12 12h28
|
|
||||||
c6.62695 0 12 -5.37305 12 -12v-28zM218 260c0 -6.62695 -5.37305 -12 -12 -12h-28c-6.62695 0 -12 5.37305 -12 12v28c0 6.62695 5.37305 12 12 12h28c6.62695 0 12 -5.37305 12 -12v-28zM314 260c0 -6.62695 -5.37305 -12 -12 -12h-28c-6.62695 0 -12 5.37305 -12 12v28
|
|
||||||
c0 6.62695 5.37305 12 12 12h28c6.62695 0 12 -5.37305 12 -12v-28zM410 260c0 -6.62695 -5.37305 -12 -12 -12h-28c-6.62695 0 -12 5.37305 -12 12v28c0 6.62695 5.37305 12 12 12h28c6.62695 0 12 -5.37305 12 -12v-28zM506 260c0 -6.62695 -5.37305 -12 -12 -12h-28
|
|
||||||
c-6.62695 0 -12 5.37305 -12 12v28c0 6.62695 5.37305 12 12 12h28c6.62695 0 12 -5.37305 12 -12v-28zM408 102c0 -6.62695 -5.37305 -12 -12 -12h-216c-6.62695 0 -12 5.37305 -12 12v16c0 6.62695 5.37305 12 12 12h216c6.62695 0 12 -5.37305 12 -12v-16z" />
|
|
||||||
<glyph glyph-name="calendar" unicode="" horiz-adv-x="448"
|
|
||||||
d="M400 384c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h48v52c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-52h128v52c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12
|
|
||||||
v-52h48zM394 -16c3.2998 0 6 2.7002 6 6v298h-352v-298c0 -3.2998 2.7002 -6 6 -6h340z" />
|
|
||||||
<glyph glyph-name="play-circle" unicode=""
|
|
||||||
d="M371.7 210c16.3994 -9.2002 16.3994 -32.9004 0 -42l-176 -101c-15.9004 -8.7998 -35.7002 2.59961 -35.7002 21v208c0 18.5 19.9004 29.7998 35.7002 21zM504 192c0 -137 -111 -248 -248 -248s-248 111 -248 248s111 248 248 248s248 -111 248 -248zM56 192
|
|
||||||
c0 -110.5 89.5 -200 200 -200s200 89.5 200 200s-89.5 200 -200 200s-200 -89.5 -200 -200z" />
|
|
||||||
<glyph glyph-name="minus-square" unicode="" horiz-adv-x="448"
|
|
||||||
d="M108 164c-6.59961 0 -12 5.40039 -12 12v32c0 6.59961 5.40039 12 12 12h232c6.59961 0 12 -5.40039 12 -12v-32c0 -6.59961 -5.40039 -12 -12 -12h-232zM448 368v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h352
|
|
||||||
c26.5 0 48 -21.5 48 -48zM400 22v340c0 3.2998 -2.7002 6 -6 6h-340c-3.2998 0 -6 -2.7002 -6 -6v-340c0 -3.2998 2.7002 -6 6 -6h340c3.2998 0 6 2.7002 6 6z" />
|
|
||||||
<glyph glyph-name="check-square" unicode="" horiz-adv-x="448"
|
|
||||||
d="M400 416c26.5098 0 48 -21.4902 48 -48v-352c0 -26.5098 -21.4902 -48 -48 -48h-352c-26.5098 0 -48 21.4902 -48 48v352c0 26.5098 21.4902 48 48 48h352zM400 16v352h-352v-352h352zM364.136 257.724l-172.589 -171.204
|
|
||||||
c-4.70508 -4.66699 -12.3027 -4.63672 -16.9697 0.0683594l-90.7812 91.5156c-4.66699 4.70508 -4.63672 12.3037 0.0693359 16.9717l22.7188 22.5361c4.70508 4.66699 12.3027 4.63672 16.9697 -0.0693359l59.792 -60.2773l141.353 140.217
|
|
||||||
c4.70508 4.66699 12.3027 4.63672 16.9697 -0.0683594l22.5361 -22.7178c4.66699 -4.70605 4.63672 -12.3047 -0.0683594 -16.9717z" />
|
|
||||||
<glyph glyph-name="share-square" unicode="" horiz-adv-x="576"
|
|
||||||
d="M561.938 289.94c18.75 -18.7402 18.75 -49.1406 0 -67.8809l-143.998 -144c-29.9727 -29.9727 -81.9404 -9.05273 -81.9404 33.9404v53.7998c-101.266 -7.83691 -99.625 -31.6406 -84.1104 -78.7598c14.2285 -43.0889 -33.4736 -79.248 -71.0195 -55.7402
|
|
||||||
c-51.6924 32.3057 -84.8701 83.0635 -84.8701 144.76c0 39.3408 12.2197 72.7402 36.3301 99.3008c19.8398 21.8398 47.7402 38.4697 82.9102 49.4199c36.7295 11.4395 78.3096 16.1094 120.76 17.9893v57.1982c0 42.9355 51.9258 63.9541 81.9404 33.9404zM384 112l144 144
|
|
||||||
l-144 144v-104.09c-110.86 -0.90332 -240 -10.5166 -240 -119.851c0 -52.1396 32.79 -85.6094 62.3096 -104.06c-39.8174 120.65 48.999 141.918 177.69 143.84v-103.84zM408.74 27.5068c6.14844 1.75684 15.5449 5.92383 20.9736 9.30273
|
|
||||||
c7.97656 4.95215 18.2861 -0.825195 18.2861 -10.2139v-42.5957c0 -26.5098 -21.4902 -48 -48 -48h-352c-26.5098 0 -48 21.4902 -48 48v352c0 26.5098 21.4902 48 48 48h132c6.62695 0 12 -5.37305 12 -12v-4.48633c0 -4.91699 -2.9873 -9.36914 -7.56934 -11.1514
|
|
||||||
c-13.7021 -5.33105 -26.3955 -11.5371 -38.0498 -18.585c-1.59668 -0.974609 -4.41016 -1.77051 -6.28027 -1.77734h-86.1006c-3.31152 0 -6 -2.68848 -6 -6v-340c0 -3.31152 2.68848 -6 6 -6h340c3.31152 0 6 2.68848 6 6v25.9658c0 5.37012 3.5791 10.0596 8.74023 11.541
|
|
||||||
z" />
|
|
||||||
<glyph glyph-name="compass" unicode="" horiz-adv-x="496"
|
|
||||||
d="M347.94 318.14c16.6592 7.61035 33.8096 -9.54004 26.1992 -26.1992l-65.9697 -144.341c-2.73047 -5.97363 -9.7959 -13.0391 -15.7695 -15.7695l-144.341 -65.9697c-16.6592 -7.61035 -33.8096 9.5498 -26.1992 26.1992l65.9697 144.341
|
|
||||||
c2.73047 5.97363 9.7959 13.0391 15.7695 15.7695zM270.58 169.42c12.4697 12.4697 12.4697 32.6904 0 45.1602s-32.6904 12.4697 -45.1602 0s-12.4697 -32.6904 0 -45.1602s32.6904 -12.4697 45.1602 0zM248 440c136.97 0 248 -111.03 248 -248s-111.03 -248 -248 -248
|
|
||||||
s-248 111.03 -248 248s111.03 248 248 248zM248 -8c110.28 0 200 89.7197 200 200s-89.7197 200 -200 200s-200 -89.7197 -200 -200s89.7197 -200 200 -200z" />
|
|
||||||
<glyph glyph-name="caret-square-down" unicode="" horiz-adv-x="448"
|
|
||||||
d="M125.1 240h197.801c10.6992 0 16.0996 -13 8.5 -20.5l-98.9004 -98.2998c-4.7002 -4.7002 -12.2002 -4.7002 -16.9004 0l-98.8994 98.2998c-7.7002 7.5 -2.2998 20.5 8.39941 20.5zM448 368v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352
|
|
||||||
c0 26.5 21.5 48 48 48h352c26.5 0 48 -21.5 48 -48zM400 22v340c0 3.2998 -2.7002 6 -6 6h-340c-3.2998 0 -6 -2.7002 -6 -6v-340c0 -3.2998 2.7002 -6 6 -6h340c3.2998 0 6 2.7002 6 6z" />
|
|
||||||
<glyph glyph-name="caret-square-up" unicode="" horiz-adv-x="448"
|
|
||||||
d="M322.9 144h-197.801c-10.6992 0 -16.0996 13 -8.5 20.5l98.9004 98.2998c4.7002 4.7002 12.2002 4.7002 16.9004 0l98.8994 -98.2998c7.7002 -7.5 2.2998 -20.5 -8.39941 -20.5zM448 368v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352
|
|
||||||
c0 26.5 21.5 48 48 48h352c26.5 0 48 -21.5 48 -48zM400 22v340c0 3.2998 -2.7002 6 -6 6h-340c-3.2998 0 -6 -2.7002 -6 -6v-340c0 -3.2998 2.7002 -6 6 -6h340c3.2998 0 6 2.7002 6 6z" />
|
|
||||||
<glyph glyph-name="caret-square-right" unicode="" horiz-adv-x="448"
|
|
||||||
d="M176 93.0996v197.801c0 10.6992 13 16.0996 20.5 8.5l98.2998 -98.9004c4.7002 -4.7002 4.7002 -12.2002 0 -16.9004l-98.2998 -98.8994c-7.5 -7.7002 -20.5 -2.2998 -20.5 8.39941zM448 368v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352
|
|
||||||
c0 26.5 21.5 48 48 48h352c26.5 0 48 -21.5 48 -48zM400 22v340c0 3.2998 -2.7002 6 -6 6h-340c-3.2998 0 -6 -2.7002 -6 -6v-340c0 -3.2998 2.7002 -6 6 -6h340c3.2998 0 6 2.7002 6 6z" />
|
|
||||||
<glyph glyph-name="file" unicode="" horiz-adv-x="384"
|
|
||||||
d="M369.9 350.1c9 -9 14.0996 -21.2998 14.0996 -34v-332.1c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48.0996h204.1c12.7002 0 24.9004 -5.09961 33.9004 -14.0996zM332.1 320l-76.0996 76.0996v-76.0996h76.0996zM48 -16h288v288
|
|
||||||
h-104c-13.2998 0 -24 10.7002 -24 24v104h-160v-416z" />
|
|
||||||
<glyph glyph-name="file-alt" unicode="" horiz-adv-x="384"
|
|
||||||
d="M288 200v-28c0 -6.59961 -5.40039 -12 -12 -12h-168c-6.59961 0 -12 5.40039 -12 12v28c0 6.59961 5.40039 12 12 12h168c6.59961 0 12 -5.40039 12 -12zM276 128c6.59961 0 12 -5.40039 12 -12v-28c0 -6.59961 -5.40039 -12 -12 -12h-168c-6.59961 0 -12 5.40039 -12 12
|
|
||||||
v28c0 6.59961 5.40039 12 12 12h168zM384 316.1v-332.1c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48h204.1c12.7002 0 24.9004 -5.09961 33.9004 -14.0996l83.9004 -83.9004c9 -8.90039 14.0996 -21.2002 14.0996 -33.9004z
|
|
||||||
M256 396.1v-76.0996h76.0996zM336 -16v288h-104c-13.2998 0 -24 10.7002 -24 24v104h-160v-416h288z" />
|
|
||||||
<glyph glyph-name="thumbs-up" unicode=""
|
|
||||||
d="M466.27 161.31c4.6748 -22.6465 0.864258 -44.5371 -8.98926 -62.9893c2.95898 -23.8682 -4.02148 -48.5654 -17.3398 -66.9902c-0.954102 -55.9072 -35.8232 -95.3301 -112.94 -95.3301c-7 0 -15 0.00976562 -22.2197 0.00976562
|
|
||||||
c-102.742 0 -133.293 38.9395 -177.803 39.9404c-3.56934 -13.7764 -16.085 -23.9502 -30.9775 -23.9502h-64c-17.6729 0 -32 14.3271 -32 32v240c0 17.6729 14.3271 32 32 32h98.7598c19.1455 16.9531 46.0137 60.6533 68.7598 83.4004
|
|
||||||
c13.667 13.667 10.1533 108.6 71.7607 108.6c57.5801 0 95.2695 -31.9355 95.2695 -104.73c0 -18.4092 -3.92969 -33.7295 -8.84961 -46.5391h36.4795c48.6025 0 85.8203 -41.5654 85.8203 -85.5801c0 -19.1504 -4.95996 -34.9902 -13.7305 -49.8408zM404.52 107.48
|
|
||||||
c21.5811 20.3838 18.6992 51.0645 5.21094 65.6191c9.44922 0 22.3594 18.9102 22.2695 37.8105c-0.0898438 18.9102 -16.71 37.8203 -37.8203 37.8203h-103.989c0 37.8193 28.3594 55.3691 28.3594 94.5391c0 23.75 0 56.7305 -47.2695 56.7305
|
|
||||||
c-18.9102 -18.9102 -9.45996 -66.1797 -37.8203 -94.54c-26.5596 -26.5703 -66.1797 -97.46 -94.54 -97.46h-10.9199v-186.17c53.6113 0 100.001 -37.8203 171.64 -37.8203h37.8203c35.5117 0 60.8203 17.1201 53.1201 65.9004
|
|
||||||
c15.2002 8.16016 26.5 36.4395 13.9395 57.5703zM88 16c0 13.2549 -10.7451 24 -24 24s-24 -10.7451 -24 -24s10.7451 -24 24 -24s24 10.7451 24 24z" />
|
|
||||||
<glyph glyph-name="thumbs-down" unicode=""
|
|
||||||
d="M466.27 222.69c8.77051 -14.8506 13.7305 -30.6904 13.7305 -49.8408c0 -44.0146 -37.2178 -85.5801 -85.8203 -85.5801h-36.4795c4.91992 -12.8096 8.84961 -28.1299 8.84961 -46.5391c0 -72.7949 -37.6895 -104.73 -95.2695 -104.73
|
|
||||||
c-61.6074 0 -58.0938 94.9326 -71.7607 108.6c-22.7461 22.7471 -49.6133 66.4473 -68.7598 83.4004h-7.05176c-5.5332 -9.56152 -15.8662 -16 -27.708 -16h-64c-17.6729 0 -32 14.3271 -32 32v240c0 17.6729 14.3271 32 32 32h64c8.11328 0 15.5146 -3.02539 21.1553 -8
|
|
||||||
h10.8447c40.9971 0 73.1953 39.9902 176.78 39.9902c7.21973 0 15.2197 0.00976562 22.2197 0.00976562c77.1172 0 111.986 -39.4229 112.94 -95.3301c13.3184 -18.4248 20.2979 -43.1221 17.3398 -66.9902c9.85352 -18.4521 13.6641 -40.3428 8.98926 -62.9893zM64 152
|
|
||||||
c13.2549 0 24 10.7451 24 24s-10.7451 24 -24 24s-24 -10.7451 -24 -24s10.7451 -24 24 -24zM394.18 135.27c21.1104 0 37.7305 18.9102 37.8203 37.8203c0.0898438 18.9004 -12.8203 37.8105 -22.2695 37.8105c13.4883 14.5547 16.3701 45.2354 -5.21094 65.6191
|
|
||||||
c12.5605 21.1309 1.26074 49.4102 -13.9395 57.5703c7.7002 48.7803 -17.6084 65.9004 -53.1201 65.9004h-37.8203c-71.6387 0 -118.028 -37.8203 -171.64 -37.8203v-186.17h10.9199c28.3604 0 67.9805 -70.8896 94.54 -97.46
|
|
||||||
c28.3604 -28.3604 18.9102 -75.6299 37.8203 -94.54c47.2695 0 47.2695 32.9805 47.2695 56.7305c0 39.1699 -28.3594 56.7197 -28.3594 94.5391h103.989z" />
|
|
||||||
<glyph glyph-name="sun" unicode=""
|
|
||||||
d="M494.2 226.1c11.2002 -7.59961 17.7998 -20.0996 17.8994 -33.6992c0 -13.4004 -6.69922 -26 -17.7998 -33.5l-59.7998 -40.5l13.7002 -71c2.5 -13.2002 -1.60059 -26.8008 -11.1006 -36.3008s-22.8994 -13.7998 -36.2998 -11.0996l-70.8994 13.7002l-40.4004 -59.9004
|
|
||||||
c-7.5 -11.0996 -20.0996 -17.7998 -33.5 -17.7998s-26 6.7002 -33.5 17.9004l-40.4004 59.8994l-70.7998 -13.7002c-13.3994 -2.59961 -26.7998 1.60059 -36.2998 11.1006s-13.7002 23.0996 -11.0996 36.2998l13.6992 71l-59.7998 40.5
|
|
||||||
c-11.0996 7.5 -17.7998 20 -17.7998 33.5s6.59961 26 17.7998 33.5996l59.7998 40.5l-13.6992 71c-2.60059 13.2002 1.59961 26.7002 11.0996 36.3008c9.5 9.59961 23 13.6992 36.2998 11.1992l70.7998 -13.6992l40.4004 59.8994c15.0996 22.2998 51.9004 22.2998 67 0
|
|
||||||
l40.4004 -59.8994l70.8994 13.6992c13 2.60059 26.6006 -1.59961 36.2002 -11.0996c9.5 -9.59961 13.7002 -23.2002 11.0996 -36.4004l-13.6992 -71zM381.3 140.5l76.7998 52.0996l-76.7998 52l17.6006 91.1006l-91 -17.6006l-51.9004 76.9004l-51.7998 -76.7998
|
|
||||||
l-91 17.5996l17.5996 -91.2002l-76.7998 -52l76.7998 -52l-17.5996 -91.1992l90.8994 17.5996l51.9004 -77l51.9004 76.9004l91 -17.6006zM256 296c57.2998 0 104 -46.7002 104 -104s-46.7002 -104 -104 -104s-104 46.7002 -104 104s46.7002 104 104 104zM256 136
|
|
||||||
c30.9004 0 56 25.0996 56 56s-25.0996 56 -56 56s-56 -25.0996 -56 -56s25.0996 -56 56 -56z" />
|
|
||||||
<glyph glyph-name="moon" unicode=""
|
|
||||||
d="M279.135 -64c-141.424 0 -256 114.64 -256 256c0 141.425 114.641 256 256 256c13.0068 -0.00195312 33.9443 -1.91797 46.7354 -4.27734c44.0205 -8.13086 53.7666 -66.8691 15.0215 -88.9189c-41.374 -23.5439 -67.4336 -67.4121 -67.4336 -115.836
|
|
||||||
c0 -83.5234 75.9238 -146.475 158.272 -130.792c43.6904 8.32129 74.5186 -42.5693 46.248 -77.4004c-47.8613 -58.9717 -120.088 -94.7754 -198.844 -94.7754zM279.135 400c-114.875 0 -208 -93.125 -208 -208s93.125 -208 208 -208
|
|
||||||
c65.2314 0 123.439 30.0361 161.575 77.0244c-111.611 -21.2568 -215.252 64.0957 -215.252 177.943c0 67.5127 36.9326 126.392 91.6934 157.555c-12.3271 2.27637 -25.0312 3.47754 -38.0166 3.47754z" />
|
|
||||||
<glyph glyph-name="caret-square-left" unicode="" horiz-adv-x="448"
|
|
||||||
d="M272 290.9v-197.801c0 -10.6992 -13 -16.0996 -20.5 -8.5l-98.2998 98.9004c-4.7002 4.7002 -4.7002 12.2002 0 16.9004l98.2998 98.8994c7.5 7.7002 20.5 2.2998 20.5 -8.39941zM448 368v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352
|
|
||||||
c0 26.5 21.5 48 48 48h352c26.5 0 48 -21.5 48 -48zM400 22v340c0 3.2998 -2.7002 6 -6 6h-340c-3.2998 0 -6 -2.7002 -6 -6v-340c0 -3.2998 2.7002 -6 6 -6h340c3.2998 0 6 2.7002 6 6z" />
|
|
||||||
<glyph glyph-name="dot-circle" unicode=""
|
|
||||||
d="M256 392c-110.549 0 -200 -89.4678 -200 -200c0 -110.549 89.4678 -200 200 -200c110.549 0 200 89.4678 200 200c0 110.549 -89.4678 200 -200 200zM256 440c136.967 0 248 -111.033 248 -248s-111.033 -248 -248 -248s-248 111.033 -248 248s111.033 248 248 248z
|
|
||||||
M256 272c44.1826 0 80 -35.8174 80 -80s-35.8174 -80 -80 -80s-80 35.8174 -80 80s35.8174 80 80 80z" />
|
|
||||||
<glyph glyph-name="building" unicode="" horiz-adv-x="448"
|
|
||||||
d="M128 300v40c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12h-40c-6.59961 0 -12 5.40039 -12 12zM268 288c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-40
|
|
||||||
c0 -6.59961 -5.40039 -12 -12 -12h-40zM140 192c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12h-40zM268 192c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h40
|
|
||||||
c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12h-40zM192 108c0 -6.59961 -5.40039 -12 -12 -12h-40c-6.59961 0 -12 5.40039 -12 12v40c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-40zM268 96c-6.59961 0 -12 5.40039 -12 12v40
|
|
||||||
c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12h-40zM448 -28v-36h-448v36c0 6.59961 5.40039 12 12 12h19.5v440c0 13.2998 10.7002 24 24 24h337c13.2998 0 24 -10.7002 24 -24v-440h19.5
|
|
||||||
c6.59961 0 12 -5.40039 12 -12zM79.5 -15h112.5v67c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-67h112.5v414l-288.5 1z" />
|
|
||||||
<glyph glyph-name="file-pdf" unicode="" horiz-adv-x="384"
|
|
||||||
d="M369.9 350.1c9 -9 14.0996 -21.2998 14.0996 -34v-332.1c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48.0996h204.1c12.7002 0 24.9004 -5.09961 33.9004 -14.0996zM332.1 320l-76.0996 76.0996v-76.0996h76.0996zM48 -16h288v288
|
|
||||||
h-104c-13.2998 0 -24 10.7002 -24 24v104h-160v-416zM298.2 127.7c10.5 -10.5 8 -38.7002 -17.5 -38.7002c-14.7998 0 -36.9004 6.7998 -55.7998 17c-21.6006 -3.59961 -46 -12.7002 -68.4004 -20.0996c-50.0996 -86.4004 -79.4004 -47 -76.0996 -31.2002
|
|
||||||
c4 20 31 35.8994 51 46.2002c10.5 18.3994 25.3994 50.5 35.3994 74.3994c-7.39941 28.6006 -11.3994 51 -7 67.1006c4.7998 17.6992 38.4004 20.2998 42.6006 -5.90039c4.69922 -15.4004 -1.5 -39.9004 -5.40039 -56c8.09961 -21.2998 19.5996 -35.7998 36.7998 -46.2998
|
|
||||||
c17.4004 2.2002 52.2002 5.5 64.4004 -6.5zM100.1 49.9004c0 -0.700195 11.4004 4.69922 30.4004 35c-5.90039 -5.5 -25.2998 -21.3008 -30.4004 -35zM181.7 240.5c-2.5 0 -2.60059 -26.9004 1.7998 -40.7998c4.90039 8.7002 5.59961 40.7998 -1.7998 40.7998zM157.3 103.9
|
|
||||||
c15.9004 6.09961 34 14.8994 54.7998 19.1992c-11.1992 8.30078 -21.7998 20.4004 -30.0996 35.5c-6.7002 -17.6992 -15 -37.7998 -24.7002 -54.6992zM288.9 108.9c3.59961 2.39941 -2.2002 10.3994 -37.3008 7.7998c32.3008 -13.7998 37.3008 -7.7998 37.3008 -7.7998z" />
|
|
||||||
<glyph glyph-name="file-word" unicode="" horiz-adv-x="384"
|
|
||||||
d="M369.9 350.1c9 -9 14.0996 -21.2998 14.0996 -34v-332.1c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48.0996h204.1c12.7002 0 24.9004 -5.09961 33.9004 -14.0996zM332.1 320l-76.0996 76.0996v-76.0996h76.0996zM48 -16h288v288
|
|
||||||
h-104c-13.2998 0 -24 10.7002 -24 24v104h-160v-416zM268.1 192v0.200195h15.8008c7.7998 0 13.5 -7.2998 11.5996 -14.9004c-4.2998 -17 -13.7002 -54.0996 -34.5 -136c-1.2998 -5.39941 -6.09961 -9.09961 -11.5996 -9.09961h-24.7002
|
|
||||||
c-5.5 0 -10.2998 3.7998 -11.6006 9.09961c-5.2998 20.9004 -17.7998 71 -17.8994 71.4004l-2.90039 17.2998c-0.5 -5.2998 -1.5 -11.0996 -3 -17.2998l-17.8994 -71.4004c-1.30078 -5.39941 -6.10059 -9.09961 -11.6006 -9.09961h-25.2002
|
|
||||||
c-5.59961 0 -10.3994 3.7002 -11.6992 9.09961c-6.5 26.5 -25.2002 103.4 -33.2002 136c-1.7998 7.5 3.89941 14.7998 11.7002 14.7998h16.7998c5.7998 0 10.7002 -4.09961 11.7998 -9.69922c5 -25.7002 18.4004 -93.8008 19.0996 -99
|
|
||||||
c0.300781 -1.7002 0.400391 -3.10059 0.5 -4.2002c0.800781 7.5 0.400391 4.7002 24.8008 103.7c1.39941 5.2998 6.19922 9.09961 11.6992 9.09961h13.3008c5.59961 0 10.3994 -3.7998 11.6992 -9.2002c23.9004 -99.7002 22.8008 -94.3994 23.6006 -99.5
|
|
||||||
c0.299805 -1.7002 0.5 -3.09961 0.700195 -4.2998c0.599609 8.09961 0.399414 5.7998 21 103.5c1.09961 5.5 6 9.5 11.6992 9.5z" />
|
|
||||||
<glyph glyph-name="file-excel" unicode="" horiz-adv-x="384"
|
|
||||||
d="M369.9 350.1c9 -9 14.0996 -21.2998 14.0996 -34v-332.1c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48.0996h204.1c12.7002 0 24.9004 -5.09961 33.9004 -14.0996zM332.1 320l-76.0996 76.0996v-76.0996h76.0996zM48 -16h288v288
|
|
||||||
h-104c-13.2998 0 -24 10.7002 -24 24v104h-160v-416zM260 224c9.2002 0 15 -10 10.2998 -18c-16 -27.5 -45.5996 -76.9004 -46.2998 -78l46.4004 -78c4.59961 -8 -1.10059 -18 -10.4004 -18h-28.7998c-4.40039 0 -8.5 2.40039 -10.6006 6.2998
|
|
||||||
c-22.6992 41.7998 -13.6992 27.5 -28.5996 57.7002c-5.59961 -12.7002 -6.90039 -17.7002 -28.5996 -57.7002c-2.10059 -3.89941 -6.10059 -6.2998 -10.5 -6.2998h-28.9004c-9.2998 0 -15.0996 10 -10.4004 18l46.3008 78l-46.3008 78c-4.59961 8 1.10059 18 10.4004 18
|
|
||||||
h28.9004c4.39941 0 8.5 -2.40039 10.5996 -6.2998c21.7002 -40.4004 14.7002 -28.6006 28.5996 -57.7002c6.40039 15.2998 10.6006 24.5996 28.6006 57.7002c2.09961 3.89941 6.09961 6.2998 10.5 6.2998h28.7998z" />
|
|
||||||
<glyph glyph-name="file-powerpoint" unicode="" horiz-adv-x="384"
|
|
||||||
d="M369.9 350.1c9 -9 14.0996 -21.2998 14.0996 -34v-332.1c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48.0996h204.1c12.7002 0 24.9004 -5.09961 33.9004 -14.0996zM332.1 320l-76.0996 76.0996v-76.0996h76.0996zM48 -16h288v288
|
|
||||||
h-104c-13.2998 0 -24 10.7002 -24 24v104h-160v-416zM120 44v168c0 6.59961 5.40039 12 12 12h69.2002c36.7002 0 62.7998 -27 62.7998 -66.2998c0 -74.2998 -68.7002 -66.5 -95.5 -66.5v-47.2002c0 -6.59961 -5.40039 -12 -12 -12h-24.5c-6.59961 0 -12 5.40039 -12 12z
|
|
||||||
M168.5 131.4h23c7.90039 0 13.9004 2.39941 18.0996 7.19922c8.5 9.80078 8.40039 28.5 0.100586 37.8008c-4.10059 4.59961 -9.90039 7 -17.4004 7h-23.8994v-52h0.0996094z" />
|
|
||||||
<glyph glyph-name="file-image" unicode="" horiz-adv-x="384"
|
|
||||||
d="M369.9 350.1c9 -9 14.0996 -21.2998 14.0996 -34v-332.1c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48.0996h204.1c12.7002 0 24.9004 -5.09961 33.9004 -14.0996zM332.1 320l-76.0996 76.0996v-76.0996h76.0996zM48 -16h288v288
|
|
||||||
h-104c-13.2998 0 -24 10.7002 -24 24v104h-160v-416zM80 32v64l39.5 39.5c4.7002 4.7002 12.2998 4.7002 17 0l39.5 -39.5l87.5 87.5c4.7002 4.7002 12.2998 4.7002 17 0l23.5 -23.5v-128h-224zM128 272c26.5 0 48 -21.5 48 -48s-21.5 -48 -48 -48s-48 21.5 -48 48
|
|
||||||
s21.5 48 48 48z" />
|
|
||||||
<glyph glyph-name="file-archive" unicode="" horiz-adv-x="384"
|
|
||||||
d="M128.3 288h32v-32h-32v32zM192.3 384v-32h-32v32h32zM128.3 352h32v-32h-32v32zM192.3 320v-32h-32v32h32zM369.9 350.1c9 -9 14.0996 -21.2998 14.0996 -34v-332.1c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48.0996h204.1
|
|
||||||
c12.7002 0 24.9004 -5.09961 33.9004 -14.0996zM256 396.1v-76.0996h76.0996zM336 -16v288h-104c-13.2998 0 -24 10.7002 -24 24v104h-48.2998v-16h-32v16h-79.7002v-416h288zM194.2 182.3l17.2998 -87.7002c6.40039 -32.3994 -18.4004 -62.5996 -51.5 -62.5996
|
|
||||||
c-33.2002 0 -58 30.4004 -51.4004 62.9004l19.7002 97.0996v32h32v-32h22.1006c5.7998 0 10.6992 -4.09961 11.7998 -9.7002zM160.3 57.9004c17.9004 0 32.4004 12.0996 32.4004 27c0 14.8994 -14.5 27 -32.4004 27c-17.8994 0 -32.3994 -12.1006 -32.3994 -27
|
|
||||||
c0 -14.9004 14.5 -27 32.3994 -27zM192.3 256v-32h-32v32h32z" />
|
|
||||||
<glyph glyph-name="file-audio" unicode="" horiz-adv-x="384"
|
|
||||||
d="M369.941 350.059c7.75977 -7.75977 14.0586 -22.9658 14.0586 -33.9404v-332.118c0 -26.5098 -21.4902 -48 -48 -48h-288c-26.5098 0 -48 21.4902 -48 48v416c0 26.5098 21.4902 48 48 48h204.118c10.9746 0 26.1807 -6.29883 33.9404 -14.0586zM332.118 320
|
|
||||||
l-76.1182 76.1182v-76.1182h76.1182zM48 -16h288v288h-104c-13.2549 0 -24 10.7451 -24 24v104h-160v-416zM192 60.0244c0 -10.6914 -12.9258 -16.0459 -20.4854 -8.48535l-35.5146 35.9746h-28c-6.62695 0 -12 5.37305 -12 12v56c0 6.62695 5.37305 12 12 12h28
|
|
||||||
l35.5146 36.9473c7.56055 7.56055 20.4854 2.20605 20.4854 -8.48535v-135.951zM233.201 107.154c9.05078 9.29688 9.05957 24.1328 0.000976562 33.4385c-22.1494 22.752 12.2344 56.2461 34.3945 33.4814c27.1982 -27.9404 27.2119 -72.4443 0.000976562 -100.401
|
|
||||||
c-21.793 -22.3857 -56.9463 10.3154 -34.3965 33.4814z" />
|
|
||||||
<glyph glyph-name="file-video" unicode="" horiz-adv-x="384"
|
|
||||||
d="M369.941 350.059c7.75977 -7.75977 14.0586 -22.9658 14.0586 -33.9404v-332.118c0 -26.5098 -21.4902 -48 -48 -48h-288c-26.5098 0 -48 21.4902 -48 48v416c0 26.5098 21.4902 48 48 48h204.118c10.9746 0 26.1807 -6.29883 33.9404 -14.0586zM332.118 320
|
|
||||||
l-76.1182 76.1182v-76.1182h76.1182zM48 -16h288v288h-104c-13.2549 0 -24 10.7451 -24 24v104h-160v-416zM276.687 195.303c10.0049 10.0049 27.3135 2.99707 27.3135 -11.3135v-111.976c0 -14.2939 -17.2959 -21.332 -27.3135 -11.3135l-52.6865 52.6738v-37.374
|
|
||||||
c0 -11.0459 -8.9541 -20 -20 -20h-104c-11.0459 0 -20 8.9541 -20 20v104c0 11.0459 8.9541 20 20 20h104c11.0459 0 20 -8.9541 20 -20v-37.374z" />
|
|
||||||
<glyph glyph-name="file-code" unicode="" horiz-adv-x="384"
|
|
||||||
d="M149.9 98.9004c3.5 -3.30078 3.69922 -8.90039 0.399414 -12.4004l-17.3994 -18.5996c-1.60059 -1.80078 -4 -2.80078 -6.40039 -2.80078c-2.2002 0 -4.40039 0.900391 -6 2.40039l-57.7002 54.0996c-3.7002 3.40039 -3.7002 9.30078 0 12.8008l57.7002 54.0996
|
|
||||||
c3.40039 3.2998 9 3.2002 12.4004 -0.400391l17.3994 -18.5996l0.200195 -0.200195c3.2002 -3.59961 2.7998 -9.2002 -0.799805 -12.3994l-32.7998 -28.9004l32.7998 -28.9004zM369.9 350.1c9 -9 14.0996 -21.2998 14.0996 -34v-332.1c0 -26.5 -21.5 -48 -48 -48h-288
|
|
||||||
c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48.0996h204.1c12.7002 0 24.9004 -5.09961 33.9004 -14.0996zM256 396.1v-76.0996h76.0996zM336 -16v288h-104c-13.2998 0 -24 10.7002 -24 24v104h-160v-416h288zM209.6 234l24.4004 -7
|
|
||||||
c4.7002 -1.2998 7.40039 -6.2002 6 -10.9004l-54.7002 -188.199c-1.2998 -4.60059 -6.2002 -7.40039 -10.8994 -6l-24.4004 7.09961c-4.7002 1.2998 -7.40039 6.2002 -6 10.9004l54.7002 188.1c1.39941 4.7002 6.2002 7.40039 10.8994 6zM234.1 157.1
|
|
||||||
c-3.5 3.30078 -3.69922 8.90039 -0.399414 12.4004l17.3994 18.5996c3.30078 3.60059 8.90039 3.7002 12.4004 0.400391l57.7002 -54.0996c3.7002 -3.40039 3.7002 -9.30078 0 -12.8008l-57.7002 -54.0996c-3.5 -3.2998 -9.09961 -3.09961 -12.4004 0.400391
|
|
||||||
l-17.3994 18.5996l-0.200195 0.200195c-3.2002 3.59961 -2.7998 9.2002 0.799805 12.3994l32.7998 28.9004l-32.7998 28.9004z" />
|
|
||||||
<glyph glyph-name="life-ring" unicode=""
|
|
||||||
d="M256 -56c-136.967 0 -248 111.033 -248 248s111.033 248 248 248s248 -111.033 248 -248s-111.033 -248 -248 -248zM152.602 20.7197c63.2178 -38.3184 143.579 -38.3184 206.797 0l-53.4111 53.4111c-31.8467 -13.5215 -68.168 -13.5059 -99.9746 0zM336 192
|
|
||||||
c0 44.1123 -35.8877 80 -80 80s-80 -35.8877 -80 -80s35.8877 -80 80 -80s80 35.8877 80 80zM427.28 88.6016c38.3184 63.2178 38.3184 143.579 0 206.797l-53.4111 -53.4111c13.5215 -31.8467 13.5049 -68.168 0 -99.9746zM359.397 363.28
|
|
||||||
c-63.2168 38.3184 -143.578 38.3184 -206.796 0l53.4111 -53.4111c31.8457 13.5215 68.167 13.5049 99.9736 0zM84.7197 295.398c-38.3184 -63.2178 -38.3184 -143.579 0 -206.797l53.4111 53.4111c-13.5215 31.8467 -13.5059 68.168 0 99.9746z" />
|
|
||||||
<glyph glyph-name="paper-plane" unicode=""
|
|
||||||
d="M440 441.5c34.5996 19.9004 77.5996 -8.7998 71.5 -48.9004l-59.4004 -387.199c-2.2998 -14.5 -11.0996 -27.3008 -23.8994 -34.5c-7.2998 -4.10059 -15.4004 -6.2002 -23.6006 -6.2002c-6.19922 0 -12.3994 1.2002 -18.2998 3.59961l-111.899 46.2002l-43.8008 -59.0996
|
|
||||||
c-27.3994 -36.9004 -86.5996 -17.8008 -86.5996 28.5996v84.4004l-114.3 47.2998c-36.7998 15.0996 -40.1006 66 -5.7002 85.8994zM192 -16l36.5996 49.5l-36.5996 15.0996v-64.5996zM404.6 12.7002l59.4004 387.3l-416 -240l107.8 -44.5996l211.5 184.3
|
|
||||||
c14.2002 12.2998 34.4004 -5.7002 23.7002 -21.2002l-140.2 -202.3z" />
|
|
||||||
<glyph glyph-name="futbol" unicode="" horiz-adv-x="496"
|
|
||||||
d="M483.8 268.6c42.2998 -130.199 -29 -270.1 -159.2 -312.399c-25.5 -8.2998 -51.2998 -12.2002 -76.6992 -12.2002c-104.5 0 -201.7 66.5996 -235.7 171.4c-42.2998 130.199 29 270.1 159.2 312.399c25.5 8.2998 51.2998 12.2002 76.6992 12.2002
|
|
||||||
c104.5 0 201.7 -66.5996 235.7 -171.4zM409.3 74.9004c6.10059 8.39941 12.1006 16.8994 16.7998 26.1992c14.3008 28.1006 21.5 58.5 21.7002 89.2002l-38.8994 36.4004l-71.1006 -22.1006l-24.3994 -75.1992l43.6992 -60.9004zM409.3 310.3
|
|
||||||
c-24.5 33.4004 -58.7002 58.4004 -97.8994 71.4004l-47.4004 -26.2002v-73.7998l64.2002 -46.5l70.7002 22zM184.9 381.6c-39.9004 -13.2998 -73.5 -38.5 -97.8008 -71.8994l10.1006 -52.5l70.5996 -22l64.2002 46.5v73.7998zM139 68.5l43.5 61.7002l-24.2998 74.2998
|
|
||||||
l-71.1006 22.2002l-39 -36.4004c0.5 -55.7002 23.4004 -95.2002 37.8008 -115.3zM187.2 1.5c64.0996 -20.4004 115.5 -1.7998 121.7 0l22.3994 48.0996l-44.2998 61.7002h-78.5996l-43.6006 -61.7002z" />
|
|
||||||
<glyph glyph-name="newspaper" unicode="" horiz-adv-x="576"
|
|
||||||
d="M552 384c13.2549 0 24 -10.7451 24 -24v-336c0 -13.2549 -10.7451 -24 -24 -24h-496c-30.9277 0 -56 25.0723 -56 56v272c0 13.2549 10.7451 24 24 24h42.752c6.60547 18.623 24.3896 32 45.248 32h440zM48 56c0 -4.41113 3.58887 -8 8 -8s8 3.58887 8 8v248h-16v-248z
|
|
||||||
M528 48v288h-416v-280c0 -2.7168 -0.204102 -5.38574 -0.578125 -8h416.578zM172 168c-6.62695 0 -12 5.37305 -12 12v96c0 6.62695 5.37305 12 12 12h136c6.62695 0 12 -5.37305 12 -12v-96c0 -6.62695 -5.37305 -12 -12 -12h-136zM200 248v-40h80v40h-80zM160 108v24
|
|
||||||
c0 6.62695 5.37305 12 12 12h136c6.62695 0 12 -5.37305 12 -12v-24c0 -6.62695 -5.37305 -12 -12 -12h-136c-6.62695 0 -12 5.37305 -12 12zM352 108v24c0 6.62695 5.37305 12 12 12h104c6.62695 0 12 -5.37305 12 -12v-24c0 -6.62695 -5.37305 -12 -12 -12h-104
|
|
||||||
c-6.62695 0 -12 5.37305 -12 12zM352 252v24c0 6.62695 5.37305 12 12 12h104c6.62695 0 12 -5.37305 12 -12v-24c0 -6.62695 -5.37305 -12 -12 -12h-104c-6.62695 0 -12 5.37305 -12 12zM352 180v24c0 6.62695 5.37305 12 12 12h104c6.62695 0 12 -5.37305 12 -12v-24
|
|
||||||
c0 -6.62695 -5.37305 -12 -12 -12h-104c-6.62695 0 -12 5.37305 -12 12z" />
|
|
||||||
<glyph glyph-name="bell-slash" unicode="" horiz-adv-x="640"
|
|
||||||
d="M633.99 -23.0195c6.91016 -5.52051 8.01953 -15.5908 2.5 -22.4902l-10 -12.4902c-5.53027 -6.88965 -15.5898 -8.00977 -22.4902 -2.49023l-598 467.51c-6.90039 5.52051 -8.01953 15.5908 -2.49023 22.4902l10 12.4902
|
|
||||||
c5.52051 6.90039 15.5898 8.00977 22.4902 2.49023zM163.53 80h182.84l61.3994 -48h-279.659c-19.1201 0 -31.9902 15.5996 -32.1006 32c-0.0498047 7.5498 2.61035 15.2598 8.61035 21.71c18.3701 19.7402 51.5703 49.6904 54.8398 140.42l45.4697 -35.5498
|
|
||||||
c-6.91992 -54.7803 -24.6895 -88.5498 -41.3994 -110.58zM320 352c-23.3496 0 -45 -7.17969 -62.9404 -19.4004l-38.1699 29.8408c19.6807 15.7793 43.1104 27.3096 69.1299 32.7197v20.8398c0 17.6699 14.3203 32 31.9805 32s31.9805 -14.3301 31.9805 -32v-20.8398
|
|
||||||
c73.46 -15.2598 127.939 -77.46 127.939 -155.16c0 -41.3604 6.03027 -70.7197 14.3398 -92.8496l-59.5293 46.54c-1.63086 13.96 -2.77051 28.8896 -2.79004 45.7295c0 0.200195 0.0595703 0.379883 0.0595703 0.580078c0 61.8604 -50.1396 112 -112 112zM320 -64
|
|
||||||
c-35.3203 0 -63.9697 28.6504 -63.9697 64h127.939c0 -35.3496 -28.6494 -64 -63.9697 -64z" />
|
|
||||||
<glyph glyph-name="copyright" unicode=""
|
|
||||||
d="M256 440c136.967 0 248 -111.033 248 -248s-111.033 -248 -248 -248s-248 111.033 -248 248s111.033 248 248 248zM256 -8c110.549 0 200 89.4678 200 200c0 110.549 -89.4678 200 -200 200c-110.549 0 -200 -89.4688 -200 -200c0 -110.549 89.4678 -200 200 -200z
|
|
||||||
M363.351 93.0645c-9.61328 -9.71289 -45.5293 -41.3965 -104.064 -41.3965c-82.4297 0 -140.484 61.4248 -140.484 141.567c0 79.1514 60.2754 139.4 139.763 139.4c55.5303 0 88.7373 -26.6201 97.5928 -34.7783c2.13379 -1.96289 3.86523 -5.9082 3.86523 -8.80762
|
|
||||||
c0 -1.95508 -0.864258 -4.87402 -1.92969 -6.51465l-18.1543 -28.1133c-3.8418 -5.9502 -11.9668 -7.28223 -17.499 -2.9209c-8.5957 6.77637 -31.8145 22.5381 -61.708 22.5381c-48.3037 0 -77.916 -35.3301 -77.916 -80.082c0 -41.5889 26.8877 -83.6924 78.2764 -83.6924
|
|
||||||
c32.6572 0 56.8428 19.0391 65.7266 27.2256c5.26953 4.85645 13.5957 4.03906 17.8193 -1.73828l19.8652 -27.1699c1.28613 -1.74512 2.33008 -4.91992 2.33008 -7.08789c0 -2.72363 -1.56055 -6.5 -3.48242 -8.42969z" />
|
|
||||||
<glyph glyph-name="closed-captioning" unicode=""
|
|
||||||
d="M464 384c26.5 0 48 -21.5 48 -48v-288c0 -26.5 -21.5 -48 -48 -48h-416c-26.5 0 -48 21.5 -48 48v288c0 26.5 21.5 48 48 48h416zM458 48c3.2998 0 6 2.7002 6 6v276c0 3.2998 -2.7002 6 -6 6h-404c-3.2998 0 -6 -2.7002 -6 -6v-276c0 -3.2998 2.7002 -6 6 -6h404z
|
|
||||||
M246.9 133.7c1.69922 -2.40039 1.5 -5.60059 -0.5 -7.7002c-53.6006 -56.7998 -172.801 -32.0996 -172.801 67.9004c0 97.2998 121.7 119.5 172.5 70.0996c2.10059 -2 2.5 -3.2002 1 -5.7002l-17.5 -30.5c-1.89941 -3.09961 -6.19922 -4 -9.09961 -1.7002
|
|
||||||
c-40.7998 32 -94.5996 14.9004 -94.5996 -31.1992c0 -48 51 -70.5 92.1992 -32.6006c2.80078 2.5 7.10059 2.10059 9.2002 -0.899414zM437.3 133.7c1.7002 -2.40039 1.5 -5.60059 -0.5 -7.7002c-53.5996 -56.9004 -172.8 -32.0996 -172.8 67.9004
|
|
||||||
c0 97.2998 121.7 119.5 172.5 70.0996c2.09961 -2 2.5 -3.2002 1 -5.7002l-17.5 -30.5c-1.90039 -3.09961 -6.2002 -4 -9.09961 -1.7002c-40.8008 32 -94.6006 14.9004 -94.6006 -31.1992c0 -48 51 -70.5 92.2002 -32.6006c2.7998 2.5 7.09961 2.10059 9.2002 -0.899414z
|
|
||||||
" />
|
|
||||||
<glyph glyph-name="object-group" unicode=""
|
|
||||||
d="M500 320h-12v-256h12c6.62695 0 12 -5.37305 12 -12v-72c0 -6.62695 -5.37305 -12 -12 -12h-72c-6.62695 0 -12 5.37305 -12 12v12h-320v-12c0 -6.62695 -5.37305 -12 -12 -12h-72c-6.62695 0 -12 5.37305 -12 12v72c0 6.62695 5.37305 12 12 12h12v256h-12
|
|
||||||
c-6.62695 0 -12 5.37305 -12 12v72c0 6.62695 5.37305 12 12 12h72c6.62695 0 12 -5.37305 12 -12v-12h320v12c0 6.62695 5.37305 12 12 12h72c6.62695 0 12 -5.37305 12 -12v-72c0 -6.62695 -5.37305 -12 -12 -12zM448 384v-32h32v32h-32zM32 384v-32h32v32h-32zM64 0v32
|
|
||||||
h-32v-32h32zM480 0v32h-32v-32h32zM440 64v256h-12c-6.62695 0 -12 5.37305 -12 12v12h-320v-12c0 -6.62695 -5.37305 -12 -12 -12h-12v-256h12c6.62695 0 12 -5.37305 12 -12v-12h320v12c0 6.62695 5.37305 12 12 12h12zM404 256c6.62695 0 12 -5.37207 12 -12v-168
|
|
||||||
c0 -6.62793 -5.37305 -12 -12 -12h-200c-6.62695 0 -12 5.37207 -12 12v52h-84c-6.62695 0 -12 5.37207 -12 12v168c0 6.62793 5.37305 12 12 12h200c6.62695 0 12 -5.37207 12 -12v-52h84zM136 280v-112h144v112h-144zM376 104v112h-56v-76
|
|
||||||
c0 -6.62793 -5.37305 -12 -12 -12h-76v-24h144z" />
|
|
||||||
<glyph glyph-name="object-ungroup" unicode="" horiz-adv-x="576"
|
|
||||||
d="M564 224h-12v-160h12c6.62695 0 12 -5.37305 12 -12v-72c0 -6.62695 -5.37305 -12 -12 -12h-72c-6.62695 0 -12 5.37305 -12 12v12h-224v-12c0 -6.62695 -5.37305 -12 -12 -12h-72c-6.62695 0 -12 5.37305 -12 12v72c0 6.62695 5.37305 12 12 12h12v24h-88v-12
|
|
||||||
c0 -6.62695 -5.37305 -12 -12 -12h-72c-6.62695 0 -12 5.37305 -12 12v72c0 6.62695 5.37305 12 12 12h12v160h-12c-6.62695 0 -12 5.37305 -12 12v72c0 6.62695 5.37305 12 12 12h72c6.62695 0 12 -5.37305 12 -12v-12h224v12c0 6.62695 5.37305 12 12 12h72
|
|
||||||
c6.62695 0 12 -5.37305 12 -12v-72c0 -6.62695 -5.37305 -12 -12 -12h-12v-24h88v12c0 6.62695 5.37305 12 12 12h72c6.62695 0 12 -5.37305 12 -12v-72c0 -6.62695 -5.37305 -12 -12 -12zM352 384v-32h32v32h-32zM352 128v-32h32v32h-32zM64 96v32h-32v-32h32zM64 352v32
|
|
||||||
h-32v-32h32zM96 136h224v12c0 6.62695 5.37305 12 12 12h12v160h-12c-6.62695 0 -12 5.37305 -12 12v12h-224v-12c0 -6.62695 -5.37305 -12 -12 -12h-12v-160h12c6.62695 0 12 -5.37305 12 -12v-12zM224 0v32h-32v-32h32zM504 64v160h-12c-6.62695 0 -12 5.37305 -12 12v12
|
|
||||||
h-88v-88h12c6.62695 0 12 -5.37305 12 -12v-72c0 -6.62695 -5.37305 -12 -12 -12h-72c-6.62695 0 -12 5.37305 -12 12v12h-88v-24h12c6.62695 0 12 -5.37305 12 -12v-12h224v12c0 6.62695 5.37305 12 12 12h12zM544 0v32h-32v-32h32zM544 256v32h-32v-32h32z" />
|
|
||||||
<glyph glyph-name="sticky-note" unicode="" horiz-adv-x="448"
|
|
||||||
d="M448 99.8936c0 -10.9746 -6.29883 -26.1797 -14.0586 -33.9404l-83.8828 -83.8818c-7.75977 -7.76074 -22.9658 -14.0596 -33.9404 -14.0596h-268.118c-26.5098 0 -48 21.4902 -48 48v351.988c0 26.5098 21.4902 48 48 48h352c26.5098 0 48 -21.4902 48 -48v-268.106z
|
|
||||||
M320 19.8936l76.1182 76.1182h-76.1182v-76.1182zM400 368h-352v-351.988h224v104c0 13.2549 10.7451 24 24 24h104v223.988z" />
|
|
||||||
<glyph glyph-name="clone" unicode=""
|
|
||||||
d="M464 448c26.5098 0 48 -21.4902 48 -48v-320c0 -26.5098 -21.4902 -48 -48 -48h-48v-48c0 -26.5098 -21.4902 -48 -48 -48h-320c-26.5098 0 -48 21.4902 -48 48v320c0 26.5098 21.4902 48 48 48h48v48c0 26.5098 21.4902 48 48 48h320zM362 -16c3.31152 0 6 2.68848 6 6
|
|
||||||
v42h-224c-26.5098 0 -48 21.4902 -48 48v224h-42c-3.31152 0 -6 -2.68848 -6 -6v-308c0 -3.31152 2.68848 -6 6 -6h308zM458 80c3.31152 0 6 2.68848 6 6v308c0 3.31152 -2.68848 6 -6 6h-308c-3.31152 0 -6 -2.68848 -6 -6v-308c0 -3.31152 2.68848 -6 6 -6h308z" />
|
|
||||||
<glyph glyph-name="hourglass" unicode="" horiz-adv-x="384"
|
|
||||||
d="M368 400c0 -80.0996 -31.8984 -165.619 -97.1797 -208c64.9912 -42.1934 97.1797 -127.436 97.1797 -208h4c6.62695 0 12 -5.37305 12 -12v-24c0 -6.62695 -5.37305 -12 -12 -12h-360c-6.62695 0 -12 5.37305 -12 12v24c0 6.62695 5.37305 12 12 12h4
|
|
||||||
c0 80.0996 31.8994 165.619 97.1797 208c-64.9912 42.1934 -97.1797 127.436 -97.1797 208h-4c-6.62695 0 -12 5.37305 -12 12v24c0 6.62695 5.37305 12 12 12h360c6.62695 0 12 -5.37305 12 -12v-24c0 -6.62695 -5.37305 -12 -12 -12h-4zM64 400
|
|
||||||
c0 -101.621 57.3066 -184 128 -184s128 82.3799 128 184h-256zM320 -16c0 101.62 -57.3076 184 -128 184s-128 -82.3799 -128 -184h256z" />
|
|
||||||
<glyph glyph-name="hand-rock" unicode=""
|
|
||||||
d="M408.864 368.948c48.8213 20.751 103.136 -15.0723 103.136 -67.9111v-114.443c0 -15.3955 -3.08887 -30.3906 -9.18262 -44.5674l-42.835 -99.6562c-4.99707 -11.625 -3.98242 -18.8574 -3.98242 -42.3701c0 -17.6729 -14.3271 -32 -32 -32h-252
|
|
||||||
c-17.6729 0 -32 14.3271 -32 32c0 27.3301 1.1416 29.2012 -3.11035 32.9033l-97.71 85.0811c-24.8994 21.6797 -39.1797 52.8926 -39.1797 85.6338v56.9531c0 47.4277 44.8457 82.0215 91.0459 71.1807c1.96094 55.751 63.5107 87.8262 110.671 60.8057
|
|
||||||
c29.1895 31.0713 78.8604 31.4473 108.334 -0.0214844c32.7051 18.6846 76.4121 10.3096 98.8135 -23.5879zM464 186.594v114.445c0 34.29 -52 33.8232 -52 0.676758c0 -8.83594 -7.16309 -16 -16 -16h-7c-8.83691 0 -16 7.16406 -16 16v26.751
|
|
||||||
c0 34.457 -52 33.707 -52 0.676758v-27.4287c0 -8.83594 -7.16309 -16 -16 -16h-7c-8.83691 0 -16 7.16406 -16 16v40.4658c0 34.3525 -52 33.8115 -52 0.677734v-41.1436c0 -8.83594 -7.16406 -16 -16 -16h-7c-8.83594 0 -16 7.16406 -16 16v26.751
|
|
||||||
c0 34.4023 -52 33.7744 -52 0.676758v-116.571c0 -8.83203 -7.16797 -16 -16 -16c-3.30664 0 -8.01367 1.7627 -10.5068 3.93359l-7 6.09473c-3.03223 2.64062 -5.49316 8.04688 -5.49316 12.0674v0v41.2275c0 34.2148 -52 33.8857 -52 0.677734v-56.9531
|
|
||||||
c0 -18.8555 8.27441 -36.874 22.7002 -49.4365l97.71 -85.0801c12.4502 -10.8398 19.5898 -26.4463 19.5898 -42.8164v-10.2861h220v7.07617c0 13.21 2.65332 26.0791 7.88281 38.25l42.835 99.6553c2.91602 6.75391 5.28223 18.207 5.28223 25.5635v0.0488281z" />
|
|
||||||
<glyph glyph-name="hand-paper" unicode="" horiz-adv-x="448"
|
|
||||||
d="M372.57 335.359c39.9062 5.63281 75.4297 -25.7393 75.4297 -66.3594v-131.564c-0.00195312 -12.7666 -2.33008 -33.2246 -5.19531 -45.666l-30.1836 -130.958c-3.34668 -14.5234 -16.2783 -24.8125 -31.1816 -24.8125h-222.897
|
|
||||||
c-9.10352 0 -20.7793 6.01758 -26.0615 13.4316l-119.97 168.415c-21.2441 29.8203 -14.8047 71.3574 14.5498 93.1533c18.7754 13.9395 42.1309 16.2979 62.083 8.87109v126.13c0 44.0547 41.125 75.5439 82.4053 64.9834c23.8926 48.1963 92.3535 50.2471 117.982 0.74707
|
|
||||||
c42.5186 11.1445 83.0391 -21.9346 83.0391 -65.5469v-10.8242zM399.997 137.437l-0.00195312 131.563c0 24.9492 -36.5703 25.5508 -36.5703 -0.691406v-76.3086c0 -8.83691 -7.16309 -16 -16 -16h-6.85645c-8.83691 0 -16 7.16309 -16 16v154.184
|
|
||||||
c0 25.501 -36.5703 26.3633 -36.5703 0.691406v-154.875c0 -8.83691 -7.16309 -16 -16 -16h-6.85645c-8.83691 0 -16 7.16309 -16 16v188.309c0 25.501 -36.5703 26.3545 -36.5703 0.691406v-189c0 -8.83691 -7.16309 -16 -16 -16h-6.85645c-8.83691 0 -16 7.16309 -16 16
|
|
||||||
v153.309c0 25.501 -36.5713 26.3359 -36.5713 0.691406v-206.494c0 -15.5703 -20.0352 -21.9092 -29.0303 -9.2832l-27.1279 38.0791c-14.3711 20.1709 -43.833 -2.33496 -29.3945 -22.6045l115.196 -161.697h201.92l27.3252 118.551
|
|
||||||
c2.63086 11.417 3.96484 23.1553 3.96484 34.8857z" />
|
|
||||||
<glyph glyph-name="hand-scissors" unicode=""
|
|
||||||
d="M256 -32c-44.9561 0 -77.3428 43.2627 -64.0244 85.8535c-21.6484 13.71 -34.0156 38.7617 -30.3408 65.0068h-87.6348c-40.8037 0 -74 32.8105 -74 73.1406c0 40.3291 33.1963 73.1396 74 73.1396l94 -9.14062l-78.8496 18.6787
|
|
||||||
c-38.3076 14.7422 -57.04 57.4707 -41.9424 95.1123c15.0303 37.4736 57.7549 55.7803 95.6416 41.2012l144.929 -55.7568c24.9551 30.5566 57.8086 43.9932 92.2178 24.7324l97.999 -54.8525c20.9746 -11.7393 34.0049 -33.8457 34.0049 -57.6904v-205.702
|
|
||||||
c0 -30.7422 -21.4404 -57.5576 -51.7979 -64.5537l-118.999 -27.4268c-4.97168 -1.14648 -10.0889 -1.72949 -15.2031 -1.72949zM256 16.0127l70 -0.000976562c1.23633 0 3.21777 0.225586 4.42285 0.501953l119.001 27.4277
|
|
||||||
c8.58203 1.97754 14.5762 9.29102 14.5762 17.7812v205.701c0 6.4873 -3.62109 12.542 -9.44922 15.8047l-98 54.8545c-8.13965 4.55566 -18.668 2.61914 -24.4873 -4.50781l-21.7646 -26.6475c-2.65039 -3.24512 -8.20215 -5.87891 -12.3926 -5.87891
|
|
||||||
c-1.64062 0 -4.21484 0.477539 -5.74609 1.06738l-166.549 64.0908c-32.6543 12.5664 -50.7744 -34.5771 -19.2227 -46.7168l155.357 -59.7852c5.66016 -2.17773 10.2539 -8.86816 10.2539 -14.9326v0v-11.6328c0 -8.83691 -7.16309 -16 -16 -16h-182
|
|
||||||
c-34.375 0 -34.4297 -50.2803 0 -50.2803h182c8.83691 0 16 -7.16309 16 -16v-6.85645c0 -8.83691 -7.16309 -16 -16 -16h-28c-25.1221 0 -25.1592 -36.5674 0 -36.5674h28c8.83691 0 16 -7.16211 16 -16v-6.85547c0 -8.83691 -7.16309 -16 -16 -16
|
|
||||||
c-25.1201 0 -25.1602 -36.5674 0 -36.5674z" />
|
|
||||||
<glyph glyph-name="hand-lizard" unicode="" horiz-adv-x="576"
|
|
||||||
d="M556.686 157.458c12.6357 -19.4863 19.3145 -42.0615 19.3145 -65.2871v-124.171h-224v71.582l-99.751 38.7871c-2.7832 1.08203 -5.70996 1.63086 -8.69727 1.63086h-131.552c-30.8789 0 -56 25.1211 -56 56c0 48.5234 39.4766 88 88 88h113.709l18.333 48h-196.042
|
|
||||||
c-44.1123 0 -80 35.8877 -80 80v8c0 30.8779 25.1211 56 56 56h293.917c24.5 0 47.084 -12.2725 60.4111 -32.8291zM528 16v76.1709v0.0478516c0 11.7461 -5.19141 29.2734 -11.5879 39.124l-146.358 225.715c-4.44336 6.85254 -11.9707 10.9424 -20.1367 10.9424h-293.917
|
|
||||||
c-4.41113 0 -8 -3.58887 -8 -8v-8c0 -17.6445 14.3555 -32 32 -32h213.471c25.2021 0 42.626 -25.293 33.6299 -48.8457l-24.5518 -64.2812c-7.05371 -18.4658 -25.0732 -30.873 -44.8398 -30.873h-113.709c-22.0557 0 -40 -17.9443 -40 -40c0 -4.41113 3.58887 -8 8 -8
|
|
||||||
h131.552h0.0517578c7.44141 0 19.1074 -2.19238 26.041 -4.89355l99.752 -38.7881c18.5898 -7.22852 30.6035 -24.7881 30.6035 -44.7363v-23.582h128z" />
|
|
||||||
<glyph glyph-name="hand-spock" unicode=""
|
|
||||||
d="M21.0957 66.21c-26.9688 25.3818 -28.2471 67.7461 -2.87109 94.707c24.1982 25.7139 64.2881 28.2373 91.4824 5.72168l-31.04 136.509c-9.38379 41.2803 21.4336 81.0127 64.0713 81.8438c1.74414 28.9062 22.2656 54.4912 51.8818 61.2949
|
|
||||||
c36.001 8.27539 72.0176 -14.2266 80.3037 -50.2959l21.6748 -131.99l16.9014 105.25c9.02344 36.0947 45.4473 57.7021 81.25 48.75c27.3066 -6.82715 45.7061 -29.1357 49.8496 -53.9922c43.2285 0.212891 75.6436 -40.1133 65.5439 -82.5244l-31.7295 -133.41
|
|
||||||
c-0.938477 -3.94141 -1.41406 -7.99414 -1.41406 -12.0449v-36.8389v-0.00683594c0 -9.29102 -2.14355 -24.0596 -4.78516 -32.9668l-31.8145 -107.312c-4.02734 -13.585 -16.5107 -22.9043 -30.6807 -22.9043h-237.6c-7.00586 0 -16.8311 3.89648 -21.9316 8.69824z
|
|
||||||
M53.1641 128.021c-7.17969 -7.62891 -6.81543 -19.6777 0.813477 -26.8574l124.487 -117.164h219.311l28.4199 95.8613c1.86133 6.27637 2.80469 12.7793 2.80469 19.3281v36.8389c0.000976562 6.48047 1.21973 16.8574 2.71973 23.1621l31.7549 133.407
|
|
||||||
c5.83105 24.4893 -31.1445 33.25 -36.9658 8.80273l-26.9229 -113.105c-1.61523 -6.78711 -8.58887 -12.2949 -15.5645 -12.2949h-9.69434c-10.4072 0 -18.043 9.79199 -15.5225 19.8799l38.127 152.512c6.09766 24.376 -30.7607 33.6396 -36.8643 9.21777l-42.3721 -169.49
|
|
||||||
c-1.67285 -6.68945 -8.62695 -12.1191 -15.5225 -12.1191h-13.2168v0c-7.0332 0 -14.0195 5.5625 -15.5938 12.417l-45.2207 196.828c-5.64453 24.5684 -42.6572 15.9609 -37.0342 -8.50781l41.6191 -181.153c2.30078 -10.0156 -5.31738 -19.583 -15.5938 -19.583h-8.60352
|
|
||||||
h-0.000976562c-7.0498 0 -14.04 5.5791 -15.6025 12.4541l-30.3984 133.757c-5.55273 24.4395 -42.6504 16.1963 -37.0547 -8.4209l34.1299 -150.172c0.263672 -1.16309 0.397461 -2.35352 0.397461 -3.5459v-69.4795c0 -13.9941 -16.7754 -21.2432 -26.9658 -11.6523
|
|
||||||
l-53.0117 49.8936c-7.61523 7.16699 -19.6377 6.85938 -26.8564 -0.8125z" />
|
|
||||||
<glyph glyph-name="hand-pointer" unicode="" horiz-adv-x="448"
|
|
||||||
d="M358.182 268.639c43.1934 16.6348 89.8184 -15.7949 89.8184 -62.6387v-84c-0.000976562 -4.25 -0.775391 -11.0615 -1.72754 -15.2041l-27.4297 -118.999c-6.98242 -30.2969 -33.7549 -51.7969 -64.5566 -51.7969h-178.286c-21.2588 0 -41.3682 10.4102 -53.791 27.8457
|
|
||||||
l-109.699 154.001c-21.2432 29.8193 -14.8047 71.3574 14.5498 93.1523c18.8115 13.9658 42.1748 16.2822 62.083 8.87207v161.129c0 36.9443 29.7363 67 66.2861 67s66.2861 -30.0557 66.2861 -67v-73.6338c20.4131 2.85742 41.4678 -3.94238 56.5947 -19.6289
|
|
||||||
c27.1934 12.8467 60.3799 5.66992 79.8721 -19.0986zM80.9854 168.303c-14.4004 20.2119 -43.8008 -2.38281 -29.3945 -22.6055l109.712 -154c3.43457 -4.81934 8.92871 -7.69727 14.6973 -7.69727h178.285c8.49219 0 15.8037 5.99414 17.7822 14.5762l27.4297 119.001
|
|
||||||
c0.333008 1.44629 0.501953 2.93457 0.501953 4.42285v84c0 25.1602 -36.5713 25.1211 -36.5713 0c0 -8.83594 -7.16309 -16 -16 -16h-6.85645c-8.83691 0 -16 7.16406 -16 16v21c0 25.1602 -36.5713 25.1201 -36.5713 0v-21c0 -8.83594 -7.16309 -16 -16 -16h-6.85938
|
|
||||||
c-8.83691 0 -16 7.16406 -16 16v35c0 25.1602 -36.5703 25.1201 -36.5703 0v-35c0 -8.83594 -7.16309 -16 -16 -16h-6.85742c-8.83691 0 -16 7.16406 -16 16v175c0 25.1602 -36.5713 25.1201 -36.5713 0v-241.493c0 -15.5703 -20.0352 -21.9092 -29.0303 -9.2832z
|
|
||||||
M176.143 48v96c0 8.83691 6.26855 16 14 16h6c7.73242 0 14 -7.16309 14 -16v-96c0 -8.83691 -6.26758 -16 -14 -16h-6c-7.73242 0 -14 7.16309 -14 16zM251.571 48v96c0 8.83691 6.26758 16 14 16h6c7.73145 0 14 -7.16309 14 -16v-96c0 -8.83691 -6.26855 -16 -14 -16h-6
|
|
||||||
c-7.73242 0 -14 7.16309 -14 16zM327 48v96c0 8.83691 6.26758 16 14 16h6c7.73242 0 14 -7.16309 14 -16v-96c0 -8.83691 -6.26758 -16 -14 -16h-6c-7.73242 0 -14 7.16309 -14 16z" />
|
|
||||||
<glyph glyph-name="hand-peace" unicode="" horiz-adv-x="448"
|
|
||||||
d="M362.146 256.024c42.5908 13.3184 85.8535 -19.0684 85.8535 -64.0244l-0.0117188 -70.001c-0.000976562 -4.25 -0.775391 -11.0615 -1.72949 -15.2031l-27.4268 -118.999c-6.99707 -30.3564 -33.8105 -51.7969 -64.5547 -51.7969h-205.702
|
|
||||||
c-23.8447 0 -45.9502 13.0303 -57.6904 34.0059l-54.8525 97.999c-19.2607 34.4092 -5.82422 67.2617 24.7324 92.2178l-55.7568 144.928c-14.5791 37.8867 3.72754 80.6113 41.2012 95.6416c37.6406 15.0977 80.3691 -3.63477 95.1123 -41.9424l18.6787 -78.8496
|
|
||||||
l-9.14062 94c0 40.8037 32.8096 74 73.1396 74s73.1406 -33.1963 73.1406 -74v-87.6348c26.2451 3.6748 51.2959 -8.69238 65.0068 -30.3408zM399.987 122l-0.000976562 70c0 25.1602 -36.5674 25.1201 -36.5674 0c0 -8.83691 -7.16309 -16 -16 -16h-6.85547
|
|
||||||
c-8.83789 0 -16 7.16309 -16 16v28c0 25.1592 -36.5674 25.1221 -36.5674 0v-28c0 -8.83691 -7.16309 -16 -16 -16h-6.85645c-8.83691 0 -16 7.16309 -16 16v182c0 34.4297 -50.2803 34.375 -50.2803 0v-182c0 -8.83691 -7.16309 -16 -16 -16h-11.6328v0
|
|
||||||
c-6.06445 0 -12.7549 4.59375 -14.9326 10.2539l-59.7842 155.357c-12.1396 31.5518 -59.2842 13.4326 -46.7168 -19.2227l64.0898 -166.549c0.589844 -1.53125 1.06738 -4.10547 1.06738 -5.74609c0 -4.19043 -2.63379 -9.74219 -5.87891 -12.3926l-26.6475 -21.7646
|
|
||||||
c-7.12695 -5.81934 -9.06445 -16.3467 -4.50781 -24.4873l54.8535 -98c3.26367 -5.82812 9.31934 -9.44922 15.8057 -9.44922h205.701c8.49121 0 15.8037 5.99414 17.7812 14.5762l27.4277 119.001c0.333008 1.44629 0.501953 2.93457 0.501953 4.42285z" />
|
|
||||||
<glyph glyph-name="registered" unicode=""
|
|
||||||
d="M256 440c136.967 0 248 -111.033 248 -248s-111.033 -248 -248 -248s-248 111.033 -248 248s111.033 248 248 248zM256 -8c110.549 0 200 89.4678 200 200c0 110.549 -89.4678 200 -200 200c-110.549 0 -200 -89.4688 -200 -200c0 -110.549 89.4678 -200 200 -200z
|
|
||||||
M366.442 73.791c4.40332 -7.99219 -1.37012 -17.791 -10.5107 -17.791h-42.8096h-0.0126953c-3.97559 0 -8.71582 2.84961 -10.5801 6.36035l-47.5156 89.3027h-31.958v-83.6631c0 -6.61719 -5.38281 -12 -12 -12h-38.5674c-6.61719 0 -12 5.38281 -12 12v248.304
|
|
||||||
c0 6.61719 5.38281 12 12 12h78.667c71.251 0 101.498 -32.749 101.498 -85.252c0 -31.6123 -15.2148 -59.2969 -39.4824 -73.1758c3.02148 -4.61719 0.225586 0.199219 53.2715 -96.085zM256.933 208.094c20.9131 0 32.4307 11.5186 32.4316 32.4316
|
|
||||||
c0 19.5752 -6.5127 31.709 -38.9297 31.709h-27.377v-64.1406h33.875z" />
|
|
||||||
<glyph glyph-name="calendar-plus" unicode="" horiz-adv-x="448"
|
|
||||||
d="M336 156v-24c0 -6.59961 -5.40039 -12 -12 -12h-76v-76c0 -6.59961 -5.40039 -12 -12 -12h-24c-6.59961 0 -12 5.40039 -12 12v76h-76c-6.59961 0 -12 5.40039 -12 12v24c0 6.59961 5.40039 12 12 12h76v76c0 6.59961 5.40039 12 12 12h24c6.59961 0 12 -5.40039 12 -12
|
|
||||||
v-76h76c6.59961 0 12 -5.40039 12 -12zM448 336v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h48v52c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-52h128v52c0 6.59961 5.40039 12 12 12h40
|
|
||||||
c6.59961 0 12 -5.40039 12 -12v-52h48c26.5 0 48 -21.5 48 -48zM400 -10v298h-352v-298c0 -3.2998 2.7002 -6 6 -6h340c3.2998 0 6 2.7002 6 6z" />
|
|
||||||
<glyph glyph-name="calendar-minus" unicode="" horiz-adv-x="448"
|
|
||||||
d="M124 120c-6.59961 0 -12 5.40039 -12 12v24c0 6.59961 5.40039 12 12 12h200c6.59961 0 12 -5.40039 12 -12v-24c0 -6.59961 -5.40039 -12 -12 -12h-200zM448 336v-352c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h48v52
|
|
||||||
c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-52h128v52c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-52h48c26.5 0 48 -21.5 48 -48zM400 -10v298h-352v-298c0 -3.2998 2.7002 -6 6 -6h340c3.2998 0 6 2.7002 6 6z" />
|
|
||||||
<glyph glyph-name="calendar-times" unicode="" horiz-adv-x="448"
|
|
||||||
d="M311.7 73.2998l-17 -17c-4.7002 -4.7002 -12.2998 -4.7002 -17 0l-53.7002 53.7998l-53.7002 -53.6992c-4.7002 -4.7002 -12.2998 -4.7002 -17 0l-17 17c-4.7002 4.69922 -4.7002 12.2998 0 17l53.7002 53.6992l-53.7002 53.7002c-4.7002 4.7002 -4.7002 12.2998 0 17
|
|
||||||
l17 17c4.7002 4.7002 12.2998 4.7002 17 0l53.7002 -53.7002l53.7002 53.7002c4.7002 4.7002 12.2998 4.7002 17 0l17 -17c4.7002 -4.7002 4.7002 -12.2998 0 -17l-53.7998 -53.7998l53.6992 -53.7002c4.80078 -4.7002 4.80078 -12.2998 0.100586 -17zM448 336v-352
|
|
||||||
c0 -26.5 -21.5 -48 -48 -48h-352c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h48v52c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-52h128v52c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-52h48c26.5 0 48 -21.5 48 -48zM400 -10
|
|
||||||
v298h-352v-298c0 -3.2998 2.7002 -6 6 -6h340c3.2998 0 6 2.7002 6 6z" />
|
|
||||||
<glyph glyph-name="calendar-check" unicode="" horiz-adv-x="448"
|
|
||||||
d="M400 384c26.5098 0 48 -21.4902 48 -48v-352c0 -26.5098 -21.4902 -48 -48 -48h-352c-26.5098 0 -48 21.4902 -48 48v352c0 26.5098 21.4902 48 48 48h48v52c0 6.62695 5.37305 12 12 12h40c6.62695 0 12 -5.37305 12 -12v-52h128v52c0 6.62695 5.37305 12 12 12h40
|
|
||||||
c6.62695 0 12 -5.37305 12 -12v-52h48zM394 -16c3.31152 0 6 2.68848 6 6v298h-352v-298c0 -3.31152 2.68848 -6 6 -6h340zM341.151 184.65l-142.31 -141.169c-4.70508 -4.66699 -12.3027 -4.6377 -16.9707 0.0673828l-75.0908 75.6992
|
|
||||||
c-4.66699 4.70508 -4.6377 12.3027 0.0673828 16.9707l22.7197 22.5361c4.70508 4.66699 12.3027 4.63672 16.9697 -0.0693359l44.1035 -44.4609l111.072 110.182c4.70508 4.66699 12.3027 4.63672 16.9707 -0.0683594l22.5361 -22.7178
|
|
||||||
c4.66699 -4.70508 4.63672 -12.3027 -0.0683594 -16.9697z" />
|
|
||||||
<glyph glyph-name="map" unicode="" horiz-adv-x="576"
|
|
||||||
d="M560.02 416c8.4502 0 15.9805 -6.83008 15.9805 -16.0195v-346.32c0 -11.9609 -9.01367 -25.2705 -20.1201 -29.71l-151.83 -52.8105c-5.32617 -1.7334 -14.1953 -3.13965 -19.7969 -3.13965c-5.7373 0 -14.8105 1.47363 -20.2529 3.29004l-172 60.71l-170.05 -62.8398
|
|
||||||
c-1.99023 -0.790039 -4 -1.16016 -5.95996 -1.16016c-8.45996 0 -15.9902 6.83008 -15.9902 16.0195v346.32c0.00292969 11.959 9.0166 25.2686 20.1201 29.71l151.83 52.8105c6.43945 2.08984 13.1201 3.13965 19.8096 3.13965
|
|
||||||
c5.73242 -0.00195312 14.8008 -1.47168 20.2402 -3.28027l172 -60.7197h0.00976562l170.05 62.8398c1.98047 0.790039 4 1.16016 5.95996 1.16016zM224 357.58v-285.97l128 -45.1904v285.97zM48 29.9502l127.36 47.0801l0.639648 0.229492v286.2l-128 -44.5303v-288.979z
|
|
||||||
M528 65.0801v288.97l-127.36 -47.0693l-0.639648 -0.240234v-286.19z" />
|
|
||||||
<glyph glyph-name="comment-alt" unicode=""
|
|
||||||
d="M448 448c35.2998 0 64 -28.7002 64 -64v-288c0 -35.2998 -28.7002 -64 -64 -64h-144l-124.9 -93.5996c-2.19922 -1.7002 -4.69922 -2.40039 -7.09961 -2.40039c-6.2002 0 -12 4.90039 -12 12v84h-96c-35.2998 0 -64 28.7002 -64 64v288c0 35.2998 28.7002 64 64 64h384z
|
|
||||||
M464 96v288c0 8.7998 -7.2002 16 -16 16h-384c-8.7998 0 -16 -7.2002 -16 -16v-288c0 -8.7998 7.2002 -16 16 -16h144v-60l67.2002 50.4004l12.7998 9.59961h160c8.7998 0 16 7.2002 16 16z" />
|
|
||||||
<glyph glyph-name="pause-circle" unicode=""
|
|
||||||
d="M256 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM256 -8c110.5 0 200 89.5 200 200s-89.5 200 -200 200s-200 -89.5 -200 -200s89.5 -200 200 -200zM352 272v-160c0 -8.7998 -7.2002 -16 -16 -16h-48
|
|
||||||
c-8.7998 0 -16 7.2002 -16 16v160c0 8.7998 7.2002 16 16 16h48c8.7998 0 16 -7.2002 16 -16zM240 272v-160c0 -8.7998 -7.2002 -16 -16 -16h-48c-8.7998 0 -16 7.2002 -16 16v160c0 8.7998 7.2002 16 16 16h48c8.7998 0 16 -7.2002 16 -16z" />
|
|
||||||
<glyph glyph-name="stop-circle" unicode=""
|
|
||||||
d="M504 192c0 -137 -111 -248 -248 -248s-248 111 -248 248s111 248 248 248s248 -111 248 -248zM56 192c0 -110.5 89.5 -200 200 -200s200 89.5 200 200s-89.5 200 -200 200s-200 -89.5 -200 -200zM352 272v-160c0 -8.7998 -7.2002 -16 -16 -16h-160
|
|
||||||
c-8.7998 0 -16 7.2002 -16 16v160c0 8.7998 7.2002 16 16 16h160c8.7998 0 16 -7.2002 16 -16z" />
|
|
||||||
<glyph glyph-name="handshake" unicode="" horiz-adv-x="640"
|
|
||||||
d="M519.2 320.1h120.8v-255.699h-64c-17.5 0 -31.7998 14.1992 -31.9004 31.6992h-57.8994c-1.7998 -8.19922 -5.2998 -16.0996 -10.9004 -23l-26.2002 -32.2998c-15.7998 -19.3994 -41.8994 -25.5 -64 -16.7998c-13.5 -16.5996 -30.5996 -24 -48.7998 -24
|
|
||||||
c-15.0996 0 -28.5996 5.09961 -41.0996 15.9004c-31.7998 -21.9004 -74.7002 -21.3008 -105.601 3.7998l-84.5996 76.3994h-9.09961c-0.100586 -17.5 -14.3008 -31.6992 -31.9004 -31.6992h-64v255.699h118l47.5996 47.6006c10.5 10.3994 24.8008 16.2998 39.6006 16.2998
|
|
||||||
h226.8v0c12.7812 0 30.5225 -7.30273 39.5996 -16.2998zM48 96.4004c8.7998 0 16 7.09961 16 16c0 8.7998 -7.2002 16 -16 16s-16 -7.2002 -16 -16c0 -8.80078 7.2002 -16 16 -16zM438 103.3c2.7002 3.40039 2.2002 8.5 -1.2002 11.2998l-108.2 87.8008l-8.19922 -7.5
|
|
||||||
c-40.3008 -36.8008 -86.7002 -11.8008 -101.5 4.39941c-26.7002 29 -25 74.4004 4.39941 101.3l38.7002 35.5h-56.7002c-2 -0.799805 -3.7002 -1.5 -5.7002 -2.2998l-61.6992 -61.5996h-41.9004v-128.101h27.7002l97.2998 -88
|
|
||||||
c16.0996 -13.0996 41.4004 -10.5 55.2998 6.60059l15.6006 19.2002l36.7998 -31.5c3 -2.40039 12 -4.90039 18 2.39941l30 36.5l23.8994 -19.3994c3.5 -2.80078 8.5 -2.2002 11.3008 1.19922zM544 144.1v128h-44.7002l-61.7002 61.6006
|
|
||||||
c-1.39941 1.5 -3.39941 2.2998 -5.5 2.2998l-83.6992 -0.200195c-10 0 -19.6006 -3.7002 -27 -10.5l-65.6006 -60.0996c-9.7002 -8.7998 -10.5 -24 -1.2002 -33.9004c8.90039 -9.39941 25.1006 -8.7002 34.6006 0l55.2002 50.6006c6.5 5.89941 16.5996 5.5 22.5996 -1
|
|
||||||
l10.9004 -11.7002c6 -6.5 5.5 -16.6006 -1 -22.6006l-12.5 -11.3994l102.699 -83.4004c2.80078 -2.2998 5.40039 -4.89941 7.7002 -7.7002h69.2002zM592 96.4004c8.7998 0 16 7.09961 16 16c0 8.7998 -7.2002 16 -16 16s-16 -7.2002 -16 -16c0 -8.80078 7.2002 -16 16 -16z
|
|
||||||
" />
|
|
||||||
<glyph glyph-name="envelope-open" unicode=""
|
|
||||||
d="M494.586 283.484c9.6123 -7.94824 17.4141 -24.5205 17.4141 -36.9932v-262.491c0 -26.5098 -21.4902 -48 -48 -48h-416c-26.5098 0 -48 21.4902 -48 48v262.515c0 12.5166 7.84668 29.1279 17.5146 37.0771c4.08008 3.35449 110.688 89.0996 135.15 108.549
|
|
||||||
c22.6992 18.1426 60.1299 55.8594 103.335 55.8594c43.4365 0 81.2314 -38.1914 103.335 -55.8594c23.5283 -18.707 130.554 -104.773 135.251 -108.656zM464 -10v253.632v0.00488281c0 1.5791 -0.996094 3.66602 -2.22363 4.6582
|
|
||||||
c-15.8633 12.8232 -108.793 87.5752 -132.366 106.316c-17.5527 14.0195 -49.7168 45.3887 -73.4102 45.3887c-23.6016 0 -55.2451 -30.8799 -73.4102 -45.3887c-23.5713 -18.7393 -116.494 -93.4795 -132.364 -106.293
|
|
||||||
c-1.40918 -1.13965 -2.22559 -2.85254 -2.22559 -4.66504v-253.653c0 -3.31152 2.68848 -6 6 -6h404c3.31152 0 6 2.68848 6 6zM432.009 177.704c4.24902 -5.15918 3.46484 -12.7949 -1.74512 -16.9814c-28.9746 -23.2822 -59.2734 -47.5967 -70.9287 -56.8623
|
|
||||||
c-22.6992 -18.1436 -60.1299 -55.8604 -103.335 -55.8604c-43.4521 0 -81.2871 38.2373 -103.335 55.8604c-11.2793 8.9668 -41.7441 33.4131 -70.9268 56.8643c-5.20996 4.1875 -5.99316 11.8223 -1.74512 16.9814l15.2578 18.5283
|
|
||||||
c4.17773 5.07227 11.6572 5.84277 16.7793 1.72559c28.6182 -23.001 58.5654 -47.0352 70.5596 -56.5713c17.5527 -14.0195 49.7168 -45.3887 73.4102 -45.3887c23.6016 0 55.2461 30.8799 73.4102 45.3887c11.9941 9.53516 41.9434 33.5703 70.5625 56.5684
|
|
||||||
c5.12207 4.11621 12.6016 3.3457 16.7783 -1.72656z" />
|
|
||||||
<glyph glyph-name="address-book" unicode="" horiz-adv-x="448"
|
|
||||||
d="M436 288h-20v-64h20c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12h-20v-64h20c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12h-20v-48c0 -26.5 -21.5 -48 -48 -48h-320c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48
|
|
||||||
h320c26.5 0 48 -21.5 48 -48v-48h20c6.59961 0 12 -5.40039 12 -12v-40c0 -6.59961 -5.40039 -12 -12 -12zM368 -16v416h-320v-416h320zM208 192c-35.2998 0 -64 28.7002 -64 64s28.7002 64 64 64s64 -28.7002 64 -64s-28.7002 -64 -64 -64zM118.4 64
|
|
||||||
c-12.4004 0 -22.4004 8.59961 -22.4004 19.2002v19.2002c0 31.7998 30.0996 57.5996 67.2002 57.5996c11.3994 0 17.8994 -8 44.7998 -8c26.0996 0 34 8 44.7998 8c37.1006 0 67.2002 -25.7998 67.2002 -57.5996v-19.2002c0 -10.6006 -10 -19.2002 -22.4004 -19.2002
|
|
||||||
h-179.199z" />
|
|
||||||
<glyph glyph-name="address-card" unicode="" horiz-adv-x="576"
|
|
||||||
d="M528 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-480c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h480zM528 16v352h-480v-352h480zM208 192c-35.2998 0 -64 28.7002 -64 64s28.7002 64 64 64s64 -28.7002 64 -64s-28.7002 -64 -64 -64z
|
|
||||||
M118.4 64c-12.4004 0 -22.4004 8.59961 -22.4004 19.2002v19.2002c0 31.7998 30.0996 57.5996 67.2002 57.5996c11.3994 0 17.8994 -8 44.7998 -8c26.0996 0 34 8 44.7998 8c37.1006 0 67.2002 -25.7998 67.2002 -57.5996v-19.2002
|
|
||||||
c0 -10.6006 -10 -19.2002 -22.4004 -19.2002h-179.199zM360 128c-4.40039 0 -8 3.59961 -8 8v16c0 4.40039 3.59961 8 8 8h112c4.40039 0 8 -3.59961 8 -8v-16c0 -4.40039 -3.59961 -8 -8 -8h-112zM360 192c-4.40039 0 -8 3.59961 -8 8v16c0 4.40039 3.59961 8 8 8h112
|
|
||||||
c4.40039 0 8 -3.59961 8 -8v-16c0 -4.40039 -3.59961 -8 -8 -8h-112zM360 256c-4.40039 0 -8 3.59961 -8 8v16c0 4.40039 3.59961 8 8 8h112c4.40039 0 8 -3.59961 8 -8v-16c0 -4.40039 -3.59961 -8 -8 -8h-112z" />
|
|
||||||
<glyph glyph-name="user-circle" unicode="" horiz-adv-x="496"
|
|
||||||
d="M248 344c53 0 96 -43 96 -96s-43 -96 -96 -96s-96 43 -96 96s43 96 96 96zM248 200c26.5 0 48 21.5 48 48s-21.5 48 -48 48s-48 -21.5 -48 -48s21.5 -48 48 -48zM248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8
|
|
||||||
c49.7002 0 95.0996 18.2998 130.1 48.4004c-14.8994 23 -40.3994 38.5 -69.5996 39.5c-20.7998 -6.5 -40.5996 -9.60059 -60.5 -9.60059s-39.7002 3.2002 -60.5 9.60059c-29.2002 -0.900391 -54.7002 -16.5 -69.5996 -39.5c35 -30.1006 80.3994 -48.4004 130.1 -48.4004z
|
|
||||||
M410.7 76.0996c23.3994 32.7002 37.2998 72.7002 37.2998 115.9c0 110.3 -89.7002 200 -200 200s-200 -89.7002 -200 -200c0 -43.2002 13.9004 -83.2002 37.2998 -115.9c24.5 31.4004 62.2002 51.9004 105.101 51.9004c10.1992 0 26.0996 -9.59961 57.5996 -9.59961
|
|
||||||
c31.5996 0 47.4004 9.59961 57.5996 9.59961c43 0 80.7002 -20.5 105.101 -51.9004z" />
|
|
||||||
<glyph glyph-name="id-badge" unicode="" horiz-adv-x="384"
|
|
||||||
d="M336 448c26.5 0 48 -21.5 48 -48v-416c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v416c0 26.5 21.5 48 48 48h288zM336 -16v416h-288v-416h288zM144 336c-8.7998 0 -16 7.2002 -16 16s7.2002 16 16 16h96c8.7998 0 16 -7.2002 16 -16s-7.2002 -16 -16 -16
|
|
||||||
h-96zM192 160c-35.2998 0 -64 28.7002 -64 64s28.7002 64 64 64s64 -28.7002 64 -64s-28.7002 -64 -64 -64zM102.4 32c-12.4004 0 -22.4004 8.59961 -22.4004 19.2002v19.2002c0 31.7998 30.0996 57.5996 67.2002 57.5996c11.3994 0 17.8994 -8 44.7998 -8
|
|
||||||
c26.0996 0 34 8 44.7998 8c37.1006 0 67.2002 -25.7998 67.2002 -57.5996v-19.2002c0 -10.6006 -10 -19.2002 -22.4004 -19.2002h-179.199z" />
|
|
||||||
<glyph glyph-name="id-card" unicode="" horiz-adv-x="576"
|
|
||||||
d="M528 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-480c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h480zM528 16v288h-480v-288h32.7998c-1 4.5 -0.799805 -3.59961 -0.799805 22.4004c0 31.7998 30.0996 57.5996 67.2002 57.5996
|
|
||||||
c11.3994 0 17.8994 -8 44.7998 -8c26.0996 0 34 8 44.7998 8c37.1006 0 67.2002 -25.7998 67.2002 -57.5996c0 -26 0.0996094 -17.9004 -0.799805 -22.4004h224.8zM360 96c-4.40039 0 -8 3.59961 -8 8v16c0 4.40039 3.59961 8 8 8h112c4.40039 0 8 -3.59961 8 -8v-16
|
|
||||||
c0 -4.40039 -3.59961 -8 -8 -8h-112zM360 160c-4.40039 0 -8 3.59961 -8 8v16c0 4.40039 3.59961 8 8 8h112c4.40039 0 8 -3.59961 8 -8v-16c0 -4.40039 -3.59961 -8 -8 -8h-112zM360 224c-4.40039 0 -8 3.59961 -8 8v16c0 4.40039 3.59961 8 8 8h112
|
|
||||||
c4.40039 0 8 -3.59961 8 -8v-16c0 -4.40039 -3.59961 -8 -8 -8h-112zM192 128c-35.2998 0 -64 28.7002 -64 64s28.7002 64 64 64s64 -28.7002 64 -64s-28.7002 -64 -64 -64z" />
|
|
||||||
<glyph glyph-name="window-maximize" unicode=""
|
|
||||||
d="M464 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-416c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h416zM464 22v234h-416v-234c0 -3.2998 2.7002 -6 6 -6h404c3.2998 0 6 2.7002 6 6z" />
|
|
||||||
<glyph glyph-name="window-minimize" unicode=""
|
|
||||||
d="M480 -32h-448c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32h448c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32z" />
|
|
||||||
<glyph glyph-name="window-restore" unicode=""
|
|
||||||
d="M464 448c26.5 0 48 -21.5 48 -48v-320c0 -26.5 -21.5 -48 -48 -48h-48v-48c0 -26.5 -21.5 -48 -48 -48h-320c-26.5 0 -48 21.5 -48 48v320c0 26.5 21.5 48 48 48h48v48c0 26.5 21.5 48 48 48h320zM368 -16v208h-320v-208h320zM464 80v320h-320v-48h224
|
|
||||||
c26.5 0 48 -21.5 48 -48v-224h48z" />
|
|
||||||
<glyph glyph-name="snowflake" unicode="" horiz-adv-x="448"
|
|
||||||
d="M440.1 92.7998c7.60059 -4.39941 10.1006 -14.2002 5.5 -21.7002l-7.89941 -13.8994c-4.40039 -7.7002 -14 -10.2998 -21.5 -5.90039l-39.2002 23l9.09961 -34.7002c2.30078 -8.5 -2.69922 -17.2998 -11.0996 -19.5996l-15.2002 -4.09961
|
|
||||||
c-8.39941 -2.30078 -17.0996 2.7998 -19.2998 11.2998l-21.2998 81l-71.9004 42.2002v-84.5l58.2998 -59.3008c6.10059 -6.19922 6.10059 -16.3994 0 -22.5996l-11.0996 -11.2998c-6.09961 -6.2002 -16.0996 -6.2002 -22.2002 0l-24.8994 25.3994v-46.0996
|
|
||||||
c0 -8.7998 -7 -16 -15.7002 -16h-15.7002c-8.7002 0 -15.7002 7.2002 -15.7002 16v45.9004l-24.8994 -25.4004c-6.10059 -6.2002 -16.1006 -6.2002 -22.2002 0l-11.1006 11.2998c-6.09961 6.2002 -6.09961 16.4004 0 22.6006l58.3008 59.2998v84.5l-71.9004 -42.2002
|
|
||||||
l-21.2998 -81c-2.2998 -8.5 -10.9004 -13.5996 -19.2998 -11.2998l-15.2002 4.09961c-8.40039 2.2998 -13.2998 11.1006 -11.1006 19.6006l9.10059 34.6992l-39.2002 -23c-7.5 -4.39941 -17.2002 -1.7998 -21.5 5.90039l-7.90039 13.9004
|
|
||||||
c-4.2998 7.69922 -1.69922 17.5 5.80078 21.8994l39.1992 23l-34.0996 9.2998c-8.40039 2.30078 -13.2998 11.1006 -11.0996 19.6006l4.09961 15.5c2.2998 8.5 10.9004 13.5996 19.2998 11.2998l79.7002 -21.7002l71.9004 42.2002l-71.9004 42.2002l-79.7002 -21.7002
|
|
||||||
c-8.39941 -2.2998 -17.0996 2.7998 -19.2998 11.2998l-4.09961 15.5c-2.30078 8.5 2.69922 17.2998 11.0996 19.6006l34.0996 9.09961l-39.1992 23c-7.60059 4.5 -10.1006 14.2002 -5.80078 21.9004l7.90039 13.8994c4.40039 7.7002 14 10.2998 21.5 5.90039l39.2002 -23
|
|
||||||
l-9.10059 34.7002c-2.2998 8.5 2.7002 17.2998 11.1006 19.5996l15.2002 4.09961c8.39941 2.30078 17.0996 -2.7998 19.2998 -11.2998l21.2998 -81l71.9004 -42.2002v84.5l-58.3008 59.3008c-6.09961 6.19922 -6.09961 16.3994 0 22.5996l11.5 11.2998
|
|
||||||
c6.10059 6.2002 16.1006 6.2002 22.2002 0l24.9004 -25.3994v46.0996c0 8.7998 7 16 15.7002 16h15.6992c8.7002 0 15.7002 -7.2002 15.7002 -16v-45.9004l24.9004 25.4004c6.09961 6.2002 16.0996 6.2002 22.2002 0l11.0996 -11.2998
|
|
||||||
c6.09961 -6.2002 6.09961 -16.4004 0 -22.6006l-58.2998 -59.2998v-84.5l71.8994 42.2002l21.3008 81c2.2998 8.5 10.8994 13.5996 19.2998 11.2998l15.2002 -4.09961c8.39941 -2.2998 13.2998 -11.1006 11.0996 -19.6006l-9.09961 -34.6992l39.1992 23
|
|
||||||
c7.5 4.39941 17.2002 1.7998 21.5 -5.90039l7.90039 -13.9004c4.2998 -7.69922 1.7002 -17.5 -5.7998 -21.8994l-39.2002 -23l34.0996 -9.2998c8.40039 -2.30078 13.3008 -11.1006 11.1006 -19.6006l-4.10059 -15.5c-2.2998 -8.5 -10.8994 -13.5996 -19.2998 -11.2998
|
|
||||||
l-79.7002 21.7002l-71.8994 -42.2002l71.7998 -42.2002l79.7002 21.7002c8.39941 2.2998 17.0996 -2.7998 19.2998 -11.2998l4.09961 -15.5c2.30078 -8.5 -2.69922 -17.2998 -11.0996 -19.6006l-34.0996 -9.2998z" />
|
|
||||||
<glyph glyph-name="trash-alt" unicode="" horiz-adv-x="448"
|
|
||||||
d="M268 32c-6.62402 0 -12 5.37598 -12 12v216c0 6.62402 5.37598 12 12 12h24c6.62402 0 12 -5.37598 12 -12v-216c0 -6.62402 -5.37598 -12 -12 -12h-24zM432 368c8.83203 0 16 -7.16797 16 -16v-16c0 -8.83203 -7.16797 -16 -16 -16h-16v-336
|
|
||||||
c0 -26.4961 -21.5039 -48 -48 -48h-288c-26.4961 0 -48 21.5039 -48 48v336h-16c-8.83203 0 -16 7.16797 -16 16v16c0 8.83203 7.16797 16 16 16h82.4102l34.0195 56.7002c7.71875 12.8613 26.1572 23.2998 41.1572 23.2998h0.00292969h100.82h0.0224609
|
|
||||||
c15 0 33.4385 -10.4385 41.1572 -23.2998l34 -56.7002h82.4102zM171.84 397.09l-17.4502 -29.0898h139.221l-17.46 29.0898c-0.96582 1.60645 -3.26953 2.91016 -5.14355 2.91016h-0.00683594h-94h-0.0166016c-1.87402 0 -4.17871 -1.30371 -5.14355 -2.91016zM368 -16v336
|
|
||||||
h-288v-336h288zM156 32c-6.62402 0 -12 5.37598 -12 12v216c0 6.62402 5.37598 12 12 12h24c6.62402 0 12 -5.37598 12 -12v-216c0 -6.62402 -5.37598 -12 -12 -12h-24z" />
|
|
||||||
<glyph glyph-name="images" unicode="" horiz-adv-x="576"
|
|
||||||
d="M480 32v-16c0 -26.5098 -21.4902 -48 -48 -48h-384c-26.5098 0 -48 21.4902 -48 48v256c0 26.5098 21.4902 48 48 48h16v-48h-10c-3.31152 0 -6 -2.68848 -6 -6v-244c0 -3.31152 2.68848 -6 6 -6h372c3.31152 0 6 2.68848 6 6v10h48zM522 368h-372
|
|
||||||
c-3.31152 0 -6 -2.68848 -6 -6v-244c0 -3.31152 2.68848 -6 6 -6h372c3.31152 0 6 2.68848 6 6v244c0 3.31152 -2.68848 6 -6 6zM528 416c26.5098 0 48 -21.4902 48 -48v-256c0 -26.5098 -21.4902 -48 -48 -48h-384c-26.5098 0 -48 21.4902 -48 48v256
|
|
||||||
c0 26.5098 21.4902 48 48 48h384zM264 304c0 -22.0908 -17.9092 -40 -40 -40s-40 17.9092 -40 40s17.9092 40 40 40s40 -17.9092 40 -40zM192 208l39.5146 39.5146c4.68652 4.68652 12.2842 4.68652 16.9717 0l39.5137 -39.5146l103.515 103.515
|
|
||||||
c4.68652 4.68652 12.2842 4.68652 16.9717 0l71.5137 -71.5146v-80h-288v48z" />
|
|
||||||
<glyph glyph-name="clipboard" unicode="" horiz-adv-x="384"
|
|
||||||
d="M336 384c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-288c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h80c0 35.2998 28.7002 64 64 64s64 -28.7002 64 -64h80zM192 408c-13.2998 0 -24 -10.7002 -24 -24s10.7002 -24 24 -24s24 10.7002 24 24
|
|
||||||
s-10.7002 24 -24 24zM336 -10v340c0 3.2998 -2.7002 6 -6 6h-42v-36c0 -6.59961 -5.40039 -12 -12 -12h-168c-6.59961 0 -12 5.40039 -12 12v36h-42c-3.2998 0 -6 -2.7002 -6 -6v-340c0 -3.2998 2.7002 -6 6 -6h276c3.2998 0 6 2.7002 6 6z" />
|
|
||||||
<glyph glyph-name="arrow-alt-circle-down" unicode=""
|
|
||||||
d="M256 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM256 -8c110.5 0 200 89.5 200 200s-89.5 200 -200 200s-200 -89.5 -200 -200s89.5 -200 200 -200zM224 308c0 6.59961 5.40039 12 12 12h40c6.59961 0 12 -5.40039 12 -12v-116
|
|
||||||
h67c10.7002 0 16.0996 -12.9004 8.5 -20.5l-99 -99c-4.7002 -4.7002 -12.2998 -4.7002 -17 0l-99 99c-7.5 7.59961 -2.2002 20.5 8.5 20.5h67v116z" />
|
|
||||||
<glyph glyph-name="arrow-alt-circle-left" unicode=""
|
|
||||||
d="M8 192c0 137 111 248 248 248s248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248zM456 192c0 110.5 -89.5 200 -200 200s-200 -89.5 -200 -200s89.5 -200 200 -200s200 89.5 200 200zM384 212v-40c0 -6.59961 -5.40039 -12 -12 -12h-116v-67
|
|
||||||
c0 -10.7002 -12.9004 -16 -20.5 -8.5l-99 99c-4.7002 4.7002 -4.7002 12.2998 0 17l99 99c7.59961 7.59961 20.5 2.2002 20.5 -8.5v-67h116c6.59961 0 12 -5.40039 12 -12z" />
|
|
||||||
<glyph glyph-name="arrow-alt-circle-right" unicode=""
|
|
||||||
d="M504 192c0 -137 -111 -248 -248 -248s-248 111 -248 248s111 248 248 248s248 -111 248 -248zM56 192c0 -110.5 89.5 -200 200 -200s200 89.5 200 200s-89.5 200 -200 200s-200 -89.5 -200 -200zM128 172v40c0 6.59961 5.40039 12 12 12h116v67
|
|
||||||
c0 10.7002 12.9004 16 20.5 8.5l99 -99c4.7002 -4.7002 4.7002 -12.2998 0 -17l-99 -99c-7.59961 -7.59961 -20.5 -2.2002 -20.5 8.5v67h-116c-6.59961 0 -12 5.40039 -12 12z" />
|
|
||||||
<glyph glyph-name="arrow-alt-circle-up" unicode=""
|
|
||||||
d="M256 -56c-137 0 -248 111 -248 248s111 248 248 248s248 -111 248 -248s-111 -248 -248 -248zM256 392c-110.5 0 -200 -89.5 -200 -200s89.5 -200 200 -200s200 89.5 200 200s-89.5 200 -200 200zM276 64h-40c-6.59961 0 -12 5.40039 -12 12v116h-67
|
|
||||||
c-10.7002 0 -16 12.9004 -8.5 20.5l99 99c4.7002 4.7002 12.2998 4.7002 17 0l99 -99c7.59961 -7.59961 2.2002 -20.5 -8.5 -20.5h-67v-116c0 -6.59961 -5.40039 -12 -12 -12z" />
|
|
||||||
<glyph glyph-name="gem" unicode="" horiz-adv-x="576"
|
|
||||||
d="M464 448c4.09961 0 7.7998 -2 10.0996 -5.40039l99.9004 -147.199c2.90039 -4.40039 2.59961 -10.1006 -0.700195 -14.2002l-276 -340.8c-4.7998 -5.90039 -13.7998 -5.90039 -18.5996 0l-276 340.8c-3.2998 4 -3.60059 9.7998 -0.700195 14.2002l100 147.199
|
|
||||||
c2.2002 3.40039 6 5.40039 10 5.40039h352zM444.7 400h-56.7998l51.6992 -96h68.4004zM242.6 400l-51.5996 -96h194l-51.7002 96h-90.7002zM131.3 400l-63.2998 -96h68.4004l51.6992 96h-56.7998zM88.2998 256l119.7 -160l-68.2998 160h-51.4004zM191.2 256l96.7998 -243.3
|
|
||||||
l96.7998 243.3h-193.6zM368 96l119.6 160h-51.3994z" />
|
|
||||||
<glyph glyph-name="money-bill-alt" unicode="" horiz-adv-x="640"
|
|
||||||
d="M320 304c53.0195 0 96 -50.1396 96 -112c0 -61.8701 -43 -112 -96 -112c-53.0195 0 -96 50.1504 -96 112c0 61.8604 42.9805 112 96 112zM360 136v16c0 4.41992 -3.58008 8 -8 8h-16v88c0 4.41992 -3.58008 8 -8 8h-13.5801h-0.000976562
|
|
||||||
c-4.01074 0 -9.97266 -1.80566 -13.3086 -4.03027l-15.3301 -10.2197c-1.96777 -1.30957 -3.56445 -4.29004 -3.56445 -6.65332c0 -1.33691 0.601562 -3.32422 1.34375 -4.43652l8.88086 -13.3105c1.30859 -1.9668 4.29004 -3.56445 6.65332 -3.56445
|
|
||||||
c1.33691 0 3.32422 0.602539 4.43652 1.34473l0.469727 0.310547v-55.4404h-16c-4.41992 0 -8 -3.58008 -8 -8v-16c0 -4.41992 3.58008 -8 8 -8h64c4.41992 0 8 3.58008 8 8zM608 384c17.6699 0 32 -14.3301 32 -32v-320c0 -17.6699 -14.3301 -32 -32 -32h-576
|
|
||||||
c-17.6699 0 -32 14.3301 -32 32v320c0 17.6699 14.3301 32 32 32h576zM592 112v160c-35.3496 0 -64 28.6504 -64 64h-416c0 -35.3496 -28.6504 -64 -64 -64v-160c35.3496 0 64 -28.6504 64 -64h416c0 35.3496 28.6504 64 64 64z" />
|
|
||||||
<glyph glyph-name="window-close" unicode=""
|
|
||||||
d="M464 416c26.5 0 48 -21.5 48 -48v-352c0 -26.5 -21.5 -48 -48 -48h-416c-26.5 0 -48 21.5 -48 48v352c0 26.5 21.5 48 48 48h416zM464 22v340c0 3.2998 -2.7002 6 -6 6h-404c-3.2998 0 -6 -2.7002 -6 -6v-340c0 -3.2998 2.7002 -6 6 -6h404c3.2998 0 6 2.7002 6 6z
|
|
||||||
M356.5 253.4l-61.4004 -61.4004l61.4004 -61.4004c4.59961 -4.59961 4.59961 -12.0996 0 -16.7998l-22.2998 -22.2998c-4.60059 -4.59961 -12.1006 -4.59961 -16.7998 0l-61.4004 61.4004l-61.4004 -61.4004c-4.59961 -4.59961 -12.0996 -4.59961 -16.7998 0
|
|
||||||
l-22.2998 22.2998c-4.59961 4.60059 -4.59961 12.1006 0 16.7998l61.4004 61.4004l-61.4004 61.4004c-4.59961 4.59961 -4.59961 12.0996 0 16.7998l22.2998 22.2998c4.60059 4.59961 12.1006 4.59961 16.7998 0l61.4004 -61.4004l61.4004 61.4004
|
|
||||||
c4.59961 4.59961 12.0996 4.59961 16.7998 0l22.2998 -22.2998c4.7002 -4.60059 4.7002 -12.1006 0 -16.7998z" />
|
|
||||||
<glyph glyph-name="comment-dots" unicode=""
|
|
||||||
d="M144 240c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32s-32 14.2998 -32 32s14.2998 32 32 32zM256 240c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32s-32 14.2998 -32 32s14.2998 32 32 32zM368 240c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32
|
|
||||||
s-32 14.2998 -32 32s14.2998 32 32 32zM256 416c141.4 0 256 -93.0996 256 -208s-114.6 -208 -256 -208c-32.7998 0 -64 5.2002 -92.9004 14.2998c-29.0996 -20.5996 -77.5996 -46.2998 -139.1 -46.2998c-9.59961 0 -18.2998 5.7002 -22.0996 14.5
|
|
||||||
c-3.80078 8.7998 -2 19 4.59961 26c0.5 0.400391 31.5 33.7998 46.4004 73.2002c-33 35.0996 -52.9004 78.7002 -52.9004 126.3c0 114.9 114.6 208 256 208zM256 48c114.7 0 208 71.7998 208 160s-93.2998 160 -208 160s-208 -71.7998 -208 -160
|
|
||||||
c0 -42.2002 21.7002 -74.0996 39.7998 -93.4004l20.6006 -21.7998l-10.6006 -28.0996c-5.5 -14.5 -12.5996 -28.1006 -19.8994 -40.2002c23.5996 7.59961 43.1992 18.9004 57.5 29l19.5 13.7998l22.6992 -7.2002c25.3008 -8 51.7002 -12.0996 78.4004 -12.0996z" />
|
|
||||||
<glyph glyph-name="smile-wink" unicode="" horiz-adv-x="496"
|
|
||||||
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM365.8 138.4c10.2002 -8.5 11.6006 -23.6006 3.10059 -33.8008
|
|
||||||
c-30 -36 -74.1006 -56.5996 -120.9 -56.5996s-90.9004 20.5996 -120.9 56.5996c-8.39941 10.2002 -7.09961 25.3008 3.10059 33.8008c10.0996 8.39941 25.2998 7.09961 33.7998 -3.10059c20.7998 -25.0996 51.5 -39.3994 84 -39.3994s63.2002 14.3994 84 39.3994
|
|
||||||
c8.5 10.2002 23.5996 11.6006 33.7998 3.10059zM168 208c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32s32 -14.2998 32 -32s-14.2998 -32 -32 -32zM328 268c25.7002 0 55.9004 -16.9004 59.7002 -42.0996c1.7998 -11.1006 -11.2998 -18.2002 -19.7998 -10.8008l-9.5 8.5
|
|
||||||
c-14.8008 13.2002 -46.2002 13.2002 -61 0l-9.5 -8.5c-8.30078 -7.39941 -21.5 -0.399414 -19.8008 10.8008c4 25.1992 34.2002 42.0996 59.9004 42.0996z" />
|
|
||||||
<glyph glyph-name="angry" unicode="" horiz-adv-x="496"
|
|
||||||
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM248 136c33.5996 0 65.2002 -14.7998 86.7998 -40.5996
|
|
||||||
c8.40039 -10.2002 7.10059 -25.3008 -3.09961 -33.8008c-10.6006 -8.89941 -25.7002 -6.69922 -33.7998 3c-24.8008 29.7002 -75 29.7002 -99.8008 0c-8.5 -10.1992 -23.5996 -11.5 -33.7998 -3s-11.5996 23.6006 -3.09961 33.8008
|
|
||||||
c21.5996 25.7998 53.2002 40.5996 86.7998 40.5996zM200 208c0 -17.7002 -14.2998 -32.0996 -32 -32.0996s-32 14.2998 -32 32c0 6.19922 2.2002 11.6992 5.2998 16.5996l-28.2002 8.5c-12.6992 3.7998 -19.8994 17.2002 -16.0996 29.9004
|
|
||||||
c3.7998 12.6992 17.0996 20 29.9004 16.0996l80 -24c12.6992 -3.7998 19.8994 -17.2002 16.0996 -29.9004c-3.09961 -10.3994 -12.7002 -17.0996 -23 -17.0996zM399 262.9c3.7998 -12.7002 -3.40039 -26.1006 -16.0996 -29.8008l-28.2002 -8.5
|
|
||||||
c3.09961 -4.89941 5.2998 -10.3994 5.2998 -16.5996c0 -17.7002 -14.2998 -32 -32 -32s-32 14.2998 -32 32c-10.2998 0 -19.9004 6.7002 -23 17.0996c-3.7998 12.7002 3.40039 26.1006 16.0996 29.9004l80 24c12.8008 3.7998 26.1006 -3.40039 29.9004 -16.0996z" />
|
|
||||||
<glyph glyph-name="dizzy" unicode="" horiz-adv-x="496"
|
|
||||||
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM214.2 209.9
|
|
||||||
c-7.90039 -7.90039 -20.5 -7.90039 -28.4004 -0.200195l-17.7998 17.7998l-17.7998 -17.7998c-7.7998 -7.7998 -20.5 -7.7998 -28.2998 0c-7.80078 7.7998 -7.80078 20.5 0 28.2998l17.8994 17.9004l-17.8994 17.8994c-7.80078 7.7998 -7.80078 20.5 0 28.2998
|
|
||||||
c7.7998 7.80078 20.5 7.80078 28.2998 0l17.7998 -17.7998l17.9004 17.9004c7.7998 7.7998 20.5 7.7998 28.2998 0s7.7998 -20.5 0 -28.2998l-17.9004 -17.9004l17.9004 -17.7998c7.7998 -7.7998 7.7998 -20.5 0 -28.2998zM374.2 302.1
|
|
||||||
c7.7002 -7.7998 7.7002 -20.3994 0 -28.1992l-17.9004 -17.9004l17.7998 -18c7.80078 -7.7998 7.80078 -20.5 0 -28.2998c-7.7998 -7.7998 -20.5 -7.7998 -28.2998 0l-17.7998 17.7998l-17.7998 -17.7998c-7.7998 -7.7998 -20.5 -7.7998 -28.2998 0
|
|
||||||
c-7.80078 7.7998 -7.80078 20.5 0 28.2998l17.8994 17.9004l-17.8994 17.8994c-7.80078 7.7998 -7.80078 20.5 0 28.2998c7.7998 7.80078 20.5 7.80078 28.2998 0l17.7998 -17.7998l17.9004 17.7998c7.7998 7.80078 20.5 7.80078 28.2998 0zM248 176
|
|
||||||
c35.2998 0 64 -28.7002 64 -64s-28.7002 -64 -64 -64s-64 28.7002 -64 64s28.7002 64 64 64z" />
|
|
||||||
<glyph glyph-name="flushed" unicode="" horiz-adv-x="496"
|
|
||||||
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM344 304c44.2002 0 80 -35.7998 80 -80s-35.7998 -80 -80 -80
|
|
||||||
s-80 35.7998 -80 80s35.7998 80 80 80zM344 176c26.5 0 48 21.5 48 48s-21.5 48 -48 48s-48 -21.5 -48 -48s21.5 -48 48 -48zM344 248c13.2998 0 24 -10.7002 24 -24s-10.7002 -24 -24 -24s-24 10.7002 -24 24s10.7002 24 24 24zM232 224c0 -44.2002 -35.7998 -80 -80 -80
|
|
||||||
s-80 35.7998 -80 80s35.7998 80 80 80s80 -35.7998 80 -80zM152 176c26.5 0 48 21.5 48 48s-21.5 48 -48 48s-48 -21.5 -48 -48s21.5 -48 48 -48zM152 248c13.2998 0 24 -10.7002 24 -24s-10.7002 -24 -24 -24s-24 10.7002 -24 24s10.7002 24 24 24zM312 104
|
|
||||||
c13.2002 0 24 -10.7998 24 -24s-10.7998 -24 -24 -24h-128c-13.2002 0 -24 10.7998 -24 24s10.7998 24 24 24h128z" />
|
|
||||||
<glyph glyph-name="frown-open" unicode="" horiz-adv-x="496"
|
|
||||||
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM200 240c0 -17.7002 -14.2998 -32 -32 -32s-32 14.2998 -32 32
|
|
||||||
s14.2998 32 32 32s32 -14.2998 32 -32zM328 272c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32s-32 14.2998 -32 32s14.2998 32 32 32zM248 160c35.5996 0 88.7998 -21.2998 95.7998 -61.2002c2 -11.7998 -9.09961 -21.5996 -20.5 -18.0996
|
|
||||||
c-31.2002 9.59961 -59.3994 15.2998 -75.2998 15.2998s-44.0996 -5.7002 -75.2998 -15.2998c-11.5 -3.40039 -22.5 6.2998 -20.5 18.0996c7 39.9004 60.2002 61.2002 95.7998 61.2002z" />
|
|
||||||
<glyph glyph-name="grimace" unicode="" horiz-adv-x="496"
|
|
||||||
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM168 208c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32
|
|
||||||
s32 -14.2998 32 -32s-14.2998 -32 -32 -32zM328 208c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32s32 -14.2998 32 -32s-14.2998 -32 -32 -32zM344 192c26.5 0 48 -21.5 48 -48v-32c0 -26.5 -21.5 -48 -48 -48h-192c-26.5 0 -48 21.5 -48 48v32c0 26.5 21.5 48 48 48
|
|
||||||
h192zM176 96v24h-40v-8c0 -8.7998 7.2002 -16 16 -16h24zM176 136v24h-24c-8.7998 0 -16 -7.2002 -16 -16v-8h40zM240 96v24h-48v-24h48zM240 136v24h-48v-24h48zM304 96v24h-48v-24h48zM304 136v24h-48v-24h48zM360 112v8h-40v-24h24c8.7998 0 16 7.2002 16 16zM360 136v8
|
|
||||||
c0 8.7998 -7.2002 16 -16 16h-24v-24h40z" />
|
|
||||||
<glyph glyph-name="grin" unicode="" horiz-adv-x="496"
|
|
||||||
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM353.6 143.4c10 3.09961 19.3008 -5.5 17.7002 -15.3008
|
|
||||||
c-8 -47.0996 -71.2998 -80 -123.3 -80s-115.4 32.9004 -123.3 80c-1.7002 9.90039 7.7998 18.4004 17.7002 15.3008c26 -8.30078 64.3994 -13.1006 105.6 -13.1006s79.7002 4.7998 105.6 13.1006zM168 208c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32
|
|
||||||
s32 -14.2998 32 -32s-14.2998 -32 -32 -32zM328 208c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32s32 -14.2998 32 -32s-14.2998 -32 -32 -32z" />
|
|
||||||
<glyph glyph-name="grin-alt" unicode="" horiz-adv-x="496"
|
|
||||||
d="M200.3 200c-7.5 -11.4004 -24.5996 -12 -32.7002 0c-12.3994 18.7002 -15.1992 37.2998 -15.6992 56c0.599609 18.7002 3.2998 37.2998 15.6992 56c7.60059 11.4004 24.7002 12 32.7002 0c12.4004 -18.7002 15.2002 -37.2998 15.7002 -56
|
|
||||||
c-0.599609 -18.7002 -3.2998 -37.2998 -15.7002 -56zM328.3 200c-7.5 -11.4004 -24.5996 -12 -32.7002 0c-12.3994 18.7002 -15.1992 37.2998 -15.6992 56c0.599609 18.7002 3.2998 37.2998 15.6992 56c7.60059 11.4004 24.7002 12 32.7002 0
|
|
||||||
c12.4004 -18.7002 15.2002 -37.2998 15.7002 -56c-0.599609 -18.7002 -3.2998 -37.2998 -15.7002 -56zM248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200
|
|
||||||
s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM353.6 143.4c10 3.09961 19.3008 -5.5 17.7002 -15.3008c-8 -47.0996 -71.2998 -80 -123.3 -80s-115.4 32.8008 -123.3 80c-1.7002 10 7.7998 18.4004 17.7002 15.3008c26 -8.30078 64.3994 -13.1006 105.6 -13.1006
|
|
||||||
s79.7002 4.7998 105.6 13.1006z" />
|
|
||||||
<glyph glyph-name="grin-beam" unicode="" horiz-adv-x="496"
|
|
||||||
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM353.6 143.4c10 3.09961 19.3008 -5.5 17.7002 -15.3008
|
|
||||||
c-8 -47.0996 -71.2998 -80 -123.3 -80s-115.4 32.9004 -123.3 80c-1.7002 10 7.89941 18.4004 17.7002 15.3008c26 -8.30078 64.3994 -13.1006 105.6 -13.1006s79.7002 4.7998 105.6 13.1006zM117.7 216.3c-3.60059 1.10059 -6 4.60059 -5.7002 8.2998
|
|
||||||
c3.2998 42.1006 32.2002 71.4004 56 71.4004s52.7002 -29.2998 56 -71.4004c0.299805 -3.7998 -2.09961 -7.19922 -5.7002 -8.2998c-3.09961 -1 -7.2002 0 -9.2998 3.7002l-9.5 17c-7.7002 13.7002 -19.2002 21.5996 -31.5 21.5996s-23.7998 -7.89941 -31.5 -21.5996
|
|
||||||
l-9.5 -17c-1.90039 -3.2002 -5.7998 -4.7998 -9.2998 -3.7002zM277.7 216.3c-3.60059 1.10059 -6 4.60059 -5.7002 8.2998c3.2998 42.1006 32.2002 71.4004 56 71.4004s52.7002 -29.2998 56 -71.4004c0.299805 -3.7998 -2.09961 -7.19922 -5.7002 -8.2998
|
|
||||||
c-3.09961 -1 -7.2002 0 -9.2998 3.7002l-9.5 17c-7.7002 13.7002 -19.2002 21.5996 -31.5 21.5996s-23.7998 -7.89941 -31.5 -21.5996l-9.5 -17c-1.90039 -3.2002 -5.7998 -4.7998 -9.2998 -3.7002z" />
|
|
||||||
<glyph glyph-name="grin-beam-sweat" unicode="" horiz-adv-x="496"
|
|
||||||
d="M440 288c-29.5 0 -53.2998 26.2998 -53.2998 58.7002c0 25 31.7002 75.5 46.2002 97.2998c3.5 5.2998 10.5996 5.2998 14.1992 0c14.5 -21.7998 46.2002 -72.2998 46.2002 -97.2998c0 -32.4004 -23.7998 -58.7002 -53.2998 -58.7002zM248 48
|
|
||||||
c-51.9004 0 -115.3 32.9004 -123.3 80c-1.7002 10 7.89941 18.4004 17.7002 15.2998c26 -8.2998 64.3994 -13.0996 105.6 -13.0996s79.7002 4.7998 105.6 13.0996c10 3.2002 19.4004 -5.39941 17.7002 -15.2998c-8 -47.0996 -71.3994 -80 -123.3 -80zM378.3 216.3
|
|
||||||
c-3.09961 -0.899414 -7.2002 0.100586 -9.2998 3.7002l-9.5 17c-7.7002 13.7002 -19.2002 21.5996 -31.5 21.5996s-23.7998 -7.89941 -31.5 -21.5996l-9.5 -17c-1.90039 -3.2002 -5.7998 -4.7998 -9.2998 -3.7002c-3.60059 1.10059 -6 4.60059 -5.7002 8.2998
|
|
||||||
c3.2998 42.1006 32.2002 71.4004 56 71.4004s52.7002 -29.2998 56 -71.4004c0.299805 -3.7998 -2.09961 -7.19922 -5.7002 -8.2998zM483.6 269.2c8 -24.2998 12.4004 -50.2002 12.4004 -77.2002c0 -137 -111 -248 -248 -248s-248 111 -248 248s111 248 248 248
|
|
||||||
c45.7002 0 88.4004 -12.5996 125.2 -34.2002c-10.9004 -21.5996 -15.5 -36.2002 -17.2002 -45.7002c-31.2002 20.1006 -68.2002 31.9004 -108 31.9004c-110.3 0 -200 -89.7002 -200 -200s89.7002 -200 200 -200s200 89.7002 200 200
|
|
||||||
c0 22.5 -3.90039 44.0996 -10.7998 64.2998c0.399414 0 21.7998 -2.7998 46.3994 12.9004zM168 258.6c-12.2998 0 -23.7998 -7.7998 -31.5 -21.5996l-9.5 -17c-1.90039 -3.2002 -5.7998 -4.7998 -9.2998 -3.7002c-3.60059 1.10059 -6 4.60059 -5.7002 8.2998
|
|
||||||
c3.2998 42.1006 32.2002 71.4004 56 71.4004s52.7002 -29.2998 56 -71.4004c0.299805 -3.7998 -2.09961 -7.19922 -5.7002 -8.2998c-3.09961 -1 -7.2002 0 -9.2998 3.7002l-9.5 17c-7.7002 13.7002 -19.2002 21.5996 -31.5 21.5996z" />
|
|
||||||
<glyph glyph-name="grin-hearts" unicode="" horiz-adv-x="496"
|
|
||||||
d="M353.6 143.4c10 3.09961 19.3008 -5.5 17.7002 -15.3008c-8 -47.0996 -71.2998 -80 -123.3 -80s-115.4 32.8008 -123.3 80c-1.7002 10 7.89941 18.4004 17.7002 15.3008c26 -8.30078 64.3994 -13.1006 105.6 -13.1006s79.7002 4.7998 105.6 13.1006zM200.8 192.3
|
|
||||||
l-70.2002 18.1006c-20.3994 5.2998 -31.8994 27 -24.1992 47.1992c6.69922 17.7002 26.6992 26.7002 44.8994 22l7.10059 -1.89941l2 7.09961c5.09961 18.1006 22.8994 30.9004 41.5 27.9004c21.3994 -3.40039 34.3994 -24.2002 28.7998 -44.5l-19.4004 -69.9004
|
|
||||||
c-1.2998 -4.5 -6 -7.2002 -10.5 -6zM389.6 257.6c7.7002 -20.1992 -3.7998 -41.7998 -24.1992 -47.0996l-70.2002 -18.2002c-4.60059 -1.2002 -9.2998 1.5 -10.5 6l-19.4004 69.9004c-5.59961 20.2998 7.40039 41.0996 28.7998 44.5c18.7002 3 36.5 -9.7998 41.5 -27.9004
|
|
||||||
l2 -7.09961l7.10059 1.89941c18.2002 4.7002 38.2002 -4.39941 44.8994 -22zM248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200
|
|
||||||
s89.7002 -200 200 -200z" />
|
|
||||||
<glyph glyph-name="grin-squint" unicode="" horiz-adv-x="496"
|
|
||||||
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM353.6 143.4c10 3.09961 19.3008 -5.5 17.7002 -15.3008
|
|
||||||
c-8 -47.0996 -71.2998 -80 -123.3 -80s-115.4 32.9004 -123.3 80c-1.7002 9.90039 7.7998 18.4004 17.7002 15.3008c26 -8.30078 64.3994 -13.1006 105.6 -13.1006s79.7002 4.7998 105.6 13.1006zM118.9 184.2c-3.80078 4.39941 -3.90039 11 -0.100586 15.5l33.6006 40.2998
|
|
||||||
l-33.6006 40.2998c-3.7002 4.5 -3.7002 11 0.100586 15.5c3.89941 4.40039 10.1992 5.5 15.2998 2.5l80 -48c3.59961 -2.2002 5.7998 -6.09961 5.7998 -10.2998s-2.2002 -8.09961 -5.7998 -10.2998l-80 -48c-5.40039 -3.2002 -11.7002 -1.7002 -15.2998 2.5zM361.8 181.7
|
|
||||||
l-80 48c-3.59961 2.2002 -5.7998 6.09961 -5.7998 10.2998s2.2002 8.09961 5.7998 10.2998l80 48c5.10059 2.90039 11.5 1.90039 15.2998 -2.5c3.80078 -4.5 3.90039 -11 0.100586 -15.5l-33.6006 -40.2998l33.6006 -40.2998c3.7002 -4.5 3.7002 -11 -0.100586 -15.5
|
|
||||||
c-3.59961 -4.2002 -9.89941 -5.7002 -15.2998 -2.5z" />
|
|
||||||
<glyph glyph-name="grin-squint-tears" unicode=""
|
|
||||||
d="M117.1 63.9004c6.30078 0.899414 11.7002 -4.5 10.9004 -10.9004c-3.7002 -25.7998 -13.7002 -84 -30.5996 -100.9c-22 -21.8994 -57.9004 -21.5 -80.3008 0.900391c-22.3994 22.4004 -22.7998 58.4004 -0.899414 80.2998
|
|
||||||
c16.8994 16.9004 75.0996 26.9004 100.899 30.6006zM75.9004 105.6c-19.6006 -3.89941 -35.1006 -8.09961 -47.3008 -12.1992c-39.2998 90.5996 -22.0996 199.899 52 274c48.5 48.3994 111.9 72.5996 175.4 72.5996c38.9004 0 77.7998 -9.2002 113.2 -27.4004
|
|
||||||
c-4 -12.1992 -8.2002 -28 -12 -48.2998c-30.4004 17.9004 -65 27.7002 -101.2 27.7002c-53.4004 0 -103.6 -20.7998 -141.4 -58.5996c-61.5996 -61.5 -74.2998 -153.4 -38.6992 -227.801zM428.2 293.2c20.2998 3.89941 36.2002 8 48.5 12
|
|
||||||
c47.8994 -93.2002 32.8994 -210.5 -45.2002 -288.601c-48.5 -48.3994 -111.9 -72.5996 -175.4 -72.5996c-33.6992 0 -67.2998 7 -98.6992 20.5996c4.19922 12.2002 8.2998 27.7002 12.1992 47.2002c26.6006 -12.7998 55.9004 -19.7998 86.4004 -19.7998
|
|
||||||
c53.4004 0 103.6 20.7998 141.4 58.5996c65.6992 65.7002 75.7998 166 30.7998 242.601zM394.9 320.1c-6.30078 -0.899414 -11.7002 4.5 -10.9004 10.9004c3.7002 25.7998 13.7002 84 30.5996 100.9c22 21.8994 57.9004 21.5 80.3008 -0.900391
|
|
||||||
c22.3994 -22.4004 22.7998 -58.4004 0.899414 -80.2998c-16.8994 -16.9004 -75.0996 -26.9004 -100.899 -30.6006zM207.9 211.8c3 -3 4.19922 -7.2998 3.19922 -11.5l-22.5996 -90.5c-1.40039 -5.39941 -6.2002 -9.09961 -11.7002 -9.09961h-0.899414
|
|
||||||
c-5.80078 0.5 -10.5 5.09961 -11 10.8994l-4.80078 52.3008l-52.2998 4.7998c-5.7998 0.5 -10.3994 5.2002 -10.8994 11c-0.400391 5.89941 3.39941 11.2002 9.09961 12.5996l90.5 22.7002c4.2002 1 8.40039 -0.200195 11.4004 -3.2002zM247.6 236.9
|
|
||||||
c-0.0996094 0 -6.39941 -1.80078 -11.3994 3.19922c-3 3 -4.2002 7.30078 -3.2002 11.4004l22.5996 90.5c1.40039 5.7002 7 9.2002 12.6006 9.09961c5.7998 -0.5 10.5 -5.09961 11 -10.8994l4.7998 -52.2998l52.2998 -4.80078c5.7998 -0.5 10.4004 -5.19922 10.9004 -11
|
|
||||||
c0.399414 -5.89941 -3.40039 -11.1992 -9.10059 -12.5996zM299.6 148.4c29.1006 29.0996 53 59.5996 65.3008 83.7998c4.89941 9.2998 17.5996 9.89941 23.3994 1.7002c27.7002 -38.9004 6.10059 -106.9 -30.5996 -143.7s-104.8 -58.2998 -143.7 -30.6006
|
|
||||||
c-8.2998 5.90039 -7.5 18.6006 1.7002 23.4004c24.2002 12.5 54.7998 36.2998 83.8994 65.4004z" />
|
|
||||||
<glyph glyph-name="grin-stars" unicode="" horiz-adv-x="496"
|
|
||||||
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM353.6 143.4c10 3.09961 19.3008 -5.5 17.7002 -15.3008
|
|
||||||
c-8 -47.0996 -71.2998 -80 -123.3 -80s-115.4 32.8008 -123.3 80c-1.7002 10 7.89941 18.4004 17.7002 15.3008c26 -8.30078 64.3994 -13.1006 105.6 -13.1006s79.7002 4.7998 105.6 13.1006zM125.7 200.9l6.09961 34.8994l-25.3994 24.6006
|
|
||||||
c-4.60059 4.59961 -1.90039 12.2998 4.2998 13.1992l34.8994 5l15.5 31.6006c2.90039 5.7998 11 5.7998 13.9004 0l15.5 -31.6006l34.9004 -5c6.19922 -1 8.7998 -8.69922 4.2998 -13.1992l-25.4004 -24.6006l6 -34.8994c1 -6.2002 -5.39941 -11 -11 -7.90039
|
|
||||||
l-31.2998 16.2998l-31.2998 -16.2998c-5.60059 -3.09961 -12 1.7002 -11 7.90039zM385.4 273.6c6.19922 -1 8.89941 -8.59961 4.39941 -13.1992l-25.3994 -24.6006l6 -34.8994c1 -6.2002 -5.40039 -11 -11 -7.90039l-31.3008 16.2998l-31.2998 -16.2998
|
|
||||||
c-5.59961 -3.09961 -12 1.7002 -11 7.90039l6 34.8994l-25.3994 24.6006c-4.60059 4.59961 -1.90039 12.2998 4.2998 13.1992l34.8994 5l15.5 31.6006c2.90039 5.7998 11 5.7998 13.9004 0l15.5 -31.6006z" />
|
|
||||||
<glyph glyph-name="grin-tears" unicode="" horiz-adv-x="640"
|
|
||||||
d="M117.1 191.9c6.30078 0.899414 11.7002 -4.5 10.9004 -10.9004c-3.7002 -25.7998 -13.7002 -84 -30.5996 -100.9c-22 -21.8994 -57.9004 -21.5 -80.3008 0.900391c-22.3994 22.4004 -22.7998 58.4004 -0.899414 80.2998c16.8994 16.9004 75.0996 26.9004 100.899 30.6006
|
|
||||||
zM623.8 161.3c21.9004 -21.8994 21.5 -57.8994 -0.799805 -80.2002c-22.4004 -22.3994 -58.4004 -22.7998 -80.2998 -0.899414c-16.9004 16.8994 -26.9004 75.0996 -30.6006 100.899c-0.899414 6.30078 4.5 11.7002 10.8008 10.8008
|
|
||||||
c25.7998 -3.7002 84 -13.7002 100.899 -30.6006zM497.2 99.5996c12.3994 -37.2998 25.0996 -43.7998 28.2998 -46.5c-44.5996 -65.7998 -120 -109.1 -205.5 -109.1s-160.9 43.2998 -205.5 109.1c3.09961 2.60059 15.7998 9.10059 28.2998 46.5
|
|
||||||
c33.4004 -63.8994 100.3 -107.6 177.2 -107.6s143.8 43.7002 177.2 107.6zM122.7 223.5c-2.40039 0.299805 -5 2.5 -49.5 -6.90039c12.3994 125.4 118.1 223.4 246.8 223.4s234.4 -98 246.8 -223.5c-44.2998 9.40039 -47.3994 7.2002 -49.5 7
|
|
||||||
c-15.2002 95.2998 -97.7998 168.5 -197.3 168.5s-182.1 -73.2002 -197.3 -168.5zM320 48c-51.9004 0 -115.3 32.9004 -123.3 80c-1.7002 10 7.89941 18.4004 17.7002 15.2998c26 -8.2998 64.3994 -13.0996 105.6 -13.0996s79.7002 4.7998 105.6 13.0996
|
|
||||||
c10 3.2002 19.4004 -5.39941 17.7002 -15.2998c-8 -47.0996 -71.3994 -80 -123.3 -80zM450.3 216.3c-3.09961 -0.899414 -7.2002 0.100586 -9.2998 3.7002l-9.5 17c-7.7002 13.7002 -19.2002 21.5996 -31.5 21.5996s-23.7998 -7.89941 -31.5 -21.5996l-9.5 -17
|
|
||||||
c-1.90039 -3.2002 -5.7998 -4.7998 -9.2998 -3.7002c-3.60059 1.10059 -6 4.60059 -5.7002 8.2998c3.2998 42.1006 32.2002 71.4004 56 71.4004s52.7002 -29.2998 56 -71.4004c0.299805 -3.7998 -2.09961 -7.19922 -5.7002 -8.2998zM240 258.6
|
|
||||||
c-12.2998 0 -23.7998 -7.7998 -31.5 -21.5996l-9.5 -17c-1.90039 -3.2002 -5.7998 -4.7998 -9.2998 -3.7002c-3.60059 1.10059 -6 4.60059 -5.7002 8.2998c3.2998 42.1006 32.2002 71.4004 56 71.4004s52.7002 -29.2998 56 -71.4004
|
|
||||||
c0.299805 -3.7998 -2.09961 -7.19922 -5.7002 -8.2998c-3.09961 -1 -7.2002 0 -9.2998 3.7002l-9.5 17c-7.7002 13.7002 -19.2002 21.5996 -31.5 21.5996z" />
|
|
||||||
<glyph glyph-name="grin-tongue" unicode="" horiz-adv-x="496"
|
|
||||||
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM312 40h0.0996094v43.7998l-17.6992 8.7998c-15.1006 7.60059 -31.5 -1.69922 -34.9004 -16.5l-2.7998 -12.0996c-2.10059 -9.2002 -15.2002 -9.2002 -17.2998 0
|
|
||||||
l-2.80078 12.0996c-3.39941 14.8008 -19.8994 24 -34.8994 16.5l-17.7002 -8.7998v-42.7998c0 -35.2002 28 -64.5 63.0996 -65c35.8008 -0.5 64.9004 28.4004 64.9004 64zM340.2 14.7002c64 33.3994 107.8 100.3 107.8 177.3c0 110.3 -89.7002 200 -200 200
|
|
||||||
s-200 -89.7002 -200 -200c0 -77 43.7998 -143.9 107.8 -177.3c-2.2002 8.09961 -3.7998 16.5 -3.7998 25.2998v43.5c-14.2002 12.4004 -24.4004 27.5 -27.2998 44.5c-1.7002 10 7.7998 18.4004 17.7002 15.2998c26 -8.2998 64.3994 -13.0996 105.6 -13.0996
|
|
||||||
s79.7002 4.7998 105.6 13.0996c10 3.2002 19.4004 -5.39941 17.7002 -15.2998c-2.89941 -17 -13.0996 -32.0996 -27.2998 -44.5v-43.5c0 -8.7998 -1.59961 -17.2002 -3.7998 -25.2998zM168 272c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32s-32 14.2998 -32 32
|
|
||||||
s14.2998 32 32 32zM328 272c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32s-32 14.2998 -32 32s14.2998 32 32 32z" />
|
|
||||||
<glyph glyph-name="grin-tongue-squint" unicode="" horiz-adv-x="496"
|
|
||||||
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM312 40h0.0996094v43.7998l-17.6992 8.7998c-15.1006 7.60059 -31.5 -1.69922 -34.9004 -16.5l-2.7998 -12.0996c-2.10059 -9.2002 -15.2002 -9.2002 -17.2998 0
|
|
||||||
l-2.80078 12.0996c-3.39941 14.8008 -19.8994 24 -34.8994 16.5l-17.7002 -8.7998v-42.7998c0 -35.2002 28 -64.5 63.0996 -65c35.8008 -0.5 64.9004 28.4004 64.9004 64zM340.2 14.7002c64 33.3994 107.8 100.3 107.8 177.3c0 110.3 -89.7002 200 -200 200
|
|
||||||
s-200 -89.7002 -200 -200c0 -77 43.7998 -143.9 107.8 -177.3c-2.2002 8.09961 -3.7998 16.5 -3.7998 25.2998v43.5c-14.2002 12.4004 -24.4004 27.5 -27.2998 44.5c-1.7002 10 7.7998 18.4004 17.7002 15.2998c26 -8.2998 64.3994 -13.0996 105.6 -13.0996
|
|
||||||
s79.7002 4.7998 105.6 13.0996c10 3.2002 19.4004 -5.39941 17.7002 -15.2998c-2.89941 -17 -13.0996 -32.0996 -27.2998 -44.5v-43.5c0 -8.7998 -1.59961 -17.2002 -3.7998 -25.2998zM377.1 295.8c3.80078 -4.39941 3.90039 -11 0.100586 -15.5l-33.6006 -40.2998
|
|
||||||
l33.6006 -40.2998c3.7002 -4.5 3.7002 -11 -0.100586 -15.5c-3.59961 -4.2002 -9.89941 -5.7002 -15.2998 -2.5l-80 48c-3.59961 2.2002 -5.7998 6.09961 -5.7998 10.2998s2.2002 8.09961 5.7998 10.2998l80 48c5 3 11.5 1.90039 15.2998 -2.5zM214.2 250.3
|
|
||||||
c3.59961 -2.2002 5.7998 -6.09961 5.7998 -10.2998s-2.2002 -8.09961 -5.7998 -10.2998l-80 -48c-5.40039 -3.2002 -11.7002 -1.7002 -15.2998 2.5c-3.80078 4.5 -3.90039 11 -0.100586 15.5l33.6006 40.2998l-33.6006 40.2998c-3.7002 4.5 -3.7002 11 0.100586 15.5
|
|
||||||
c3.89941 4.5 10.2998 5.5 15.2998 2.5z" />
|
|
||||||
<glyph glyph-name="grin-tongue-wink" unicode="" horiz-adv-x="496"
|
|
||||||
d="M152 268c25.7002 0 55.9004 -16.9004 59.7998 -42.0996c0.799805 -5 -1.7002 -10 -6.09961 -12.4004c-5.7002 -3.09961 -11.2002 -0.599609 -13.7002 1.59961l-9.5 8.5c-14.7998 13.2002 -46.2002 13.2002 -61 0l-9.5 -8.5
|
|
||||||
c-3.7998 -3.39941 -9.2998 -4 -13.7002 -1.59961c-4.39941 2.40039 -6.89941 7.40039 -6.09961 12.4004c3.89941 25.1992 34.0996 42.0996 59.7998 42.0996zM328 320c44.2002 0 80 -35.7998 80 -80s-35.7998 -80 -80 -80s-80 35.7998 -80 80s35.7998 80 80 80zM328 192
|
|
||||||
c26.5 0 48 21.5 48 48s-21.5 48 -48 48s-48 -21.5 -48 -48s21.5 -48 48 -48zM328 264c13.2998 0 24 -10.7002 24 -24s-10.7002 -24 -24 -24s-24 10.7002 -24 24s10.7002 24 24 24zM248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248z
|
|
||||||
M312 40h0.0996094v43.7998l-17.6992 8.7998c-15.1006 7.60059 -31.5 -1.69922 -34.9004 -16.5l-2.7998 -12.0996c-2.10059 -9.2002 -15.2002 -9.2002 -17.2998 0l-2.80078 12.0996c-3.39941 14.8008 -19.8994 24 -34.8994 16.5l-17.7002 -8.7998v-42.7998
|
|
||||||
c0 -35.2002 28 -64.5 63.0996 -65c35.8008 -0.5 64.9004 28.4004 64.9004 64zM340.2 14.7002c64 33.3994 107.8 100.3 107.8 177.3c0 110.3 -89.7002 200 -200 200s-200 -89.7002 -200 -200c0 -77 43.7998 -143.9 107.8 -177.3
|
|
||||||
c-2.2002 8.09961 -3.7998 16.5 -3.7998 25.2998v43.5c-14.2002 12.4004 -24.4004 27.5 -27.2998 44.5c-1.7002 10 7.7998 18.4004 17.7002 15.2998c26 -8.2998 64.3994 -13.0996 105.6 -13.0996s79.7002 4.7998 105.6 13.0996c10 3.2002 19.4004 -5.39941 17.7002 -15.2998
|
|
||||||
c-2.89941 -17 -13.0996 -32.0996 -27.2998 -44.5v-43.5c0 -8.7998 -1.59961 -17.2002 -3.7998 -25.2998z" />
|
|
||||||
<glyph glyph-name="grin-wink" unicode="" horiz-adv-x="496"
|
|
||||||
d="M328 268c25.6904 0 55.8799 -16.9199 59.8701 -42.1201c1.72949 -11.0898 -11.3506 -18.2695 -19.8301 -10.8398l-9.5498 8.47949c-14.8105 13.1904 -46.1602 13.1904 -60.9707 0l-9.5498 -8.47949c-8.33008 -7.40039 -21.5801 -0.379883 -19.8301 10.8398
|
|
||||||
c3.98047 25.2002 34.1699 42.1201 59.8604 42.1201zM168 208c-17.6699 0 -32 14.3301 -32 32s14.3301 32 32 32s32 -14.3301 32 -32s-14.3301 -32 -32 -32zM353.55 143.36c10.04 3.13965 19.3906 -5.4502 17.71 -15.3408
|
|
||||||
c-7.92969 -47.1494 -71.3193 -80.0195 -123.26 -80.0195s-115.33 32.8701 -123.26 80.0195c-1.69043 9.9707 7.76953 18.4707 17.71 15.3408c25.9297 -8.31055 64.3994 -13.0605 105.55 -13.0605s79.6201 4.75977 105.55 13.0605zM248 440c136.97 0 248 -111.03 248 -248
|
|
||||||
s-111.03 -248 -248 -248s-248 111.03 -248 248s111.03 248 248 248zM248 -8c110.28 0 200 89.7197 200 200s-89.7197 200 -200 200s-200 -89.7197 -200 -200s89.7197 -200 200 -200z" />
|
|
||||||
<glyph glyph-name="kiss" unicode="" horiz-adv-x="496"
|
|
||||||
d="M168 272c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32s-32 14.2998 -32 32s14.2998 32 32 32zM304 140c0 -13 -13.4004 -27.2998 -35.0996 -36.4004c21.7998 -8.69922 35.1992 -23 35.1992 -36c0 -19.1992 -28.6992 -41.5 -71.5 -44h-0.5
|
|
||||||
c-3.69922 0 -7 2.60059 -7.7998 6.2002c-0.899414 3.7998 1.10059 7.7002 4.7002 9.2002l17 7.2002c12.9004 5.5 20.7002 13.5 20.7002 21.5s-7.7998 16 -20.7998 21.5l-16.9004 7.2002c-6 2.59961 -5.7002 12.3994 0 14.7998l17 7.2002
|
|
||||||
c12.9004 5.5 20.7002 13.5 20.7002 21.5s-7.7998 16 -20.7998 21.5l-16.9004 7.19922c-3.59961 1.5 -5.59961 5.40039 -4.7002 9.2002c0.799805 3.7998 4.40039 6.60059 8.2002 6.2002c42.7002 -2.5 71.5 -24.7998 71.5 -44zM248 440c137 0 248 -111 248 -248
|
|
||||||
s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM328 272c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32s-32 14.2998 -32 32s14.2998 32 32 32z
|
|
||||||
" />
|
|
||||||
<glyph glyph-name="kiss-beam" unicode="" horiz-adv-x="496"
|
|
||||||
d="M168 296c23.7998 0 52.7002 -29.2998 55.7998 -71.4004c0.299805 -3.7998 -2 -7.19922 -5.59961 -8.2998c-3.10059 -1 -7.2002 0 -9.2998 3.7002l-9.5 17c-7.7002 13.7002 -19.2002 21.5996 -31.5 21.5996c-12.3008 0 -23.8008 -7.89941 -31.5 -21.5996l-9.5 -17
|
|
||||||
c-1.80078 -3.2002 -5.80078 -4.7002 -9.30078 -3.7002c-3.59961 1.10059 -5.89941 4.60059 -5.59961 8.2998c3.2998 42.1006 32.2002 71.4004 56 71.4004zM248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8
|
|
||||||
c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM304 140c0 -13 -13.4004 -27.2998 -35.0996 -36.4004c21.7998 -8.69922 35.1992 -23 35.1992 -36c0 -19.1992 -28.6992 -41.5 -71.5 -44h-0.5
|
|
||||||
c-3.69922 0 -7 2.60059 -7.7998 6.2002c-0.899414 3.7998 1.10059 7.7002 4.7002 9.2002l17 7.2002c12.9004 5.5 20.7002 13.5 20.7002 21.5s-7.7998 16 -20.7998 21.5l-16.9004 7.2002c-6 2.59961 -5.7002 12.3994 0 14.7998l17 7.2002
|
|
||||||
c12.9004 5.5 20.7002 13.5 20.7002 21.5s-7.7998 16 -20.7998 21.5l-16.9004 7.19922c-3.59961 1.5 -5.59961 5.40039 -4.7002 9.2002c0.799805 3.7998 4.40039 6.60059 8.2002 6.2002c42.7002 -2.5 71.5 -24.7998 71.5 -44zM328 296
|
|
||||||
c23.7998 0 52.7002 -29.2998 55.7998 -71.4004c0.299805 -3.7998 -2 -7.19922 -5.59961 -8.2998c-3.10059 -1 -7.2002 0 -9.2998 3.7002l-9.5 17c-7.7002 13.7002 -19.2002 21.5996 -31.5 21.5996c-12.3008 0 -23.8008 -7.89941 -31.5 -21.5996l-9.5 -17
|
|
||||||
c-1.80078 -3.2002 -5.80078 -4.7002 -9.30078 -3.7002c-3.59961 1.10059 -5.89941 4.60059 -5.59961 8.2998c3.2998 42.1006 32.2002 71.4004 56 71.4004z" />
|
|
||||||
<glyph glyph-name="kiss-wink-heart" unicode="" horiz-adv-x="504"
|
|
||||||
d="M304 139.5c0 -13 -13.4004 -27.2998 -35.0996 -36.4004c21.7998 -8.69922 35.1992 -23 35.1992 -36c0 -19.1992 -28.6992 -41.5 -71.5 -44h-0.5c-3.69922 0 -7 2.60059 -7.7998 6.2002c-0.899414 3.7998 1.10059 7.7002 4.7002 9.2002l17 7.2002
|
|
||||||
c12.9004 5.5 20.7002 13.5 20.7002 21.5s-7.7998 16 -20.7998 21.5l-16.9004 7.2002c-6 2.59961 -5.7002 12.3994 0 14.7998l17 7.2002c12.9004 5.5 20.7002 13.5 20.7002 21.5s-7.7998 16 -20.7998 21.5l-16.9004 7.19922c-3.59961 1.5 -5.59961 5.40039 -4.7002 9.2002
|
|
||||||
c0.799805 3.7998 4.40039 6.60059 8.2002 6.2002c42.7002 -2.5 71.5 -24.7998 71.5 -44zM374.5 223c-14.7998 13.2002 -46.2002 13.2002 -61 0l-9.5 -8.5c-2.5 -2.2998 -7.90039 -4.7002 -13.7002 -1.59961c-4.39941 2.39941 -6.89941 7.39941 -6.09961 12.3994
|
|
||||||
c3.89941 25.2002 34.2002 42.1006 59.7998 42.1006s55.7998 -16.9004 59.7998 -42.1006c0.799805 -5 -1.7002 -10 -6.09961 -12.3994c-4.40039 -2.40039 -9.90039 -1.7002 -13.7002 1.59961zM136 239.5c0 17.7002 14.2998 32 32 32s32 -14.2998 32 -32s-14.2998 -32 -32 -32
|
|
||||||
s-32 14.2998 -32 32zM501.1 45.5c9.2002 -23.9004 -4.39941 -49.4004 -28.5 -55.7002l-83 -21.5c-5.39941 -1.39941 -10.8994 1.7998 -12.3994 7.10059l-22.9004 82.5996c-6.59961 24 8.7998 48.5996 34 52.5996c22 3.5 43.1006 -11.5996 49 -33l2.2998 -8.39941
|
|
||||||
l8.40039 2.2002c21.5996 5.59961 45.0996 -5.10059 53.0996 -25.9004zM334 11.7002c17.7002 -64 10.9004 -39.5 13.4004 -46.7998c-30.5 -13.4004 -64 -20.9004 -99.4004 -20.9004c-137 0 -248 111 -248 248s111 248 248 248s248 -111 247.9 -248
|
|
||||||
c0 -31.7998 -6.2002 -62.0996 -17.1006 -90c-6 1.5 -12.2002 2.7998 -18.5996 2.90039c-5.60059 9.69922 -13.6006 17.5 -22.6006 23.8994c6.7002 19.9004 10.4004 41.1006 10.4004 63.2002c0 110.3 -89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200
|
|
||||||
c30.7998 0 59.9004 7.2002 86 19.7002z" />
|
|
||||||
<glyph glyph-name="laugh" unicode="" horiz-adv-x="496"
|
|
||||||
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM389.4 50.5996c37.7998 37.8008 58.5996 88 58.5996 141.4s-20.7998 103.6 -58.5996 141.4c-37.8008 37.7998 -88 58.5996 -141.4 58.5996s-103.6 -20.7998 -141.4 -58.5996
|
|
||||||
c-37.7998 -37.8008 -58.5996 -88 -58.5996 -141.4s20.7998 -103.6 58.5996 -141.4c37.8008 -37.7998 88 -58.5996 141.4 -58.5996s103.6 20.7998 141.4 58.5996zM328 224c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32s32 -14.2998 32 -32s-14.2998 -32 -32 -32zM168 224
|
|
||||||
c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32s32 -14.2998 32 -32s-14.2998 -32 -32 -32zM362.4 160c8.19922 0 14.5 -7 13.5 -15c-7.5 -59.2002 -58.9004 -105 -121.101 -105h-13.5996c-62.2002 0 -113.601 45.7998 -121.101 105c-1 8 5.30078 15 13.5 15h228.801z" />
|
|
||||||
<glyph glyph-name="laugh-beam" unicode="" horiz-adv-x="496"
|
|
||||||
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM389.4 50.5996c37.7998 37.8008 58.5996 88 58.5996 141.4s-20.7998 103.6 -58.5996 141.4c-37.8008 37.7998 -88 58.5996 -141.4 58.5996s-103.6 -20.7998 -141.4 -58.5996
|
|
||||||
c-37.7998 -37.8008 -58.5996 -88 -58.5996 -141.4s20.7998 -103.6 58.5996 -141.4c37.8008 -37.7998 88 -58.5996 141.4 -58.5996s103.6 20.7998 141.4 58.5996zM328 296c23.7998 0 52.7002 -29.2998 55.7998 -71.4004c0.700195 -8.5 -10.7998 -11.8994 -14.8994 -4.5
|
|
||||||
l-9.5 17c-7.7002 13.7002 -19.2002 21.6006 -31.5 21.6006c-12.3008 0 -23.8008 -7.90039 -31.5 -21.6006l-9.5 -17c-4.10059 -7.39941 -15.6006 -4.09961 -14.9004 4.5c3.2998 42.1006 32.2002 71.4004 56 71.4004zM127 220.1c-4.2002 -7.39941 -15.7002 -4 -15.0996 4.5
|
|
||||||
c3.2998 42.1006 32.1992 71.4004 56 71.4004c23.7998 0 52.6992 -29.2998 56 -71.4004c0.699219 -8.5 -10.8008 -11.8994 -14.9004 -4.5l-9.5 17c-7.7002 13.7002 -19.2002 21.6006 -31.5 21.6006s-23.7998 -7.90039 -31.5 -21.6006zM362.4 160c8.19922 0 14.5 -7 13.5 -15
|
|
||||||
c-7.5 -59.2002 -58.9004 -105 -121.101 -105h-13.5996c-62.2002 0 -113.601 45.7998 -121.101 105c-1 8 5.30078 15 13.5 15h228.801z" />
|
|
||||||
<glyph glyph-name="laugh-squint" unicode="" horiz-adv-x="496"
|
|
||||||
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM389.4 50.5996c37.7998 37.8008 58.5996 88 58.5996 141.4s-20.7998 103.6 -58.5996 141.4c-37.8008 37.7998 -88 58.5996 -141.4 58.5996s-103.6 -20.7998 -141.4 -58.5996
|
|
||||||
c-37.7998 -37.8008 -58.5996 -88 -58.5996 -141.4s20.7998 -103.6 58.5996 -141.4c37.8008 -37.7998 88 -58.5996 141.4 -58.5996s103.6 20.7998 141.4 58.5996zM343.6 252l33.6006 -40.2998c8.59961 -10.4004 -3.90039 -24.7998 -15.4004 -18l-80 48
|
|
||||||
c-7.7998 4.7002 -7.7998 15.8994 0 20.5996l80 48c11.6006 6.7998 24 -7.7002 15.4004 -18zM134.2 193.7c-11.6006 -6.7998 -24.1006 7.59961 -15.4004 18l33.6006 40.2998l-33.6006 40.2998c-8.59961 10.2998 3.7998 24.9004 15.4004 18l80 -48
|
|
||||||
c7.7998 -4.7002 7.7998 -15.8994 0 -20.5996zM362.4 160c8.19922 0 14.5 -7 13.5 -15c-7.5 -59.2002 -58.9004 -105 -121.101 -105h-13.5996c-62.2002 0 -113.601 45.7998 -121.101 105c-1 8 5.30078 15 13.5 15h228.801z" />
|
|
||||||
<glyph glyph-name="laugh-wink" unicode="" horiz-adv-x="496"
|
|
||||||
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM389.4 50.5996c37.7998 37.8008 58.5996 88 58.5996 141.4s-20.7998 103.6 -58.5996 141.4c-37.8008 37.7998 -88 58.5996 -141.4 58.5996s-103.6 -20.7998 -141.4 -58.5996
|
|
||||||
c-37.7998 -37.8008 -58.5996 -88 -58.5996 -141.4s20.7998 -103.6 58.5996 -141.4c37.8008 -37.7998 88 -58.5996 141.4 -58.5996s103.6 20.7998 141.4 58.5996zM328 284c25.7002 0 55.9004 -16.9004 59.7002 -42.0996c1.7998 -11.1006 -11.2998 -18.2002 -19.7998 -10.8008
|
|
||||||
l-9.5 8.5c-14.8008 13.2002 -46.2002 13.2002 -61 0l-9.5 -8.5c-8.30078 -7.39941 -21.5 -0.399414 -19.8008 10.8008c4 25.1992 34.2002 42.0996 59.9004 42.0996zM168 224c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32s32 -14.2998 32 -32s-14.2998 -32 -32 -32z
|
|
||||||
M362.4 160c8.19922 0 14.5 -7 13.5 -15c-7.5 -59.2002 -58.9004 -105 -121.101 -105h-13.5996c-62.2002 0 -113.601 45.7998 -121.101 105c-1 8 5.30078 15 13.5 15h228.801z" />
|
|
||||||
<glyph glyph-name="meh-blank" unicode="" horiz-adv-x="496"
|
|
||||||
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM168 272c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32
|
|
||||||
s-32 14.2998 -32 32s14.2998 32 32 32zM328 272c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32s-32 14.2998 -32 32s14.2998 32 32 32z" />
|
|
||||||
<glyph glyph-name="meh-rolling-eyes" unicode="" horiz-adv-x="496"
|
|
||||||
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM336 296c39.7998 0 72 -32.2002 72 -72s-32.2002 -72 -72 -72
|
|
||||||
s-72 32.2002 -72 72s32.2002 72 72 72zM336 184c22.0996 0 40 17.9004 40 40c0 13.5996 -7.2998 25.0996 -17.7002 32.2998c1 -2.59961 1.7002 -5.39941 1.7002 -8.2998c0 -13.2998 -10.7002 -24 -24 -24s-24 10.7002 -24 24c0 3 0.700195 5.7002 1.7002 8.2998
|
|
||||||
c-10.4004 -7.2002 -17.7002 -18.7002 -17.7002 -32.2998c0 -22.0996 17.9004 -40 40 -40zM232 224c0 -39.7998 -32.2002 -72 -72 -72s-72 32.2002 -72 72s32.2002 72 72 72s72 -32.2002 72 -72zM120 224c0 -22.0996 17.9004 -40 40 -40s40 17.9004 40 40
|
|
||||||
c0 13.5996 -7.2998 25.0996 -17.7002 32.2998c1 -2.59961 1.7002 -5.39941 1.7002 -8.2998c0 -13.2998 -10.7002 -24 -24 -24s-24 10.7002 -24 24c0 3 0.700195 5.7002 1.7002 8.2998c-10.4004 -7.2002 -17.7002 -18.7002 -17.7002 -32.2998zM312 96
|
|
||||||
c13.2002 0 24 -10.7998 24 -24s-10.7998 -24 -24 -24h-128c-13.2002 0 -24 10.7998 -24 24s10.7998 24 24 24h128z" />
|
|
||||||
<glyph glyph-name="sad-cry" unicode="" horiz-adv-x="496"
|
|
||||||
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM392 53.5996c34.5996 35.9004 56 84.7002 56 138.4c0 110.3 -89.7002 200 -200 200s-200 -89.7002 -200 -200c0 -53.7002 21.4004 -102.4 56 -138.4v114.4
|
|
||||||
c0 13.2002 10.7998 24 24 24s24 -10.7998 24 -24v-151.4c28.5 -15.5996 61.2002 -24.5996 96 -24.5996s67.5 9 96 24.5996v151.4c0 13.2002 10.7998 24 24 24s24 -10.7998 24 -24v-114.4zM205.8 213.5c-5.7998 -3.2002 -11.2002 -0.700195 -13.7002 1.59961l-9.5 8.5
|
|
||||||
c-14.7998 13.2002 -46.1992 13.2002 -61 0l-9.5 -8.5c-3.7998 -3.39941 -9.2998 -4 -13.6992 -1.59961c-4.40039 2.40039 -6.90039 7.40039 -6.10059 12.4004c3.90039 25.1992 34.2002 42.0996 59.7998 42.0996c25.6006 0 55.8008 -16.9004 59.8008 -42.0996
|
|
||||||
c0.799805 -5 -1.7002 -10 -6.10059 -12.4004zM344 268c25.7002 0 55.9004 -16.9004 59.7998 -42.0996c0.799805 -5 -1.7002 -10 -6.09961 -12.4004c-5.7002 -3.09961 -11.2002 -0.599609 -13.7002 1.59961l-9.5 8.5c-14.7998 13.2002 -46.2002 13.2002 -61 0l-9.5 -8.5
|
|
||||||
c-3.7998 -3.39941 -9.2002 -4 -13.7002 -1.59961c-4.39941 2.40039 -6.89941 7.40039 -6.09961 12.4004c3.89941 25.1992 34.0996 42.0996 59.7998 42.0996zM248 176c30.9004 0 56 -28.7002 56 -64s-25.0996 -64 -56 -64s-56 28.7002 -56 64s25.0996 64 56 64z" />
|
|
||||||
<glyph glyph-name="sad-tear" unicode="" horiz-adv-x="496"
|
|
||||||
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM256 144c38.0996 0 74 -16.7998 98.5 -46.0996
|
|
||||||
c8.5 -10.2002 7.09961 -25.3008 -3.09961 -33.8008c-10.6006 -8.7998 -25.7002 -6.69922 -33.8008 3.10059c-15.2998 18.2998 -37.7998 28.7998 -61.5996 28.7998c-13.2002 0 -24 10.7998 -24 24s10.7998 24 24 24zM168 208c-17.7002 0 -32 14.2998 -32 32s14.2998 32 32 32
|
|
||||||
s32 -14.2998 32 -32s-14.2998 -32 -32 -32zM328 272c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32s-32 14.2998 -32 32s14.2998 32 32 32zM162.4 173.2c2.7998 3.7002 8.39941 3.7002 11.1992 0c11.4004 -15.2998 36.4004 -50.6006 36.4004 -68.1006
|
|
||||||
c0 -22.6992 -18.7998 -41.0996 -42 -41.0996s-42 18.4004 -42 41.0996c0 17.5 25 52.8008 36.4004 68.1006z" />
|
|
||||||
<glyph glyph-name="smile-beam" unicode="" horiz-adv-x="496"
|
|
||||||
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM332 135.4c8.5 10.1992 23.5996 11.5 33.7998 3.09961
|
|
||||||
c10.2002 -8.5 11.6006 -23.5996 3.10059 -33.7998c-30 -36 -74.1006 -56.6006 -120.9 -56.6006s-90.9004 20.6006 -120.9 56.6006c-8.39941 10.2002 -7.09961 25.2998 3.10059 33.7998c10.2002 8.40039 25.2998 7.09961 33.7998 -3.09961
|
|
||||||
c20.7998 -25.1006 51.5 -39.4004 84 -39.4004s63.2002 14.4004 84 39.4004zM136.5 237l-9.5 -17c-1.90039 -3.2002 -5.90039 -4.7998 -9.2998 -3.7002c-3.60059 1.10059 -6 4.60059 -5.7002 8.2998c3.2998 42.1006 32.2002 71.4004 56 71.4004s52.7002 -29.2998 56 -71.4004
|
|
||||||
c0.299805 -3.7998 -2.09961 -7.19922 -5.7002 -8.2998c-3.09961 -1 -7.2002 0 -9.2998 3.7002l-9.5 17c-7.7002 13.7002 -19.2002 21.5996 -31.5 21.5996s-23.7998 -7.89941 -31.5 -21.5996zM328 296c23.7998 0 52.7002 -29.2998 56 -71.4004
|
|
||||||
c0.299805 -3.7998 -2.09961 -7.19922 -5.7002 -8.2998c-3.09961 -1 -7.2002 0 -9.2998 3.7002l-9.5 17c-7.7002 13.7002 -19.2002 21.5996 -31.5 21.5996s-23.7998 -7.89941 -31.5 -21.5996l-9.5 -17c-1.90039 -3.2002 -5.7998 -4.7998 -9.2998 -3.7002
|
|
||||||
c-3.60059 1.10059 -6 4.60059 -5.7002 8.2998c3.2998 42.1006 32.2002 71.4004 56 71.4004z" />
|
|
||||||
<glyph glyph-name="surprise" unicode="" horiz-adv-x="496"
|
|
||||||
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM248 168c35.2998 0 64 -28.7002 64 -64s-28.7002 -64 -64 -64
|
|
||||||
s-64 28.7002 -64 64s28.7002 64 64 64zM200 240c0 -17.7002 -14.2998 -32 -32 -32s-32 14.2998 -32 32s14.2998 32 32 32s32 -14.2998 32 -32zM328 272c17.7002 0 32 -14.2998 32 -32s-14.2998 -32 -32 -32s-32 14.2998 -32 32s14.2998 32 32 32z" />
|
|
||||||
<glyph glyph-name="tired" unicode="" horiz-adv-x="496"
|
|
||||||
d="M248 440c137 0 248 -111 248 -248s-111 -248 -248 -248s-248 111 -248 248s111 248 248 248zM248 -8c110.3 0 200 89.7002 200 200s-89.7002 200 -200 200s-200 -89.7002 -200 -200s89.7002 -200 200 -200zM377.1 295.8c3.80078 -4.39941 3.90039 -11 0.100586 -15.5
|
|
||||||
l-33.6006 -40.2998l33.6006 -40.2998c3.7998 -4.5 3.7002 -11 -0.100586 -15.5c-3.5 -4.10059 -9.89941 -5.7002 -15.2998 -2.5l-80 48c-3.59961 2.2002 -5.7998 6.09961 -5.7998 10.2998s2.2002 8.09961 5.7998 10.2998l80 48c5 2.90039 11.5 1.90039 15.2998 -2.5z
|
|
||||||
M220 240c0 -4.2002 -2.2002 -8.09961 -5.7998 -10.2998l-80 -48c-5.40039 -3.2002 -11.7998 -1.60059 -15.2998 2.5c-3.80078 4.5 -3.90039 11 -0.100586 15.5l33.6006 40.2998l-33.6006 40.2998c-3.7998 4.5 -3.7002 11 0.100586 15.5
|
|
||||||
c3.7998 4.40039 10.2998 5.5 15.2998 2.5l80 -48c3.59961 -2.2002 5.7998 -6.09961 5.7998 -10.2998zM248 176c45.4004 0 100.9 -38.2998 107.8 -93.2998c1.5 -11.9004 -7 -21.6006 -15.5 -17.9004c-22.7002 9.7002 -56.2998 15.2002 -92.2998 15.2002
|
|
||||||
s-69.5996 -5.5 -92.2998 -15.2002c-8.60059 -3.7002 -17 6.10059 -15.5 17.9004c6.89941 55 62.3994 93.2998 107.8 93.2998z" />
|
|
||||||
</font>
|
|
||||||
</defs></svg>
|
|
Before Width: | Height: | Size: 141 KiB |
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user