├── .gitignore ├── LICENSE ├── PaymentGateway ├── __init__.py ├── __pycache__ │ ├── __init__.cpython-38.pyc │ ├── settings.cpython-38.pyc │ ├── urls.cpython-38.pyc │ └── wsgi.cpython-38.pyc ├── asgi.py ├── settings.py ├── urls.py └── wsgi.py ├── README.md ├── mainsite ├── __init__.py ├── __pycache__ │ ├── __init__.cpython-38.pyc │ ├── admin.cpython-38.pyc │ ├── apps.cpython-38.pyc │ ├── models.cpython-38.pyc │ ├── urls.cpython-38.pyc │ └── views.cpython-38.pyc ├── admin.py ├── apps.py ├── migrations │ ├── __init__.py │ └── __pycache__ │ │ └── __init__.cpython-38.pyc ├── models.py ├── tests.py ├── urls.py └── views.py ├── manage.py ├── phoneservice ├── __init__.py ├── __pycache__ │ ├── __init__.cpython-38.pyc │ ├── admin.cpython-38.pyc │ ├── apps.cpython-38.pyc │ ├── custom_authenticators.cpython-38.pyc │ ├── models.cpython-38.pyc │ ├── restAPIs.cpython-38.pyc │ └── urls.cpython-38.pyc ├── admin.py ├── apps.py ├── custom_authenticators.py ├── migrations │ ├── __init__.py │ └── __pycache__ │ │ └── __init__.cpython-38.pyc ├── models.py ├── restAPIs.py ├── tests.py ├── urls.py └── views.py ├── requirements.txt ├── static ├── dash_files │ ├── all.css │ ├── bootstrap-notify.js │ ├── bootstrap.min.css │ ├── bootstrap.min.js │ ├── chartjs.min.js │ ├── common.js │ ├── css │ ├── demo.css │ ├── demo.js │ ├── jquery.min.js │ ├── js │ ├── now-ui-dashboard.css │ ├── now-ui-dashboard.min.js │ ├── perfect-scrollbar.jquery.min.js │ ├── popper.min.js │ └── util.js └── pages │ └── main.css ├── templates ├── dashboard │ ├── api_keys.html │ ├── base.html │ ├── new_api_key.html │ └── transactions.html └── pages │ ├── login.html │ ├── phoneLogIn.html │ └── signup.html ├── transactions ├── __init__.py ├── __pycache__ │ ├── __init__.cpython-38.pyc │ ├── admin.cpython-38.pyc │ ├── apps.cpython-38.pyc │ ├── ardor_access.cpython-38.pyc │ ├── models.cpython-38.pyc │ ├── rest_apis.cpython-38.pyc │ └── urls.cpython-38.pyc ├── admin.py ├── apps.py ├── ardor_access.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_auto_20200813_1929.py │ ├── 0003_auto_20200813_1939.py │ ├── 0004_auto_20200813_2104.py │ ├── 0005_transaction_transaction_res.py │ ├── 0006_transaction_chain.py │ ├── __init__.py │ └── __pycache__ │ │ ├── 0001_initial.cpython-38.pyc │ │ ├── 0002_auto_20200813_1929.cpython-38.pyc │ │ ├── 0003_auto_20200813_1939.cpython-38.pyc │ │ ├── 0004_auto_20200813_2104.cpython-38.pyc │ │ ├── 0005_transaction_transaction_res.cpython-38.pyc │ │ ├── 0006_transaction_chain.cpython-38.pyc │ │ └── __init__.cpython-38.pyc ├── models.py ├── rest_apis.py ├── tests.py ├── urls.py └── views.py └── usermgmt ├── __init__.py ├── __pycache__ ├── __init__.cpython-38.pyc ├── admin.cpython-38.pyc ├── apps.cpython-38.pyc ├── models.cpython-38.pyc ├── urls.cpython-38.pyc ├── utils.cpython-38.pyc └── views.cpython-38.pyc ├── admin.py ├── apps.py ├── migrations ├── 0001_initial.py ├── 0002_apiaccesskey.py ├── 0003_auto_20200813_1821.py ├── 0004_userdetails_ardor_public_key.py ├── __init__.py └── __pycache__ │ ├── 0001_initial.cpython-38.pyc │ ├── 0002_apiaccesskey.cpython-38.pyc │ ├── 0003_auto_20200813_1821.cpython-38.pyc │ ├── 0004_userdetails_ardor_public_key.cpython-38.pyc │ └── __init__.cpython-38.pyc ├── models.py ├── tests.py ├── urls.py ├── utils.py └── views.py /.gitignore: -------------------------------------------------------------------------------- 1 | */gatewayEnv/* 2 | gatewayEnv/* 3 | gatewayEnv/ 4 | 5 | ./db.sqlite3 6 | db.sqlite3 7 | 8 | */staticfiles/* 9 | staticfiles/* 10 | staticfiles/ 11 | 12 | */media/* 13 | media/* 14 | media/ 15 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Suraj S Jain 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /PaymentGateway/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/PaymentGateway/__init__.py -------------------------------------------------------------------------------- /PaymentGateway/__pycache__/__init__.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/PaymentGateway/__pycache__/__init__.cpython-38.pyc -------------------------------------------------------------------------------- /PaymentGateway/__pycache__/settings.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/PaymentGateway/__pycache__/settings.cpython-38.pyc -------------------------------------------------------------------------------- /PaymentGateway/__pycache__/urls.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/PaymentGateway/__pycache__/urls.cpython-38.pyc -------------------------------------------------------------------------------- /PaymentGateway/__pycache__/wsgi.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/PaymentGateway/__pycache__/wsgi.cpython-38.pyc -------------------------------------------------------------------------------- /PaymentGateway/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for PaymentGateway project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/3.1/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'PaymentGateway.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /PaymentGateway/settings.py: -------------------------------------------------------------------------------- 1 | """ 2 | Django settings for PaymentGateway project. 3 | 4 | Generated by 'django-admin startproject' using Django 3.1. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/3.1/topics/settings/ 8 | 9 | For the full list of settings and their values, see 10 | https://docs.djangoproject.com/en/3.1/ref/settings/ 11 | """ 12 | 13 | from pathlib import Path 14 | import os 15 | 16 | # Build paths inside the project like this: BASE_DIR / 'subdir'. 17 | BASE_DIR = Path(__file__).resolve(strict=True).parent.parent 18 | 19 | 20 | # Quick-start development settings - unsuitable for production 21 | # See https://docs.djangoproject.com/en/3.1/howto/deployment/checklist/ 22 | 23 | # SECURITY WARNING: keep the secret key used in production secret! 24 | SECRET_KEY = 'ubei=po6jyu&(s$83gas1@5yl@&2qoio($!)+hbr&n&^xqk8$(' 25 | 26 | # SECURITY WARNING: don't run with debug turned on in production! 27 | DEBUG = True 28 | 29 | ALLOWED_HOSTS = ['*'] 30 | 31 | 32 | # Application definition 33 | 34 | INSTALLED_APPS = [ 35 | 'rest_framework', 36 | 'rest_framework.authtoken', 37 | 'django.contrib.admin', 38 | 'django.contrib.auth', 39 | 'django.contrib.contenttypes', 40 | 'django.contrib.sessions', 41 | 'django.contrib.messages', 42 | 'django.contrib.staticfiles', 43 | 'mainsite.apps.MainsiteConfig', 44 | 'usermgmt.apps.UsermgmtConfig', 45 | 'transactions.apps.TransactionsConfig', 46 | 'phoneservice.apps.PhoneserviceConfig', 47 | ] 48 | 49 | MIDDLEWARE = [ 50 | 'django.middleware.security.SecurityMiddleware', 51 | 'django.contrib.sessions.middleware.SessionMiddleware', 52 | 'django.middleware.common.CommonMiddleware', 53 | 'django.middleware.csrf.CsrfViewMiddleware', 54 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 55 | 'django.contrib.messages.middleware.MessageMiddleware', 56 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 57 | ] 58 | 59 | REST_FRAMEWORK = { 60 | 'DEFAULT_AUTHENTICATION_CLASSES': ['rest_framework.authentication.TokenAuthentication',], 61 | 'DEFAULT_PERMISSION_CLASSES': ['rest_framework.permissions.IsAuthenticated',], 62 | } 63 | 64 | ROOT_URLCONF = 'PaymentGateway.urls' 65 | 66 | TEMPLATES = [ 67 | { 68 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 69 | 'DIRS': [os.path.join(BASE_DIR, 'templates')], 70 | 'APP_DIRS': True, 71 | 'OPTIONS': { 72 | 'context_processors': [ 73 | 'django.template.context_processors.debug', 74 | 'django.template.context_processors.request', 75 | 'django.contrib.auth.context_processors.auth', 76 | 'django.contrib.messages.context_processors.messages', 77 | ], 78 | }, 79 | }, 80 | ] 81 | 82 | WSGI_APPLICATION = 'PaymentGateway.wsgi.application' 83 | 84 | 85 | # Database 86 | # https://docs.djangoproject.com/en/3.1/ref/settings/#databases 87 | 88 | DATABASES = { 89 | 'default': { 90 | 'ENGINE': 'django.db.backends.sqlite3', 91 | 'NAME': BASE_DIR / 'db.sqlite3', 92 | } 93 | } 94 | 95 | 96 | # Password validation 97 | # https://docs.djangoproject.com/en/3.1/ref/settings/#auth-password-validators 98 | 99 | AUTH_PASSWORD_VALIDATORS = [ 100 | { 101 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 102 | }, 103 | { 104 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 105 | }, 106 | { 107 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 108 | }, 109 | { 110 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 111 | }, 112 | ] 113 | 114 | 115 | # Internationalization 116 | # https://docs.djangoproject.com/en/3.1/topics/i18n/ 117 | 118 | LANGUAGE_CODE = 'en-us' 119 | 120 | TIME_ZONE = 'UTC' 121 | 122 | USE_I18N = True 123 | 124 | USE_L10N = True 125 | 126 | USE_TZ = True 127 | 128 | 129 | # Static files (CSS, JavaScript, Images) 130 | # https://docs.djangoproject.com/en/3.1/howto/static-files/ 131 | 132 | STATIC_URL = '/staticfiles/' 133 | STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') 134 | # STATIC_ROOT = 'staticfiles' 135 | STATICFILES_DIRS = [ 136 | os.path.join(BASE_DIR, 'static') 137 | ] 138 | 139 | MEDIA_ROOT = os.path.join(BASE_DIR, 'media') 140 | MEDIA_URL = '/media/' 141 | 142 | ARDOR_REQUEST_BASE_URL = 'https://testardor.jelurida.com/' 143 | -------------------------------------------------------------------------------- /PaymentGateway/urls.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.urls import path, include 3 | 4 | urlpatterns = [ 5 | path('admin/', admin.site.urls), 6 | path('', include('mainsite.urls')), 7 | path('auth/', include('usermgmt.urls')), 8 | path('transactions/', include('transactions.urls')), 9 | path('phoneservice/', include('phoneservice.urls')), 10 | ] 11 | -------------------------------------------------------------------------------- /PaymentGateway/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for PaymentGateway project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/3.1/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'PaymentGateway.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # crpytopay-web 2 | A payment portal like Stripe for cryptocurrencies 3 | -------------------------------------------------------------------------------- /mainsite/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/mainsite/__init__.py -------------------------------------------------------------------------------- /mainsite/__pycache__/__init__.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/mainsite/__pycache__/__init__.cpython-38.pyc -------------------------------------------------------------------------------- /mainsite/__pycache__/admin.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/mainsite/__pycache__/admin.cpython-38.pyc -------------------------------------------------------------------------------- /mainsite/__pycache__/apps.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/mainsite/__pycache__/apps.cpython-38.pyc -------------------------------------------------------------------------------- /mainsite/__pycache__/models.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/mainsite/__pycache__/models.cpython-38.pyc -------------------------------------------------------------------------------- /mainsite/__pycache__/urls.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/mainsite/__pycache__/urls.cpython-38.pyc -------------------------------------------------------------------------------- /mainsite/__pycache__/views.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/mainsite/__pycache__/views.cpython-38.pyc -------------------------------------------------------------------------------- /mainsite/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /mainsite/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class MainsiteConfig(AppConfig): 5 | name = 'mainsite' 6 | -------------------------------------------------------------------------------- /mainsite/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/mainsite/migrations/__init__.py -------------------------------------------------------------------------------- /mainsite/migrations/__pycache__/__init__.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/mainsite/migrations/__pycache__/__init__.cpython-38.pyc -------------------------------------------------------------------------------- /mainsite/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | # Create your models here. 4 | -------------------------------------------------------------------------------- /mainsite/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /mainsite/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path, include 2 | 3 | from . import views 4 | 5 | urlpatterns = [ 6 | path('', views.displayTransactions, name='dash_home'), 7 | path('apikeys/', views.displayAPIKeys, name='api_keys'), 8 | path('apikeys/new/', views.newAPIKey, name='new_key'), 9 | path('apikeys/delete//', views.deleteAPIKey, name='delete_key'), 10 | ] 11 | -------------------------------------------------------------------------------- /mainsite/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render, redirect 2 | 3 | from usermgmt.models import APIAccessKey 4 | from transactions.models import Transaction 5 | 6 | from usermgmt.utils import generate_key 7 | 8 | # Create your views here. 9 | def displayTransactions(request): 10 | 11 | trs = [] 12 | 13 | try: 14 | trs = Transaction.objects.filter(seller=request.user) 15 | # print(request.use) 16 | # print(len(trs)) 17 | except: 18 | pass 19 | 20 | ctxt = { 21 | 'transactions': trs, 22 | 'nav_active' : 'Transactions', 23 | } 24 | return render(request, 'dashboard/transactions.html', context=ctxt) 25 | 26 | def displayAPIKeys(request): 27 | api_keys = [] 28 | try: 29 | api_keys = APIAccessKey.objects.filter(user = request.user) 30 | except: 31 | pass 32 | 33 | ctxt = { 34 | 'nav_active' : 'APIKeys', 35 | 'api_keys' : api_keys, 36 | } 37 | 38 | return render(request, 'dashboard/api_keys.html', context=ctxt) 39 | 40 | def newAPIKey(request): 41 | 42 | if request.method == 'GET': 43 | ctxt = { 44 | 'nav_active' : 'APIKeys', 45 | } 46 | 47 | return render(request, 'dashboard/new_api_key.html', context=ctxt) 48 | 49 | else: 50 | name = request.POST['name'] 51 | user = request.user 52 | userName = user.username 53 | api_key = generate_key(userName) 54 | 55 | access_key = APIAccessKey() 56 | access_key.user = user 57 | access_key.name = name 58 | access_key.key = api_key 59 | access_key.save() 60 | 61 | return redirect('api_keys') 62 | 63 | def deleteAPIKey(request, key_id): 64 | apikey = APIAccessKey.objects.get(id = key_id) 65 | apikey.delete() 66 | 67 | return redirect('api_keys') 68 | -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'PaymentGateway.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /phoneservice/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/phoneservice/__init__.py -------------------------------------------------------------------------------- /phoneservice/__pycache__/__init__.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/phoneservice/__pycache__/__init__.cpython-38.pyc -------------------------------------------------------------------------------- /phoneservice/__pycache__/admin.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/phoneservice/__pycache__/admin.cpython-38.pyc -------------------------------------------------------------------------------- /phoneservice/__pycache__/apps.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/phoneservice/__pycache__/apps.cpython-38.pyc -------------------------------------------------------------------------------- /phoneservice/__pycache__/custom_authenticators.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/phoneservice/__pycache__/custom_authenticators.cpython-38.pyc -------------------------------------------------------------------------------- /phoneservice/__pycache__/models.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/phoneservice/__pycache__/models.cpython-38.pyc -------------------------------------------------------------------------------- /phoneservice/__pycache__/restAPIs.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/phoneservice/__pycache__/restAPIs.cpython-38.pyc -------------------------------------------------------------------------------- /phoneservice/__pycache__/urls.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/phoneservice/__pycache__/urls.cpython-38.pyc -------------------------------------------------------------------------------- /phoneservice/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /phoneservice/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class PhoneserviceConfig(AppConfig): 5 | name = 'phoneservice' 6 | -------------------------------------------------------------------------------- /phoneservice/custom_authenticators.py: -------------------------------------------------------------------------------- 1 | from rest_framework.authentication import SessionAuthentication, BasicAuthentication 2 | 3 | class CsrfExemptSessionAuthentication(SessionAuthentication): 4 | 5 | def enforce_csrf(self, request): 6 | return 7 | -------------------------------------------------------------------------------- /phoneservice/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/phoneservice/migrations/__init__.py -------------------------------------------------------------------------------- /phoneservice/migrations/__pycache__/__init__.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/phoneservice/migrations/__pycache__/__init__.cpython-38.pyc -------------------------------------------------------------------------------- /phoneservice/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | # Create your models here. 4 | -------------------------------------------------------------------------------- /phoneservice/restAPIs.py: -------------------------------------------------------------------------------- 1 | from rest_framework.response import Response 2 | from rest_framework.views import APIView 3 | from rest_framework.permissions import IsAuthenticated, AllowAny 4 | 5 | from .custom_authenticators import CsrfExemptSessionAuthentication 6 | from rest_framework.authentication import SessionAuthentication, BasicAuthentication 7 | from rest_framework.authtoken.models import Token 8 | 9 | from django.contrib.auth.models import User 10 | from django.contrib import messages, auth 11 | 12 | class Login(APIView): 13 | # authentication_classes = [CsrfExemptSessionAuthentication] 14 | permission_classes = [AllowAny] 15 | 16 | 17 | def get(self, request, format=None): 18 | return Response({"auth_status": False}) 19 | 20 | def post(self, request, format=None): 21 | data = request.data 22 | 23 | email = data['email'] 24 | password = data['password'] 25 | 26 | try: 27 | user = User.objects.get(email=email) 28 | # print(user.password) 29 | if user.check_password(password): 30 | print('User authenticated') 31 | auth.login(request, user) 32 | print('User Logged in') 33 | token, _ = Token.objects.get_or_create(user=user) 34 | return Response({"auth_status": True, "auth_token": token.key}) 35 | else: 36 | print('User not authenticated') 37 | return Response({"auth_status": False}) 38 | except: 39 | return Response({"auth_status": False}) 40 | 41 | class Logout(APIView): 42 | def get(self, request, format=None): 43 | pass 44 | 45 | def get(self, request, format=None): 46 | pass 47 | -------------------------------------------------------------------------------- /phoneservice/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /phoneservice/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path, include 2 | from . import restAPIs 3 | from django.views.decorators.csrf import csrf_exempt 4 | 5 | urlpatterns = [ 6 | path('login/', restAPIs.Login.as_view(), name='rest_login'), 7 | path('logout/', restAPIs.Logout.as_view(), name='rest_logout'), 8 | ] 9 | -------------------------------------------------------------------------------- /phoneservice/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | 3 | # Create your views here. 4 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | appdirs==1.4.3 2 | asgiref==3.2.10 3 | CacheControl==0.12.6 4 | certifi==2019.11.28 5 | chardet==3.0.4 6 | colorama==0.4.3 7 | contextlib2==0.6.0 8 | distlib==0.3.0 9 | distro==1.4.0 10 | Django==3.1 11 | django-rest-framework==0.1.0 12 | djangorestframework==3.11.1 13 | html5lib==1.0.1 14 | idna==2.8 15 | ipaddr==2.2.0 16 | lockfile==0.12.2 17 | msgpack==0.6.2 18 | packaging==20.3 19 | pep517==0.8.2 20 | progress==1.5 21 | pyparsing==2.4.6 22 | pytoml==0.1.21 23 | pytz==2020.1 24 | requests==2.22.0 25 | retrying==1.3.3 26 | six==1.14.0 27 | sqlparse==0.3.1 28 | urllib3==1.25.8 29 | webencodings==0.5.1 30 | -------------------------------------------------------------------------------- /static/dash_files/all.css: -------------------------------------------------------------------------------- 1 | .fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:fa-spin 2s infinite linear}.fa-pulse{animation:fa-spin 1s infinite steps(8)}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-wizard:before{content:"\f6e8"}.fa-haykal:before{content:"\f666"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:normal;font-display:auto;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:auto;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:auto;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900} -------------------------------------------------------------------------------- /static/dash_files/bootstrap-notify.js: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | 4 | 5 | Creative Tim Modifications 6 | 7 | Lines: 238, 239 was changed from top: 5px to top: 50% and we added margin-top: -13px. In this way the close button will be aligned vertically 8 | Line:222 - modified when the icon is set, we add the class "alert-with-icon", so there will be enough space for the icon. 9 | 10 | 11 | 12 | 13 | */ 14 | 15 | 16 | /* 17 | * Project: Bootstrap Notify = v3.1.5 18 | * Description: Turns standard Bootstrap alerts into "Growl-like" notifications. 19 | * Author: Mouse0270 aka Robert McIntosh 20 | * License: MIT License 21 | * Website: https://github.com/mouse0270/bootstrap-growl 22 | */ 23 | 24 | /* global define:false, require: false, jQuery:false */ 25 | 26 | (function(factory) { 27 | if (typeof define === 'function' && define.amd) { 28 | // AMD. Register as an anonymous module. 29 | define(['jquery'], factory); 30 | } else if (typeof exports === 'object') { 31 | // Node/CommonJS 32 | factory(require('jquery')); 33 | } else { 34 | // Browser globals 35 | factory(jQuery); 36 | } 37 | }(function($) { 38 | // Create the defaults once 39 | var defaults = { 40 | element: 'body', 41 | position: null, 42 | type: "info", 43 | allow_dismiss: true, 44 | allow_duplicates: true, 45 | newest_on_top: false, 46 | showProgressbar: false, 47 | placement: { 48 | from: "top", 49 | align: "right" 50 | }, 51 | offset: 20, 52 | spacing: 10, 53 | z_index: 1060, 54 | delay: 5000, 55 | timer: 1000, 56 | url_target: '_blank', 57 | mouse_over: null, 58 | animate: { 59 | enter: 'animated fadeInDown', 60 | exit: 'animated fadeOutUp' 61 | }, 62 | onShow: null, 63 | onShown: null, 64 | onClose: null, 65 | onClosed: null, 66 | onClick: null, 67 | icon_type: 'class', 68 | template: '' 69 | }; 70 | 71 | String.format = function() { 72 | var args = arguments; 73 | var str = arguments[0]; 74 | return str.replace(/(\{\{\d\}\}|\{\d\})/g, function(str) { 75 | if (str.substring(0, 2) === "{{") return str; 76 | var num = parseInt(str.match(/\d/)[0]); 77 | return args[num + 1]; 78 | }); 79 | }; 80 | 81 | function isDuplicateNotification(notification) { 82 | var isDupe = false; 83 | 84 | $('[data-notify="container"]').each(function(i, el) { 85 | var $el = $(el); 86 | var title = $el.find('[data-notify="title"]').html().trim(); 87 | var message = $el.find('[data-notify="message"]').html().trim(); 88 | 89 | // The input string might be different than the actual parsed HTML string! 90 | // (
vs
for example) 91 | // So we have to force-parse this as HTML here! 92 | var isSameTitle = title === $("
" + notification.settings.content.title + "
").html().trim(); 93 | var isSameMsg = message === $("
" + notification.settings.content.message + "
").html().trim(); 94 | var isSameType = $el.hasClass('alert-' + notification.settings.type); 95 | 96 | if (isSameTitle && isSameMsg && isSameType) { 97 | //we found the dupe. Set the var and stop checking. 98 | isDupe = true; 99 | } 100 | return !isDupe; 101 | }); 102 | 103 | return isDupe; 104 | } 105 | 106 | function Notify(element, content, options) { 107 | // Setup Content of Notify 108 | var contentObj = { 109 | content: { 110 | message: typeof content === 'object' ? content.message : content, 111 | title: content.title ? content.title : '', 112 | icon: content.icon ? content.icon : '', 113 | url: content.url ? content.url : '#', 114 | target: content.target ? content.target : '-' 115 | } 116 | }; 117 | 118 | options = $.extend(true, {}, contentObj, options); 119 | this.settings = $.extend(true, {}, defaults, options); 120 | this._defaults = defaults; 121 | if (this.settings.content.target === "-") { 122 | this.settings.content.target = this.settings.url_target; 123 | } 124 | this.animations = { 125 | start: 'webkitAnimationStart oanimationstart MSAnimationStart animationstart', 126 | end: 'webkitAnimationEnd oanimationend MSAnimationEnd animationend' 127 | }; 128 | 129 | if (typeof this.settings.offset === 'number') { 130 | this.settings.offset = { 131 | x: this.settings.offset, 132 | y: this.settings.offset 133 | }; 134 | } 135 | 136 | //if duplicate messages are not allowed, then only continue if this new message is not a duplicate of one that it already showing 137 | if (this.settings.allow_duplicates || (!this.settings.allow_duplicates && !isDuplicateNotification(this))) { 138 | this.init(); 139 | } 140 | } 141 | 142 | $.extend(Notify.prototype, { 143 | init: function() { 144 | var self = this; 145 | 146 | this.buildNotify(); 147 | if (this.settings.content.icon) { 148 | this.setIcon(); 149 | } 150 | if (this.settings.content.url != "#") { 151 | this.styleURL(); 152 | } 153 | this.styleDismiss(); 154 | this.placement(); 155 | this.bind(); 156 | 157 | this.notify = { 158 | $ele: this.$ele, 159 | update: function(command, update) { 160 | var commands = {}; 161 | if (typeof command === "string") { 162 | commands[command] = update; 163 | } else { 164 | commands = command; 165 | } 166 | for (var cmd in commands) { 167 | switch (cmd) { 168 | case "type": 169 | this.$ele.removeClass('alert-' + self.settings.type); 170 | this.$ele.find('[data-notify="progressbar"] > .progress-bar').removeClass('progress-bar-' + self.settings.type); 171 | self.settings.type = commands[cmd]; 172 | this.$ele.addClass('alert-' + commands[cmd]).find('[data-notify="progressbar"] > .progress-bar').addClass('progress-bar-' + commands[cmd]); 173 | break; 174 | case "icon": 175 | var $icon = this.$ele.find('[data-notify="icon"]'); 176 | if (self.settings.icon_type.toLowerCase() === 'class') { 177 | $icon.removeClass(self.settings.content.icon).addClass(commands[cmd]); 178 | } else { 179 | if (!$icon.is('img')) { 180 | $icon.find('img'); 181 | } 182 | $icon.attr('src', commands[cmd]); 183 | } 184 | self.settings.content.icon = commands[command]; 185 | break; 186 | case "progress": 187 | var newDelay = self.settings.delay - (self.settings.delay * (commands[cmd] / 100)); 188 | this.$ele.data('notify-delay', newDelay); 189 | this.$ele.find('[data-notify="progressbar"] > div').attr('aria-valuenow', commands[cmd]).css('width', commands[cmd] + '%'); 190 | break; 191 | case "url": 192 | this.$ele.find('[data-notify="url"]').attr('href', commands[cmd]); 193 | break; 194 | case "target": 195 | this.$ele.find('[data-notify="url"]').attr('target', commands[cmd]); 196 | break; 197 | default: 198 | this.$ele.find('[data-notify="' + cmd + '"]').html(commands[cmd]); 199 | } 200 | } 201 | var posX = this.$ele.outerHeight() + parseInt(self.settings.spacing) + parseInt(self.settings.offset.y); 202 | self.reposition(posX); 203 | }, 204 | close: function() { 205 | self.close(); 206 | } 207 | }; 208 | 209 | }, 210 | buildNotify: function() { 211 | var content = this.settings.content; 212 | this.$ele = $(String.format(this.settings.template, this.settings.type, content.title, content.message, content.url, content.target)); 213 | this.$ele.attr('data-notify-position', this.settings.placement.from + '-' + this.settings.placement.align); 214 | if (!this.settings.allow_dismiss) { 215 | this.$ele.find('[data-notify="dismiss"]').css('display', 'none'); 216 | } 217 | if ((this.settings.delay <= 0 && !this.settings.showProgressbar) || !this.settings.showProgressbar) { 218 | this.$ele.find('[data-notify="progressbar"]').remove(); 219 | } 220 | }, 221 | setIcon: function() { 222 | this.$ele.addClass('alert-with-icon'); 223 | 224 | if (this.settings.icon_type.toLowerCase() === 'class') { 225 | this.$ele.find('[data-notify="icon"]').addClass(this.settings.content.icon); 226 | } else { 227 | if (this.$ele.find('[data-notify="icon"]').is('img')) { 228 | this.$ele.find('[data-notify="icon"]').attr('src', this.settings.content.icon); 229 | } else { 230 | this.$ele.find('[data-notify="icon"]').append('Notify Icon'); 231 | } 232 | } 233 | }, 234 | styleDismiss: function() { 235 | this.$ele.find('[data-notify="dismiss"]').css({ 236 | position: 'absolute', 237 | right: '10px', 238 | top: '50%', 239 | marginTop: '-13px', 240 | zIndex: this.settings.z_index + 2 241 | }); 242 | }, 243 | styleURL: function() { 244 | this.$ele.find('[data-notify="url"]').css({ 245 | backgroundImage: 'url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)', 246 | height: '100%', 247 | left: 0, 248 | position: 'absolute', 249 | top: 0, 250 | width: '100%', 251 | zIndex: this.settings.z_index + 1 252 | }); 253 | }, 254 | placement: function() { 255 | var self = this, 256 | offsetAmt = this.settings.offset.y, 257 | css = { 258 | display: 'inline-block', 259 | margin: '0px auto', 260 | position: this.settings.position ? this.settings.position : (this.settings.element === 'body' ? 'fixed' : 'absolute'), 261 | transition: 'all .5s ease-in-out', 262 | zIndex: this.settings.z_index 263 | }, 264 | hasAnimation = false, 265 | settings = this.settings; 266 | 267 | $('[data-notify-position="' + this.settings.placement.from + '-' + this.settings.placement.align + '"]:not([data-closing="true"])').each(function() { 268 | offsetAmt = Math.max(offsetAmt, parseInt($(this).css(settings.placement.from)) + parseInt($(this).outerHeight()) + parseInt(settings.spacing)); 269 | }); 270 | if (this.settings.newest_on_top === true) { 271 | offsetAmt = this.settings.offset.y; 272 | } 273 | css[this.settings.placement.from] = offsetAmt + 'px'; 274 | 275 | switch (this.settings.placement.align) { 276 | case "left": 277 | case "right": 278 | css[this.settings.placement.align] = this.settings.offset.x + 'px'; 279 | break; 280 | case "center": 281 | css.left = 0; 282 | css.right = 0; 283 | break; 284 | } 285 | this.$ele.css(css).addClass(this.settings.animate.enter); 286 | $.each(Array('webkit-', 'moz-', 'o-', 'ms-', ''), function(index, prefix) { 287 | self.$ele[0].style[prefix + 'AnimationIterationCount'] = 1; 288 | }); 289 | 290 | $(this.settings.element).append(this.$ele); 291 | 292 | if (this.settings.newest_on_top === true) { 293 | offsetAmt = (parseInt(offsetAmt) + parseInt(this.settings.spacing)) + this.$ele.outerHeight(); 294 | this.reposition(offsetAmt); 295 | } 296 | 297 | if ($.isFunction(self.settings.onShow)) { 298 | self.settings.onShow.call(this.$ele); 299 | } 300 | 301 | this.$ele.one(this.animations.start, function() { 302 | hasAnimation = true; 303 | }).one(this.animations.end, function() { 304 | self.$ele.removeClass(self.settings.animate.enter); 305 | if ($.isFunction(self.settings.onShown)) { 306 | self.settings.onShown.call(this); 307 | } 308 | }); 309 | 310 | setTimeout(function() { 311 | if (!hasAnimation) { 312 | if ($.isFunction(self.settings.onShown)) { 313 | self.settings.onShown.call(this); 314 | } 315 | } 316 | }, 600); 317 | }, 318 | bind: function() { 319 | var self = this; 320 | 321 | this.$ele.find('[data-notify="dismiss"]').on('click', function() { 322 | self.close(); 323 | }); 324 | 325 | if ($.isFunction(self.settings.onClick)) { 326 | this.$ele.on('click', function(event) { 327 | if (event.target != self.$ele.find('[data-notify="dismiss"]')[0]) { 328 | self.settings.onClick.call(this, event); 329 | } 330 | }); 331 | } 332 | 333 | this.$ele.mouseover(function() { 334 | $(this).data('data-hover', "true"); 335 | }).mouseout(function() { 336 | $(this).data('data-hover', "false"); 337 | }); 338 | this.$ele.data('data-hover', "false"); 339 | 340 | if (this.settings.delay > 0) { 341 | self.$ele.data('notify-delay', self.settings.delay); 342 | var timer = setInterval(function() { 343 | var delay = parseInt(self.$ele.data('notify-delay')) - self.settings.timer; 344 | if ((self.$ele.data('data-hover') === 'false' && self.settings.mouse_over === "pause") || self.settings.mouse_over != "pause") { 345 | var percent = ((self.settings.delay - delay) / self.settings.delay) * 100; 346 | self.$ele.data('notify-delay', delay); 347 | self.$ele.find('[data-notify="progressbar"] > div').attr('aria-valuenow', percent).css('width', percent + '%'); 348 | } 349 | if (delay <= -(self.settings.timer)) { 350 | clearInterval(timer); 351 | self.close(); 352 | } 353 | }, self.settings.timer); 354 | } 355 | }, 356 | close: function() { 357 | var self = this, 358 | posX = parseInt(this.$ele.css(this.settings.placement.from)), 359 | hasAnimation = false; 360 | 361 | this.$ele.attr('data-closing', 'true').addClass(this.settings.animate.exit); 362 | self.reposition(posX); 363 | 364 | if ($.isFunction(self.settings.onClose)) { 365 | self.settings.onClose.call(this.$ele); 366 | } 367 | 368 | this.$ele.one(this.animations.start, function() { 369 | hasAnimation = true; 370 | }).one(this.animations.end, function() { 371 | $(this).remove(); 372 | if ($.isFunction(self.settings.onClosed)) { 373 | self.settings.onClosed.call(this); 374 | } 375 | }); 376 | 377 | setTimeout(function() { 378 | if (!hasAnimation) { 379 | self.$ele.remove(); 380 | if (self.settings.onClosed) { 381 | self.settings.onClosed(self.$ele); 382 | } 383 | } 384 | }, 600); 385 | }, 386 | reposition: function(posX) { 387 | var self = this, 388 | notifies = '[data-notify-position="' + this.settings.placement.from + '-' + this.settings.placement.align + '"]:not([data-closing="true"])', 389 | $elements = this.$ele.nextAll(notifies); 390 | if (this.settings.newest_on_top === true) { 391 | $elements = this.$ele.prevAll(notifies); 392 | } 393 | $elements.each(function() { 394 | $(this).css(self.settings.placement.from, posX); 395 | posX = (parseInt(posX) + parseInt(self.settings.spacing)) + $(this).outerHeight(); 396 | }); 397 | } 398 | }); 399 | 400 | $.notify = function(content, options) { 401 | var plugin = new Notify(this, content, options); 402 | return plugin.notify; 403 | }; 404 | $.notifyDefaults = function(options) { 405 | defaults = $.extend(true, {}, defaults, options); 406 | return defaults; 407 | }; 408 | 409 | $.notifyClose = function(selector) { 410 | 411 | if (typeof selector === "undefined" || selector === "all") { 412 | $('[data-notify]').find('[data-notify="dismiss"]').trigger('click'); 413 | } else if (selector === 'success' || selector === 'info' || selector === 'warning' || selector === 'danger') { 414 | $('.alert-' + selector + '[data-notify]').find('[data-notify="dismiss"]').trigger('click'); 415 | } else if (selector) { 416 | $(selector + '[data-notify]').find('[data-notify="dismiss"]').trigger('click'); 417 | } else { 418 | $('[data-notify-position="' + selector + '"]').find('[data-notify="dismiss"]').trigger('click'); 419 | } 420 | }; 421 | 422 | $.notifyCloseExcept = function(selector) { 423 | 424 | if (selector === 'success' || selector === 'info' || selector === 'warning' || selector === 'danger') { 425 | $('[data-notify]').not('.alert-' + selector).find('[data-notify="dismiss"]').trigger('click'); 426 | } else { 427 | $('[data-notify]').not(selector).find('[data-notify="dismiss"]').trigger('click'); 428 | } 429 | }; 430 | 431 | 432 | })); -------------------------------------------------------------------------------- /static/dash_files/css: -------------------------------------------------------------------------------- 1 | /* cyrillic-ext */ 2 | @font-face { 3 | font-family: 'Montserrat'; 4 | font-style: normal; 5 | font-weight: 200; 6 | src: local('Montserrat ExtraLight'), local('Montserrat-ExtraLight'), url(https://fonts.gstatic.com/s/montserrat/v14/JTURjIg1_i6t8kCHKm45_aZA3gTD_u50.woff2) format('woff2'); 7 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 8 | } 9 | /* cyrillic */ 10 | @font-face { 11 | font-family: 'Montserrat'; 12 | font-style: normal; 13 | font-weight: 200; 14 | src: local('Montserrat ExtraLight'), local('Montserrat-ExtraLight'), url(https://fonts.gstatic.com/s/montserrat/v14/JTURjIg1_i6t8kCHKm45_aZA3g3D_u50.woff2) format('woff2'); 15 | unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 16 | } 17 | /* vietnamese */ 18 | @font-face { 19 | font-family: 'Montserrat'; 20 | font-style: normal; 21 | font-weight: 200; 22 | src: local('Montserrat ExtraLight'), local('Montserrat-ExtraLight'), url(https://fonts.gstatic.com/s/montserrat/v14/JTURjIg1_i6t8kCHKm45_aZA3gbD_u50.woff2) format('woff2'); 23 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 24 | } 25 | /* latin-ext */ 26 | @font-face { 27 | font-family: 'Montserrat'; 28 | font-style: normal; 29 | font-weight: 200; 30 | src: local('Montserrat ExtraLight'), local('Montserrat-ExtraLight'), url(https://fonts.gstatic.com/s/montserrat/v14/JTURjIg1_i6t8kCHKm45_aZA3gfD_u50.woff2) format('woff2'); 31 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 32 | } 33 | /* latin */ 34 | @font-face { 35 | font-family: 'Montserrat'; 36 | font-style: normal; 37 | font-weight: 200; 38 | src: local('Montserrat ExtraLight'), local('Montserrat-ExtraLight'), url(https://fonts.gstatic.com/s/montserrat/v14/JTURjIg1_i6t8kCHKm45_aZA3gnD_g.woff2) format('woff2'); 39 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 40 | } 41 | /* cyrillic-ext */ 42 | @font-face { 43 | font-family: 'Montserrat'; 44 | font-style: normal; 45 | font-weight: 400; 46 | src: local('Montserrat Regular'), local('Montserrat-Regular'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUSjIg1_i6t8kCHKm459WRhyzbi.woff2) format('woff2'); 47 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 48 | } 49 | /* cyrillic */ 50 | @font-face { 51 | font-family: 'Montserrat'; 52 | font-style: normal; 53 | font-weight: 400; 54 | src: local('Montserrat Regular'), local('Montserrat-Regular'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUSjIg1_i6t8kCHKm459W1hyzbi.woff2) format('woff2'); 55 | unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 56 | } 57 | /* vietnamese */ 58 | @font-face { 59 | font-family: 'Montserrat'; 60 | font-style: normal; 61 | font-weight: 400; 62 | src: local('Montserrat Regular'), local('Montserrat-Regular'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUSjIg1_i6t8kCHKm459WZhyzbi.woff2) format('woff2'); 63 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 64 | } 65 | /* latin-ext */ 66 | @font-face { 67 | font-family: 'Montserrat'; 68 | font-style: normal; 69 | font-weight: 400; 70 | src: local('Montserrat Regular'), local('Montserrat-Regular'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUSjIg1_i6t8kCHKm459Wdhyzbi.woff2) format('woff2'); 71 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 72 | } 73 | /* latin */ 74 | @font-face { 75 | font-family: 'Montserrat'; 76 | font-style: normal; 77 | font-weight: 400; 78 | src: local('Montserrat Regular'), local('Montserrat-Regular'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUSjIg1_i6t8kCHKm459Wlhyw.woff2) format('woff2'); 79 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 80 | } 81 | /* cyrillic-ext */ 82 | @font-face { 83 | font-family: 'Montserrat'; 84 | font-style: normal; 85 | font-weight: 700; 86 | src: local('Montserrat Bold'), local('Montserrat-Bold'), url(https://fonts.gstatic.com/s/montserrat/v14/JTURjIg1_i6t8kCHKm45_dJE3gTD_u50.woff2) format('woff2'); 87 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 88 | } 89 | /* cyrillic */ 90 | @font-face { 91 | font-family: 'Montserrat'; 92 | font-style: normal; 93 | font-weight: 700; 94 | src: local('Montserrat Bold'), local('Montserrat-Bold'), url(https://fonts.gstatic.com/s/montserrat/v14/JTURjIg1_i6t8kCHKm45_dJE3g3D_u50.woff2) format('woff2'); 95 | unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 96 | } 97 | /* vietnamese */ 98 | @font-face { 99 | font-family: 'Montserrat'; 100 | font-style: normal; 101 | font-weight: 700; 102 | src: local('Montserrat Bold'), local('Montserrat-Bold'), url(https://fonts.gstatic.com/s/montserrat/v14/JTURjIg1_i6t8kCHKm45_dJE3gbD_u50.woff2) format('woff2'); 103 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; 104 | } 105 | /* latin-ext */ 106 | @font-face { 107 | font-family: 'Montserrat'; 108 | font-style: normal; 109 | font-weight: 700; 110 | src: local('Montserrat Bold'), local('Montserrat-Bold'), url(https://fonts.gstatic.com/s/montserrat/v14/JTURjIg1_i6t8kCHKm45_dJE3gfD_u50.woff2) format('woff2'); 111 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 112 | } 113 | /* latin */ 114 | @font-face { 115 | font-family: 'Montserrat'; 116 | font-style: normal; 117 | font-weight: 700; 118 | src: local('Montserrat Bold'), local('Montserrat-Bold'), url(https://fonts.gstatic.com/s/montserrat/v14/JTURjIg1_i6t8kCHKm45_dJE3gnD_g.woff2) format('woff2'); 119 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 120 | } 121 | -------------------------------------------------------------------------------- /static/dash_files/demo.css: -------------------------------------------------------------------------------- 1 | .tim-row { 2 | margin-bottom: 20px; 3 | } 4 | 5 | .tim-white-buttons { 6 | background-color: #777777; 7 | } 8 | 9 | .typography-line { 10 | padding-left: 25%; 11 | margin-bottom: 35px; 12 | position: relative; 13 | display: block; 14 | width: 100%; 15 | } 16 | 17 | .typography-line span { 18 | bottom: 10px; 19 | color: #c0c1c2; 20 | display: block; 21 | font-weight: 400; 22 | font-size: 13px; 23 | line-height: 13px; 24 | left: 0; 25 | position: absolute; 26 | width: 260px; 27 | text-transform: none; 28 | } 29 | 30 | .tim-row { 31 | padding-top: 60px; 32 | } 33 | 34 | .tim-row h3 { 35 | margin-top: 0; 36 | } 37 | 38 | .offline-doc .page-header { 39 | display: flex; 40 | align-items: center; 41 | } 42 | 43 | .offline-doc .footer { 44 | position: absolute; 45 | width: 100%; 46 | background: transparent; 47 | bottom: 0; 48 | color: #fff; 49 | z-index: 1; 50 | } 51 | 52 | @media all and (min-width: 992px) { 53 | .sidebar .nav>li.active-pro { 54 | position: absolute; 55 | width: 100%; 56 | bottom: 10px; 57 | } 58 | } 59 | 60 | .card.card-upgrade .card-category { 61 | max-width: 530px; 62 | margin: 0 auto; 63 | } -------------------------------------------------------------------------------- /static/dash_files/demo.js: -------------------------------------------------------------------------------- 1 | demo = { 2 | initPickColor: function() { 3 | $('.pick-class-label').click(function() { 4 | var new_class = $(this).attr('new-class'); 5 | var old_class = $('#display-buttons').attr('data-class'); 6 | var display_div = $('#display-buttons'); 7 | if (display_div.length) { 8 | var display_buttons = display_div.find('.btn'); 9 | display_buttons.removeClass(old_class); 10 | display_buttons.addClass(new_class); 11 | display_div.attr('data-class', new_class); 12 | } 13 | }); 14 | }, 15 | 16 | initDocChart: function() { 17 | chartColor = "#FFFFFF"; 18 | 19 | // General configuration for the charts with Line gradientStroke 20 | gradientChartOptionsConfiguration = { 21 | maintainAspectRatio: false, 22 | legend: { 23 | display: false 24 | }, 25 | tooltips: { 26 | bodySpacing: 4, 27 | mode: "nearest", 28 | intersect: 0, 29 | position: "nearest", 30 | xPadding: 10, 31 | yPadding: 10, 32 | caretPadding: 10 33 | }, 34 | responsive: true, 35 | scales: { 36 | yAxes: [{ 37 | display: 0, 38 | gridLines: 0, 39 | ticks: { 40 | display: false 41 | }, 42 | gridLines: { 43 | zeroLineColor: "transparent", 44 | drawTicks: false, 45 | display: false, 46 | drawBorder: false 47 | } 48 | }], 49 | xAxes: [{ 50 | display: 0, 51 | gridLines: 0, 52 | ticks: { 53 | display: false 54 | }, 55 | gridLines: { 56 | zeroLineColor: "transparent", 57 | drawTicks: false, 58 | display: false, 59 | drawBorder: false 60 | } 61 | }] 62 | }, 63 | layout: { 64 | padding: { 65 | left: 0, 66 | right: 0, 67 | top: 15, 68 | bottom: 15 69 | } 70 | } 71 | }; 72 | 73 | ctx = document.getElementById('lineChartExample').getContext("2d"); 74 | 75 | gradientStroke = ctx.createLinearGradient(500, 0, 100, 0); 76 | gradientStroke.addColorStop(0, '#80b6f4'); 77 | gradientStroke.addColorStop(1, chartColor); 78 | 79 | gradientFill = ctx.createLinearGradient(0, 170, 0, 50); 80 | gradientFill.addColorStop(0, "rgba(128, 182, 244, 0)"); 81 | gradientFill.addColorStop(1, "rgba(249, 99, 59, 0.40)"); 82 | 83 | myChart = new Chart(ctx, { 84 | type: 'line', 85 | responsive: true, 86 | data: { 87 | labels: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], 88 | datasets: [{ 89 | label: "Active Users", 90 | borderColor: "#f96332", 91 | pointBorderColor: "#FFF", 92 | pointBackgroundColor: "#f96332", 93 | pointBorderWidth: 2, 94 | pointHoverRadius: 4, 95 | pointHoverBorderWidth: 1, 96 | pointRadius: 4, 97 | fill: true, 98 | backgroundColor: gradientFill, 99 | borderWidth: 2, 100 | data: [542, 480, 430, 550, 530, 453, 380, 434, 568, 610, 700, 630] 101 | }] 102 | }, 103 | options: gradientChartOptionsConfiguration 104 | }); 105 | }, 106 | 107 | initDashboardPageCharts: function() { 108 | 109 | chartColor = "#FFFFFF"; 110 | 111 | // General configuration for the charts with Line gradientStroke 112 | gradientChartOptionsConfiguration = { 113 | maintainAspectRatio: false, 114 | legend: { 115 | display: false 116 | }, 117 | tooltips: { 118 | bodySpacing: 4, 119 | mode: "nearest", 120 | intersect: 0, 121 | position: "nearest", 122 | xPadding: 10, 123 | yPadding: 10, 124 | caretPadding: 10 125 | }, 126 | responsive: 1, 127 | scales: { 128 | yAxes: [{ 129 | display: 0, 130 | gridLines: 0, 131 | ticks: { 132 | display: false 133 | }, 134 | gridLines: { 135 | zeroLineColor: "transparent", 136 | drawTicks: false, 137 | display: false, 138 | drawBorder: false 139 | } 140 | }], 141 | xAxes: [{ 142 | display: 0, 143 | gridLines: 0, 144 | ticks: { 145 | display: false 146 | }, 147 | gridLines: { 148 | zeroLineColor: "transparent", 149 | drawTicks: false, 150 | display: false, 151 | drawBorder: false 152 | } 153 | }] 154 | }, 155 | layout: { 156 | padding: { 157 | left: 0, 158 | right: 0, 159 | top: 15, 160 | bottom: 15 161 | } 162 | } 163 | }; 164 | 165 | gradientChartOptionsConfigurationWithNumbersAndGrid = { 166 | maintainAspectRatio: false, 167 | legend: { 168 | display: false 169 | }, 170 | tooltips: { 171 | bodySpacing: 4, 172 | mode: "nearest", 173 | intersect: 0, 174 | position: "nearest", 175 | xPadding: 10, 176 | yPadding: 10, 177 | caretPadding: 10 178 | }, 179 | responsive: true, 180 | scales: { 181 | yAxes: [{ 182 | gridLines: 0, 183 | gridLines: { 184 | zeroLineColor: "transparent", 185 | drawBorder: false 186 | } 187 | }], 188 | xAxes: [{ 189 | display: 0, 190 | gridLines: 0, 191 | ticks: { 192 | display: false 193 | }, 194 | gridLines: { 195 | zeroLineColor: "transparent", 196 | drawTicks: false, 197 | display: false, 198 | drawBorder: false 199 | } 200 | }] 201 | }, 202 | layout: { 203 | padding: { 204 | left: 0, 205 | right: 0, 206 | top: 15, 207 | bottom: 15 208 | } 209 | } 210 | }; 211 | 212 | var ctx = document.getElementById('bigDashboardChart').getContext("2d"); 213 | 214 | var gradientStroke = ctx.createLinearGradient(500, 0, 100, 0); 215 | gradientStroke.addColorStop(0, '#80b6f4'); 216 | gradientStroke.addColorStop(1, chartColor); 217 | 218 | var gradientFill = ctx.createLinearGradient(0, 200, 0, 50); 219 | gradientFill.addColorStop(0, "rgba(128, 182, 244, 0)"); 220 | gradientFill.addColorStop(1, "rgba(255, 255, 255, 0.24)"); 221 | 222 | var myChart = new Chart(ctx, { 223 | type: 'line', 224 | data: { 225 | labels: ["JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"], 226 | datasets: [{ 227 | label: "Data", 228 | borderColor: chartColor, 229 | pointBorderColor: chartColor, 230 | pointBackgroundColor: "#1e3d60", 231 | pointHoverBackgroundColor: "#1e3d60", 232 | pointHoverBorderColor: chartColor, 233 | pointBorderWidth: 1, 234 | pointHoverRadius: 7, 235 | pointHoverBorderWidth: 2, 236 | pointRadius: 5, 237 | fill: true, 238 | backgroundColor: gradientFill, 239 | borderWidth: 2, 240 | data: [50, 150, 100, 190, 130, 90, 150, 160, 120, 140, 190, 95] 241 | }] 242 | }, 243 | options: { 244 | layout: { 245 | padding: { 246 | left: 20, 247 | right: 20, 248 | top: 0, 249 | bottom: 0 250 | } 251 | }, 252 | maintainAspectRatio: false, 253 | tooltips: { 254 | backgroundColor: '#fff', 255 | titleFontColor: '#333', 256 | bodyFontColor: '#666', 257 | bodySpacing: 4, 258 | xPadding: 12, 259 | mode: "nearest", 260 | intersect: 0, 261 | position: "nearest" 262 | }, 263 | legend: { 264 | position: "bottom", 265 | fillStyle: "#FFF", 266 | display: false 267 | }, 268 | scales: { 269 | yAxes: [{ 270 | ticks: { 271 | fontColor: "rgba(255,255,255,0.4)", 272 | fontStyle: "bold", 273 | beginAtZero: true, 274 | maxTicksLimit: 5, 275 | padding: 10 276 | }, 277 | gridLines: { 278 | drawTicks: true, 279 | drawBorder: false, 280 | display: true, 281 | color: "rgba(255,255,255,0.1)", 282 | zeroLineColor: "transparent" 283 | } 284 | 285 | }], 286 | xAxes: [{ 287 | gridLines: { 288 | zeroLineColor: "transparent", 289 | display: false, 290 | 291 | }, 292 | ticks: { 293 | padding: 10, 294 | fontColor: "rgba(255,255,255,0.4)", 295 | fontStyle: "bold" 296 | } 297 | }] 298 | } 299 | } 300 | }); 301 | 302 | var cardStatsMiniLineColor = "#fff", 303 | cardStatsMiniDotColor = "#fff"; 304 | 305 | ctx = document.getElementById('lineChartExample').getContext("2d"); 306 | 307 | gradientStroke = ctx.createLinearGradient(500, 0, 100, 0); 308 | gradientStroke.addColorStop(0, '#80b6f4'); 309 | gradientStroke.addColorStop(1, chartColor); 310 | 311 | gradientFill = ctx.createLinearGradient(0, 170, 0, 50); 312 | gradientFill.addColorStop(0, "rgba(128, 182, 244, 0)"); 313 | gradientFill.addColorStop(1, "rgba(249, 99, 59, 0.40)"); 314 | 315 | myChart = new Chart(ctx, { 316 | type: 'line', 317 | responsive: true, 318 | data: { 319 | labels: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], 320 | datasets: [{ 321 | label: "Active Users", 322 | borderColor: "#f96332", 323 | pointBorderColor: "#FFF", 324 | pointBackgroundColor: "#f96332", 325 | pointBorderWidth: 2, 326 | pointHoverRadius: 4, 327 | pointHoverBorderWidth: 1, 328 | pointRadius: 4, 329 | fill: true, 330 | backgroundColor: gradientFill, 331 | borderWidth: 2, 332 | data: [542, 480, 430, 550, 530, 453, 380, 434, 568, 610, 700, 630] 333 | }] 334 | }, 335 | options: gradientChartOptionsConfiguration 336 | }); 337 | 338 | 339 | ctx = document.getElementById('lineChartExampleWithNumbersAndGrid').getContext("2d"); 340 | 341 | gradientStroke = ctx.createLinearGradient(500, 0, 100, 0); 342 | gradientStroke.addColorStop(0, '#18ce0f'); 343 | gradientStroke.addColorStop(1, chartColor); 344 | 345 | gradientFill = ctx.createLinearGradient(0, 170, 0, 50); 346 | gradientFill.addColorStop(0, "rgba(128, 182, 244, 0)"); 347 | gradientFill.addColorStop(1, hexToRGB('#18ce0f', 0.4)); 348 | 349 | myChart = new Chart(ctx, { 350 | type: 'line', 351 | responsive: true, 352 | data: { 353 | labels: ["12pm,", "3pm", "6pm", "9pm", "12am", "3am", "6am", "9am"], 354 | datasets: [{ 355 | label: "Email Stats", 356 | borderColor: "#18ce0f", 357 | pointBorderColor: "#FFF", 358 | pointBackgroundColor: "#18ce0f", 359 | pointBorderWidth: 2, 360 | pointHoverRadius: 4, 361 | pointHoverBorderWidth: 1, 362 | pointRadius: 4, 363 | fill: true, 364 | backgroundColor: gradientFill, 365 | borderWidth: 2, 366 | data: [40, 500, 650, 700, 1200, 1250, 1300, 1900] 367 | }] 368 | }, 369 | options: gradientChartOptionsConfigurationWithNumbersAndGrid 370 | }); 371 | 372 | var e = document.getElementById("barChartSimpleGradientsNumbers").getContext("2d"); 373 | 374 | gradientFill = ctx.createLinearGradient(0, 170, 0, 50); 375 | gradientFill.addColorStop(0, "rgba(128, 182, 244, 0)"); 376 | gradientFill.addColorStop(1, hexToRGB('#2CA8FF', 0.6)); 377 | 378 | var a = { 379 | type: "bar", 380 | data: { 381 | labels: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], 382 | datasets: [{ 383 | label: "Active Countries", 384 | backgroundColor: gradientFill, 385 | borderColor: "#2CA8FF", 386 | pointBorderColor: "#FFF", 387 | pointBackgroundColor: "#2CA8FF", 388 | pointBorderWidth: 2, 389 | pointHoverRadius: 4, 390 | pointHoverBorderWidth: 1, 391 | pointRadius: 4, 392 | fill: true, 393 | borderWidth: 1, 394 | data: [80, 99, 86, 96, 123, 85, 100, 75, 88, 90, 123, 155] 395 | }] 396 | }, 397 | options: { 398 | maintainAspectRatio: false, 399 | legend: { 400 | display: false 401 | }, 402 | tooltips: { 403 | bodySpacing: 4, 404 | mode: "nearest", 405 | intersect: 0, 406 | position: "nearest", 407 | xPadding: 10, 408 | yPadding: 10, 409 | caretPadding: 10 410 | }, 411 | responsive: 1, 412 | scales: { 413 | yAxes: [{ 414 | gridLines: 0, 415 | gridLines: { 416 | zeroLineColor: "transparent", 417 | drawBorder: false 418 | } 419 | }], 420 | xAxes: [{ 421 | display: 0, 422 | gridLines: 0, 423 | ticks: { 424 | display: false 425 | }, 426 | gridLines: { 427 | zeroLineColor: "transparent", 428 | drawTicks: false, 429 | display: false, 430 | drawBorder: false 431 | } 432 | }] 433 | }, 434 | layout: { 435 | padding: { 436 | left: 0, 437 | right: 0, 438 | top: 15, 439 | bottom: 15 440 | } 441 | } 442 | } 443 | }; 444 | 445 | var viewsChart = new Chart(e, a); 446 | }, 447 | 448 | initGoogleMaps: function() { 449 | var myLatlng = new google.maps.LatLng(40.748817, -73.985428); 450 | var mapOptions = { 451 | zoom: 13, 452 | center: myLatlng, 453 | scrollwheel: false, //we disable de scroll over the map, it is a really annoing when you scroll through page 454 | styles: [{ 455 | "featureType": "water", 456 | "elementType": "geometry", 457 | "stylers": [{ 458 | "color": "#e9e9e9" 459 | }, { 460 | "lightness": 17 461 | }] 462 | }, { 463 | "featureType": "landscape", 464 | "elementType": "geometry", 465 | "stylers": [{ 466 | "color": "#f5f5f5" 467 | }, { 468 | "lightness": 20 469 | }] 470 | }, { 471 | "featureType": "road.highway", 472 | "elementType": "geometry.fill", 473 | "stylers": [{ 474 | "color": "#ffffff" 475 | }, { 476 | "lightness": 17 477 | }] 478 | }, { 479 | "featureType": "road.highway", 480 | "elementType": "geometry.stroke", 481 | "stylers": [{ 482 | "color": "#ffffff" 483 | }, { 484 | "lightness": 29 485 | }, { 486 | "weight": 0.2 487 | }] 488 | }, { 489 | "featureType": "road.arterial", 490 | "elementType": "geometry", 491 | "stylers": [{ 492 | "color": "#ffffff" 493 | }, { 494 | "lightness": 18 495 | }] 496 | }, { 497 | "featureType": "road.local", 498 | "elementType": "geometry", 499 | "stylers": [{ 500 | "color": "#ffffff" 501 | }, { 502 | "lightness": 16 503 | }] 504 | }, { 505 | "featureType": "poi", 506 | "elementType": "geometry", 507 | "stylers": [{ 508 | "color": "#f5f5f5" 509 | }, { 510 | "lightness": 21 511 | }] 512 | }, { 513 | "featureType": "poi.park", 514 | "elementType": "geometry", 515 | "stylers": [{ 516 | "color": "#dedede" 517 | }, { 518 | "lightness": 21 519 | }] 520 | }, { 521 | "elementType": "labels.text.stroke", 522 | "stylers": [{ 523 | "visibility": "on" 524 | }, { 525 | "color": "#ffffff" 526 | }, { 527 | "lightness": 16 528 | }] 529 | }, { 530 | "elementType": "labels.text.fill", 531 | "stylers": [{ 532 | "saturation": 36 533 | }, { 534 | "color": "#333333" 535 | }, { 536 | "lightness": 40 537 | }] 538 | }, { 539 | "elementType": "labels.icon", 540 | "stylers": [{ 541 | "visibility": "off" 542 | }] 543 | }, { 544 | "featureType": "transit", 545 | "elementType": "geometry", 546 | "stylers": [{ 547 | "color": "#f2f2f2" 548 | }, { 549 | "lightness": 19 550 | }] 551 | }, { 552 | "featureType": "administrative", 553 | "elementType": "geometry.fill", 554 | "stylers": [{ 555 | "color": "#fefefe" 556 | }, { 557 | "lightness": 20 558 | }] 559 | }, { 560 | "featureType": "administrative", 561 | "elementType": "geometry.stroke", 562 | "stylers": [{ 563 | "color": "#fefefe" 564 | }, { 565 | "lightness": 17 566 | }, { 567 | "weight": 1.2 568 | }] 569 | }] 570 | }; 571 | 572 | var map = new google.maps.Map(document.getElementById("map"), mapOptions); 573 | 574 | var marker = new google.maps.Marker({ 575 | position: myLatlng, 576 | title: "Hello World!" 577 | }); 578 | 579 | // To add the marker to the map, call setMap(); 580 | marker.setMap(map); 581 | } 582 | }; -------------------------------------------------------------------------------- /static/dash_files/now-ui-dashboard.min.js: -------------------------------------------------------------------------------- 1 | !function(){if(isWindows=-1',$(div).appendTo("body").click(function(){$("html").removeClass("nav-open"),nowuiDashboard.misc.navbar_menu_visible=0,setTimeout(function(){$toggle.removeClass("toggled"),$("#bodyClick").remove()},550)}),$("html").addClass("nav-open"),nowuiDashboard.misc.navbar_menu_visible=1)}),$(window).resize(function(){seq=seq2=0,0==$(".full-screen-map").length&&0==$(".bd-docs").length&&($navbar=$(".navbar"),isExpanded=$(".navbar").find('[data-toggle="collapse"]').attr("aria-expanded"),$navbar.hasClass("bg-white")&&991<$(window).width()?0==scrollElement.scrollTop()&&$navbar.removeClass("bg-white").addClass("navbar-transparent"):$navbar.hasClass("navbar-transparent")&&$(window).width()<991&&"false"!=isExpanded&&$navbar.addClass("bg-white").removeClass("navbar-transparent")),is_iPad&&$("body").removeClass("sidebar-mini")}),nowuiDashboard={misc:{navbar_menu_visible:0},showNotification:function(a,e){color="primary",$.notify({icon:"now-ui-icons ui-1_bell-53",message:"Welcome to Now Ui Dashboard - a beautiful freebie for every web developer."},{type:color,timer:8e3,placement:{from:a,align:e}})}}; 2 | //# sourceMappingURL=_site_dashboard_free/assets/js/dashboard-free.js.map -------------------------------------------------------------------------------- /static/dash_files/perfect-scrollbar.jquery.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * perfect-scrollbar v1.4.0 3 | * (c) 2018 Hyunje Jun 4 | * @license MIT 5 | */ 6 | !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.PerfectScrollbar=e()}(this,function(){"use strict";function t(t){return getComputedStyle(t)}function e(t,e){for(var i in e){var r=e[i];"number"==typeof r&&(r+="px"),t.style[i]=r}return t}function i(t){var e=document.createElement("div");return e.className=t,e}function r(t,e){if(!v)throw new Error("No element matching method supported");return v.call(t,e)}function l(t){t.remove?t.remove():t.parentNode&&t.parentNode.removeChild(t)}function n(t,e){return Array.prototype.filter.call(t.children,function(t){return r(t,e)})}function o(t,e){var i=t.element.classList,r=m.state.scrolling(e);i.contains(r)?clearTimeout(Y[e]):i.add(r)}function s(t,e){Y[e]=setTimeout(function(){return t.isAlive&&t.element.classList.remove(m.state.scrolling(e))},t.settings.scrollingThreshold)}function a(t,e){o(t,e),s(t,e)}function c(t){if("function"==typeof window.CustomEvent)return new CustomEvent(t);var e=document.createEvent("CustomEvent");return e.initCustomEvent(t,!1,!1,void 0),e}function h(t,e,i,r,l){var n=i[0],o=i[1],s=i[2],h=i[3],u=i[4],d=i[5];void 0===r&&(r=!0),void 0===l&&(l=!1);var f=t.element;t.reach[h]=null,f[s]<1&&(t.reach[h]="start"),f[s]>t[n]-t[o]-1&&(t.reach[h]="end"),e&&(f.dispatchEvent(c("ps-scroll-"+h)),e<0?f.dispatchEvent(c("ps-scroll-"+u)):e>0&&f.dispatchEvent(c("ps-scroll-"+d)),r&&a(t,h)),t.reach[h]&&(e||l)&&f.dispatchEvent(c("ps-"+h+"-reach-"+t.reach[h]))}function u(t){return parseInt(t,10)||0}function d(t){return r(t,"input,[contenteditable]")||r(t,"select,[contenteditable]")||r(t,"textarea,[contenteditable]")||r(t,"button,[contenteditable]")}function f(e){var i=t(e);return u(i.width)+u(i.paddingLeft)+u(i.paddingRight)+u(i.borderLeftWidth)+u(i.borderRightWidth)}function p(t,e){return t.settings.minScrollbarLength&&(e=Math.max(e,t.settings.minScrollbarLength)),t.settings.maxScrollbarLength&&(e=Math.min(e,t.settings.maxScrollbarLength)),e}function b(t,i){var r={width:i.railXWidth},l=Math.floor(t.scrollTop);i.isRtl?r.left=i.negativeScrollAdjustment+t.scrollLeft+i.containerWidth-i.contentWidth:r.left=t.scrollLeft,i.isScrollbarXUsingBottom?r.bottom=i.scrollbarXBottom-l:r.top=i.scrollbarXTop+l,e(i.scrollbarXRail,r);var n={top:l,height:i.railYHeight};i.isScrollbarYUsingRight?i.isRtl?n.right=i.contentWidth-(i.negativeScrollAdjustment+t.scrollLeft)-i.scrollbarYRight-i.scrollbarYOuterWidth:n.right=i.scrollbarYRight-t.scrollLeft:i.isRtl?n.left=i.negativeScrollAdjustment+t.scrollLeft+2*i.containerWidth-i.contentWidth-i.scrollbarYLeft-i.scrollbarYOuterWidth:n.left=i.scrollbarYLeft+t.scrollLeft,e(i.scrollbarYRail,n),e(i.scrollbarX,{left:i.scrollbarXLeft,width:i.scrollbarXWidth-i.railBorderXWidth}),e(i.scrollbarY,{top:i.scrollbarYTop,height:i.scrollbarYHeight-i.railBorderYWidth})}function g(t,e){function i(e){b[d]=g+Y*(e[a]-v),o(t,f),R(t),e.stopPropagation(),e.preventDefault()}function r(){s(t,f),t[p].classList.remove(m.state.clicking),t.event.unbind(t.ownerDocument,"mousemove",i)}var l=e[0],n=e[1],a=e[2],c=e[3],h=e[4],u=e[5],d=e[6],f=e[7],p=e[8],b=t.element,g=null,v=null,Y=null;t.event.bind(t[h],"mousedown",function(e){g=b[d],v=e[a],Y=(t[n]-t[l])/(t[c]-t[u]),t.event.bind(t.ownerDocument,"mousemove",i),t.event.once(t.ownerDocument,"mouseup",r),t[p].classList.add(m.state.clicking),e.stopPropagation(),e.preventDefault()})}var v="undefined"!=typeof Element&&(Element.prototype.matches||Element.prototype.webkitMatchesSelector||Element.prototype.mozMatchesSelector||Element.prototype.msMatchesSelector),m={main:"ps",element:{thumb:function(t){return"ps__thumb-"+t},rail:function(t){return"ps__rail-"+t},consuming:"ps__child--consume"},state:{focus:"ps--focus",clicking:"ps--clicking",active:function(t){return"ps--active-"+t},scrolling:function(t){return"ps--scrolling-"+t}}},Y={x:null,y:null},X=function(t){this.element=t,this.handlers={}},w={isEmpty:{configurable:!0}};X.prototype.bind=function(t,e){void 0===this.handlers[t]&&(this.handlers[t]=[]),this.handlers[t].push(e),this.element.addEventListener(t,e,!1)},X.prototype.unbind=function(t,e){var i=this;this.handlers[t]=this.handlers[t].filter(function(r){return!(!e||r===e)||(i.element.removeEventListener(t,r,!1),!1)})},X.prototype.unbindAll=function(){var t=this;for(var e in t.handlers)t.unbind(e)},w.isEmpty.get=function(){var t=this;return Object.keys(this.handlers).every(function(e){return 0===t.handlers[e].length})},Object.defineProperties(X.prototype,w);var y=function(){this.eventElements=[]};y.prototype.eventElement=function(t){var e=this.eventElements.filter(function(e){return e.element===t})[0];return e||(e=new X(t),this.eventElements.push(e)),e},y.prototype.bind=function(t,e,i){this.eventElement(t).bind(e,i)},y.prototype.unbind=function(t,e,i){var r=this.eventElement(t);r.unbind(e,i),r.isEmpty&&this.eventElements.splice(this.eventElements.indexOf(r),1)},y.prototype.unbindAll=function(){this.eventElements.forEach(function(t){return t.unbindAll()}),this.eventElements=[]},y.prototype.once=function(t,e,i){var r=this.eventElement(t),l=function(t){r.unbind(e,l),i(t)};r.bind(e,l)};var W=function(t,e,i,r,l){void 0===r&&(r=!0),void 0===l&&(l=!1);var n;if("top"===e)n=["contentHeight","containerHeight","scrollTop","y","up","down"];else{if("left"!==e)throw new Error("A proper axis should be provided");n=["contentWidth","containerWidth","scrollLeft","x","left","right"]}h(t,i,n,r,l)},L={isWebKit:"undefined"!=typeof document&&"WebkitAppearance"in document.documentElement.style,supportsTouch:"undefined"!=typeof window&&("ontouchstart"in window||window.DocumentTouch&&document instanceof window.DocumentTouch),supportsIePointer:"undefined"!=typeof navigator&&navigator.msMaxTouchPoints,isChrome:"undefined"!=typeof navigator&&/Chrome/i.test(navigator&&navigator.userAgent)},R=function(t){var e=t.element,i=Math.floor(e.scrollTop);t.containerWidth=e.clientWidth,t.containerHeight=e.clientHeight,t.contentWidth=e.scrollWidth,t.contentHeight=e.scrollHeight,e.contains(t.scrollbarXRail)||(n(e,m.element.rail("x")).forEach(function(t){return l(t)}),e.appendChild(t.scrollbarXRail)),e.contains(t.scrollbarYRail)||(n(e,m.element.rail("y")).forEach(function(t){return l(t)}),e.appendChild(t.scrollbarYRail)),!t.settings.suppressScrollX&&t.containerWidth+t.settings.scrollXMarginOffset=t.railXWidth-t.scrollbarXWidth&&(t.scrollbarXLeft=t.railXWidth-t.scrollbarXWidth),t.scrollbarYTop>=t.railYHeight-t.scrollbarYHeight&&(t.scrollbarYTop=t.railYHeight-t.scrollbarYHeight),b(e,t),t.scrollbarXActive?e.classList.add(m.state.active("x")):(e.classList.remove(m.state.active("x")),t.scrollbarXWidth=0,t.scrollbarXLeft=0,e.scrollLeft=0),t.scrollbarYActive?e.classList.add(m.state.active("y")):(e.classList.remove(m.state.active("y")),t.scrollbarYHeight=0,t.scrollbarYTop=0,e.scrollTop=0)},T={"click-rail":function(t){t.event.bind(t.scrollbarY,"mousedown",function(t){return t.stopPropagation()}),t.event.bind(t.scrollbarYRail,"mousedown",function(e){var i=e.pageY-window.pageYOffset-t.scrollbarYRail.getBoundingClientRect().top>t.scrollbarYTop?1:-1;t.element.scrollTop+=i*t.containerHeight,R(t),e.stopPropagation()}),t.event.bind(t.scrollbarX,"mousedown",function(t){return t.stopPropagation()}),t.event.bind(t.scrollbarXRail,"mousedown",function(e){var i=e.pageX-window.pageXOffset-t.scrollbarXRail.getBoundingClientRect().left>t.scrollbarXLeft?1:-1;t.element.scrollLeft+=i*t.containerWidth,R(t),e.stopPropagation()})},"drag-thumb":function(t){g(t,["containerWidth","contentWidth","pageX","railXWidth","scrollbarX","scrollbarXWidth","scrollLeft","x","scrollbarXRail"]),g(t,["containerHeight","contentHeight","pageY","railYHeight","scrollbarY","scrollbarYHeight","scrollTop","y","scrollbarYRail"])},keyboard:function(t){function e(e,r){var l=Math.floor(i.scrollTop);if(0===e){if(!t.scrollbarYActive)return!1;if(0===l&&r>0||l>=t.contentHeight-t.containerHeight&&r<0)return!t.settings.wheelPropagation}var n=i.scrollLeft;if(0===r){if(!t.scrollbarXActive)return!1;if(0===n&&e<0||n>=t.contentWidth-t.containerWidth&&e>0)return!t.settings.wheelPropagation}return!0}var i=t.element,l=function(){return r(i,":hover")},n=function(){return r(t.scrollbarX,":focus")||r(t.scrollbarY,":focus")};t.event.bind(t.ownerDocument,"keydown",function(r){if(!(r.isDefaultPrevented&&r.isDefaultPrevented()||r.defaultPrevented)&&(l()||n())){var o=document.activeElement?document.activeElement:t.ownerDocument.activeElement;if(o){if("IFRAME"===o.tagName)o=o.contentDocument.activeElement;else for(;o.shadowRoot;)o=o.shadowRoot.activeElement;if(d(o))return}var s=0,a=0;switch(r.which){case 37:s=r.metaKey?-t.contentWidth:r.altKey?-t.containerWidth:-30;break;case 38:a=r.metaKey?t.contentHeight:r.altKey?t.containerHeight:30;break;case 39:s=r.metaKey?t.contentWidth:r.altKey?t.containerWidth:30;break;case 40:a=r.metaKey?-t.contentHeight:r.altKey?-t.containerHeight:-30;break;case 32:a=r.shiftKey?t.containerHeight:-t.containerHeight;break;case 33:a=t.containerHeight;break;case 34:a=-t.containerHeight;break;case 36:a=t.contentHeight;break;case 35:a=-t.contentHeight;break;default:return}t.settings.suppressScrollX&&0!==s||t.settings.suppressScrollY&&0!==a||(i.scrollTop-=a,i.scrollLeft+=s,R(t),e(s,a)&&r.preventDefault())}})},wheel:function(e){function i(t,i){var r=Math.floor(o.scrollTop),l=0===o.scrollTop,n=r+o.offsetHeight===o.scrollHeight,s=0===o.scrollLeft,a=o.scrollLeft+o.offsetWidth===o.scrollWidth;return!(Math.abs(i)>Math.abs(t)?l||n:s||a)||!e.settings.wheelPropagation}function r(t){var e=t.deltaX,i=-1*t.deltaY;return void 0!==e&&void 0!==i||(e=-1*t.wheelDeltaX/6,i=t.wheelDeltaY/6),t.deltaMode&&1===t.deltaMode&&(e*=10,i*=10),e!==e&&i!==i&&(e=0,i=t.wheelDelta),t.shiftKey?[-i,-e]:[e,i]}function l(e,i,r){if(!L.isWebKit&&o.querySelector("select:focus"))return!0;if(!o.contains(e))return!1;for(var l=e;l&&l!==o;){if(l.classList.contains(m.element.consuming))return!0;var n=t(l);if([n.overflow,n.overflowX,n.overflowY].join("").match(/(scroll|auto)/)){var s=l.scrollHeight-l.clientHeight;if(s>0&&!(0===l.scrollTop&&r>0||l.scrollTop===s&&r<0))return!0;var a=l.scrollWidth-l.clientWidth;if(a>0&&!(0===l.scrollLeft&&i<0||l.scrollLeft===a&&i>0))return!0}l=l.parentNode}return!1}function n(t){var n=r(t),s=n[0],a=n[1];if(!l(t.target,s,a)){var c=!1;e.settings.useBothWheelAxes?e.scrollbarYActive&&!e.scrollbarXActive?(a?o.scrollTop-=a*e.settings.wheelSpeed:o.scrollTop+=s*e.settings.wheelSpeed,c=!0):e.scrollbarXActive&&!e.scrollbarYActive&&(s?o.scrollLeft+=s*e.settings.wheelSpeed:o.scrollLeft-=a*e.settings.wheelSpeed,c=!0):(o.scrollTop-=a*e.settings.wheelSpeed,o.scrollLeft+=s*e.settings.wheelSpeed),R(e),(c=c||i(s,a))&&!t.ctrlKey&&(t.stopPropagation(),t.preventDefault())}}var o=e.element;void 0!==window.onwheel?e.event.bind(o,"wheel",n):void 0!==window.onmousewheel&&e.event.bind(o,"mousewheel",n)},touch:function(e){function i(t,i){var r=Math.floor(h.scrollTop),l=h.scrollLeft,n=Math.abs(t),o=Math.abs(i);if(o>n){if(i<0&&r===e.contentHeight-e.containerHeight||i>0&&0===r)return 0===window.scrollY&&i>0&&L.isChrome}else if(n>o&&(t<0&&l===e.contentWidth-e.containerWidth||t>0&&0===l))return!0;return!0}function r(t,i){h.scrollTop-=i,h.scrollLeft-=t,R(e)}function l(t){return t.targetTouches?t.targetTouches[0]:t}function n(t){return!(t.pointerType&&"pen"===t.pointerType&&0===t.buttons||(!t.targetTouches||1!==t.targetTouches.length)&&(!t.pointerType||"mouse"===t.pointerType||t.pointerType===t.MSPOINTER_TYPE_MOUSE))}function o(t){if(n(t)){var e=l(t);u.pageX=e.pageX,u.pageY=e.pageY,d=(new Date).getTime(),null!==p&&clearInterval(p)}}function s(e,i,r){if(!h.contains(e))return!1;for(var l=e;l&&l!==h;){if(l.classList.contains(m.element.consuming))return!0;var n=t(l);if([n.overflow,n.overflowX,n.overflowY].join("").match(/(scroll|auto)/)){var o=l.scrollHeight-l.clientHeight;if(o>0&&!(0===l.scrollTop&&r>0||l.scrollTop===o&&r<0))return!0;var s=l.scrollLeft-l.clientWidth;if(s>0&&!(0===l.scrollLeft&&i<0||l.scrollLeft===s&&i>0))return!0}l=l.parentNode}return!1}function a(t){if(n(t)){var e=l(t),o={pageX:e.pageX,pageY:e.pageY},a=o.pageX-u.pageX,c=o.pageY-u.pageY;if(s(t.target,a,c))return;r(a,c),u=o;var h=(new Date).getTime(),p=h-d;p>0&&(f.x=a/p,f.y=c/p,d=h),i(a,c)&&t.preventDefault()}}function c(){e.settings.swipeEasing&&(clearInterval(p),p=setInterval(function(){e.isInitialized?clearInterval(p):f.x||f.y?Math.abs(f.x)<.01&&Math.abs(f.y)<.01?clearInterval(p):(r(30*f.x,30*f.y),f.x*=.8,f.y*=.8):clearInterval(p)},10))}if(L.supportsTouch||L.supportsIePointer){var h=e.element,u={},d=0,f={},p=null;L.supportsTouch?(e.event.bind(h,"touchstart",o),e.event.bind(h,"touchmove",a),e.event.bind(h,"touchend",c)):L.supportsIePointer&&(window.PointerEvent?(e.event.bind(h,"pointerdown",o),e.event.bind(h,"pointermove",a),e.event.bind(h,"pointerup",c)):window.MSPointerEvent&&(e.event.bind(h,"MSPointerDown",o),e.event.bind(h,"MSPointerMove",a),e.event.bind(h,"MSPointerUp",c)))}}},H=function(r,l){var n=this;if(void 0===l&&(l={}),"string"==typeof r&&(r=document.querySelector(r)),!r||!r.nodeName)throw new Error("no element is specified to initialize PerfectScrollbar");this.element=r,r.classList.add(m.main),this.settings={handlers:["click-rail","drag-thumb","keyboard","wheel","touch"],maxScrollbarLength:null,minScrollbarLength:null,scrollingThreshold:1e3,scrollXMarginOffset:0,scrollYMarginOffset:0,suppressScrollX:!1,suppressScrollY:!1,swipeEasing:!0,useBothWheelAxes:!1,wheelPropagation:!0,wheelSpeed:1};for(var o in l)n.settings[o]=l[o];this.containerWidth=null,this.containerHeight=null,this.contentWidth=null,this.contentHeight=null;var s=function(){return r.classList.add(m.state.focus)},a=function(){return r.classList.remove(m.state.focus)};this.isRtl="rtl"===t(r).direction,this.isNegativeScroll=function(){var t=r.scrollLeft,e=null;return r.scrollLeft=-1,e=r.scrollLeft<0,r.scrollLeft=t,e}(),this.negativeScrollAdjustment=this.isNegativeScroll?r.scrollWidth-r.clientWidth:0,this.event=new y,this.ownerDocument=r.ownerDocument||document,this.scrollbarXRail=i(m.element.rail("x")),r.appendChild(this.scrollbarXRail),this.scrollbarX=i(m.element.thumb("x")),this.scrollbarXRail.appendChild(this.scrollbarX),this.scrollbarX.setAttribute("tabindex",0),this.event.bind(this.scrollbarX,"focus",s),this.event.bind(this.scrollbarX,"blur",a),this.scrollbarXActive=null,this.scrollbarXWidth=null,this.scrollbarXLeft=null;var c=t(this.scrollbarXRail);this.scrollbarXBottom=parseInt(c.bottom,10),isNaN(this.scrollbarXBottom)?(this.isScrollbarXUsingBottom=!1,this.scrollbarXTop=u(c.top)):this.isScrollbarXUsingBottom=!0,this.railBorderXWidth=u(c.borderLeftWidth)+u(c.borderRightWidth),e(this.scrollbarXRail,{display:"block"}),this.railXMarginWidth=u(c.marginLeft)+u(c.marginRight),e(this.scrollbarXRail,{display:""}),this.railXWidth=null,this.railXRatio=null,this.scrollbarYRail=i(m.element.rail("y")),r.appendChild(this.scrollbarYRail),this.scrollbarY=i(m.element.thumb("y")),this.scrollbarYRail.appendChild(this.scrollbarY),this.scrollbarY.setAttribute("tabindex",0),this.event.bind(this.scrollbarY,"focus",s),this.event.bind(this.scrollbarY,"blur",a),this.scrollbarYActive=null,this.scrollbarYHeight=null,this.scrollbarYTop=null;var h=t(this.scrollbarYRail);this.scrollbarYRight=parseInt(h.right,10),isNaN(this.scrollbarYRight)?(this.isScrollbarYUsingRight=!1,this.scrollbarYLeft=u(h.left)):this.isScrollbarYUsingRight=!0,this.scrollbarYOuterWidth=this.isRtl?f(this.scrollbarY):null,this.railBorderYWidth=u(h.borderTopWidth)+u(h.borderBottomWidth),e(this.scrollbarYRail,{display:"block"}),this.railYMarginHeight=u(h.marginTop)+u(h.marginBottom),e(this.scrollbarYRail,{display:""}),this.railYHeight=null,this.railYRatio=null,this.reach={x:r.scrollLeft<=0?"start":r.scrollLeft>=this.contentWidth-this.containerWidth?"end":null,y:r.scrollTop<=0?"start":r.scrollTop>=this.contentHeight-this.containerHeight?"end":null},this.isAlive=!0,this.settings.handlers.forEach(function(t){return T[t](n)}),this.lastScrollTop=Math.floor(r.scrollTop),this.lastScrollLeft=r.scrollLeft,this.event.bind(this.element,"scroll",function(t){return n.onScroll(t)}),R(this)};return H.prototype.update=function(){this.isAlive&&(this.negativeScrollAdjustment=this.isNegativeScroll?this.element.scrollWidth-this.element.clientWidth:0,e(this.scrollbarXRail,{display:"block"}),e(this.scrollbarYRail,{display:"block"}),this.railXMarginWidth=u(t(this.scrollbarXRail).marginLeft)+u(t(this.scrollbarXRail).marginRight),this.railYMarginHeight=u(t(this.scrollbarYRail).marginTop)+u(t(this.scrollbarYRail).marginBottom),e(this.scrollbarXRail,{display:"none"}),e(this.scrollbarYRail,{display:"none"}),R(this),W(this,"top",0,!1,!0),W(this,"left",0,!1,!0),e(this.scrollbarXRail,{display:""}),e(this.scrollbarYRail,{display:""}))},H.prototype.onScroll=function(t){this.isAlive&&(R(this),W(this,"top",this.element.scrollTop-this.lastScrollTop),W(this,"left",this.element.scrollLeft-this.lastScrollLeft),this.lastScrollTop=Math.floor(this.element.scrollTop),this.lastScrollLeft=this.element.scrollLeft)},H.prototype.destroy=function(){this.isAlive&&(this.event.unbindAll(),l(this.scrollbarX),l(this.scrollbarY),l(this.scrollbarXRail),l(this.scrollbarYRail),this.removePsClasses(),this.element=null,this.scrollbarX=null,this.scrollbarY=null,this.scrollbarXRail=null,this.scrollbarYRail=null,this.isAlive=!1)},H.prototype.removePsClasses=function(){this.element.className=this.element.className.split(" ").filter(function(t){return!t.match(/^ps([-_].+|)$/)}).join(" ")},H}); 7 | -------------------------------------------------------------------------------- /static/dash_files/popper.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) Federico Zivolo 2018 3 | Distributed under the MIT License (license terms are at http://opensource.org/licenses/MIT). 4 | */(function(e,t){'object'==typeof exports&&'undefined'!=typeof module?module.exports=t():'function'==typeof define&&define.amd?define(t):e.Popper=t()})(this,function(){'use strict';function e(e){return e&&'[object Function]'==={}.toString.call(e)}function t(e,t){if(1!==e.nodeType)return[];var o=e.ownerDocument.defaultView,n=o.getComputedStyle(e,null);return t?n[t]:n}function o(e){return'HTML'===e.nodeName?e:e.parentNode||e.host}function n(e){if(!e)return document.body;switch(e.nodeName){case'HTML':case'BODY':return e.ownerDocument.body;case'#document':return e.body;}var i=t(e),r=i.overflow,p=i.overflowX,s=i.overflowY;return /(auto|scroll|overlay)/.test(r+s+p)?e:n(o(e))}function r(e){return 11===e?pe:10===e?se:pe||se}function p(e){if(!e)return document.documentElement;for(var o=r(10)?document.body:null,n=e.offsetParent||null;n===o&&e.nextElementSibling;)n=(e=e.nextElementSibling).offsetParent;var i=n&&n.nodeName;return i&&'BODY'!==i&&'HTML'!==i?-1!==['TH','TD','TABLE'].indexOf(n.nodeName)&&'static'===t(n,'position')?p(n):n:e?e.ownerDocument.documentElement:document.documentElement}function s(e){var t=e.nodeName;return'BODY'!==t&&('HTML'===t||p(e.firstElementChild)===e)}function d(e){return null===e.parentNode?e:d(e.parentNode)}function a(e,t){if(!e||!e.nodeType||!t||!t.nodeType)return document.documentElement;var o=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,n=o?e:t,i=o?t:e,r=document.createRange();r.setStart(n,0),r.setEnd(i,0);var l=r.commonAncestorContainer;if(e!==l&&t!==l||n.contains(i))return s(l)?l:p(l);var f=d(e);return f.host?a(f.host,t):a(e,d(t).host)}function l(e){var t=1=o.clientWidth&&n>=o.clientHeight}),l=0a[e]&&!t.escapeWithReference&&(n=Q(f[o],a[e]-('right'===e?f.width:f.height))),le({},o,n)}};return l.forEach(function(e){var t=-1===['left','top'].indexOf(e)?'secondary':'primary';f=fe({},f,m[t](e))}),e.offsets.popper=f,e},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,o=t.popper,n=t.reference,i=e.placement.split('-')[0],r=Z,p=-1!==['top','bottom'].indexOf(i),s=p?'right':'bottom',d=p?'left':'top',a=p?'width':'height';return o[s]r(n[s])&&(e.offsets.popper[d]=r(n[s])),e}},arrow:{order:500,enabled:!0,fn:function(e,o){var n;if(!K(e.instance.modifiers,'arrow','keepTogether'))return e;var i=o.element;if('string'==typeof i){if(i=e.instance.popper.querySelector(i),!i)return e;}else if(!e.instance.popper.contains(i))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),e;var r=e.placement.split('-')[0],p=e.offsets,s=p.popper,d=p.reference,a=-1!==['left','right'].indexOf(r),l=a?'height':'width',f=a?'Top':'Left',m=f.toLowerCase(),h=a?'left':'top',c=a?'bottom':'right',u=S(i)[l];d[c]-us[c]&&(e.offsets.popper[m]+=d[m]+u-s[c]),e.offsets.popper=g(e.offsets.popper);var b=d[m]+d[l]/2-u/2,w=t(e.instance.popper),y=parseFloat(w['margin'+f],10),E=parseFloat(w['border'+f+'Width'],10),v=b-e.offsets.popper[m]-y-E;return v=ee(Q(s[l]-u,v),0),e.arrowElement=i,e.offsets.arrow=(n={},le(n,m,$(v)),le(n,h,''),n),e},element:'[x-arrow]'},flip:{order:600,enabled:!0,fn:function(e,t){if(W(e.instance.modifiers,'inner'))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var o=v(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement,e.positionFixed),n=e.placement.split('-')[0],i=T(n),r=e.placement.split('-')[1]||'',p=[];switch(t.behavior){case ge.FLIP:p=[n,i];break;case ge.CLOCKWISE:p=G(n);break;case ge.COUNTERCLOCKWISE:p=G(n,!0);break;default:p=t.behavior;}return p.forEach(function(s,d){if(n!==s||p.length===d+1)return e;n=e.placement.split('-')[0],i=T(n);var a=e.offsets.popper,l=e.offsets.reference,f=Z,m='left'===n&&f(a.right)>f(l.left)||'right'===n&&f(a.left)f(l.top)||'bottom'===n&&f(a.top)f(o.right),g=f(a.top)f(o.bottom),b='left'===n&&h||'right'===n&&c||'top'===n&&g||'bottom'===n&&u,w=-1!==['top','bottom'].indexOf(n),y=!!t.flipVariations&&(w&&'start'===r&&h||w&&'end'===r&&c||!w&&'start'===r&&g||!w&&'end'===r&&u);(m||b||y)&&(e.flipped=!0,(m||b)&&(n=p[d+1]),y&&(r=z(r)),e.placement=n+(r?'-'+r:''),e.offsets.popper=fe({},e.offsets.popper,D(e.instance.popper,e.offsets.reference,e.placement)),e=P(e.instance.modifiers,e,'flip'))}),e},behavior:'flip',padding:5,boundariesElement:'viewport'},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,o=t.split('-')[0],n=e.offsets,i=n.popper,r=n.reference,p=-1!==['left','right'].indexOf(o),s=-1===['top','left'].indexOf(o);return i[p?'left':'top']=r[o]-(s?i[p?'width':'height']:0),e.placement=T(t),e.offsets.popper=g(i),e}},hide:{order:800,enabled:!0,fn:function(e){if(!K(e.instance.modifiers,'hide','preventOverflow'))return e;var t=e.offsets.reference,o=C(e.instance.modifiers,function(e){return'preventOverflow'===e.name}).boundaries;if(t.bottomo.right||t.top>o.bottom||t.rightwindow.devicePixelRatio||!me),c='bottom'===o?'top':'bottom',g='right'===n?'left':'right',b=H('transform');if(d='bottom'==c?'HTML'===l.nodeName?-l.clientHeight+h.bottom:-f.height+h.bottom:h.top,s='right'==g?'HTML'===l.nodeName?-l.clientWidth+h.right:-f.width+h.right:h.left,a&&b)m[b]='translate3d('+s+'px, '+d+'px, 0)',m[c]=0,m[g]=0,m.willChange='transform';else{var w='bottom'==c?-1:1,y='right'==g?-1:1;m[c]=d*w,m[g]=s*y,m.willChange=c+', '+g}var E={"x-placement":e.placement};return e.attributes=fe({},E,e.attributes),e.styles=fe({},m,e.styles),e.arrowStyles=fe({},e.offsets.arrow,e.arrowStyles),e},gpuAcceleration:!0,x:'bottom',y:'right'},applyStyle:{order:900,enabled:!0,fn:function(e){return j(e.instance.popper,e.styles),V(e.instance.popper,e.attributes),e.arrowElement&&Object.keys(e.arrowStyles).length&&j(e.arrowElement,e.arrowStyles),e},onLoad:function(e,t,o,n,i){var r=L(i,t,e,o.positionFixed),p=O(o.placement,r,t,e,o.modifiers.flip.boundariesElement,o.modifiers.flip.padding);return t.setAttribute('x-placement',p),j(t,{position:o.positionFixed?'fixed':'absolute'}),o},gpuAcceleration:void 0}}},ue}); 5 | -------------------------------------------------------------------------------- /static/pages/main.css: -------------------------------------------------------------------------------- 1 | @import url(https://fonts.googleapis.com/css?family=Roboto:300); 2 | 3 | .login-page { 4 | width: 360px; 5 | padding: 8% 0 0; 6 | margin: auto; 7 | } 8 | .form { 9 | position: relative; 10 | z-index: 1; 11 | background: #FFFFFF; 12 | max-width: 360px; 13 | margin: 0 auto 100px; 14 | padding: 45px; 15 | text-align: center; 16 | box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.2), 0 5px 5px 0 rgba(0, 0, 0, 0.24); 17 | } 18 | .form input { 19 | font-family: "Roboto", sans-serif; 20 | outline: 0; 21 | background: #f2f2f2; 22 | width: 100%; 23 | border: 0; 24 | margin: 0 0 15px; 25 | padding: 15px; 26 | box-sizing: border-box; 27 | font-size: 14px; 28 | } 29 | .form button { 30 | font-family: "Roboto", sans-serif; 31 | text-transform: uppercase; 32 | outline: 0; 33 | background: #4CAF50; 34 | width: 100%; 35 | border: 0; 36 | padding: 15px; 37 | color: #FFFFFF; 38 | font-size: 14px; 39 | -webkit-transition: all 0.3 ease; 40 | transition: all 0.3 ease; 41 | cursor: pointer; 42 | } 43 | .form button:hover,.form button:active,.form button:focus { 44 | background: #43A047; 45 | } 46 | .form .message { 47 | margin: 15px 0 0; 48 | color: #b3b3b3; 49 | font-size: 12px; 50 | } 51 | .form .message a { 52 | color: #4CAF50; 53 | text-decoration: none; 54 | } 55 | .form .register-form { 56 | display: none; 57 | } 58 | .container { 59 | position: relative; 60 | z-index: 1; 61 | max-width: 300px; 62 | margin: 0 auto; 63 | } 64 | .container:before, .container:after { 65 | content: ""; 66 | display: block; 67 | clear: both; 68 | } 69 | .container .info { 70 | margin: 50px auto; 71 | text-align: center; 72 | } 73 | .container .info h1 { 74 | margin: 0 0 15px; 75 | padding: 0; 76 | font-size: 36px; 77 | font-weight: 300; 78 | color: #1a1a1a; 79 | } 80 | .container .info span { 81 | color: #4d4d4d; 82 | font-size: 12px; 83 | } 84 | .container .info span a { 85 | color: #000000; 86 | text-decoration: none; 87 | } 88 | .container .info span .fa { 89 | color: #EF3B3A; 90 | } 91 | body { 92 | background: #76b852; /* fallback for old browsers */ 93 | background: -webkit-linear-gradient(right, #76b852, #8DC26F); 94 | background: -moz-linear-gradient(right, #76b852, #8DC26F); 95 | background: -o-linear-gradient(right, #76b852, #8DC26F); 96 | background: linear-gradient(to left, #76b852, #8DC26F); 97 | font-family: "Roboto", sans-serif; 98 | -webkit-font-smoothing: antialiased; 99 | -moz-osx-font-smoothing: grayscale; 100 | } 101 | -------------------------------------------------------------------------------- /templates/dashboard/api_keys.html: -------------------------------------------------------------------------------- 1 | {% extends 'dashboard/base.html' %} 2 | 3 | {% block mainContent %} 4 |
5 |
6 |
7 |
8 |

Your API Keys

9 |
10 |
11 | + Add a new API Key

12 | 13 | {% if api_keys|length != 0 %} 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | {% for api_key in api_keys %} 24 | 25 | 28 | 31 | 34 | 35 | {% endfor %} 36 | 37 |
NameKey
26 | {{ api_key.name }} 27 | 29 | {{ api_key.key }} 30 | 32 | Delete 33 |
38 |
39 | {% else %} 40 |

It looks like you've got no API keys, create a new one

41 | {% endif %} 42 | 43 |
44 |
45 |
46 | 47 |
48 | {% endblock %} 49 | -------------------------------------------------------------------------------- /templates/dashboard/base.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Seller Dash | Crypto Pay 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | {% if not user.is_authenticated %} 22 | 25 | {% endif %} 26 | 53 | 54 | 55 | 56 | 57 | 58 |
59 | 87 |
88 | 89 | 109 | 110 |
111 |
112 |
113 | {% block mainContent %} 114 | {% endblock %} 115 |
116 | 117 |
118 |
119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 138 | 139 | 140 | 141 | 142 | 143 | -------------------------------------------------------------------------------- /templates/dashboard/new_api_key.html: -------------------------------------------------------------------------------- 1 | {% extends 'dashboard/base.html' %} 2 | 3 | {% block mainContent %} 4 |
5 |
6 |
Edit Profile
7 |
8 |
9 |
10 | {% csrf_token %} 11 |
12 |
13 |
14 | 15 | 16 | 17 |
18 |
19 |
20 |
21 |
22 |
23 | {% endblock %} 24 | -------------------------------------------------------------------------------- /templates/dashboard/transactions.html: -------------------------------------------------------------------------------- 1 | {% extends 'dashboard/base.html' %} 2 | 3 | {% block mainContent %} 4 |
5 |
6 |
7 |
8 |

Transactions

9 |
10 |
11 |
12 | {% if transactions|length != 0 %} 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | {% for transaction in transactions %} 26 | 27 | 30 | 33 | 36 | 39 | 40 | {% if transaction.completed %} 41 | 44 | {% else %} 45 | 48 | {% endif %} 49 | 50 | 57 | 58 | {% endfor %} 59 | 60 |
Date & TimeCheckout CodeCustomer EmailAPI KeyStatusAmount
28 | {{ transaction.datetime }} 29 | 31 | {{ transaction.checkout_code }} 32 | 34 | {{ transaction.customer.email }} 35 | 37 | {{ transaction.apikey.name }} 38 | 42 | Completed 43 | 46 | Pending 47 | 51 | {% if transaction.chain == 1 %} 52 | ARDR 53 | {% else %} 54 | IGNIS 55 | {% endif %} 56 | {{ transaction.amount }}
61 | {% else %} 62 |

63 | It looks like you don't have any transactions yet 64 |

65 | {% endif %} 66 |
67 |
68 |
69 |
70 | 71 |
72 | {% endblock %} 73 | -------------------------------------------------------------------------------- /templates/pages/login.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | 3 | 4 | 5 | 6 | 7 | 8 | Login | CryptoPay 9 | 10 | 11 | 12 | 13 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /templates/pages/phoneLogIn.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | 3 | 4 | 5 | 6 | 7 | 8 | Mobile App Download | CryptoPay 9 | 10 | 11 | 12 | 13 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /templates/pages/signup.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | 3 | 4 | 5 | 6 | 7 | 8 | Sign Up | CryptoPay 9 | 10 | 11 | 12 | 13 | 14 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /transactions/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/transactions/__init__.py -------------------------------------------------------------------------------- /transactions/__pycache__/__init__.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/transactions/__pycache__/__init__.cpython-38.pyc -------------------------------------------------------------------------------- /transactions/__pycache__/admin.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/transactions/__pycache__/admin.cpython-38.pyc -------------------------------------------------------------------------------- /transactions/__pycache__/apps.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/transactions/__pycache__/apps.cpython-38.pyc -------------------------------------------------------------------------------- /transactions/__pycache__/ardor_access.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/transactions/__pycache__/ardor_access.cpython-38.pyc -------------------------------------------------------------------------------- /transactions/__pycache__/models.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/transactions/__pycache__/models.cpython-38.pyc -------------------------------------------------------------------------------- /transactions/__pycache__/rest_apis.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/transactions/__pycache__/rest_apis.cpython-38.pyc -------------------------------------------------------------------------------- /transactions/__pycache__/urls.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/transactions/__pycache__/urls.cpython-38.pyc -------------------------------------------------------------------------------- /transactions/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from .models import * 3 | # Register your models here. 4 | admin.site.register(Transaction) 5 | -------------------------------------------------------------------------------- /transactions/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class TransactionsConfig(AppConfig): 5 | name = 'transactions' 6 | -------------------------------------------------------------------------------- /transactions/ardor_access.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import json 3 | 4 | from django.conf import settings 5 | 6 | def get_unsigned_transaction_bytes(receiver_account_id,payment_amount,sender_public_key,chain=1): 7 | 8 | print('Function Called') 9 | 10 | base = settings.ARDOR_REQUEST_BASE_URL 11 | payment_amount = payment_amount * (10**8) 12 | # print(base+'nxt?chain=1&requestType=sendMoney&recipient='+receiver_account_id+'&publicKey='+public_key+'&amountNQT='+payment_amount+'&feeNQT=1&deadline=60') 13 | print('Making a Request') 14 | data=requests.post(base+'nxt?chain='+str(chain)+'&requestType=sendMoney&recipient='+str(receiver_account_id)+'&publicKey='+str(sender_public_key)+'&amountNQT='+str(payment_amount)+'&feeNQT=-1&deadline=10') 15 | print('request completed') 16 | # print(type(data)) 17 | x=data.json() 18 | # print(type(x)) 19 | # print(x) 20 | return x['transactionJSON'] 21 | 22 | def confirm_transaction(unsignedTransactionJSON,secret_pass_phrase): 23 | base = settings.ARDOR_REQUEST_BASE_URL 24 | # print(unsignedTransactionJSON) 25 | unsignedTransactionJSON=json.dumps(unsignedTransactionJSON) 26 | data=requests.post(base+'nxt?requestType=signTransaction&unsignedTransactionJSON='+unsignedTransactionJSON+'&secretPhrase='+secret_pass_phrase) 27 | x=data.json() 28 | # print(x) 29 | status = x['verify'] 30 | if(status is True): 31 | transactionJSON=x['transactionJSON'] 32 | transactionJSON=json.dumps(transactionJSON) 33 | broadcast_data=requests.post(base+'nxt?requestType=broadcastTransaction&transactionJSON='+transactionJSON) 34 | # print("Success") 35 | return status 36 | -------------------------------------------------------------------------------- /transactions/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.1 on 2020-08-13 19:03 2 | 3 | from django.conf import settings 4 | from django.db import migrations, models 5 | import django.db.models.deletion 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | initial = True 11 | 12 | dependencies = [ 13 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 14 | ] 15 | 16 | operations = [ 17 | migrations.CreateModel( 18 | name='Transaction', 19 | fields=[ 20 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 21 | ('datetime', models.DateTimeField(auto_now_add=True)), 22 | ('unique_code', models.CharField(max_length=100)), 23 | ('customer_email', models.CharField(max_length=50)), 24 | ('completed', models.BooleanField(default=False)), 25 | ('amount', models.FloatField()), 26 | ('seller', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), 27 | ], 28 | ), 29 | ] 30 | -------------------------------------------------------------------------------- /transactions/migrations/0002_auto_20200813_1929.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.1 on 2020-08-13 19:29 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('usermgmt', '0003_auto_20200813_1821'), 11 | ('transactions', '0001_initial'), 12 | ] 13 | 14 | operations = [ 15 | migrations.RemoveField( 16 | model_name='transaction', 17 | name='unique_code', 18 | ), 19 | migrations.AddField( 20 | model_name='transaction', 21 | name='apikey', 22 | field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, to='usermgmt.apiaccesskey'), 23 | ), 24 | migrations.AddField( 25 | model_name='transaction', 26 | name='checkour_code', 27 | field=models.CharField(blank=True, max_length=100), 28 | ), 29 | ] 30 | -------------------------------------------------------------------------------- /transactions/migrations/0003_auto_20200813_1939.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.1 on 2020-08-13 19:39 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('transactions', '0002_auto_20200813_1929'), 10 | ] 11 | 12 | operations = [ 13 | migrations.RenameField( 14 | model_name='transaction', 15 | old_name='checkour_code', 16 | new_name='checkout_code', 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /transactions/migrations/0004_auto_20200813_2104.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.1 on 2020-08-13 21:04 2 | 3 | from django.conf import settings 4 | from django.db import migrations, models 5 | import django.db.models.deletion 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 12 | ('transactions', '0003_auto_20200813_1939'), 13 | ] 14 | 15 | operations = [ 16 | migrations.RemoveField( 17 | model_name='transaction', 18 | name='customer_email', 19 | ), 20 | migrations.AddField( 21 | model_name='transaction', 22 | name='customer', 23 | field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, related_name='customer', to=settings.AUTH_USER_MODEL), 24 | ), 25 | ] 26 | -------------------------------------------------------------------------------- /transactions/migrations/0005_transaction_transaction_res.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.1 on 2020-08-13 21:23 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('transactions', '0004_auto_20200813_2104'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='transaction', 15 | name='transaction_res', 16 | field=models.CharField(default='', max_length=1000), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /transactions/migrations/0006_transaction_chain.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.1 on 2020-08-14 13:03 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('transactions', '0005_transaction_transaction_res'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='transaction', 15 | name='chain', 16 | field=models.IntegerField(default=1), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /transactions/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/transactions/migrations/__init__.py -------------------------------------------------------------------------------- /transactions/migrations/__pycache__/0001_initial.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/transactions/migrations/__pycache__/0001_initial.cpython-38.pyc -------------------------------------------------------------------------------- /transactions/migrations/__pycache__/0002_auto_20200813_1929.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/transactions/migrations/__pycache__/0002_auto_20200813_1929.cpython-38.pyc -------------------------------------------------------------------------------- /transactions/migrations/__pycache__/0003_auto_20200813_1939.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/transactions/migrations/__pycache__/0003_auto_20200813_1939.cpython-38.pyc -------------------------------------------------------------------------------- /transactions/migrations/__pycache__/0004_auto_20200813_2104.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/transactions/migrations/__pycache__/0004_auto_20200813_2104.cpython-38.pyc -------------------------------------------------------------------------------- /transactions/migrations/__pycache__/0005_transaction_transaction_res.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/transactions/migrations/__pycache__/0005_transaction_transaction_res.cpython-38.pyc -------------------------------------------------------------------------------- /transactions/migrations/__pycache__/0006_transaction_chain.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/transactions/migrations/__pycache__/0006_transaction_chain.cpython-38.pyc -------------------------------------------------------------------------------- /transactions/migrations/__pycache__/__init__.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/transactions/migrations/__pycache__/__init__.cpython-38.pyc -------------------------------------------------------------------------------- /transactions/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.contrib.auth.models import User 3 | 4 | from usermgmt.models import APIAccessKey 5 | 6 | # Create your models here. 7 | class Transaction(models.Model): 8 | chain = models.IntegerField(default=1) 9 | seller = models.ForeignKey(User, on_delete=models.CASCADE) 10 | apikey = models.ForeignKey(APIAccessKey, on_delete=models.CASCADE, default=None) 11 | datetime = models.DateTimeField(auto_now_add=True) 12 | checkout_code = models.CharField(max_length=100, blank=True) 13 | customer = models.ForeignKey(User, on_delete=models.CASCADE, related_name='customer', default=None) 14 | completed = models.BooleanField(default=False) 15 | amount = models.FloatField() 16 | 17 | transaction_res = models.CharField(max_length=1000, default='') 18 | -------------------------------------------------------------------------------- /transactions/rest_apis.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | from django.contrib.auth.models import User 4 | from django.db.models import Q 5 | 6 | from rest_framework.response import Response 7 | from rest_framework.views import APIView 8 | 9 | from . models import * 10 | from . import ardor_access 11 | from usermgmt.models import APIAccessKey, UserDetails 12 | from rest_framework.permissions import IsAuthenticated, AllowAny 13 | 14 | class RegisterTransaction(APIView): 15 | permission_classes = [AllowAny] 16 | 17 | def get(self, request, format=None): 18 | return Response({"Message": "Try the POST request, GET request can\'t be done on this API"}) 19 | 20 | 21 | def post(self, request, format=None): 22 | data = request.data 23 | api_key = data['key'] 24 | try: 25 | try: 26 | accessKey = APIAccessKey.objects.get(key = api_key) 27 | except: 28 | return Response({"transaction_status": "invalid key error"}) 29 | seller = accessKey.user 30 | 31 | tr = Transaction() 32 | tr.seller = seller 33 | tr.apikey = accessKey 34 | try: 35 | tr.customer = User.objects.get(email=data['customer_email']) 36 | except: 37 | return Response({"transaction_status": "customer not found"}) 38 | 39 | tr.amount = data['amount'] 40 | tr.chain = data['chain'] 41 | tr.save() 42 | 43 | print('Tr AMT: '+str(tr.amount)) 44 | 45 | tr.checkout_code = ("".join(tr.apikey.name.split(" ")))+'-'+str(tr.id) 46 | tr.save() 47 | 48 | 49 | # TODO: add sushranth's functions to get tr.transaction_res (Transaction json) 50 | seller_det = UserDetails.objects.get(user = seller) 51 | customer_det = UserDetails.objects.get(user = tr.customer) 52 | 53 | # print('Seller details: '+str(seller_det)) 54 | # print('customer details: '+str(customer_det)) 55 | 56 | transactionJSON = ardor_access.get_unsigned_transaction_bytes(receiver_account_id=seller_det.ardor_acc_num, sender_public_key=customer_det.ardor_public_key, payment_amount=tr.amount, chain=tr.chain) 57 | 58 | print('Transaction JSON: \n'+str(transactionJSON)) 59 | 60 | transactionJSON_str = json.dumps(transactionJSON) 61 | 62 | print(transactionJSON_str) 63 | 64 | tr.transaction_res = transactionJSON_str 65 | tr.save() 66 | 67 | return Response({"transaction_status": "registered", "id": tr.id, "checkout_code": tr.checkout_code}) 68 | 69 | except: 70 | return Response({"transaction_status": "error"}) 71 | 72 | class ConfirmTransaction(APIView): 73 | permission_classes = [AllowAny] 74 | def get(self, request, format=None): 75 | data = request.data 76 | 77 | key = APIAccessKey.objects.get(key = data['key']) 78 | seller = key.user 79 | customer = User.objects.get(email = data['customer_email']) 80 | 81 | confirmed_transactions = Transaction.objects.filter(Q(seller = seller) & Q(customer = customer) & Q(completed = True)) 82 | 83 | conf_tr = [] 84 | for transaction in confirmed_transactions: 85 | conf_tr.append(transaction.checkout_code) 86 | 87 | res = {"confirmed_transactions": conf_tr} 88 | 89 | return Response(res) 90 | 91 | def post(self, request, format=None): 92 | data = request.data 93 | try: 94 | try: 95 | checkout_code = data['checkout_code'] 96 | tr = Transaction.objects.get(checkout_code=checkout_code) 97 | except: 98 | return Response({"transaction_status": "invalid checkout_code"}) 99 | 100 | passphrase = data['passphrase'] 101 | 102 | status = False 103 | 104 | try: 105 | status = ardor_access.confirm_transaction(unsignedTransactionJSON=json.loads(tr.transaction_res), secret_pass_phrase=passphrase) 106 | except: 107 | return Response({"transaction_status": "error on the ardor side"}) 108 | 109 | if(status == True): 110 | tr.completed = True 111 | tr.save() 112 | 113 | return Response({"transaction_status": "executed"}) 114 | 115 | else: 116 | return Response({"transaction_status": "failed"}) 117 | 118 | except: 119 | return Response({"transaction_status": "error"}) 120 | 121 | 122 | class PendingTransactions(APIView): 123 | permission_classes = [IsAuthenticated] 124 | 125 | def get(self, request, format=None): 126 | pending_transasctions = Transaction.objects.filter(Q(customer = request.user) & Q(completed = False)) 127 | 128 | trs = [] 129 | for transaction in pending_transasctions: 130 | tr = {} 131 | tr['checkout_code'] = transaction.checkout_code 132 | tr['amount'] = transaction.amount 133 | tr['chain'] = transaction.chain 134 | trs.append(tr) 135 | 136 | return Response({"transactions": trs}) 137 | 138 | def post(self, request, format=None): 139 | return Response({"Message": "Try the GET method"}) 140 | -------------------------------------------------------------------------------- /transactions/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /transactions/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path, include 2 | 3 | from . import rest_apis 4 | 5 | urlpatterns = [ 6 | path('register/', rest_apis.RegisterTransaction.as_view(), name='reg_transaction'), 7 | path('confirm/', rest_apis.ConfirmTransaction.as_view(), name='conf_transaction'), 8 | path('pending/', rest_apis.PendingTransactions.as_view(), name='pending_transactions'), 9 | ] 10 | -------------------------------------------------------------------------------- /transactions/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | 3 | # Create your views here. 4 | -------------------------------------------------------------------------------- /usermgmt/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/usermgmt/__init__.py -------------------------------------------------------------------------------- /usermgmt/__pycache__/__init__.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/usermgmt/__pycache__/__init__.cpython-38.pyc -------------------------------------------------------------------------------- /usermgmt/__pycache__/admin.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/usermgmt/__pycache__/admin.cpython-38.pyc -------------------------------------------------------------------------------- /usermgmt/__pycache__/apps.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/usermgmt/__pycache__/apps.cpython-38.pyc -------------------------------------------------------------------------------- /usermgmt/__pycache__/models.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/usermgmt/__pycache__/models.cpython-38.pyc -------------------------------------------------------------------------------- /usermgmt/__pycache__/urls.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/usermgmt/__pycache__/urls.cpython-38.pyc -------------------------------------------------------------------------------- /usermgmt/__pycache__/utils.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/usermgmt/__pycache__/utils.cpython-38.pyc -------------------------------------------------------------------------------- /usermgmt/__pycache__/views.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/usermgmt/__pycache__/views.cpython-38.pyc -------------------------------------------------------------------------------- /usermgmt/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from .models import * 3 | 4 | # Register your models here. 5 | admin.site.register(UserDetails) 6 | admin.site.register(APIAccessKey) 7 | -------------------------------------------------------------------------------- /usermgmt/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class UsermgmtConfig(AppConfig): 5 | name = 'usermgmt' 6 | -------------------------------------------------------------------------------- /usermgmt/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.1 on 2020-08-13 17:17 2 | 3 | from django.conf import settings 4 | from django.db import migrations, models 5 | import django.db.models.deletion 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | initial = True 11 | 12 | dependencies = [ 13 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 14 | ] 15 | 16 | operations = [ 17 | migrations.CreateModel( 18 | name='UserDetails', 19 | fields=[ 20 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 21 | ('singtype', models.CharField(default='payer', max_length=6)), 22 | ('ardor_acc_num', models.CharField(blank=True, default='', max_length=26)), 23 | ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), 24 | ], 25 | ), 26 | ] 27 | -------------------------------------------------------------------------------- /usermgmt/migrations/0002_apiaccesskey.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.1 on 2020-08-13 17:38 2 | 3 | from django.conf import settings 4 | from django.db import migrations, models 5 | import django.db.models.deletion 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 12 | ('usermgmt', '0001_initial'), 13 | ] 14 | 15 | operations = [ 16 | migrations.CreateModel( 17 | name='APIAccessKey', 18 | fields=[ 19 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 20 | ('name', models.CharField(max_length=30)), 21 | ('key', models.CharField(max_length=30)), 22 | ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), 23 | ], 24 | ), 25 | ] 26 | -------------------------------------------------------------------------------- /usermgmt/migrations/0003_auto_20200813_1821.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.1 on 2020-08-13 18:21 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('usermgmt', '0002_apiaccesskey'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='apiaccesskey', 15 | name='name', 16 | field=models.CharField(max_length=50), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /usermgmt/migrations/0004_userdetails_ardor_public_key.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.1 on 2020-08-13 21:01 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('usermgmt', '0003_auto_20200813_1821'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='userdetails', 15 | name='ardor_public_key', 16 | field=models.CharField(blank=True, default='', max_length=100), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /usermgmt/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/usermgmt/migrations/__init__.py -------------------------------------------------------------------------------- /usermgmt/migrations/__pycache__/0001_initial.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/usermgmt/migrations/__pycache__/0001_initial.cpython-38.pyc -------------------------------------------------------------------------------- /usermgmt/migrations/__pycache__/0002_apiaccesskey.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/usermgmt/migrations/__pycache__/0002_apiaccesskey.cpython-38.pyc -------------------------------------------------------------------------------- /usermgmt/migrations/__pycache__/0003_auto_20200813_1821.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/usermgmt/migrations/__pycache__/0003_auto_20200813_1821.cpython-38.pyc -------------------------------------------------------------------------------- /usermgmt/migrations/__pycache__/0004_userdetails_ardor_public_key.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/usermgmt/migrations/__pycache__/0004_userdetails_ardor_public_key.cpython-38.pyc -------------------------------------------------------------------------------- /usermgmt/migrations/__pycache__/__init__.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surajsjain/cryptopay-web/0a06acd22024b380bd15978fd9a7eb38c101db27/usermgmt/migrations/__pycache__/__init__.cpython-38.pyc -------------------------------------------------------------------------------- /usermgmt/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.contrib.auth.models import User 3 | 4 | # Create your models here. 5 | class UserDetails(models.Model): 6 | user = models.ForeignKey(User, on_delete=models.CASCADE) 7 | singtype = models.CharField(max_length=6, default='payer') 8 | ardor_public_key = models.CharField(max_length=100, blank=True, default='') 9 | ardor_acc_num = models.CharField(max_length=26, blank=True, default='') 10 | 11 | class APIAccessKey(models.Model): 12 | user = models.ForeignKey(User, on_delete=models.CASCADE) 13 | name = models.CharField(max_length=50) 14 | key = models.CharField(max_length=30) 15 | -------------------------------------------------------------------------------- /usermgmt/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /usermgmt/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path, include 2 | from . import views 3 | 4 | urlpatterns = [ 5 | path('signup/', views.signup, name='signup'), 6 | path('login/', views.login, name='login'), 7 | path('phonedownload/', views.phoneDownload, name='phonedownload'), 8 | path('logout/', views.logout, name='logout'), 9 | ] 10 | -------------------------------------------------------------------------------- /usermgmt/utils.py: -------------------------------------------------------------------------------- 1 | import random 2 | 3 | def generate_key(name): 4 | nme = name.lower() 5 | otp = str(random.randint(1000, 9999)) 6 | 7 | code = '' 8 | code = code + otp[:2] 9 | 10 | for n in nme: 11 | new_char = (ord(n)-97 + random.randint(0, 25)) % 25 12 | new_char += 97 13 | 14 | char_or_num = random.randint(0,1) 15 | 16 | if(char_or_num == 0): 17 | new_char_ch = chr(new_char) 18 | code += new_char_ch 19 | else: 20 | code += str(new_char) 21 | 22 | code += otp[2:] 23 | 24 | if(len(code)>30): 25 | code = code[:30] 26 | 27 | return code 28 | -------------------------------------------------------------------------------- /usermgmt/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render, redirect 2 | from django.contrib.auth.models import User 3 | from django.contrib import messages, auth 4 | 5 | from .models import * 6 | 7 | # Create your views here. 8 | def login(request): 9 | if request.method == 'GET': 10 | return render(request, 'pages/login.html') 11 | else: 12 | data = request.POST 13 | email = data['email'] 14 | password = data['password'] 15 | 16 | try: 17 | user = User.objects.get(email=email) 18 | if user.check_password(password): 19 | 20 | usr_det = UserDetails.objects.get(user = user) 21 | if(usr_det.singtype == 'seller'): 22 | auth.login(request, user) 23 | return redirect('dash_home') 24 | else: 25 | return redirect('phonedownload') 26 | 27 | else: 28 | return redirect('login') 29 | 30 | except: 31 | return redirect('login') 32 | def signup(request): 33 | 34 | if request.method == 'GET': 35 | return render(request, 'pages/signup.html') 36 | 37 | else: 38 | inData = request.POST 39 | 40 | user = User.objects.create_user(username=inData['username'], first_name = inData['firstname'], last_name = inData['lastname'], email = inData['email'], password = inData['password']) 41 | user.save() 42 | 43 | usr_det = UserDetails() 44 | usr_det.user = user 45 | usr_det.singtype = inData['signtype'] 46 | usr_det.ardor_public_key = inData['ardor_public_key'] 47 | 48 | if(inData['signtype'] == 'seller'): 49 | usr_det.ardor_acc_num = inData['ardor_acc'] 50 | 51 | usr_det.save() 52 | 53 | if(inData['signtype'] == 'seller'): 54 | auth.login(request, user) 55 | return redirect('dash_home') 56 | 57 | else: 58 | return redirect('phonedownload') 59 | 60 | def phoneDownload(request): 61 | return render(request, 'pages/phoneLogIn.html') 62 | 63 | def logout(request): 64 | # if request.method == 'POST': 65 | auth.logout(request) 66 | 67 | return redirect('login') 68 | --------------------------------------------------------------------------------