diff --git a/su-do-coders/README.md b/su-do-coders/README.md new file mode 100644 index 0000000..9005b50 --- /dev/null +++ b/su-do-coders/README.md @@ -0,0 +1,106 @@ +# BiteBase + +BiteBase is a Django-based web application that provides real-time information from various trusted sources. It offers features like contests and hackathons, job listings, and breaking news updates. + +Website Link: https://bitebase.onrender.com/ + + +## Installation + +Clone the repository then move to project directory using cd NewsFeed. + +```shell +git clone https://github.com/nag2mani/BiteBase.git +``` + + + +## Install dependencies: + +```shell +pip install -r requirements.txt +``` + +## Run migrations: + +```shell +python manage.py makemigrations +``` +```shell +python manage.py migrate +``` + +## Start the development server: + +```shell +python manage.py runserver +``` + +Visit http://127.0.0.1:8000/ in your web browser to access the application. + + +## Urls Pattern + +Home: http://127.0.0.1:8000/ + +Contest: http://127.0.0.1:8000/contest + +Job: http://127.0.0.1:8000/job + +Tech News: http://127.0.0.1:8000/news + +Contact: http://127.0.0.1:8000/contact + +## Our Services: + +Our website is a comprehensive platform that aggregates real-time data from various sources to provide users with valuable information on hackathons, coding contests, job opportunities, and news articles. Here's a summary of its key features: + + +1. **Hackathons and Coding Contests:** + - Our website scrapes data from multiple websites worldwide to gather information about hackathons and coding contests. + - This data is then stored in our database for easy access and management. + - Users can explore upcoming hackathons and coding contests directly from our platform, making it convenient to find and participate in events of interest. + + +2. **Job Listings:** + - Similar to hackathons, our website collects job listings from various sources on the internet. + - Users can browse through a wide range of job opportunities conveniently aggregated on our platform. + - By providing access to diverse job listings, we aim to help users find suitable employment opportunities more efficiently. + + +3. **News Articles:** + - Our website also curates Tech news articles from different sources, presenting users with the latest headlines and summaries. + - Users can stay informed about current events, industry updates, and trending topics without the need to visit multiple websites. + - The summarized news articles make it easy for users to grasp the key information quickly and efficiently. + + + +## TechStack used; + +**1. HTML5** + +**2. CSS** + +**3. Bootstrap** + +**4. Javascript** + +**5. Python** + +**6. Django** + +**7. SQL(Sqlite)** + +**8. Machine Learning Model** + +**8. Generative AI [Gemini & Groq]** + + + +## Team: + +**Nagmani Kumar Team Lead [Backend, Database, GenAI and ML]**, + +**Sahil Kumar [FrontEnd, GenAI and UI/UX Design]**, + + diff --git a/su-do-coders/core/build.sh b/su-do-coders/core/build.sh new file mode 100644 index 0000000..0e1868d --- /dev/null +++ b/su-do-coders/core/build.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +# exit on error +set -o errexit + +pip install -r requirements.txt + +python3 manage.py collectstatic --no-input +python3 manage.py migrate + +# python3 manage.py runserver + + + diff --git a/su-do-coders/core/core/__init__.py b/su-do-coders/core/core/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/su-do-coders/core/core/__pycache__/__init__.cpython-310.pyc b/su-do-coders/core/core/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000..f706f28 Binary files /dev/null and b/su-do-coders/core/core/__pycache__/__init__.cpython-310.pyc differ diff --git a/su-do-coders/core/core/__pycache__/__init__.cpython-312.pyc b/su-do-coders/core/core/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000..020b480 Binary files /dev/null and b/su-do-coders/core/core/__pycache__/__init__.cpython-312.pyc differ diff --git a/su-do-coders/core/core/__pycache__/settings.cpython-310.pyc b/su-do-coders/core/core/__pycache__/settings.cpython-310.pyc new file mode 100644 index 0000000..3d8d226 Binary files /dev/null and b/su-do-coders/core/core/__pycache__/settings.cpython-310.pyc differ diff --git a/su-do-coders/core/core/__pycache__/settings.cpython-312.pyc b/su-do-coders/core/core/__pycache__/settings.cpython-312.pyc new file mode 100644 index 0000000..10bb64c Binary files /dev/null and b/su-do-coders/core/core/__pycache__/settings.cpython-312.pyc differ diff --git a/su-do-coders/core/core/__pycache__/urls.cpython-310.pyc b/su-do-coders/core/core/__pycache__/urls.cpython-310.pyc new file mode 100644 index 0000000..70dc3e6 Binary files /dev/null and b/su-do-coders/core/core/__pycache__/urls.cpython-310.pyc differ diff --git a/su-do-coders/core/core/__pycache__/urls.cpython-312.pyc b/su-do-coders/core/core/__pycache__/urls.cpython-312.pyc new file mode 100644 index 0000000..1567643 Binary files /dev/null and b/su-do-coders/core/core/__pycache__/urls.cpython-312.pyc differ diff --git a/su-do-coders/core/core/__pycache__/wsgi.cpython-310.pyc b/su-do-coders/core/core/__pycache__/wsgi.cpython-310.pyc new file mode 100644 index 0000000..88ce52c Binary files /dev/null and b/su-do-coders/core/core/__pycache__/wsgi.cpython-310.pyc differ diff --git a/su-do-coders/core/core/__pycache__/wsgi.cpython-312.pyc b/su-do-coders/core/core/__pycache__/wsgi.cpython-312.pyc new file mode 100644 index 0000000..e341c81 Binary files /dev/null and b/su-do-coders/core/core/__pycache__/wsgi.cpython-312.pyc differ diff --git a/su-do-coders/core/core/asgi.py b/su-do-coders/core/core/asgi.py new file mode 100644 index 0000000..3b35c6b --- /dev/null +++ b/su-do-coders/core/core/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for core project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.2/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'core.settings') + +application = get_asgi_application() diff --git a/su-do-coders/core/core/settings.py b/su-do-coders/core/core/settings.py new file mode 100644 index 0000000..db3785e --- /dev/null +++ b/su-do-coders/core/core/settings.py @@ -0,0 +1,144 @@ +""" +Django settings for core project. + +Generated by 'django-admin startproject' using Django 4.2.7. + +For more information on this file, see +https://docs.djangoproject.com/en/4.2/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/4.2/ref/settings/ +""" + +from pathlib import Path +import os +# from dotenv import load_dotenv + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'django-insecure-x5h^8a$l2s#qt6c%9ugq_16qllxt*ymal&vivw#p-1si2zffnu' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = ['127.0.0.1','localhost','bitebase.onrender.com'] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'home', +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'core.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'core.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/4.2/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': BASE_DIR / 'db.sqlite3', + } +} + + +# Password validation +# https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/4.2/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/4.2/howto/static-files/ + +STATIC_URL = '/static/' +STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') + +STATICFILES_DIR = { + os.path.join(BASE_DIR, 'public/static') +} + +MEDIA_ROOT = os.path.join(BASE_DIR, 'public/static') +MEDIA_URL = '/media/' + +# Default primary key field type +# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' + + +# load_dotenv() + +KEY_ID="rzp_test_kRKmXIu82zMfJ1" +# SECRET_KEY = os.getenv('SECRET_KEY_RAZORPAY') +SECRET_KEY="mNdwGKAje4oeteHszcN7gUXc" + + + diff --git a/su-do-coders/core/core/urls.py b/su-do-coders/core/core/urls.py new file mode 100644 index 0000000..1dc8911 --- /dev/null +++ b/su-do-coders/core/core/urls.py @@ -0,0 +1,44 @@ +""" +URL configuration for core project. + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/4.2/topics/http/urls/ +Examples: +Function views. + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" + +from django.contrib import admin +from django.urls import path +from home.views import * +from django.conf.urls.static import static +from django.conf import settings +from django.contrib.staticfiles.urls import staticfiles_urlpatterns + +urlpatterns = [ + path('', home, name='home'), + path('contest/', contest, name='contest'), + path('job/', job, name='job'), + path('news/', news, name='news'), + path("login/", login_page, name='login'), + path("logout/", logout_page, name='logout'), + path("signup/", signup, name='signup'), + path("contact/", contact, name='contact'), + path("add_your_news/", add_your_news, name='add_your_news'), + path('admin/', admin.site.urls), +] + + +if settings.DEBUG: + urlpatterns += static(settings.MEDIA_URL, + document_root = settings.MEDIA_ROOT) + +urlpatterns += staticfiles_urlpatterns() + diff --git a/su-do-coders/core/core/wsgi.py b/su-do-coders/core/core/wsgi.py new file mode 100644 index 0000000..f44964d --- /dev/null +++ b/su-do-coders/core/core/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for core project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.2/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'core.settings') + +application = get_wsgi_application() diff --git a/su-do-coders/core/db.sqlite3 b/su-do-coders/core/db.sqlite3 new file mode 100644 index 0000000..d9f9b5d Binary files /dev/null and b/su-do-coders/core/db.sqlite3 differ diff --git a/su-do-coders/core/home/Fictometer.ipynb b/su-do-coders/core/home/Fictometer.ipynb new file mode 100644 index 0000000..a234f84 --- /dev/null +++ b/su-do-coders/core/home/Fictometer.ipynb @@ -0,0 +1,1967 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "x2LVh2Mab7CB" + }, + "source": [ + "## Application of Logistic Regression for classifying English articles into fiction and non-fiction category" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "id": "LhWIWKXdb5i3" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[nltk_data] Downloading package brown to /home/nag2mani/nltk_data...\n", + "[nltk_data] Package brown is already up-to-date!\n" + ] + } + ], + "source": [ + "# NLTK is a popular library used for analysing texts\n", + "# The brown corpus dataset is present inside this library\n", + "\n", + "import nltk\n", + "from nltk.corpus import brown\n", + "nltk.download('brown')\n", + "import pandas as pd\n", + "from sklearn import preprocessing\n", + "from sklearn import metrics\n", + "from sklearn.linear_model import LogisticRegression\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.metrics import confusion_matrix\n", + "from sklearn.metrics import ConfusionMatrixDisplay\n", + "import seaborn as sns\n", + "import matplotlib.pyplot as plt\n", + "import warnings\n", + "warnings.filterwarnings('ignore')" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "id": "2TtbTHX4dWNW" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on CategorizedTaggedCorpusReader in module nltk.corpus.reader.tagged object:\n", + "\n", + "class CategorizedTaggedCorpusReader(nltk.corpus.reader.api.CategorizedCorpusReader, TaggedCorpusReader)\n", + " | CategorizedTaggedCorpusReader(*args, **kwargs)\n", + " | \n", + " | A reader for part-of-speech tagged corpora whose documents are\n", + " | divided into categories based on their file identifiers.\n", + " | \n", + " | Method resolution order:\n", + " | CategorizedTaggedCorpusReader\n", + " | nltk.corpus.reader.api.CategorizedCorpusReader\n", + " | TaggedCorpusReader\n", + " | nltk.corpus.reader.api.CorpusReader\n", + " | builtins.object\n", + " | \n", + " | Methods defined here:\n", + " | \n", + " | __init__(self, *args, **kwargs)\n", + " | Initialize the corpus reader. Categorization arguments\n", + " | (``cat_pattern``, ``cat_map``, and ``cat_file``) are passed to\n", + " | the ``CategorizedCorpusReader`` constructor. The remaining arguments\n", + " | are passed to the ``TaggedCorpusReader``.\n", + " | \n", + " | tagged_paras(self, fileids=None, categories=None, tagset=None)\n", + " | :return: the given file(s) as a list of\n", + " | paragraphs, each encoded as a list of sentences, which are\n", + " | in turn encoded as lists of ``(word,tag)`` tuples.\n", + " | :rtype: list(list(list(tuple(str,str))))\n", + " | \n", + " | tagged_sents(self, fileids=None, categories=None, tagset=None)\n", + " | :return: the given file(s) as a list of\n", + " | sentences, each encoded as a list of ``(word,tag)`` tuples.\n", + " | \n", + " | :rtype: list(list(tuple(str,str)))\n", + " | \n", + " | tagged_words(self, fileids=None, categories=None, tagset=None)\n", + " | :return: the given file(s) as a list of tagged\n", + " | words and punctuation symbols, encoded as tuples\n", + " | ``(word,tag)``.\n", + " | :rtype: list(tuple(str,str))\n", + " | \n", + " | ----------------------------------------------------------------------\n", + " | Methods inherited from nltk.corpus.reader.api.CategorizedCorpusReader:\n", + " | \n", + " | categories(self, fileids=None)\n", + " | Return a list of the categories that are defined for this corpus,\n", + " | or for the file(s) if it is given.\n", + " | \n", + " | fileids(self, categories=None)\n", + " | Return a list of file identifiers for the files that make up\n", + " | this corpus, or that make up the given category(s) if specified.\n", + " | \n", + " | paras(self, fileids=None, categories=None)\n", + " | \n", + " | raw(self, fileids=None, categories=None)\n", + " | \n", + " | sents(self, fileids=None, categories=None)\n", + " | \n", + " | words(self, fileids=None, categories=None)\n", + " | \n", + " | ----------------------------------------------------------------------\n", + " | Data descriptors inherited from nltk.corpus.reader.api.CategorizedCorpusReader:\n", + " | \n", + " | __dict__\n", + " | dictionary for instance variables (if defined)\n", + " | \n", + " | __weakref__\n", + " | list of weak references to the object (if defined)\n", + " | \n", + " | ----------------------------------------------------------------------\n", + " | Methods inherited from nltk.corpus.reader.api.CorpusReader:\n", + " | \n", + " | __repr__(self)\n", + " | Return repr(self).\n", + " | \n", + " | abspath(self, fileid)\n", + " | Return the absolute path for the given file.\n", + " | \n", + " | :type fileid: str\n", + " | :param fileid: The file identifier for the file whose path\n", + " | should be returned.\n", + " | :rtype: PathPointer\n", + " | \n", + " | abspaths(self, fileids=None, include_encoding=False, include_fileid=False)\n", + " | Return a list of the absolute paths for all fileids in this corpus;\n", + " | or for the given list of fileids, if specified.\n", + " | \n", + " | :type fileids: None or str or list\n", + " | :param fileids: Specifies the set of fileids for which paths should\n", + " | be returned. Can be None, for all fileids; a list of\n", + " | file identifiers, for a specified set of fileids; or a single\n", + " | file identifier, for a single file. Note that the return\n", + " | value is always a list of paths, even if ``fileids`` is a\n", + " | single file identifier.\n", + " | \n", + " | :param include_encoding: If true, then return a list of\n", + " | ``(path_pointer, encoding)`` tuples.\n", + " | \n", + " | :rtype: list(PathPointer)\n", + " | \n", + " | citation(self)\n", + " | Return the contents of the corpus citation.bib file, if it exists.\n", + " | \n", + " | encoding(self, file)\n", + " | Return the unicode encoding for the given corpus file, if known.\n", + " | If the encoding is unknown, or if the given file should be\n", + " | processed using byte strings (str), then return None.\n", + " | \n", + " | ensure_loaded(self)\n", + " | Load this corpus (if it has not already been loaded). This is\n", + " | used by LazyCorpusLoader as a simple method that can be used to\n", + " | make sure a corpus is loaded -- e.g., in case a user wants to\n", + " | do help(some_corpus).\n", + " | \n", + " | license(self)\n", + " | Return the contents of the corpus LICENSE file, if it exists.\n", + " | \n", + " | open(self, file)\n", + " | Return an open stream that can be used to read the given file.\n", + " | If the file's encoding is not None, then the stream will\n", + " | automatically decode the file's contents into unicode.\n", + " | \n", + " | :param file: The file identifier of the file to read.\n", + " | \n", + " | readme(self)\n", + " | Return the contents of the corpus README file, if it exists.\n", + " | \n", + " | ----------------------------------------------------------------------\n", + " | Readonly properties inherited from nltk.corpus.reader.api.CorpusReader:\n", + " | \n", + " | root\n", + " | The directory where this corpus is stored.\n", + " | \n", + " | :type: PathPointer\n", + "\n" + ] + } + ], + "source": [ + "# Details of all the information contained in the NLTK brown corpus\n", + "help(brown)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "id": "ulutL92eeC9k" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['adventure',\n", + " 'belles_lettres',\n", + " 'editorial',\n", + " 'fiction',\n", + " 'government',\n", + " 'hobbies',\n", + " 'humor',\n", + " 'learned',\n", + " 'lore',\n", + " 'mystery',\n", + " 'news',\n", + " 'religion',\n", + " 'reviews',\n", + " 'romance',\n", + " 'science_fiction']" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# List of all text categories present in the brown corpus\n", + "brown.categories()" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "id": "NLWEJF3DeJWi" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['ca01',\n", + " 'ca02',\n", + " 'ca03',\n", + " 'ca04',\n", + " 'ca05',\n", + " 'ca06',\n", + " 'ca07',\n", + " 'ca08',\n", + " 'ca09',\n", + " 'ca10',\n", + " 'ca11',\n", + " 'ca12',\n", + " 'ca13',\n", + " 'ca14',\n", + " 'ca15',\n", + " 'ca16',\n", + " 'ca17',\n", + " 'ca18',\n", + " 'ca19',\n", + " 'ca20',\n", + " 'ca21',\n", + " 'ca22',\n", + " 'ca23',\n", + " 'ca24',\n", + " 'ca25',\n", + " 'ca26',\n", + " 'ca27',\n", + " 'ca28',\n", + " 'ca29',\n", + " 'ca30',\n", + " 'ca31',\n", + " 'ca32',\n", + " 'ca33',\n", + " 'ca34',\n", + " 'ca35',\n", + " 'ca36',\n", + " 'ca37',\n", + " 'ca38',\n", + " 'ca39',\n", + " 'ca40',\n", + " 'ca41',\n", + " 'ca42',\n", + " 'ca43',\n", + " 'ca44']" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# List of all articles within the 'news' category\n", + "brown.fileids('news')" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "id": "Pya0pMSOeZuw" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "2277\n", + "[('Every', 'AT'), ('library', 'NN'), ('borrower', 'NN'), (',', ','), ('or', 'CC'), ('at', 'IN'), ('least', 'AP'), ('those', 'DTS'), ('whose', 'WP$'), ('taste', 'NN'), ('goes', 'VBZ'), ('beyond', 'IN'), ('the', 'AT'), ('five-cent', 'JJ'), ('fiction', 'NN'), ('rentals', 'NNS'), (',', ','), ('knows', 'VBZ'), ('what', 'WDT'), ('it', 'PPS')]\n" + ] + } + ], + "source": [ + "# List of the first 20 tagged words in article number 'ca44'\n", + "# As you can see, each article is divided into individual words (tokenization), \n", + "# and for each word, the corresponging Part of Speech (POS) tag is specified.\n", + "# You can use the functions defined later on to convert these POS tags to universal tags that are easy to understand.\n", + "\n", + "print(type(brown.tagged_words('ca44')))\n", + "print(len(brown.tagged_words('ca44')))\n", + "print(brown.tagged_words('ca44')[0:20])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "GAjAUnURa3ZG" + }, + "source": [ + "The Fictometer algorithm is based on the Part of Speech (POS) tags in a text. For a given input text, it first counts the number adverbs, adjectives, and pronounds in the text and uses it as an input to the Logistic Regression algorithm to do the classification.\n", + "\n", + "We will be using the Brown corpus dataset for this work, and this corpus has both the text as well as the POS tags (added by human experts). However, the POS tags present in this corpus are finer, meaning adjectives can be further sub-divided into finer categories. But for our analysis, we only need the high level tags. And so the first step is to convert/group the finer tags into high level tags, which we do through the functions defined below." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "id": "hfrClRr4Xqm3" + }, + "outputs": [], + "source": [ + "# Define functions to count the number of POS tags in the text.\n", + "\n", + "# This function counts the number of adjectives\n", + "def n_adj(text):\n", + " adj=0\n", + " for i in text:\n", + " if i[0] == 'J':\n", + " adj=adj+1\n", + " return adj\n", + "\n", + "# This function counts the number of nouns\n", + "def n_noun(text):\n", + " noun=0\n", + " for i in text:\n", + " if ((i[0] == 'N') and (i[1] != 'C')):\n", + " noun=noun+1\n", + " return noun\n", + "\n", + "# This function counts the number of verbs\n", + "def n_verb(text):\n", + " verb=0\n", + " for i in text:\n", + " if i[0] == 'V':\n", + " verb=verb+1\n", + " return verb\n", + "\n", + "# This function counts the number of pronouns\n", + "def n_pronoun(text):\n", + " pronoun=0\n", + " for i in text:\n", + " if (i[0] == 'P') or (i[:3] in ['WP$','WPO','WPS']):\n", + " pronoun=pronoun+1\n", + " return pronoun\n", + "\n", + "# This function counts the number of adverbs\n", + "def n_adv(text):\n", + " adv=0\n", + " for i in text:\n", + " if (i[0] == 'R') or (i[:3] in ['WRB']):\n", + " adv=adv+1\n", + " return adv\n", + "\n", + "# This function outputs the universal high level tag using a finer tag as input\n", + "def func_utag(tag):\n", + " if tag[0] == 'J' or tag == 'ADJ':\n", + " utag='ADJ'\n", + " elif ((tag[0] == 'N') and (tag[1] != 'C')) or tag == 'NOUN':\n", + " utag='NOUN'\n", + " elif tag[0] == 'V' or tag == 'VERB':\n", + " utag='VERB'\n", + " elif (tag[0] == 'P') or (tag[:3] in ['WP$','WPO','WPS']) or tag == 'PRON':\n", + " utag='PRON'\n", + " elif (tag[0] == 'R') or (tag[:3] in ['WRB']) or tag == 'ADV':\n", + " utag='ADV'\n", + " else:\n", + " utag='unknown'\n", + " return utag\n", + "\n", + "# This function outputs True or False depending on whether the input tag is one of the 5 high level universal tags or not.\n", + "def func_is5tag(tag):\n", + " if tag in ['ADJ','ADV','NOUN','PRON','VERB']:\n", + " is5tag=True\n", + " else:\n", + " is5tag=False\n", + " return is5tag" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "id": "Xcch9aViXqm4" + }, + "outputs": [], + "source": [ + "# This creates an empty dataframe with the defined columns\n", + "brownpostable=pd.DataFrame(columns=['category','filename','ADJ','ADV','NOUN','VERB','PRON','RADJPRON','RADVADJ'])" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "id": "Ro0XGpj-Xqm5" + }, + "outputs": [], + "source": [ + "# Take each article from the Brown corpus, count the number of each universal POS tag in the article, and populate the DataFrame\n", + "\n", + "for i in brown.categories():\n", + " # This loop iterates over all the 15 categories of articles present in the Brown corpus\n", + " \n", + " for j in brown.fileids(categories=i):\n", + " # This loop iterates over all the articles present in the chosen category\n", + "\n", + " taggedwords=brown.tagged_words(j)\n", + " taglist=[]\n", + " for k in taggedwords:\n", + " # This loop iterates over all the tagged words in the chosen article\n", + "\n", + " taglist.append(k[1])\n", + " adj=n_adj(taglist) # Count the number of adjectives in the article\n", + " adv=n_adv(taglist) # Count the number of adverbs in the article\n", + " noun=n_noun(taglist) # Count the number of nouns in the article\n", + " verb=n_verb(taglist) # Count the number of verbs in the article\n", + " pronoun=n_pronoun(taglist) # Count the number of pronouns in the article\n", + "\n", + " # Append the above information for each article to the DataFrame\n", + " ap = {'category' : i,'filename' : j, 'ADJ' : int(adj), 'ADV' : int(adv), 'NOUN' : int(noun), 'VERB' : int(verb), 'PRON' : int(pronoun)}\n", + " df_dictionary = pd.DataFrame([ap])\n", + " brownpostable = pd.concat([brownpostable, df_dictionary], ignore_index=True)\n", + " # brownpostable=brownpostable.append(ap,ignore_index=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "id": "n6b3qD7MXqm5" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
categoryfilenameADJADVNOUNVERBPRONRADJPRONRADVADJ
0adventurecn0172134390321329NaNNaN
1adventurecn0271144423328312NaNNaN
2adventurecn035898487352219NaNNaN
3adventurecn04121116466320242NaNNaN
4adventurecn0574142363301339NaNNaN
..............................
495science_fictioncm02128116463255177NaNNaN
496science_fictioncm03109135415223205NaNNaN
497science_fictioncm04125134422265244NaNNaN
498science_fictioncm0518384531247181NaNNaN
499science_fictioncm06113117434289252NaNNaN
\n", + "

500 rows × 9 columns

\n", + "
" + ], + "text/plain": [ + " category filename ADJ ADV NOUN VERB PRON RADJPRON RADVADJ\n", + "0 adventure cn01 72 134 390 321 329 NaN NaN\n", + "1 adventure cn02 71 144 423 328 312 NaN NaN\n", + "2 adventure cn03 58 98 487 352 219 NaN NaN\n", + "3 adventure cn04 121 116 466 320 242 NaN NaN\n", + "4 adventure cn05 74 142 363 301 339 NaN NaN\n", + ".. ... ... ... ... ... ... ... ... ...\n", + "495 science_fiction cm02 128 116 463 255 177 NaN NaN\n", + "496 science_fiction cm03 109 135 415 223 205 NaN NaN\n", + "497 science_fiction cm04 125 134 422 265 244 NaN NaN\n", + "498 science_fiction cm05 183 84 531 247 181 NaN NaN\n", + "499 science_fiction cm06 113 117 434 289 252 NaN NaN\n", + "\n", + "[500 rows x 9 columns]" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "brownpostable" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "id": "jNIvYkTvXqm5" + }, + "outputs": [], + "source": [ + "# Compute the ratio of Adjectives to Pronouns, and the ratio of Adverbs to Adjectives in each article \n", + "# and populate the last 2 columns of the DataFrame\n", + "\n", + "for i in range(len(brownpostable)):\n", + " adj=brownpostable.ADJ.iloc[i]\n", + " adv=brownpostable.ADV.iloc[i]\n", + " pronoun=brownpostable.PRON.iloc[i]\n", + " brownpostable.RADJPRON.iloc[i]=adj/pronoun\n", + " brownpostable.RADVADJ.iloc[i]=adv/adj" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "id": "1e_azMB7Xqm6" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
categoryfilenameADJADVNOUNVERBPRONRADJPRONRADVADJ
0adventurecn01721343903213290.2188451.861111
1adventurecn02711444233283120.2275642.028169
2adventurecn0358984873522190.264841.689655
3adventurecn041211164663202420.50.958678
4adventurecn05741423633013390.2182891.918919
..............................
495science_fictioncm021281164632551770.7231640.90625
496science_fictioncm031091354152232050.5317071.238532
497science_fictioncm041251344222652440.5122951.072
498science_fictioncm05183845312471811.011050.459016
499science_fictioncm061131174342892520.4484131.035398
\n", + "

500 rows × 9 columns

\n", + "
" + ], + "text/plain": [ + " category filename ADJ ADV NOUN VERB PRON RADJPRON RADVADJ\n", + "0 adventure cn01 72 134 390 321 329 0.218845 1.861111\n", + "1 adventure cn02 71 144 423 328 312 0.227564 2.028169\n", + "2 adventure cn03 58 98 487 352 219 0.26484 1.689655\n", + "3 adventure cn04 121 116 466 320 242 0.5 0.958678\n", + "4 adventure cn05 74 142 363 301 339 0.218289 1.918919\n", + ".. ... ... ... ... ... ... ... ... ...\n", + "495 science_fiction cm02 128 116 463 255 177 0.723164 0.90625\n", + "496 science_fiction cm03 109 135 415 223 205 0.531707 1.238532\n", + "497 science_fiction cm04 125 134 422 265 244 0.512295 1.072\n", + "498 science_fiction cm05 183 84 531 247 181 1.01105 0.459016\n", + "499 science_fiction cm06 113 117 434 289 252 0.448413 1.035398\n", + "\n", + "[500 rows x 9 columns]" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "brownpostable" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "id": "Fl5Gv3dlXqm6" + }, + "outputs": [], + "source": [ + "# Re-categorise the Brown corpus categories as fiction and non-fiction.\n", + "# 5 categories are identified as fiction, 5 as non-fiction and the remaining 5 are dropped due to ambiguity.\n", + "\n", + "brown2=brownpostable.copy()\n", + "for i in ['news','reviews','government','learned','hobbies']:\n", + " brown2=brown2.replace(to_replace=i,value='nonfiction')\n", + "\n", + "for i in ['fiction','mystery','science_fiction','adventure','romance']:\n", + " brown2=brown2.replace(to_replace=i,value='fiction')\n", + " \n", + "index_names=brown2[(brown2['category'] != 'fiction') & (brown2['category'] != 'nonfiction')].index\n", + "brown2.drop(index_names,inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "id": "OI1ePX9C1OSp" + }, + "outputs": [], + "source": [ + "brown2.drop(columns=['filename','PRON','ADJ','ADV','NOUN','VERB'],inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": { + "id": "7ESDBvXI1U86" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
categoryRADJPRONRADVADJ
0fiction0.2188451.861111
1fiction0.2275642.028169
2fiction0.2648401.689655
3fiction0.5000000.958678
4fiction0.2182891.918919
............
495fiction0.7231640.906250
496fiction0.5317071.238532
497fiction0.5122951.072000
498fiction1.0110500.459016
499fiction0.4484131.035398
\n", + "

324 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " category RADJPRON RADVADJ\n", + "0 fiction 0.218845 1.861111\n", + "1 fiction 0.227564 2.028169\n", + "2 fiction 0.264840 1.689655\n", + "3 fiction 0.500000 0.958678\n", + "4 fiction 0.218289 1.918919\n", + ".. ... ... ...\n", + "495 fiction 0.723164 0.906250\n", + "496 fiction 0.531707 1.238532\n", + "497 fiction 0.512295 1.072000\n", + "498 fiction 1.011050 0.459016\n", + "499 fiction 0.448413 1.035398\n", + "\n", + "[324 rows x 3 columns]" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "brown2" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": { + "id": "BkUcWUPV1juX" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjIAAAGzCAYAAAA1yP25AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAACEqElEQVR4nO3dd3hUZdrH8e9kkpn0SW8kQGih945SBAVUBBXsSrMLa1kbvrtiZ21rRUWXIop0QUQEAQWlSu+9QyohyaROkpnz/vGQRmZCAmkT7s91zeXmnDNnnkyymR9PuR+dpmkaQgghhBBOyKWmGyCEEEIIcaUkyAghhBDCaUmQEUIIIYTTkiAjhBBCCKclQUYIIYQQTkuCjBBCCCGclgQZIYQQQjgtCTJCCCGEcFoSZIQQQgjhtCTICCGEEMJpudbki3/55Zd8+eWXnDx5EoBWrVrx6quvMnjwYABycnL45z//yZw5c7BYLAwcOJAvvviC0NDQcr+GzWYjNjYWHx8fdDpdVXwbQgghhKhkmqaRnp5OREQELi6O+110NbnX0s8//4xer6dp06Zomsa3337L+++/z44dO2jVqhVPPPEEv/zyCzNmzMBkMjFu3DhcXFxYv359uV/j7NmzREVFVeF3IYQQQoiqcubMGSIjIx2er9EgY09AQADvv/8+w4cPJzg4mB9++IHhw4cDcPDgQVq0aMHGjRvp3r17ue6XlpaGn58fZ86cwdfXtyqbLoQQQohKYjabiYqKIjU1FZPJ5PC6Gh1aKs5qtTJ//nwyMzPp0aMH27ZtIy8vjwEDBhRe07x5c+rXr19mkLFYLFgslsKv09PTAfD19ZUgI4QQQjiZy00LqfHJvnv27MHb2xuj0cjjjz/OokWLaNmyJfHx8RgMBvz8/EpcHxoaSnx8vMP7TZo0CZPJVPiQYSUhhBCi7qrxIBMTE8POnTvZvHkzTzzxBCNHjmT//v1XfL8JEyaQlpZW+Dhz5kwltlYIIYQQtUmNDy0ZDAaaNGkCQKdOndiyZQuffPIJd999N7m5uaSmppbolUlISCAsLMzh/YxGI0ajsaqbLYQQQohaoMaDzKVsNhsWi4VOnTrh5ubG6tWrufPOOwE4dOgQp0+fpkePHjXcSiGEEDXBarWSl5dX080QlcDNzQ29Xn/V96nRIDNhwgQGDx5M/fr1SU9P54cffmDNmjWsWLECk8nE2LFjee655wgICMDX15fx48fTo0ePcq9YEkIIUTdomkZ8fDypqak13RRRifz8/AgLC7uqOm81GmQSExN56KGHiIuLw2Qy0bZtW1asWMGNN94IwEcffYSLiwt33nlniYJ4Qgghri0FISYkJARPT08pcOrkNE0jKyuLxMREAMLDw6/4XrWujkxlM5vNmEwm0tLSZPm1EEI4IavVyuHDhwkJCSEwMLCmmyMqUXJyMomJiTRr1qzUMFN5P79rfNWSEEIIUZaCOTGenp413BJR2Qp+plcz70mCjBBCCKcgw0l1T2X8TGvdqiVRiTQNMpNAs4FHALgaarpFQgghRKWSIFNXmWNh32LYOhWsudByGHR5GPwb1HTLhBBCiEojQ0t1kTkO5twHKyZA8lFIPQ0bPoX/3QApJ2u6dUIIcU147bXXaN++fU03o86TIFMXndsGsTtKH888D5u/gnxL6XNCCCHqtLpaSFCCTF2Tnws7v3d8fu+PkHWh+tojhBBOzGaz8d5779GkSROMRiP169fn7bffBuCll16iWbNmeHp60qhRI/79738XhoUZM2bw+uuvs2vXLnQ6HTqdjhkzZgCQmprKww8/THBwML6+vtxwww3s2rWrxOu+9dZbhISE4OPjw8MPP8zLL79confHZrPxxhtvEBkZidFopH379ixfvrzw/MmTJ9HpdMydO5c+ffrg7u7O119/ja+vLwsWLCjxWosXL8bLy4v09PQqeAernsyRqWt0LqAvY68pVyPIzH8hhCiXCRMm8M033/DRRx9x3XXXERcXx8GDBwHw8fFhxowZREREsGfPHh555BF8fHx48cUXufvuu9m7dy/Lly9n1apVAJhMJgBGjBiBh4cHv/76KyaTiSlTptC/f38OHz5MQEAAs2bN4u233+aLL76gV69ezJkzhw8//JDo6OjCdn3yySd8+OGHTJkyhQ4dOjBt2jRuu+029u3bR9OmTQuve/nll/nwww/p0KED7u7u7Nq1i+nTpzN8+PDCawq+9vHxqY63tPJpdVxaWpoGaGlpaTXdlOpz/E9Nm+hr/7H2fU2z5td0C4UQotyys7O1/fv3a9nZ2dX6umazWTMajdo333xTruvff/99rVOnToVfT5w4UWvXrl2Ja/766y/N19dXy8nJKXG8cePG2pQpUzRN07Ru3bppTz31VInzvXr1KnGviIgI7e233y5xTZcuXbQnn3xS0zRNO3HihAZoH3/8cYlrNm/erOn1ei02NlbTNE1LSEjQXF1dtTVr1pTre6xsZf1sy/v5LUNLdVFwc2h1p53jLaDdveBy9Zt0CSFEXXfgwAEsFgv9+/e3e37u3Ln06tWLsLAwvL29+de//sXp06fLvOeuXbvIyMggMDAQb2/vwseJEyc4duwYoDZI7tq1a4nnFf/abDYTGxtLr169SlzTq1cvDhw4UOJY586dS92nVatWfPvttwB8//33NGjQgN69e5fZ7tpMhpbqIu9gGPwudBoJf38N+dnQ7j5o0BN8I2q6dUII4RQ8PDwcntu4cSP3338/r7/+OgMHDsRkMhUOAZUlIyOD8PBw1qxZU+qcn5/fVba4NC8vr1LHHn74YSZPnszLL7/M9OnTGT16tFMXG5QgU1d5B4N3H6jfHTQruElpbyGEqIimTZvi4eHB6tWrefjhh0uc27BhAw0aNOD//u//Co+dOnWqxDUGgwGr1VriWMeOHYmPj8fV1ZWGDRvafd2YmBi2bNnCQw89VHhsy5Ythf/b19eXiIgI1q9fT58+fQqPr1+/vlRPjj0PPPAAL774Ip9++in79+9n5MiRl31ObSZBpq5zLWPirxBCCIfc3d156aWXePHFFzEYDPTq1YukpKTCCbWnT59mzpw5dOnShV9++YVFixaVeH7Dhg05ceIEO3fuJDIyEh8fHwYMGECPHj0YNmwY7733Hs2aNSM2NpZffvmF22+/nc6dOzN+/HgeeeQROnfuTM+ePZk7dy67d++mUaNGhfd+4YUXmDhxIo0bN6Z9+/ZMnz6dnTt3MmvWrMt+X/7+/txxxx288MIL3HTTTURGRlb6e1etqmoCT21xTU72FUKIOqSmJvtqmqZZrVbtrbfe0ho0aKC5ublp9evX19555x1N0zTthRde0AIDAzVvb2/t7rvv1j766CPNZDIVPjcnJ0e78847NT8/Pw3Qpk+frmmamkQ8fvx4LSIiQnNzc9OioqK0+++/Xzt9+nThc9944w0tKChI8/b21saMGaP94x//0Lp3716iXa+99ppWr149zc3NTWvXrp3266+/Fp4vmOy7Y8cOu9/X6tWrNUCbN29e5b1ZV6AyJvvqNE3TajRJVbHybgMuhBCidsrJyeHEiRNER0fj7u5e082pETfeeCNhYWF89913lXK/7777jmeffZbY2FgMhprbh6+sn215P79laEkIIYSoRbKysvjqq68YOHAger2e2bNns2rVKlauXFkp946Li+M///kPjz32WI2GmMoiy6+FEEKIWkSn07Fs2TJ69+5Np06d+Pnnn1m4cCEDBgy46nu/9957NG/enLCwMCZMmFAJra15MrQkhBCiVpOhpbqrMoaWpEdGCCGEEE5LgowQQgghnJYEGSGEEEI4LQkyQgghhHBaEmSEEEII4bQkyAghhBDCaUmQEUIIIaqIpmk8+uijBAQEoNPp8PPz45lnnrmqe/bt2/eq71GXSGVfIYQQooosX76cGTNmsGbNGho1aoSLiwseHh7leu6aNWvo168fKSkp+Pn5FR7/8ccfcXNzq6IWOx8JMkIIIa4JaVm5nM/IxZyTh6+HG0FeBkyeVVui/9ixY4SHh9OzZ89Ku2dAQECl3asukKElIYQQdV5sajbjZu+g/3/XcvsXG+j/4VrGz95BbGp2lb3mqFGjGD9+PKdPn0an09GwYcNSw0IWi4WXXnqJqKgojEYjTZo0YerUqZw8eZJ+/foB4O/vj06nY9SoUUDpoaWUlBQeeugh/P398fT0ZPDgwRw5cqTw/IwZM/Dz82PFihW0aNECb29vBg0aRFxcXJV979VJgowQQog6LS0rl5cW7uavI+dLHP/zyHleXribtKzcKnndTz75hDfeeIPIyEji4uLYsmVLqWseeughZs+ezaeffsqBAweYMmUK3t7eREVFsXDhQgAOHTpEXFwcn3zyid3XGTVqFFu3bmXJkiVs3LgRTdO4+eabycvLK7wmKyuLDz74gO+++44///yT06dP8/zzz1fJ913dZGhJCCFEnXY+I7dUiCnw55HznM/IrZIhJpPJhI+PD3q9nrCwsFLnDx8+zLx581i5cmXhhpCNGjUqPF8whBQSElJijkxxR44cYcmSJaxfv75w+GrWrFlERUWxePFiRowYAUBeXh5fffUVjRs3BmDcuHG88cYblfa91iTpkRFCCFGnmXPyyjyffpnzVWXnzp3o9Xr69Olzxfc4cOAArq6udOvWrfBYYGAgMTExHDhwoPCYp6dnYYgBCA8PJzEx8YpftzaRICOEEKJO83Uve4WPz2XOV5Xyrl6qDJeuctLpdGiaVm2vX5UkyAghhKjTgrwN9G4aZPdc76ZBBHlX7colR9q0aYPNZmPt2rV2zxsMql1Wq9XhPVq0aEF+fj6bN28uPJacnMyhQ4do2bJl5Ta4lpIgI4QQok4zeRr4z51tS4WZ3k2DePfOtlW+BNuRhg0bMnLkSMaMGcPixYs5ceIEa9asYd68eQA0aNAAnU7H0qVLSUpKIiMjo9Q9mjZtytChQ3nkkUdYt24du3bt4oEHHqBevXoMHTq0ur+lGiGTfYUQQtR5EX4efHZvB85n5JKek4ePuxtB3lVfR+ZyvvzyS1555RWefPJJkpOTqV+/Pq+88goA9erV4/XXX+fll19m9OjRPPTQQ8yYMaPUPaZPn87TTz/NrbfeSm5uLr1792bZsmXXTNE8nVZXBskcMJvNmEwm0tLS8PX1renmCCGEqKCcnBxOnDhBdHQ07u7uNd0cUYnK+tmW9/NbhpaEEEII4bQkyAghhBDCaUmQEUIIIYTTkiAjhBBCCKclQUYIIYQQTkuCjBBCCCGclgQZIYQQQjgtCTJCCCGEcFoSZIQQQgjhtCTICCGEEE5M0zQeffRRAgIC0Ol07Ny5k759+/LMM89c1X0r4x7VQfZaEkIIIZzY8uXLmTFjBmvWrKFRo0YEBQXx448/lnuvpTVr1tCvXz9SUlLw8/MrPF6Re9QkCTJCCCGuDdkpkJkEOWZwN4FXEHj413SrrtqxY8cIDw+nZ8+ehccCAgKu+r6VcY/qUKNDS5MmTaJLly74+PgQEhLCsGHDOHToUIlr+vbti06nK/F4/PHHa6jFQgghnFLaOZg/Bj7vAv/rD593hgVj1fEq1LdvX/7xj3/w4osvEhAQQFhYGK+99lrh+dOnTzN06FC8vb3x9fXlrrvuIiEhofD8a6+9Rvv27fnuu+9o2LAhJpOJe+65h/T0dABGjRrF+PHjOX36NDqdjoYNGxa+bvFhIYvFwksvvURUVBRGo5EmTZowdepUTp48Sb9+/QDw9/dHp9MxatQou/dISUnhoYcewt/fH09PTwYPHsyRI0cKz8+YMQM/Pz9WrFhBixYt8Pb2ZtCgQcTFxVXum3qJGg0ya9eu5amnnmLTpk2sXLmSvLw8brrpJjIzM0tc98gjjxAXF1f4eO+992qoxUIIIZxOdgr8NA6O/17y+LHVsGS8Ol+Fvv32W7y8vNi8eTPvvfceb7zxBitXrsRmszF06FAuXLjA2rVrWblyJcePH+fuu+8u2cxjx1i8eDFLly5l6dKlrF27lv/85z8AfPLJJ7zxxhtERkYSFxfHli1b7LbhoYceYvbs2Xz66accOHCAKVOm4O3tTVRUFAsXLgTg0KFDxMXF8cknn9i9x6hRo9i6dStLlixh48aNaJrGzTffTF5eXuE1WVlZfPDBB3z33Xf8+eefnD59mueff74y3kaHanRoafny5SW+njFjBiEhIWzbto3evXsXHvf09CQsLKy6myeEEKIuyEwqHWIKHFutzlfhEFPbtm2ZOHEiAE2bNuXzzz9n9erVAOzZs4cTJ04QFRUFwMyZM2nVqhVbtmyhS5cuANhsNmbMmIGPjw8ADz74IKtXr+btt9/GZDLh4+ODXq93+Dl5+PBh5s2bx8qVKxkwYAAAjRo1KjxfMIQUEhJSYo5McUeOHGHJkiWsX7++cAhr1qxZREVFsXjxYkaMGAFAXl4eX331FY0bNwZg3LhxvPHGG1f2xpVTrVq1lJaWBpQel5s1axZBQUG0bt2aCRMmkJWV5fAeFosFs9lc4iGEEOIalnOZz4HLnb9Kbdu2LfF1eHg4iYmJHDhwgKioqMIQA9CyZUv8/Pw4cOBA4bGGDRsWhpjizy+vnTt3otfr6dOnzxV/DwcOHMDV1ZVu3boVHgsMDCQmJqZEWz09PQtDzJW09UrUmsm+NpuNZ555hl69etG6devC4/fddx8NGjQgIiKC3bt389JLL3Ho0CF+/PFHu/eZNGkSr7/+enU1WwghRG3n7nt156/SpSt/dDodNput2p7v4eFR7muvlr22appWpa9Za3pknnrqKfbu3cucOXNKHH/00UcZOHAgbdq04f7772fmzJksWrSIY8eO2b3PhAkTSEtLK3ycOXOmOpovhBCitvIKhsb97Z9r3F+drwEtWrTgzJkzJT6n9u/fT2pqKi1btqy012nTpg02m421a9faPW8wGACwWq1ltjU/P5/NmzcXHktOTubQoUOV2tYrUSuCzLhx41i6dCl//PEHkZGRZV5b0K119OhRu+eNRiO+vr4lHkIIIa5hHv5w22elw0zj/up4DS3BHjBgQOE/0rdv387ff//NQw89RJ8+fejcuXOlvU7Dhg0ZOXIkY8aMYfHixZw4cYI1a9Ywb948ABo0aIBOp2Pp0qUkJSWRkZFR6h5NmzZl6NChPPLII6xbt45du3bxwAMPUK9ePYYOHVppbb0SNRpkNE1j3LhxLFq0iN9//53o6OjLPmfnzp2AGncTQgghysVUD4ZPhXFb4OHV6r/Dp6rjNUSn0/HTTz/h7+9P7969GTBgAI0aNWLu3LmV/lpffvklw4cP58knn6R58+Y88sgjhSuE69Wrx+uvv87LL79MaGgo48aNs3uP6dOn06lTJ2699VZ69OiBpmksW7asxovm6bSqHrwqw5NPPskPP/zATz/9RExMTOFxk8mEh4cHx44d44cffuDmm28mMDCQ3bt38+yzzxIZGemwi+xSZrMZk8lEWlqa9M4IIYQTysnJ4cSJE0RHR+Pu7l7TzRGVqKyfbXk/v2t0su+XX34JqKI7xU2fPp1Ro0ZhMBhYtWoVH3/8MZmZmURFRXHnnXfyr3/9qwZaK4QQQojapkaDzOU6g6Kiosrd8yKEEEKIa0+tmOwrhBBCCHElJMgIIYQQwmlJkBFCCOEUanBtiqgilfEzlSAjhBCiVitY3lvW9jTCORX8TK9mCXet2aJACCGEsEev1+Pn51e4Z4+npyc6na6GWyWuhqZpZGVlkZiYiJ+fH3q9/orvJUFGCCFErVews3NVb0Aoqpefn5/DXbvLS4KMEEKIWk+n0xEeHk5ISAh5eXk13RxRCdzc3K6qJ6aABBkhhBBOQ6/XV8qHn6g7ZLKvEEIIIZyWBBkhhBBCOC0JMkIIIYRwWhJkhBBCCOG0JMgIIYQQwmlJkBFCCCGE05IgI4QQQginJUFGCCGEEE5LgowQQgghnJYEGSGEEEI4LQkyQgghhHBaEmSEEEII4bQkyAghhBDCaUmQEUIIIYTTkiAjhBBCCKclQUYIIYQQTkuCjBBCCCGclgQZIYQQQjgtCTJCCCGEcFoSZIQQQgjhtCTICCGEEMJpSZARQgghhNOSICOEEEIIpyVBRgghhBBOS4KMEEIIIZyWBBkhhBBCOC0JMkIIIYRwWhJkhBBCCOG0JMgIIYQQwmlJkBFCCCGE05IgI4QQQginJUFGCCGEEE5LgowQQgghnJYEGSGEEEI4LQkyQgghhHBaEmSEEEII4bQkyAghhBDCaUmQEUIIIYTTkiAjhBBCCKdVo0Fm0qRJdOnSBR8fH0JCQhg2bBiHDh0qcU1OTg5PPfUUgYGBeHt7c+edd5KQkFBDLRZCCCFEbVKjQWbt2rU89dRTbNq0iZUrV5KXl8dNN91EZmZm4TXPPvssP//8M/Pnz2ft2rXExsZyxx131GCrhRBCCFFb6DRN02q6EQWSkpIICQlh7dq19O7dm7S0NIKDg/nhhx8YPnw4AAcPHqRFixZs3LiR7t27X/aeZrMZk8lEWloavr6+Vf0tCCGEEKISlPfzu1bNkUlLSwMgICAAgG3btpGXl8eAAQMKr2nevDn169dn48aNdu9hsVgwm80lHkIIIYSom2pNkLHZbDzzzDP06tWL1q1bAxAfH4/BYMDPz6/EtaGhocTHx9u9z6RJkzCZTIWPqKioqm66EEIIIWpIrQkyTz31FHv37mXOnDlXdZ8JEyaQlpZW+Dhz5kwltVAIIYQQtY1rTTcAYNy4cSxdupQ///yTyMjIwuNhYWHk5uaSmppaolcmISGBsLAwu/cyGo0YjcaqbrIQQgghaoEa7ZHRNI1x48axaNEifv/9d6Kjo0uc79SpE25ubqxevbrw2KFDhzh9+jQ9evSo7uYKIYQQopap0R6Zp556ih9++IGffvoJHx+fwnkvJpMJDw8PTCYTY8eO5bnnniMgIABfX1/Gjx9Pjx49yrViSQghhBB1W40uv9bpdHaPT58+nVGjRgGqIN4///lPZs+ejcViYeDAgXzxxRcOh5YuJcuvhRBCCOdT3s/vWlVHpipIkBFCCCGcj1PWkRFCCCGEqAgJMkIIIYRwWhJkhBBCCOG0JMgIIYQQwmlJkBFCCCGE05IgI4QQQginJUFGCCGEEE5LgowQQgghnJYEGSGEEEI4LQkyQgghhHBaEmSEEEII4bQkyAghhBDCaUmQEUIIIYTTkiAjhBBCCKclQUYIIYQQTkuCjBBCCCGclgQZIYQQQjgtCTJCCCGEcFoSZIQQQgjhtCTICCGEEMJpSZARQgghhNOSICOEEEIIp+Va0w0QVyg7FcyxsG8RWNKhxRAIagLeoTXdMiGEEKLaSJBxRtkpsPlrWPNO0bHNX0KD62D4VPAJu/J7WzIgMxES9oOLHkJaqHDk5nH17RZCCCEqmQQZZ5RyqmSIKXBqHexZAN2fBJcrGDXMugBb/gdrJoFmU8f0bnDrJ9DiNnD3ubp2CyGEEJVM5sg4G02D7d86Pr/5K9WjciXidsIfbxeFGABrHvz0JKScuLJ7CiGEEFWoQj0yf/75Z7mu69279xU1RpSDZoPMJMfnLWawWSt+3+xUWPu+4/ObvoQhn4CroeL3FkIIIapIhYJM3759HZ7T6XSF/83Pz7+qRokyuOih1R1w4Gf75xvfAB5+Fb9vvgXSYx2fTz0JVosEGSGEELVKhYaWUlJS7D7OnTvHCy+8gNFopHnz5lXVVlEgqhsENi593NUd+k4Ag1fF72n0hoiOjs/X7wVunhW/rxBCCFGFKhRkTCZTiYePjw/z58+na9euzJ49m8mTJ7N79+6qaqsoYKoHD/4EXR9Rq4l0OmgyAB75HfwbXdk9DV7Q+3nV43MpN0/ocJ/9c0IIIUQN0mmapl3JE3/88UdeeeUVkpKSmDBhAuPHj8doNFZ2+66a2WzGZDKRlpaGr69vTTencuVbIDMZsIHRF9yv8vvLy4azW+Hnf8CF4+pYaCsY+gWEtga9LHITQghRPcr7+V3hT6a1a9fy0ksvsWfPHp5++mleeuklTCbTVTXW6Vgy1ITb3Aww+tRcnRVXI5giKu9+bh4QfT2M/lVN/tXpwDMAvIIr7zWEEEKISlShIHPzzTezatUqxowZw+LFiwkLu4rCa87KHAsrJ8K+hWp1kN4AncfCdc+CTx2pqusTdnVF9YQQQohqUqGhJRcXF1xdXfHy8ipcpWTPhQsXKqVxlaFSh5ayLsCPj8LRlaXPdX4YbnrjyibaCiGEEKKEKhlamj59+lU3zKllJtkPMQDbZ0DP8RAgQUYIIYSoLhUKMiNHjqyqdjiHjATH52z5kJNabU0RQgghxBXutZSdnc3KlSs5fPgwADExMQwYMAAPjzq+saCHf9nnDd7V0w4hhBBCAFcQZJYsWcLDDz/M+fPnSxwPCgpi6tSpDBkypNIaV+t4h0JwDCQdKn2u0Q3gFVT9bRJCCCGuYRUqiLdhwwaGDx9O7969Wb9+PRcuXODChQusW7eO66+/nuHDh7Np06aqamvN8w6Be2aXrqob3h5u+/TKtgYQQgghxBWr0Kqlm2++maioKKZMmWL3/GOPPcaZM2dYtmxZpTXwalVJQbz0eLUMOz0OTFHgEw7eUmtFCCGEqCzl/fyuUJAJCAhg7dq1tGnTxu753bt306dPH1JSUire4ipSpyv7CiGEEHVUeT+/KzS0lJ2dXebNTCYTOTk5FbmlEEIIIcQVq1CQadq0Kb///rvD86tXr6Zp06ZX3SghhBBCiPKoUJAZPXo0zz//vN05ML/88gsvvvgio0aNqqy2CSGEEEKUqULLr59++mk2bNjArbfeSkxMDC1atEDTNA4cOMCRI0cYNmwYzzzzTBU1VQghhBCipAr1yLi4uDB//nxmz55NTEwMBw8e5NChQzRv3pxZs2axcOFCXFwqdEshhBBCiCtWoVVLzkhWLQkhhBDOp0pWLV3O9u3bufXWWyvzlkIIIYQQDlU4yKxYsYLnn3+eV155hePHjwNw8OBBhg0bRpcuXbDZbOW+159//smQIUOIiIhAp9OxePHiEudHjRqFTqcr8Rg0aFBFmyyEEEKIOqpCQWbq1KkMHjyYGTNm8O6779K9e3e+//57evToQVhYGHv37q1QVd/MzEzatWvH5MmTHV4zaNAg4uLiCh+zZ8+uSJOFEEIIUYdVaNXSJ598wrvvvssLL7zAwoULGTFiBF988QV79uwhMjKywi8+ePBgBg8eXOY1RqORsLCwCt9bCCGEEHVfhXpkjh07xogRIwC44447cHV15f3337+iEFNea9asISQkhJiYGJ544gmSk5PLvN5isWA2m0s8xFXKToOMRMiTqs1CCCFqlwpvUeDp6QmATqfDaDQSHh5eJQ0DNaw0c+ZMVq9ezbvvvsvatWsZPHgwVqvV4XMmTZqEyWQqfERFRVVZ++q8rGQ4shLm3APTB8OvL8H5I5CfV9MtE0IIIYAKLr92cXHhrbfewtvbG4CXXnqJF154gaCgoBLX/eMf/6h4Q3Q6Fi1axLBhwxxec/z4cRo3bsyqVavo37+/3WssFgsWi6Xwa7PZTFRUlCy/rqicNFj7Pmz8rORxVyOMWQERHWqmXUIIIa4J5V1+XaE5MvXr1+ebb74p/DosLIzvvvuuxDU6ne6Kgkx5NGrUiKCgII4ePeowyBiNRoxGY5W8fo3JToXMJMhIAHcTeAWDTxXPG0pPKB1iAPItsPQ5uH8BeAVWbRuEEEKIy6hQkDl58mQVNaN8zp49S3JycpUOZ9U66fHw68uwf1HRscAmcO8cCKrCDTpPb3R8LnY75KRKkBFCCFHjKlxHRtM0jhw5wr59+8jPz7+qF8/IyGDnzp3s3LkTgBMnTrBz505Onz5NRkYGL7zwAps2beLkyZOsXr2aoUOH0qRJEwYOHHhVr+s08rLhrw9LhhiA5KPw3TAwx1bda+v0lzmvq7rXFkIIIcqpQkHmxIkTtG3blubNm9O2bVsaNWrEli1brvjFt27dSocOHejQQc23eO655+jQoQOvvvoqer2e3bt3c9ttt9GsWTPGjh1Lp06d+Ouvv+re0JEjGYmw/Vv759LOQsrJqnvtBt0dh5X6PcHdv+peWwghhCinCg0tvfDCC+Tn5/P999/j7u7OBx98wOOPP862bduu6MX79u1LWXONV6xYcUX3rTPystScFEdST0GDnlXz2t6hcMOrsPr1kseNPnDLB+ApQUYIIUTNq1CQWbduHQsWLOC6664DoHv37kRGRpKZmYmXl1eVNPCapjeAwQtyM+2fD2hSda9t9IHOo6HhdbDhc8iIg0b9oN294Neg6l5XCCGEqIAKBZnExESaNi2aYBoeHo6HhweJiYlER0dXeuOuWVkX4MRaOPkXdHwINn1Z+pqgZuBXxTVyPPwhqivcMQWsueDmDfrLzJ0RQgghqlGFgoxOpyMjIwMPD4/CYy4uLqSnp5eooCv1Wq5CvgV2zYYVr6g5KkM+hU6jYOcssF4sRBfVHe74uuqXYBdw81APIYQQopapcEE83SUTQDVNKzxW8L/Lqrxb3cpbUKfWSD0Nk7up+TGgwky7e6H5rWDLh8CmKsB4BtRsO4UQQogqVCUF8f7444+rbpi4jKzkohADoGmw8wf1ABj9K4S2rJm2CSGEELVMhYJMnz59qqodooD+MkvL3Tyrpx1CCCGEE6hQkCnPTtKurq6FG0uKK+AZqCr2nj9S+px3KHiHVH+bhBBCiFqqQgXx/Pz88Pf3L/Ph4+ODyWTizjvv5OzZs1XV7rrLJxRGfKtWDBVn8IJ7fgCfa2h7BiGEEOIyKjTZd+3atZe9xmazkZCQwOTJk/Hx8WHZsmVX1cCr5XSTfUHNi0k7A6c2wtmtEN4GovuAKRJcZPmzEEKIuq+8n98VCjIVsX//frp3716u4aiq5JRBRgghhLjGVcmqpQJpaWmsXLmSkydPotPpiI6OZsCAASVeqEmTJnz33XdXcnshhBBCiHKpcJD5/vvvGTduXKmeFpPJxFdffcXdd98NgMFgYOjQoZXTSiGEEEIIOyo02Xf79u2MHj2aYcOGsWPHDrKzs8nKymLr1q0MGTKEBx98kF27dlVVW4UQQgghSqjQHJnRo0eTkZHB/Pnz7Z4fPnw4vr6+TJs2rdIaeLVkjowQQgjhfMr7+V2hHpn169fz2GOPOTz/+OOPs27duorcUtRF1jy16ur8YUg9U7RHlBBCCFHJKjRHJjY2lmbNmjk836xZM86dO3fVjRJOLCMRtk2HDZ+DxQwGb+j2OHR7VBX0E0IIISpRhYJMVlYW7u7uDs8bjUZycnKuulGiHHIzIO0c7J4Hqaeg6U3QoKeqNVNTLBnw139h85cl2/nXB5CRBIPeBqNPzbVPCCFEnVPhVUsrVqzAZDLZPZeamnq17RHlkZsFB3+FRY+o4nkAe+aDbwSMWgYB0TXTrswk2PKN/XM7v4PrnpYgI4QQolJVOMiMHDmyKtohKiIjARY/VhRiCphjYfkEuPObmgkM2RfAlm//nGZTO3sHNq7eNgkhhKjTKhRkbDZbVbVDFMi6AKmnYecsyE6BNiMgrC34Fttj6cxmsFntP//IChUYaiLIXG5nboNX9bRDCCHENaNCq5Yux2azsXTp0sq85bUl6wJs+BS+7gN/f62Gi364Sz3MsUXX5WY4vodmc9wrUtW8glTosieoqTovhBBCVKJKCTJHjx7llVdeITIykttvv70ybnltSj0N6z4qfTx+N2ybAdaLASWqm+N7BDUDYw3Vy/EKhhEzwBRV8rhvhNq5W1YtCSGEqGRXHGSys7OZOXMmvXv3JiYmhg0bNvDqq69y9uzZymzftWXH947PbZ2mJtMC+ERASzvbP+h0cMuH4B1SNe0rj8DGMPY3GLkUbvkvPLQExq5SAUsIIYSoZBWe7Ltlyxb+97//MWfOHBo3bsz999/Phg0b+OKLL2jZsmVVtPHakZPq+FxuJnBxjpJXIAx+Hxr0gg2fQWYiRHaBG9+A4ObV0dKy+UaoR/T1Nd0SIYQQdVyFgkzbtm0xm83cd999bNiwgVatWgHw8ssvV0njrjltRqh5MfY0GwjufkVf+4RC10dVz4xmUxNtPfzsP1cIIYSooyo0tHTo0CF69+5Nv379pPelKoS3tT9Z1s0T+r5SetWPTgc+Yar3w8MP8nIcr2YSQggh6qAKBZnjx48TExPDE088QWRkJM8//zw7duxAp9NVVfuuLT7hcN9c6POSmjjr5gmtbodH10JAI/vP0TRIOQUbv4B5D8CyFyB+L1jSq7ftQgghRA2o0O7Xxf3+++9MmzaNH3/8kZycHJ5//nkefvjhMvdiqglOufu1Nf/ixF6bGk4qq/5K0iGYNlDVnCnuts+h9R1Su0UIIYRTKu/n9xUHmQJpaWnMmjWLadOmsX37dho1asTRo0ev5paVyimDTHllpcDc++HU+tLnXPQwblvNbVcghBBCXIXyfn5fdR0Zk8nEk08+ybp163j//fc5c+bM1d5SlFf2BfshBtRcmdgd1dseIYQQoppVKMhYLBYmTJhA586d6dmzJ4sXLwZg+vTpNG7cmE8++YQ33nijKtop7NEus2VEXrb94/k5al5N3C5IOqwqCgshhBBOqELLr1999VWmTJnCgAED2LBhAyNGjGD06NFs2rSJDz/8kBEjRqDX66uqreJS7r6q0Nz5w/bPR3YufSzzvNr+YP0nKtAARHaFO76WYSghhBBOp0I9MvPnz2fmzJksWLCA3377DavVSn5+Prt27eKee+6REFPdvEPh1o/VfJhLdR5beksAmxV2z4W17xaFGICzf8PMoSX3cxJCCCGcQIWCzNmzZ+nUqRMArVu3xmg08uyzz8ry65pUr6Nanh1zi1qyHdoahk+DfhNKF8hLj4M/37d/n9RTkHysypsrhBBCVKYKDS1ZrVYMBkPRk11d8fb2rvRGiQpw84CwNnDHFLBkgN7N8S7Tedmll2kXl7hfthUQQgjhVCoUZDRNY9SoURiNRgBycnJ4/PHH8fIqWavkxx9/rLwWivIx+qhHWVzdVV2Z3Ez75wMaV367hBBCiCpUoSAzcuTIEl8/8MADldoYUcW8L+7PtO6j0uc8AyGkFmw4KYQQQlRAhYLM9OnTq6odojq4GqDbE5B2DvbMKzpuioT75qn/XilNg7SzELcbkg+r4a7gFmCqd/XtFkIIIRy46sq+tV2drux7pbLT1BYI5nPgblI9Nb7hV34/TYOEPfDtbSXn4PjWg5E/Q6AMWQkhhKiY8n5+V6hHRtQRHib1CGpSOfdLj4Mf7i49kdh8DhY+DPcvAK/AynktIYQQopir3qJACNITHNegid0OWeertz1CCCGuGdIjc63It6geE52LqjdTmbV/LOayzzvaKkEIIYS4ShJk6jpNU8XuNn0JB34GN3fo/DC0uv3q5sUUZ4pUwcjedCs3D/AMqJzXEUIIIS4hQ0t1XcpJ+KYfbP5KzVlJPgYrJsDcB9TclsrgFQztHCzFv/558Aq1f04IIYS4ShJk6rL8HNjwmf3drc9tVUulK4O7Lwx4Ffr9n1oFBeAdArf8FzqNBjdj5byOEEIIcQkZWqrLsi7A/sWOz+/4Dpr0B5dK+DXwDoHrnoP296n5OG4e4B0GLpKVhRBCVB0JMnWaDlzL6A1x9aBSO+X0rldXVE8IIYSoIPnncl3mFQIdHnJ8vvMY6TERQgjh1Gr0U+zPP/9kyJAhREREoNPpWLx4cYnzmqbx6quvEh4ejoeHBwMGDODIkSM101hnpNdDx4cgOKb0ubb3QGAlFcQTQgghakiNBpnMzEzatWvH5MmT7Z5/7733+PTTT/nqq6/YvHkzXl5eDBw4kJycnGpuaQ3Jy4LUM2rlkb0Ju+VhqgcPLII7p0KTAdDiNhi5FAa+Bd7BldpcIYQQorrVmr2WdDodixYtYtiwYYDqjYmIiOCf//wnzz//PABpaWmEhoYyY8YM7rnnnnLd12n3Wko9DX9Mgr3zwZoHER3h5vchtLWqBXMl8rJBp1ebRwohhBC1WHk/v2vtBIkTJ04QHx/PgAEDCo+ZTCa6devGxo0bHT7PYrFgNptLPJxO2jm1AeOuH1SIAVXqf9pNcP7Qld/XzUNCjBBCiDql1gaZ+Ph4AEJDSxZTCw0NLTxnz6RJkzCZTIWPqKioKm1nlTi3DVJOlD5us8LKiWr3aiGEEELU3iBzpSZMmEBaWlrh48yZMzXdpIo7+Ivjc6fWQ25G9bVFCCGEqMVqbZAJCwsDICEhocTxhISEwnP2GI1GfH19Szycjm+E43OeAbJkWgghhLio1n4iRkdHExYWxurVqwuPmc1mNm/eTI8ePWqwZdWg7V2Oz3V7UvYuEkIIIS6q0cq+GRkZHD16tPDrEydOsHPnTgICAqhfvz7PPPMMb731Fk2bNiU6Opp///vfREREFK5sqrNMkXDrR/DLcyV3lG7UF9rdLT0yQgghxEU1GmS2bt1Kv379Cr9+7rnnABg5ciQzZszgxRdfJDMzk0cffZTU1FSuu+46li9fjrv7FS4/dhZGH2hzFzTsDcdWQY4ZGt8Afg2k9osQQghRTK2pI1NVnLaOjBBCCHENc/o6MkIIIYQQlyNBRgghhBBOS4KMEEIIIZyWBBkhhBBCOC0JMkIIIYRwWhJkhBBCCOG0arSOjKgk5jiwpIGLm9rCwMO/plskhBBCVAsJMs4mIwmyk8GaDx5+EL8Hlj0PaWfV+YbXw60fQ1CTmmylEEIIUS1kaMlZ2GwQvxdm3gaTu8EPd8G5rTD7nqIQA3DyL5gxGFKdcNdvIYQQooIkyNSE/FzIToH8nPI/J+0MTB8MifvV1x0fhPWf2r82IxFOb7z6dgohhBC1nASZ6pSXA4kH4dcX4fs7YMnTamgoN/Pyzz28HCzmoq+DmkHcTsfXH/vjqpsrhBBC1HYyR6a6aBqc3gSz7gRbvjp2bjvsmQvDZ0Dzm0FvsP9cmw1Orit5LOsC+ISXHFYqTubICCGEuAZIj0x1SY+DxY8VhZgCmgZLxkF6guPnurhASIuSx3bPgU6jHFyvh5ibITfjqposhBBC1HYSZKpL1nlIj7d/zpLu+FyBNneBS7EOtLNbwTsMWt1e8jpXd7j1E1j9OuxZoO59pfItkGMGm/XK7yGEEEJUIRlaqi6adpkLbGWfNkXCfXNh/qiicLL0GRgxE657Fk78CQZv8A6Bv7+G42vg0K8Q2RVCW1asrdmpkHwUNn0B5nPQqB+0vRv8GqjeISGEEKKWkCBTXTyDwCsIMs+XPufmqea7lMXNHRr2gSc2QuppyMuCwMbg6gEzbgVbLuRlQ2ZSyeft+B4GvVP+dloyYMcs+O2VomOnN8HGyTBmRcVDkRBCCFGF5J/X1cUnHG6bDDpd6XO3fAjeoZe/h6sb+EVBw17Q9EYIaATYICNehZtLQwyA+ayaLFxeGYmw8v9KH7eYYemzapKxEEIIUUtIkKkuLi4Q3Rse+wta3aGWT8fcAg+vhua3gqvxyu5r8IEGPRyfbza4YsNBZzc7HgY7s0nVvxFCCCFqCRlaqk4GTwhrA0Mnq9oxBk8weF3dPd194YZX4djvpSfl+kaoLQsqwppf9vnLzvURQgghqo/0yNQEgyd4B1c8xFgywByrhn+KC2oGo35VIQlA5wLNh8CoZeAXWbHXqN/N8bmwtmp/JyGEEKKWkB4ZZ5BvUauI/ngHTq1Xk4Z7PQNNb1KrlNzcVQB5cLGay6LTg2cgGL0r/lreodBzPGz4rORxvQGGfKxeWwghhKgldJpWt8cKzGYzJpOJtLQ0fH19a7o5V+bsVpg2sHQxvdZ3ws3vq9BypXKzICNBVRnOzYCormD0hYR9sO5D1ftTvyf0ehoCGjquPiyEEEJUovJ+fkuPTG2XeR5++WfpEAOwd6GqIXOlQcaSAYd+gcVPlrx/23tg4Ntw71yw5oLRB9w8ruw1hBBCiCokc2RqO4u57M0hj/9ZsfvlpEHCfvj9bYjfDYvsbJuwew4cWqbmw3iHlB1icjMhO61iS7yFEEKISiI9MrWdzkU9NAdBweBZ/ntlp8KW/8Hvb0Lj/pCT4ngV0rqPoNlAx/VtMs+r4aeNk9V9Ym6B1neAX/3yt0cIIYS4ShJkajvPQGg2SPWQXEqnU7Vpyiv1tAoxoHpbLl39VPw1NZvjPZayLsDad9VWCAXO/A0bP4Mxv6mKw0IIIUQ1kKGl2s7oAze9Zb9nZNB7ZVcEtuar0JF2Tu2uXXwYKukgRHQseX3zW9V+Tv0nwvXPqy0PLHZ20DafKxliCmSeh9/fUsNNQgghRDWQHhlnENhYVQA+9jsc/hV8IqDzaDWMY2+JdXaaqjeTnQzrP1UVeT38oeNIuOMb+OkpNSzUr6maA5ORqM4FNoG5D4A1T93HRQ/9/g2dRoJnQNH9D/zsuK0HfoIb37j6Qn9CCCFEOUiQcRZ+USpQtLsXXFwdbztgyYD9i1W9l/kji0JJThqsfl3tZN3/VfjtX7Di/2DYV/D3N2o+zJz7St7LZoXVr0G9jtCoT8njjtTt1fxCCCFqGRlacjauhrL3TspIUEM/6z8uCjHFHf8D/BqAwRtSTsDCsWqS7v6fHN/zzw/UROECLW51fG2zwVL9VwghRLWRIOPM8rLUJo7F90c6tRFCW6vJt47E7oB6ndVqqMjOaq5MyknH15vPQnaxXa9N9aHNiNLXGX1hwGtqXo8QQghRDWRoyRllp8L5w2obAfM5aNgbOj2kelqsFrXiyMXVfhE9UMNOd/5PXWv0ATcviOoGZzbbvz6sLWQmQ0Cji88PhIHvQMuhsP4TyEmFpgOhy8OqDUIIIUQ1kS0KnI0lA7ZOg5X/Lnnc4AWjl6vidRs+hRyzmitjz7itENS05LGkg/B1X7VSqTgXvarwm3IKuj5c+l7ZqWoIy92khr2EEEKISlDez28ZWnI2GQmwamLp47mZ8PPTqnfF1QgdHwJTVOnrBr4D3mGljxv9YPh0CG5edMw/Wq1y+vtrCGtlvz0efmonbwkxQgghaoAMLTmbc9scV/mN3Q75WdD7JXXdrR+pXbNPrVfhpeNI8G8A7nbmsPiEwhkLdHxQDQ9pGmQmqsJ3uIB/oyr9toQQQogrIUHG2XgFQ6vbIXE/JB0qfV7TVA9JzCBVDC+ivQowl9vKoKBK8P7F8PM/1HN1LhBzMwyapIKOEEIIUctIkHEWlgxIO6uWT8PFoaP6sOIVSDujjoW1UYXvChQvYpeZDPk5oDeooGOPiytE94F7W6shKqOX2q6goquQbNaLQUinnq/TVez51clqBZsFXD1qdzuFEELYJUGmKlky1BJpg9fVVbrNzYQDS2DxE0XH9i0Cn3AY+jnMH61WIN36iVqRVFx2qhpmWv2GmtDr3xD6/R806KVWHxUwx6lQtH9RUVG7htfBsC8rFmTSzsLueWoHbRdX6DRKbX3gG3GF33wVsWRA6inYMlXV02nYG1rfrsJhWXV6hBBC1Cqyaqkq5Jgh8QD8+T5cOKbquvR+Xm0BcCWB5sIJ+LyT/Yq6TQdCqzsgsiP4RYOrW9E5ax7s/EENFV2q3/9Bj3FqyMmSAb/8U4WPS9XrpPZf8nLQi1Nc6hmYcYsKCMWFtVX3qC1hJi9bBcMfHy153OgLo3+FsNY10y4hhBCFZNVSTcnLgX2LYdpNcHQlXDiuPjS/7gPH14DNwUTdspze5HhbgKMroX43CGpWMsQApMerrQjs+fM9NZkX1H/3zLN/3bltkJF0+TbarKon5tIQAxC/W004ri0yEuGncaWPW8xqH6rM89XfJiGEEFdEgkxly0yE5S+WPq5pqmckI67i97SYHZ/TbI5XMWUlO36uNU9tLAlgSXd8D4CM+Mu3MSsZds92fH77TPs7adeExP1gzbV/Lm6nqpYshBDCKUiQqWzm2NJF5QpknleTbiuqQS/H50JaOp7Donezf7yAq7v6r8FbrVByxCuk7PuAer5LGVOudPraM5k231L2+bI2xRRCCFGrSJCpbGUFAriyD3OfcLUdgL3XuvkD8HYQNDyDirYVKHUuELwvLqn2DoGWt9u/Lrxd0XVl8QxUy7wd6fLw1U14rkxhbRz/HPyjZdNLIYRwIhJkKptPuOMeEt8IFS4qyitQBZabPwC/+mobgui+8MjvUK9jGW0JVdV6Dd4lj7sa4a7vwOdihV+jD9z0BjQbVPK6ep1h+AzHy7WL0+lU2Aq1M1E2uo/anLK28AqGXs+WPq5zgSEfF70vQgghaj1ZtVTZrLlwaDnMf6hoGTOoYZ4HfoSG11/5EIumqYmqWr6q81KengObVS2JPrwcTm+E8PbQ8jYwRaqaMgVOb1bX1O+uhsbc3CFhP8TthlveL9+qJVBDayf+gh0z1VBTl4chskvtCweZyWqTzD/fVxtv1usEfSdcXFl2meKBQgghqlx5P78lyFSF3ExIOQmbvoLzh1R46HpxZ2hXY/W0oSIykuC7YZCwV32t05UMYY+ugYgOFbunJR3QgdH7spfWqKwLas6M0bvihf+EEEJUmfJ+fktBvKpg8ILQVnDLh5CfDW6el594W5NyM4pCDJQMMQAn/qx4kHGWUFC8+rEQQginI0GmKrkaKn9X6NwstRz6xF9qyXN0bzVvxtGE3/LQ6dUwkC2/9DmjL/jUkkJ2QgghxCVq9WTf1157DZ1OV+LRvHnzmm5WzcnNhEO/wmedVE2a1a/D//qrLQrSy1HrBVRvS3o8pJ0rqpfiFVh6VVRwc7jzf3DLB4BNFbXLLEdhPCGEEKIa1foemVatWrFq1arCr11da32Tr0526sUidi6gd1VhIz1OTbbVG+DHsaWHfk6tg63ToPeL6jmOZCTC3h9hw6eqcF9kV7jxdQhuCf0nwtmtqjJvSAsY8FrpKrcNeqlwY2+rAZtVtTPHrOYBeQWBu6kS3hAhhBDCsVqfClxdXQkLq2UrXqpCfh6cPwjLJ6htAUbMgHUfw+kN6nxkF7WM2dHc7M1T1AaNjvYzykqGZc/D/p+Kjp1aD1NvhAcXQ6O+ap+hc9vUaqj5I9VE2OJOrYff31armNyKrezJToH9S2DLNxAzGHzrATpo3B/8Iq/gzRBCCCHKp1YPLQEcOXKEiIgIGjVqxP3338/p06fLvN5isWA2m0s8nMKFY2qY6ORf0GWsCgUFIQbUXJWCvZHsyUktuyKtOa5kiCmgaSrgpCeAqZ5amm2zlg4xBfbMVT07xR1ZpfaU6v4kHF0Nq16DnbPg7N+QetZxm4QQQoirVKuDTLdu3ZgxYwbLly/nyy+/5MSJE1x//fWkp6c7fM6kSZMwmUyFj6ioqGps8RXKzYS1/ykqnd+gFxxdVfKapAOqV8aRep3Lrpx7ZrPjc+ePXFwufVHaOcfXWvMgP6fo6/Q4OPmnKtK3+AnVo5Odol5vwWi1qaU1z/H9hBBCiKtQq4PM4MGDGTFiBG3btmXgwIEsW7aM1NRU5s1zsFMzMGHCBNLS0gofZ86cqcYWX6GcNLUzdgFrbukhJHOsmnsS2KT083U6GPRO2UuJjWXU0NG5gIu+6OvQFo6v9fAvWSk4LxuaDYR1H9m/fuWr5Z+ILIQQQlRQrZ8jU5yfnx/NmjXj6NGjDq8xGo0YjbWw6FxZdHoVEApWEend7C+HXj4B7vga9iyAvQtV4AltBbd9Bj71VGBwN6nekUtFdna8xLrpQLVXUgFTlCriF7ez9LV9Xgbv8KKv9Qaw5kNoS+jyiOoV0rmonppNX6ohp6zz4OcEPWNCCCGcTq3ukblURkYGx44dIzw8/PIXOxPvEOj+VNHXh3+D1neWvi4rGTZ+ATe+CeO3wT92wH3zIOUUzL5bTdxd9hKcP6rCRXE+oXD7lNLbI/hGwKBJ4F6sx8Y7BO6ZpZZkF2yC6W6Cge9Am+GgL9Z74x2q6th0GqPmxsx7COY+AJu/gpveVMNhLrW4GKAQQginVqu3KHj++ecZMmQIDRo0IDY2lokTJ7Jz5072799PcHD59v6pkS0KrkR6PPw0Ts0pcdHD7V+reTJ75qteFJ0OYm6Bwe+pSbmggs2vE9QE3OLcPODh1aq3prjcTDX/Ze8CFX6a3gT1u6l9l+yxZKjaMXnZ4O6jemLsLe8+swWm3Vh6OMzNA+6dA0Ex4FvHwqcQQogqVSe2KDh79iz33nsvycnJBAcHc91117Fp06Zyhxin4hMGw75UdVwO/aoCR5+XoffzKoAYvFUtmeI9J2nnSocYUMFj+ctqh+viG0u6uKrNIFsPV/919QTvMnbjNnpffq+kHDP8+a79ZeF52XByHTTsXfY9hBBCiCtUq4PMnDlzaroJ1cs7WD0iO1/+2pw0OLLC8fkTf6prCoJM1gXYNQd+fxPystSxwMaqXk1Ia3C5wlHGvEyI3+P4/Nmtar+pslZUCSGEEFeoVgcZYYclHeJ2wY7vLxaes0Ong06j1XLus1tU8br8XNj4eVGIAdXTs2sudDWBb2TJuS/l5equ5sg4WpkUFAN694rfVwghhCgHCTLORNPUMu25D6hhontmlb5Gp4Mhn6lidF92LyqSF9QMbvsUfnkeUk9C/9fUpN4981UV36YDof19KpRcOiG4LB7+agjs+zvstMUFOo+6soAkhBBClEOtnuxbGZxmsm9xlnTITAarBYw+4BOuwoU5Fr65QS1tBuj2GKBTK4QKNL1J7ZW0/pPS9/UJg5vehsT9qgdl5yVByMMfxq6EoKYVa2/WBdg+Uw1bFSzvNnjB7V+pbQpkWEkIIUQFlffzW4JMbZN6WtWLObQMNJsKMQPfUYEgPRa+6F7y+uufV6uT9i9WgaL/q/D9nRc3nrRj6Bcq0NjrQQFofotapm30qVi7czMhIwlSjqvaMn71wTsMXA0Vu48QQghBHVm1dM0xx8F3wyD5WNGx9DhV6v/e2WpS7qX++gDc/SBmkKrbYvBxHGIAzGdV6HDk0K+qMJ+9IGOzquJ2GuAZVHLIyOAFAV4Q0LDs71EIIYSoRE5VEK/OSzpYMsQU99u/1PBSZNfS53JS1YaQnoFq8q27n+PXCGhccsJvKZr96r9pZ9U2BNMGwbSb4K/3Ic0Jtn8QQghRp0mQqU1Ob3J8LvmYChhDJ4PXJbVfXPQw4ls1lOMTBj3H27+HbwTU66QejjTuX7oSrzkOtn8Le+apQJN5HtZMgum3lA4zGUmqvk1GkuPXEEIIISqJDC3VJn71HZ8z+qi5JwHR8MgaOPkXHPsDgmOg5TBVnbdgPkrHh1TY2PJNUe9KSAtVIC8gGlJOQJsRasVSce4m6DGuaNVSegLE7oAtX6stD3qOh/B2kHRIXXvwF9i7SD0nJxVOb1QTfs8fUZtb3vAvtZN3WZtZCiGEEFdBJvvWJiknYXJXVf/lUtc9B/1eURtKlkduJmQkQvYF0BtVhV43T7Xk+vxhOLJShaPdc9Uk4cY3qH2UMhIhuLnaaXvxU3BsVcn7hraCvhPUnkqdRqvenWYD1X1WvFK6HTe+CV0fsb+RpRBCCOFAeT+/ZWipNvGNgPvmq8BRXOMbVGigAvVdDF7qkXIK5j0In7SDr/vCtplqQrCbpyqqd+Ob6t4Xjqml3T/cBXPuU4X0Lg0xAAn7IH63qj68daqaWGwxq54Ye/54W4UjIYQQogrI0FJtojdA/Z7w5GZI3AcZCWq4KWEfTB8I7e+HzmNU4Lmc9ETY+T2sfr3omPkcnFwLIc3VxODuT0F+DpzdrFYrFYjsDNumO773/p+g7d1w5m/4+2vVK5OXbf/a/By18aR/g/K9B0IIIUQFSJCpbVzdwL8+2PJg9Ztw4WjRUNOf76vAcf+CsneTzk6FpP1qaXZxPcapXprpg4oq/rroVS2aHk/BxsnqmE5fdN4ea566BtRwmO4ylXv1UktGCCFE1ZChpdooN1MN1STuKz1fJmGvGtopS2aSCjPF68V4Bqiek7XvlgwpNqs6FtlFVfYFNZE4ZrDj+8cMVptSAoS0VBWITZH2r/WNULt2CyGEEFVAgkxtlJOmJuM6snuu2nfJkawLoL+ks63lMNg1G+p3h+5PqiEq79Ci87tmQ6vb1f8+fxj8GkBYm9L3NkVCo75w/Hf1dY8nYe37MPjd0lsRuHnCXTPVkvCKykhSq6aseRV/rhBCiGuGDC3VSjoweEJuhv3THgFlb+zo7gux29TS7KRD6lhAIxVmTv6lelOMPjDgNchKhpWvqn2cigeXXfPgjm/U1gf7FquhrphbIPp6+PlpVXRvwGvgHQ6Je+Gv/8KDi+DkOkg8APU6QrPBYIqq2CaU6XFwcJlaOp6XAy2HqtBV1XNs8nPVa8duV/tQRXa5uM1CSNW+rhBCiKsiQaY28gqBzg/Dmnfsn+/wwGWeH6TCxG2fq1VIedkQ1VUtmU6PL7ru6Cq15LrPS6rQ3fmjanl36xHQ9yW4cBzi96prjD7gFap6SAb9B3wiVIG8TV+qvZkWPQ57Fqh6M/kWaDEUTPUq9n2nx8PckWrycYH1H6vNLR9eBf4NK3a/8rLmwukN8MPdanJygXpd4O6Z5ZtcLYQQokZIHZnayhwLs++BuF0lj/d+EXr+Q9VluXT4qLiUk/Dbv6Hd3Woy7r7FsHuO/Wvv/v7ijtc6VT/GzQsWjoXkI3D3LFWLJjdThZzEg6BzUYX2CpZcB8dAl4fVBpc/PqKC02N/QXjbin3Ph1eo4GVP18fUXlKuxordszxSTsHkLvbr93QeC4PeUVs/CCGEqDayaaSz842Ae+eqyb2754GHH3QZC7nZsPLfaml2iyEQ3dv+RFu9Ec7+DQeWqDCyf5Hj1zq1Aep1VtV5dXrVQ9HhATUslJ8DW6fDwaXq2siucOPrsPBh9XVoK/CPhqjukHpGVRCO36OGtyrClq/q2jiy70foMgY8AsG7kicPn/3bfogB1Rt03bPgF1W5rymEEKJSSJCpzXzD1aPpjZBjVoFi1atF5w8tA996MPJnFT6yU9SwkmeQGgqK7KqCjNEbNJvj18m3wM//gKMr1V5OF07C31PUpGN3kyqYN+RTWPq0+tD/8RG463vApgrnxW5Xw1RRXVXPTEAjNTxWIToVvhzRu6m5PbsXwIjpFR+2Kos51vG5/Bw1P0gIIUStJEHGWaTHlwwxBczn1BCPwRt2fKeONe6vAknfCSrAePiriben1qthqeAYFXxcjXDsd1WE7+d/QMeRauPK7TOL7p+TpuapdHwIOjykNo/UNMAKs0ao8FRAb4BhX8L6zy6uYrqkQnFZXPTQeRTsnW//fMthcHi5mj+z8lW47dPSq6SuVJSdHcUL+DcsXWlZCCFErSHLr53F4eWOzx1cCk0GFH19bLWaeIumVv1snAzdHoM7p6pVSLPvURN/Z98LmRfUEFJuhqoPs3OW/dfYOauotky3x9XKpeIhBlQ4+uWf0OZO2PZtxZdOB8UULQEvLrCxqiTc7l7oPxHid1Xu7tr+jSDMwXyem966suXjQgghqoX0yDiLvCzH56x5agJugRa3gYsLfNkTer+gtjhIj1OF784fKbpOs6keEIMntB6u7uOooq/NqoIKQGAjdU97clLV9gcth8G5rWpoyt2/qBJx1gX1OrmZ6vXd3FU9G72bmvvS/UloNgj2LVLfc8uhqpDfry+qIaygZtDr6aJdvSuDTyjcOwf+eEetxLLmqqXXN70FDa+vvNcRQghR6STIOIumN8KaSfbP1e9RstpvxwdVrwuoZdUhLdWwT/EQU9zuOfDgT2WvgoKinbcvt84tKxnmj1I9Ni56aHk73PB/YLWq3pSUE3D8DxW4fOupmjQhLQGbGuLKy1K9Rwn7VOD5um/RvRP2wU/jYPD7Kmy4VtL2B6Z6cMv70OdFNSfG4KVWYQkhhKjVJMg4C7/6qqfi0iEmvUH1UPz8D/V1QCNVBK+gZ+XAErhnFiTsd3zv8HaQdkYFkIIiev4NodMotSIpPwfObFHLlL1DVXE6D//SQ0ugeoaMPkXnbFbYu0AFkr4vq6rBmg1a3aGGvC4cV0M33Z9Uw0rZqar36MzfakXUrBH227z6dTXUZW81kTUfzGfh8G9qMnJkJ/Xe+UaWHdbcPGVzSyGEcDISZJyFV7BaOXTwF9j4mQoK0b3VKqG176mejeAWasiloCKwzkUNjVjzIaKDmgvj4aeGdlrfCcHNVajwDIbFj6r/fdtnamPKBj1h3ceqp8foq5Z+Nxmgho02Tobez8OK/yvdzo4jS+6kXeDwr3DDv1SBvYj2ai5NgfR4NYE37ZyaoPzzP9Qw2F0zi4azLpWbofaU8g4BS7qauGz0Uefid8GMW4uG4/bMg1Wvq9VdkZ2v8AcghBCiNpKCeM4oPQE0qwoY2WmQekItTc5Ohcb91OTYM3+rcHNomer1uOHfcG6bGh4KaKRq0Zzbrr5udQe0vQsWP6GGeLo9XjQ0VVz9HqoK8HfD1OThiA4q1CTuB1N9uP451Xvz60v2l3uPXKp6fZaMU+HjUjoXeHITfN1HFdW7exbMvV9tndDtMTCa1HXZKbD5K7VCavt3cHq9Gga67lnVozL9ZjWkdinfevDw6rJ3DhdCCFErSEG8uszn4maPedlwbgssGF0UHP6eooaHRsyA+WPA6AU9xsP0wWpi7bAvYeZtRUNP1jy1CeWZzTDoXciIVyHHntMbVc/HI3/AXx+o+it9J6hhqKwLKiic3ax6UnLSYN1HkHy06PnuvqpKsL0QA+p7SDsHj62H3/4FuekqYDW5EVa9ppaag+pZuukt9fpb/6eOJR5QS8lHLrUfYkA9PzOp7CCjaWqY7chKtW9UaCtoNUy9ZlVUFRZCCHFVJMjUZpnnL9Z78QBP/9Ln0+Nh4ZjSvR/WPDi7DZIOqO0HFj2mhlm6Pab2RrK3MinlJGSdh9DWjicFA5zaCBEdof2D4O6tNnbUNLU8e/ecol25fSPg1o9g9Rtqgm54e3Xc7WLtF51O9SjlZZccPsrLgNWvqcnBnoFquOx/N5Rsc9oZ+PFhuH+BmiNU/PnZFxy3veC9KUvifhX6ctLU1/t+hLX/gfvmq2G6y02ILpCRBOmxkHRYBSf/aPWeVGQDTSGEEJclQaY2yrqgej/WTFITbENaQP9XVa2T4qX/T/5lP5TU6whHVqiJuZnJavfo6N6q4u+mLxy/7pnN0Ki/Gm5y9IGvdwM3o+otmTdSFd9rfouasBvdF06sUWHGHAs/PgZDP4c/3oZhX6htDe76Dm58E0KaqyBm9IX8bNV7k5UMuVlqgvLhX2HUMtj7o/oe3U1q8nFUNzUPyJav9qFqfqsKG/7Rah5PQLTaF6n45o8FXN1V5WNHMpJU1eKCEFPAmqfq7jyxoXxbFaSdg/mjS25+6RWsdgcPbS1hRgghKpEUxKttcjNhy1SYc5/as8hiVgFjxi3qw91arH5K5nn798i3qOXDHn4Q2lLtgTRrBMTuAI8Ax6/tHQqHl6ll0fa4uKphq4KNHa9/Tu33tHUaHF+jhmHumw+BTdT5nFTVWzLoP+r1uz2uhnbidqmvl4yH+SNh5UQY8Abc8T/Y8Kl6rjUPlr+s5vt4BcPw6ep5c+5ToWLpsyrMtLtbtWHARNg1W0187jnefvv7vqK+R0eykh3Xx7GYVU/Q5eRmqonLxUMMqO/7u9vL3g5BCCFEhUmQqW0yktRQhj2/vqTmsBRwVKzt+BpoMVQNyxz6RVXzBdi7ENrf7/i1G/aGNe+qCrpBzUqec9HDLR/Clv+pOS6aTe3JNO9BOLFWhaSNn6thrMHvFW0fkHQIApvBQz+pXqFDy1RvUXBzteII1AaYix5TPTnFg8S5bSrI3Pg6LHtefV8FctLUsFXKabUz9oIx6rkHflY9HkM+Ua/h4qr+e9d3qr6OWxm7WF9uT6XczLLPA2QkOt6gMzNJ1dARQghRaSTI1DZpZxxXrc1OUcNOBfwbQP3upa/LzQDPALVb9JapRcdPrVe9JvYC0OD31FYHuemw6FHV2zJ0slre3ecleGQNHF4BR34ramfrO9S8j+KykmHbDGgzQu3/1OI2OLRU9bwkHoKgpmoZees71Eqqu2aqVUk5qZByvORO3i561Ruj06uVV/as+1CFmuLzhM5ug4DGcN1zcMc3asgpJ83xUu4CHgFqXo49Opeinqay5Oc4ro4MqkaOEEKISiNzZGqby62McSn2I/MOgeEz1FLkrVNVT0l4O7UM+e+v1VDOpSuEFj+u9ivq+gjE7VbbE4S1VTVYfn1RXZN1ARY9roZhgmPUztvhbVVvSgG/+rDkH3DzB2q4p7hDy+DO/6nA9PPTaqsCgxf4R8Hvr6sJtQXc/eD2L+H3t9QQmF8DFRoyk6DRDepYahlDOunxKvyYolS48o2AzqPVEvFLA2GjvqpXyZqvCvr5XDLM5BMGQ79Uk43PHy75/B7j1XNSTqmg6OaltlS4dONKg7ea92Mx22/vpT1dQgghrooEmdrGN0J9uOeklj4X2Bi8Lukx8A1Xc0Ka3wJuHiqExO9WtWGMvqqHISu56Pp8C6x4RQWX4dPVzta/vwlDPlOBoPjS5YwE9fCrX3I+TkRH1bOQfEQN59TrpFY6tbunqLcnoBGknlYhBqDDA2rSb/EQA+r7XPykChiu7lCvM6SeVJN3g5rBkqegy6NqaXd6bNGqqAIGL9Xm279Sw0+tblcTh3U6aH8fxNysemsKKgzH71V1bLxD1QTkiA5q5VOOWX2v6edUW0Naqto8B5dC57Gq52vteyow5ueoQNl5LPT6R9HEaA9/FYZ6v2B/CXtkV/CJKH1cCCHEFZOhpdrGO0zVgHG5JGMavNX+Q5dOVtU0tcHi1BvV49jvagjElgdHV6kKvPZ4+KulyifXqXts+LRoboveoHp79Ab1uje/Dxs+UyuW2oxQ+xGtflPd59jvqvz/iBlqCff8kWrezNJnVO9Sw+vUddG97Vf8BTVkptnUHk7zHlA1ZOber3qabv1YLXnuOR7um6d6kgro3dQEYVd3OLle7ZDdbJAavho+XX1fC8aoycFLxqtw5eEHIa1UfZsZt6oelqwU2DxF1eNx81BDdjlp0PQm1bOUmaTmBu1bqEKdwUsFnaYD4MdH4dP26jHnPtWT0/5+tTLL/WIBPxe92pRzxAzViyOEEKLSSGXf2ijfooZJds9TPR71u0PzIWrpr4u+5LXp8fBNP/VhfsuHsH2m6kXQNNUb0X+iKtG/4VNVswVUz0C/CfDTUyVX0TS+gcT+HxOfrSc2JYMIP0/CfI2EZB4uqs9yeLmaNJxvUV83vRGuf0EFkIzEkm3TG+De2SpIDPtS/deRYV+qsHBum/q6zQi1ncBv/y45t6XTKBXUfvuXqiOzZapazVVAp4OBk9RzVr5a+nV6jFMBaN1HF79+GlrcovZu6voo/PpC0ffhalTfW4tbIfmYCjSZiWrysH8DFYQuHbozeMHj61Sl4/Q4NefI1dP+MJQQQgiHpLKvM3M1qg/rfq+oeRqX9s4UZ7OqD8z75qnegcykonMHlqhaMyOXqkm3GYlqawPPINXjUTzEeAZwpvvrjJ17ksMJGYWHm4R4M+3uptSfP7LkEFWBns/A6Q2lQwyoMLHtW7WvkzXX8UaToOa4xO9R/1tvUEFm9t2lh5K2zYDbp6jJxyf/LBliQF2//GW4d07pYnmgwtKdU9X723IoRHVHO7UB3XXPqvekIKCB+t+Hf4WormpVVcEeVs0GqqEvexWKczNV784N/ypfzRkhhBBXRYaWaruyQgyonpgOo9QQUfEQUyA7BXZ8B7+/ocr5J+5X4ahx/xKXXej+CuN/Sy8RYgCOJmbw1I/HSb7ps9L3bj1cDfuc/Mtx+85sVkXgdv4A3Z+wf02D68BqKQodTfqrzTEddRZunKxCxZb/OX7do6sg2s7qLM0K/g1IH/w5p6KGccwWQlLo9Wpukp+dna+ve1YNGeUWe19CWsHpTY5f++RfqiieEEKIKidBxtl5Bapl1ifKCBMn/lRbBBz8RQ23mM+o4ZLQVoWXJId0Y+eZVLtP33MujWT/9mopc7t7oMNDcO9cFThSTjlesgzqXGQXNeTjU08Vx/MKIi+6P+eG/8Le+7dzcMAMEqw+RcubPQPVxF5H0mNVgHNUEBBU71HBJpPF3fwBsTZ/NloasjcnmB2Zgfxnh56/4lzIGjoN3DwBsDW4nvjbF3LWpx2JN3yg5sQUsJhLT7ou8T0Hqdo6OQ5WLlWDxPQcjidlcDo5k/Scy9THEUIIJyZDS3WBb72SWxdcyt23aH4MqB2zf38brntG9fic3Uqm3gQ4Xuacab6ghmzq94ABr8HMYWA+Cw/8CC1vV/N57Ok0Wu3vNOhdVQE4Jw3znfNYnuTHm/OPkm45CECkvweTh3xPqw3P4pqbqSYJH1lp/57h7dQcovrd1WRje6K6qxVGBVxcwd2Ps/WH8euBC/xv3XESzBb8Pd24r1sDYvM88czMp1PnsSQFdeGnC/X5csl5kjP30DAwjJd6f02P9BX4HZyjiv91fRSOrrb/2m3vUnOSWgwp++diR6I5h3hzDvFpOdTz8yDE151gn/JvVpmVm8/2U6n8+6e9nDifiU4H/ZuH8O9bW9IgUOboCCHqHgkydYFXoJrEWrzybXEdR6lVSJnn1aRdz0Bodx/8NE4VnAuOwS8mC53O/miOTgd+BpsapmoxRK3yGfSOem5+jloW3neC2huquOZDwNWgJhvHDFbDWZu+YI/ZnRcXHSxxaVxaDn/E6nEbNIt9R0/i7RVIq3v7EPL3u7gfKz6Z1wW6PKJC1eB3Vc/HpQXoTJFqldT6j7E0uZmkjk8Tn++Nt38wq/Yk8dnvR/Fxd8VNryMlK4/Jfxzlzo71SA31Jqrdk3zwx2nm7SrqETqZnMUTi07z9tA7Ce05hIzMTDoEBBN865d4Ln0C3E2ktxtDatSN4BWMKS8JXw9/Nam4Ak4lZ/L8/N20jPDFx92VBdvOEpuWzVcPdCLS39Ph83LzrSSYLew5l4q30Y2R0/9G08DX3ZWBrcMI8DSwaMc5hravx+kLmSSaLcSE+uBpdMXVBQK8jPh6VKytQghRW8iqpboiIwlWTVS7UBfX/FZo3E8NKTW+Qa2cidutlmXv+L6wRyO923P8+8IgFu8pPVwztG0ob3UHH5M/+ISrYZvpg9TqoHkPqg/sm95Rq4zObIacdAhrDQl7YO27Kmh4h8HIJaTYPBi94EypYax372zLH4cSWb63aAsGg96FT4Y1pO+xD/A4uAD8G8KA19WqqQNL1Iqp7uPgwE9qToz5HMTcolY2rX2P9H5vsSIpgH8tPUxOno3po7qQYM7B5OlGUrqFMF93zqVm8/GqI6Tn5DFtVBfqmYzc+PE6u2+xycONGaO7cNeUjdg0eGtIDEOiITHPnbdXn+P3Q0loGvRqHMj/3dycegGeZFqsnE3JRgcEeBnw93TD5GngXEo2py9ksv7oeUyeBm5oHoIODZ1OR1p2Hpqm4WHQ42N0Y19sGm0j/Qj2MWJwLVq1Zs7O40JmLseSMnhy1nYe7d2IDceS2XYqhZE9G9K9UQCLd8QSn5ZNx/r+3NAihE9WHWHrKTXhunujAEb3imbP2VSGd4okJSsPDQj0MuBh0OPhpsfHvWTAybNaSc7Iw0UHfp5uJdpztS5kWkjLzit8rwO8VE9UliWfnHwrXkZXjK56kjMsWPJt6F10BHsbcXHRqZCedV5NtvYIUCHb6F3qNaw2G3oXGVEXwhmU9/NbgkxdkpkMaafVB72mqRBzZpMqeHdpr4XeAGNXqiGac9vA6EtCs3v5bH0ic7edI8+q4abXMaJTJE8PaEao7yV7FKWehtidsPEzOPO3OqZzUdsN9L64hHn3HLWyp1E/NZ/m1xeJ6/0eN/5oJcNSVDW3Q5QfN7QI4cPfDpf6llx0sHJcFxqb/1Z1YFwNcPg3cuP3Et/6cf6Kd+VEmo0uUT60CfMg4uyvsGICuLixc8gyhn13EoBgHyMzx3TlyVnbOXG+aM+kVhG+vDgwhnE/7OCrBzuSabHy6HfbHL7F00d1ITHdwksLdwOw+pme3Pn1FlKzSs5D8TToWfRkT+ZtOUvXRgH8uP0sZ1OyaRbqw6O9G/HTznN8tbZo2wWdDt4c2or0nHyig7w5lZzJlpMXCPQycFeXKE6ez0Tv4kKXhv6EmTwwZ+fxv7+O0y7Kj3/M2YHJw403hrbmyVnbGdw6jBZhPrx/yftpdHXhs3s78OYv+zlzQQ013t+tPje1DOXtZQe4pW0EDQM9ScvKo1GwF/k2GxEmDyL8PPB2d+NcShaLdpyjWagPiekWjiRm0CzUm95Ngwk3uZOdZ+V8Ri5HEtJxd9MTZnLHRQe+Hm6E+Njf4+p8uoVcq42s3HzeX3GIFfsS6NTAn0eujybS3xNXvY7tp1JYuO0cTUK8eKBHA9YcSmLNoSTM2XmMvS6aEY2t6H8cA+e2X/yl0UOHkdD35cLqzWdTsvjr8HnWHE6ifoAnIzpHUs/PAy9jyU5pTdPIzbdhcHVBd5W7lGdZ8jmfmYslT4WwUB8jen1RiErPyeN8Ri4XMi14GV0J8jISVIFhxKthtWkkmHNISrdgybcSZvIgyNuAp0E66UXtIUHmomsqyFwqPUH1nNjbp6heR9V7se6/qoJuXjbkZpI9Zg1JVk+yLPl4Gl0J9jHg4ebgj1u+BRIPwPTBkJdV8lzvF9RqpYwENP9odLPvAk3jQr93eXBXK/bFFk2Eff22Vnz953HOpWZjzzPXh/FMW6tayr1rFvndnmJr43GM/HYnlvyiPZZCfY3Mvb8JDef2I7PF3TyTPIyVB9WS8YlDWjL779OlVmUB9GgcSMf6/nSI8sNFB2O+3erwLf3moU6cuZDNrM2nCfE10qm+H5//cczutf93c3MMrnomLim5o7beRceHI9rx9Z/H2R9XckLwz+N68eSs7ZxJUe+Fn6cbbw1rTUpmLsv2xOOq13F/t/pEB3oxduYWXr21FXoXHedSs2ke5sP42Tv4YEQ7Rk/fQr6t9P+1Y0J9GN45krd/OQCAu5sL347uSrw5h6nrTrA/1ky4nzsPX9cIf0835m45w0M9GlDP34OcPBt+nm4s2HqWbzeeIjtPhWOjqws/j7uOOVtOM33DycLhyXCTOx/f0x7NBkE+BkJ93Mm12kjJyiU7z4YLMHXdCX7eHUuTEG9G9Ywmws+d2NRsPlhxmKQMCy466BsTwsgeDVi84xxDO9Tj5PlMEsw5NA/3pUWwkWY7JkHaGdJCu5JTvy82v/pkZlvI13SY/PzJs8HtkzeQnFm0FF+ng4/vas9NrcPwcNOTZ7VxLiWbJbtisdlsNA72pkN9fzIt+VjRMLmrMObm6kJuvo30nDzc3fSFQSg330piuoXkjFz0LuDt7saHvx3i1z3x5Ns0TB5uPNWvCZF+HhxOTOfWthHEp2WTlWsl36aRlZvP2kNJPHdTM6KDSvckFZeVm09SuoX9sWbybRqt65kI8jaU6D2zWm2cz8zFpqm2exYLbLlWK9tPpfLE99tIuRjA3fQ6xt/QlKHtIth6KgWjmwtt6pkI9jFKuBE1RurICPWv0Xtmw8zbVPn9Av4N4dZPVCXb3Ew1eTWqO9zzAx6mIOqX9/6uRhVWHl+n9nY6sRa8QtC6Pgq2PLS43bi0uxudwVv1yhz7nYBdU3i2x0weXlj0Ae7v6UZieo7DlzmV7gJHlsHu2dBsMAntxvPwV7tKhBiABLOFl5bH8XWn8eTr3TlxpKgmTKS/p90QA7DxWDKP9W5EYroFTzc9Jg+3wiGO4jpE+bE/1szvBxMZ2CoUS76NDccu2Lmj0jTUh8e/L927Y7VpvLv8IM8MaFbYs1Pgp12xRAV4FgaZ94e35b3lhziSWNT2v46cp3fTIN65vS0J5hxeWbSHPKtGl4b+jOkVzYXMXLshBuBQQjpRxebbtAz3JTY1m2fn7So8duZCNhOX7GNEp0iahvrw2PfbGdQ6jLb1TKw+mMjLg5vTq0kgX6w9zsZjyTQK9mLd0SSmrT9ZeI/mYT5MGNycz38/yrqj52kc7M2bQ1vx1i8HCkOsn6cb4/o1wc/TjWnrT3LyfCYGvY6XFu4pvI9Ng98PJhLm606fmBDGfrsVq00jwMvAv25pwe74bGZZRxESbqRvTCg6Hfy45RxpWXl0qO+PrzkNTzc9zcJ82HisqA6SpsHzC3axur4fUQGe7DydytLdsVzXNIhVBxLZF5dOanYeTUK8WX0ggU4NA2gcnI+LTsf0dSfZdjqFcJM7j/dtTHSgF38cSuT1n/eTlWtl4pCWLN5xjl1n0wpfLy07j3eWHeDZAU05eT6T2NRsvvjjKJtOqN+fEB8j429oyvytZxnYKow8m40of88SPaF5VhsJ5hxW70/gjV8OYL34M9bpYHy/JozuFY2/l4G4tGzmbjnDrM2nyc61ckPzYJ7u34wGgZ646l2IS8nhoal/k2u1Fbu3xn9XHibAy8D09Sc4lpSJ3kXHO7e35pY24Xi7X/0cquJhz8ddXzjE56Z3KdVbdS3LsOSRabFidHXBz9NQ081xKN9qI86cw64zqZxNyaZdpIlGwd6le++rgQSZui6kOTzyh9oXKfm42gQyIFptdfDQErXXkd6gJgB7BlT8/npXNdn3xjfVsmS9Ad3FlTq6VrcXXTfsKzh/CLbPpJN7LBMGNuHDVcfJtdo4kphBm3p+bD9tv1hen2ZBEHW32uPp1AZOxp8vMTRV3OYTF7gweARhOz6iZUgnjiZmYHR1cXh9AU+Dnilrj+Fh0PPpvR147Lut5OQV/aEP8THy7I3NeHbuTvw8Dbi76bmQmUuAl/0/8EZXF7JyrSXuUVxcWg5+nqWfez49t/Bf+d0bBbDjdGqJEFPgzyPneaB7A/678jB5VvWBtuVkCmOviy4V8C6lURRyRveK5o2f99u9bsH2s0wf1YVvN55k+d54hrSN4HB8Ol//eZwofw9G9WzI6eQs7ugYyXebThc+z0UHr9zcgnE/bMeco973FwfG8OSs7YU9AACpWXm89csBPhjRlphQH25pG243+AHc2DKUh2eqEGN0deG/d7XjzaX7OZZUNEz4wcojTBzSijMXslmxL575287SKMiLiUNa8kSfRmw6nlxiMnueVWNvrBmDqwvL9sQR4GXgkZlFr79yfwKhvkbeH96Ot5cd4JXBzXlk5rbCAHAwPp0/DiXx4sAYjiZlkJWrPnzCTR4lQkxx0zecZNbYboyesYXE9KKgnZhu4d8/7eW/d7UjKT2HZ+buItTXnRmjuxAV4ElKZi4/74klzMediZf8vDQNPv39KJ0bBtAizIex325lf7EezyW74lh1IJGfx19H42Bvlu6JKxFiipu58STDO0Xy7vJDWG0aLy3cQ5tIP1qGX12QSc3K5eddsbyz7CBPD2iKpmlMW3+SpHQLJg83Hu3diLs6R1VohV5dk5Wbz/GkTD5edZi958xE+HnwdP8mtI30w9+rdgWafKuNnWdSeWja32TlFk1baBzsxbdjupa5OKEqSAS+FpjqqZ2fu4yBhr1U8TcXvToe2krtTXQlIaY4VwN4BTlebuwTqlYS3fEN/q1v4qFejVn9zz4seKw7g1oG8fKgptibkhDiY6RLdJCqMRPeHloNw0zZXe/ZLl5kdXyUx65vgIsOLPk2/MpYlePqoiMnz8axpEz2njOzYm8ccx/twUuDYnigW33eHNqa125rxSuL9pCcmcv1TYPYcTqVv08kM6annSJ6F3m4lT0R1t6gbueG/hyMVx9CfWNCWLYnzuHz52w5w3VNg0oce/uXAzQK9sbFwfSOxsHexKcV9X6F+bqTlGGxe62mqd6ZwIt/RP86kkSnhv6sPpBAj8aBfLr6CA90r0+gl4HYYsOCfZqFsPpgYmGIaRLizcnkrBIhprip607wj/5NSMvO42xK6eHFFuE+7DmXVtgDMaRdBD9uP1cixBS0942f93FPl6KKysfPZ7J4ZyznM3LpFl36dzzTkk9yZi69mwXz0aojpc4nmC18v+kULw+O4c1fDtgNAB/8doghbdVmoKG+7iSV0bvo6+7GoYT0EiGmuG/+Oo6HwRV/LzeOJWXw8sLdpGblsvJAAttPprJkl+P6SpP/OEpsWk6JEFMgK9fKp6uPYMnLt3u+wOkLWYRc8i/qWZtOYXUQfMpr55lU/v3TPvrEBJOWlce7yw+RdPE9SMvO4/0Vh/jvb4eu2ZpHmqbx94kLDPl8HasOJBJvzmH76RRGTt/C95tOkXmZf4hVtwRzDqOnbykRYgCOJWXyxs/7ycip3vY6RZCZPHkyDRs2xN3dnW7duvH333/XdJPEldLpQKfDw+BKVIAnnaMDaRUZSKt6/swY1ZX6AUVJ/vqmQcx9rDv1/D3AxUUFr8guNK0X5PD2gV4GLmRbmXfMle+3JfLBiHYEexvZfjqFPs3sb9g4rEM9ft1bFBg2n7iAi04N4Rw7n8mUP4/x5KztnE3Jxt/TjX4xweRZ8/nm3la08M7ikeujS91zSNtwgn2MGF3t/18szNcd8yV/tBsEelLPz6NwIq6LTudwiAjUEJX+kvSXlGEhKzefx/s0LnW9m17HP29qxsyNpwjyNvDKzS3wMpYdtjyNeiwXe5VsGujQYdMgN19jX6yZhkFenEzOpGV4UYBtGeHL1pNFQ24NAz05FO/4w/NgfDohvu5k51rxMpRuj5fBtcRQX7+YkBKr24qzabAv1kyz0KKwu2xPHME+Rrtd3u2j/HDT69h9NtVh+1YfTCTEx52jdnrGCl7z1IUsQn2NZFjyifDzcHivJiHebDvlYJsO4EBcOn4eblzIUPN51h9LJjHdwoe/HSLAy40Es+OQFG/O4UxKlsPzq/YnkJqVR0yYT5nty7nkw+nMhSzybFceZC5kWnh/xSEAhrWvx/QNJ+xeN2frGZIzcu2eq+sSzBZeXrjH7j9uPl59hPMO/rFRU44lZZLuIFytOpBAcmb1trfWB5m5c+fy3HPPMXHiRLZv3067du0YOHAgiYl29vYRTsvL6EqfmGAWPN6DVc/1Yc0LfZl8X0e7Ex+DvQ3c3j7C7n2eGdCMBoFe3NOlPkPb12PnqQu8PrQVXaMDmDikJbd3qIf+YneF0dWFe7pE0bNxIHO3FBUDHN0rmkm/HuTxPo2J9PMgNSsPDzc9d3Sox7zHehDsY+Q/t0RTb+t/8P9fFx6NPMPiJ7szrl9jHu/TiG8e6sRt7SNwc9ExYXDzUm3Uu+h4+/bWrDuitpQw6F24o2M9vri/I656XWH42XgsmQEtQks9v8DQ9hFsOl5y/6ucPBtHEzLw83Tjk3vac12TIBoHezO0fQSzH+1O/QBPPr67PXMe7U6PRgF4GfS0jbRTARk13OZlcC38g9W7aRDbTl/A6OpS+B666HTM23KWJ/sVBadMS36JYbOkdIsKow7U8/PgQmYup5IzuaNjZKnzR5MySrRRp8Ph0AiAOSevxARVS74Nd1d9iV4jgNs7RBDsY8TPw+BwCBBUYLzckghdsf8GeRvxtzNsCGqydbjJ8XsR7G0k12ojs1iYyM5VdYKOJWXSup79nxVAx/r+ZJXxL3dPgys5+Tba1DPZDYwAT/RpXGoC+vXNgjFexTJ7S76N4xd7z2ya5vC91jSIS7M/4b+uS83OJd5BSLXaNI4n2Q/RNSW5jGBl07js8HZlq/VB5r///S+PPPIIo0ePpmXLlnz11Vd4enoybdq0mm6aqAIhvu40CfGmYaCXwyJtJk8Dr9zSkldublE47NE42JuvH+zEzW3CiArwxN/LQPdGgbwwuAVdGgbQuaE/jYK9efv21vzxzz78+vT1LB1/HZ4GPc/P34VNUyt4JgxuznVNg7iva31OJWfyWO9G/PKP6/j16et59sZm+Lq7UT/Ak3xXb1J6/YucJ7biF9mM1sGuPNi9Ibd3qIfJww3Q4aLX0aNRIPMe686gVmG0CPdheKdIvhvTlV/2xNE01IcpD3bip6d60q6eia/WHsOod2HeYz24uU0Yu8+mcGPLUMJNpXsS2tbzpVWEL+l2unD/u+owNzQPYekutRrotvYRuLroWLT9HIcT0nHTu9AkxIc2kX40CPLmwxHtSn3wurroeHNoa6atV/96HtAihNi0HMzZ+YzoHMWve+PoFh3Aofh0RnSOxMug5/P7OhDsY+TXvXHc3qFe4b12nU2jQ5Q/BgeTOR/o3oCv1x6jSYg3PRoH0rNxye0f8vLVKqJWEarX58yFLJqX0avQNtJUovekbaSJQG8DbnoXvI2uNA724pWbW/Bo78b4eRrw83KjX3P7vXWgem3M2XklenmK07voiArwJMFsIcOST0qWhfftvKfto/zo3NCf1vV8cdPbH/t7+PpoJv9xtPBrdzcXfNxd8Ta68teRJPrFhOBpJ4S46XU80bcxLSIcr+y4v1t9vAx6Fmw7w8f3tKdBYFHvp4/RlZcHN8dV78Lec0Xze3w9XBnUKuyqlqIb9S5EB3kVtrMs3sZrc9rmpT2rl3KrxHpNlaF5uOPfs0AvAz7V/HOs1cuvc3Nz8fT0ZMGCBQwbNqzw+MiRI0lNTeWnn34q9RyLxYLFUpQWzWYzUVFR1+by6zrOZtNITM8h36bh7qq/ohocCeYcLmTmkptvI9DbQLC3EeNl5rZUVFpWLrlWG5oGHm4upGXncy4tG4PehVBfd4K9DcSbLcSmZpOWnUfjEG98ja5k51lxd9NjybexcPtZluyMxeDqwv3d6nNjyzAMeh0J6RZe/3kfm46roZz6AZ68Oaw1XRr6k5qVS6LZQmKGBVedjrMpWfRoHETDQC/cLhnyOpuSxfqj59lwNJnGId70ahLIwm3nOJSQzoPdG5CTZ+XNpfu5vWMkbSNNvP3Lfr4b240T5zM5kZTB0A71aBDgSUK6hdSsXIyueqZvOMl3G08Baon7fV3r83+L92DOVuFLp4P7u9anT0wwZ1OyubFlKCeTMzkcn05UgCfHkjIJ8jbQNtIPNBvmHCvztp5lx+kUnu7flPFzdpTqKenUwJ9b24bz+sUJsS46mPVwd+ZvO0Ogl5Gmod6kZuWx+0wK/x7SqnC4KT4tm1d/2sdv+xNK3M9Nr2PyfR2Z8ucxnurXhCe+317qX5v/d3MLogI8eX7+LjIs+Xwwoi2Ltp/lnq4NyM23Yc7Jo1WEidjULF5bso/eTYO5pW0Ez8zdWbiEHWBIu3AGtAjl6Tk7C4893b8pj/VuxBdrjvL5H8doF2lifP+mhRNCQYX4d+9sQ9tIE5m5Vr784xhf/1Wy5ELLcB+mjupCuMmD3/bF8/ayA4zpFU24yR2rpmG1aSzafo7RvRrywFQ1dN+5oT/vDGtD01Dvq66ps/pAAmO/3cqLA2NYtjeusO3Fhfm6s/ipnoSV0WNVV51Pt3DPN5vsDl+6u7mw6rk+1T6BtiwXMi08N3cXaw6X3qj4veFtGd4xUhWqvEp1oo5MbGws9erVY8OGDfTo0aPw+IsvvsjatWvZvHlzqee89tprvP7666WOS5ARzsxqtXEhKxcXnY5A75KBLTUrl9SsPPJtGr7urqUmayalW7DabPheUk/EnvScPNKy88i05GNwdcHDVU+ezUZyRi7Z+Ta2nLiAQe/C4DZhuLu6YNXUMmp7tUZSs3JJMOew5mLF45tahYKmloCn5eQR6uPO2ZQsOjVQvWXubno0TRVqS8nMRa/XYXJ3I9jHnczcfE6ez2TziQtEB3kR6msky2Jl0vKD7Didiq+HKw92b8CAFqE8+f024tMtdG0YwMuDmxPkZeCdXw/y+8FEvI2u3N+tPvd2q19qiCcpPYff9iXwzV/HScnKo0tDfx7s3oBFO87RItyX2zvUI8OSz3ebTrHl5AXqmTx4tE+jwuXbVjWJCB+jK36eBsZ+u4WcPBu+Hq5oGjx8XTTdGwWy7VQK+2LT6BsTgouLjpxcK01DvTmamMELC3aTlWvF192VJ/s2ZkTnKAK9jSSm5/Dakn0s2xNPuMmdB7s3oFmoD+Emd4J9jSUKDqZk5XLmQhZzt5zBnJ3HsA71aBVhIuxiz15KZi4Lt5/lg98OFQ7zhJvc+fL+jkQFeJCalY/eRYefp1ulLf9NzcplwbazTF9/gkl3tOWFBbtIMBf9g9PXw5XZj3SnZbjvVYcmZ7X7bCp3T9lUItzqdPDZPR24qVVopVbRrgwJ5hz+99dxZm0+TVaulQiTOy8Nak6fmOBK+725ZoOM9MgIUTVy823kWW14uOmv6l9b59MtmLNzybOpEFSRuhM5eVZy8qx4GfW46fWkZOaSlZuPy8XtCmw2jQtZudg0Ncen4A9qpiUPc3Y+Op2OIG8DrmXULElKt5Bvs2HUu5Bn1dC5QJCXsfB7zs23qjofbi6FAS7Tks/5dAubT14gJ8/KdU0CcdPriUvLJi4th0bB3vh7uhGflsPOM6nUD/CkZYQv4SaPwvlGOXnWwkq7ngZXQnyMJdqZmpXL+YxcTp7PxOTpRj0/D8J83cv8WWiaZjcYWPKsJGWomi6ueh1BXkZC7QxhViZLnqojY87Ow93NhRPJWRyIM9M0xJvW9UzU8/O4ZkMMqCXN51KzWbTjHFtOXqBxsDf3d6tPVIBnrS1KmJtvJSkjl7x89Xehsn+H6kSQuZKhpUtd05V9hRBCOBWbTSMn34pB71Jm4L4WlPfzu1a/SwaDgU6dOrF69erCYzabjdWrV5fooRFCCCHqAhcXHZ4G12s+xFRE7eyvKua5555j5MiRdO7cma5du/Lxxx+TmZnJ6NGja7ppQgghhKhhtT7I3H333SQlJfHqq68SHx9P+/btWb58OaGhjutrCCGEEOLaUKvnyFQGmSMjhBBCOJ86MUdGCCGEEKIsEmSEEEII4bQkyAghhBDCaUmQEUIIIYTTkiAjhBBCCKclQUYIIYQQTkuCjBBCCCGcVq0viHe1CsrkmM2lt40XQgghRO1U8Ll9uXJ3dT7IpKenAxAVFVXDLRFCCCFERaWnp2MymRyer/OVfW02G7Gxsfj4+JS5RbzZbCYqKoozZ85IBeAyyPt0efIelY+8T+Uj79PlyXtUPs72PmmaRnp6OhEREbi4OJ4JU+d7ZFxcXIiMjCz39b6+vk7xA65p8j5dnrxH5SPvU/nI+3R58h6VjzO9T2X1xBSQyb5CCCGEcFoSZIQQQgjhtCTIXGQ0Gpk4cSJGo7Gmm1Kryft0efIelY+8T+Uj79PlyXtUPnX1farzk32FEEIIUXdJj4wQQgghnJYEGSGEEEI4LQkyQgghhHBaEmSEEEII4bSuqSAzefJkGjZsiLu7O926dePvv/8u8/r58+fTvHlz3N3dadOmDcuWLaumltacirxHM2bMQKfTlXi4u7tXY2trxp9//smQIUOIiIhAp9OxePHiyz5nzZo1dOzYEaPRSJMmTZgxY0aVt7MmVfQ9WrNmTanfJZ1OR3x8fPU0uIZMmjSJLl264OPjQ0hICMOGDePQoUOXfd619LfpSt6ja/Fv05dffknbtm0Li9316NGDX3/9tczn1JXfo2smyMydO5fnnnuOiRMnsn37dtq1a8fAgQNJTEy0e/2GDRu49957GTt2LDt27GDYsGEMGzaMvXv3VnPLq09F3yNQFSLj4uIKH6dOnarGFteMzMxM2rVrx+TJk8t1/YkTJ7jlllvo168fO3fu5JlnnuHhhx9mxYoVVdzSmlPR96jAoUOHSvw+hYSEVFELa4e1a9fy1FNPsWnTJlauXEleXh433XQTmZmZDp9zrf1tupL3CK69v02RkZH85z//Ydu2bWzdupUbbriBoUOHsm/fPrvX16nfI+0a0bVrV+2pp54q/NpqtWoRERHapEmT7F5/1113abfcckuJY926ddMee+yxKm1nTaroezR9+nTNZDJVU+tqJ0BbtGhRmde8+OKLWqtWrUocu/vuu7WBAwdWYctqj/K8R3/88YcGaCkpKdXSptoqMTFRA7S1a9c6vOZa/NtUXHneI/nbpPj7+2v/+9//7J6rS79H10SPTG5uLtu2bWPAgAGFx1xcXBgwYAAbN260+5yNGzeWuB5g4MCBDq93dlfyHgFkZGTQoEEDoqKiykz/17Jr7XfparRv357w8HBuvPFG1q9fX9PNqXZpaWkABAQEOLzmWv99Ks97BNf23yar1cqcOXPIzMykR48edq+pS79H10SQOX/+PFarldDQ0BLHQ0NDHY7Bx8fHV+h6Z3cl71FMTAzTpk3jp59+4vvvv8dms9GzZ0/Onj1bHU12Go5+l8xmM9nZ2TXUqtolPDycr776ioULF7Jw4UKioqLo27cv27dvr+mmVRubzcYzzzxDr169aN26tcPrrrW/TcWV9z26Vv827dmzB29vb4xGI48//jiLFi2iZcuWdq+tS79HdX73a1F1evToUSLt9+zZkxYtWjBlyhTefPPNGmyZcDYxMTHExMQUft2zZ0+OHTvGRx99xHfffVeDLas+Tz31FHv37mXdunU13ZRaq7zv0bX6tykmJoadO3eSlpbGggULGDlyJGvXrnUYZuqKa6JHJigoCL1eT0JCQonjCQkJhIWF2X1OWFhYha53dlfyHl3Kzc2NDh06cPTo0apootNy9Lvk6+uLh4dHDbWq9uvates187s0btw4li5dyh9//EFkZGSZ115rf5sKVOQ9utS18rfJYDDQpEkTOnXqxKRJk2jXrh2ffPKJ3Wvr0u/RNRFkDAYDnTp1YvXq1YXHbDYbq1evdjh+2KNHjxLXA6xcudLh9c7uSt6jS1mtVvbs2UN4eHhVNdMpXWu/S5Vl586ddf53SdM0xo0bx6JFi/j999+Jjo6+7HOutd+nK3mPLnWt/m2y2WxYLBa75+rU71FNzzauLnPmzNGMRqM2Y8YMbf/+/dqjjz6q+fn5afHx8ZqmadqDDz6ovfzyy4XXr1+/XnN1ddU++OAD7cCBA9rEiRM1Nzc3bc+ePTX1LVS5ir5Hr7/+urZixQrt2LFj2rZt27R77rlHc3d31/bt21dT30K1SE9P13bs2KHt2LFDA7T//ve/2o4dO7RTp05pmqZpL7/8svbggw8WXn/8+HHN09NTe+GFF7QDBw5okydP1vR6vbZ8+fKa+haqXEXfo48++khbvHixduTIEW3Pnj3a008/rbm4uGirVq2qqW+hWjzxxBOayWTS1qxZo8XFxRU+srKyCq+51v82Xcl7dC3+bXr55Ze1tWvXaidOnNB2796tvfzyy5pOp9N+++03TdPq9u/RNRNkNE3TPvvsM61+/fqawWDQunbtqm3atKnwXJ8+fbSRI0eWuH7evHlas2bNNIPBoLVq1Ur75ZdfqrnF1a8i79EzzzxTeG1oaKh28803a9u3b6+BVlevgqXClz4K3puRI0dqffr0KfWc9u3bawaDQWvUqJE2ffr0am93daroe/Tuu+9qjRs31tzd3bWAgACtb9++2u+//14zja9G9t4joMTvx7X+t+lK3qNr8W/TmDFjtAYNGmgGg0ELDg7W+vfvXxhiNK1u/x7pNE3Tqq//RwghhBCi8lwTc2SEEEIIUTdJkBFCCCGE05IgI4QQQginJUFGCCGEEE5LgowQQgghnJYEGSGEEEI4LQkyQgghhHBaEmSEEEII4bQkyAghhBDCaUmQEUJUilGjRqHT6dDpdLi5uREdHc2LL75ITk5OievOnj2LwWCgdevWdu9TcA+dToeXlxdNmzZl1KhRbNu2rfCa8ePH06JFC7vPP336NHq9niVLlhQemzRpEnq9nvfff7/U9TNmzCh8Pb1ej7+/P926deONN94gLS2t1Pc4bNiw8r4lQohqIEFGCFFpBg0aRFxcHMePH+ejjz5iypQpTJw4scQ1M2bM4K677sJsNrN582a795k+fTpxcXHs27ePyZMnk5GRQbdu3Zg5cyYAY8eO5eDBg2zYsKHUc2fMmEFISAg333xz4bFp06bx4osvMm3aNLuv5+vrS1xcHGfPnmXDhg08+uijzJw5k/bt2xMbG3ulb4cQohpIkBFCVBqj0UhYWBhRUVEMGzaMAQMGsHLlysLzmqYxffp0HnzwQe677z6mTp1q9z5+fn6EhYXRsGFDbrrpJhYsWMD999/PuHHjSElJoX379nTs2LFUMNE0jRkzZjBy5EhcXV0BWLt2LdnZ2bzxxhuYzWa74Uen0xEWFkZ4eDgtWrRg7NixbNiwgYyMDF588cVKfIeEEJVNgowQokrs3buXDRs2YDAYCo/98ccfZGVlMWDAAB544AHmzJlDZmZmue737LPPkp6eXhiMxo4dy7x580o8f82aNZw4cYIxY8YUHps6dSr33nsvbm5u3HvvvQ7D06VCQkK4//77WbJkCVartVzPEUJUPwkyQohKs3TpUry9vXF3d6dNmzYkJibywgsvFJ6fOnUq99xzD3q9ntatW9OoUSPmz59frns3b94cgJMnTwJw3333kZeXV+L506dP57rrrqNZs2YAmM1mFixYwAMPPADAAw88wLx588jIyCj3a6anp5OcnFyu64UQ1U+CjBCi0vTr14+dO3eyefNmRo4cyejRo7nzzjsBSE1N5ccffywMFaCCRXl7SDRNA9QwEKjhpzvuuKNweMlsNrNw4ULGjh1b+JzZs2fTuHFj2rVrB0D79u1p0KABc+fOvaLXFELUPq413QAhRN3h5eVFkyZNADXBtl27dkydOpWxY8fyww8/kJOTQ7du3Qqv1zQNm83G4cOHC3tRHDlw4AAA0dHRhcfGjh1L//79OXr0KH/88Qd6vZ4RI0YUnp86dSr79u0rnC8DYLPZmDZtWonAU9Zr+vr6EhgYWL43QAhR7STICCGqhIuLC6+88grPPfdc4cTef/7zn4waNarEdU8++STTpk3jP//5T5n3+/jjj/H19WXAgAGFx/r160d0dDTTp0/njz/+4J577sHLywuAPXv2sHXrVtasWUNAQEDhcy5cuEDfvn05ePBg4XCVPYmJifzwww8MGzYMFxfpvBaitpIgI4SoMiNGjOCFF15g8uTJbN++nVmzZpUKD/feey9vvPEGb731VmHPSWpqKvHx8VgsFg4fPsyUKVNYvHgxM2fOxM/Pr/C5Op2OMWPG8N///peUlBQ++uijwnNTp06la9eu9O7du1S7unTpwtSpUwvrymiaRnx8PJqmkZqaysaNG3nnnXcwmUyXDVhCiJol/8wQQlQZV1dXxo0bx4QJE2jYsKHdHpDbb7+dxMREli1bVnhs9OjRhIeH07x5c5544gm8vb35+++/ue+++0o9f9SoUaSlpdGqVavCYavc3Fy+//77wvk5l7rzzjuZOXMmeXl5gJpfEx4eTr169ejRowdTpkxh5MiR7Nixg/Dw8MLn2Wy2EsNUQoiap9MKZrMJIYQo06BBg2jSpAmff/55TTdFCHGR9MgIIcRlpKSksHTpUtasWVNijo4QouZJH6kQQlzGmDFj2LJlC//85z8ZOnRoTTdHCFGMDC0JIYQQwmnJ0JIQQgghnJYEGSGEEEI4LQkyQgghhHBaEmSEEEII4bQkyAghhBDCaUmQEUIIIYTTkiAjhBBCCKclQUYIIYQQTuv/AWsUf16+/7VuAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "sns.scatterplot(data=brown2, hue='category', x='RADVADJ', y='RADJPRON')" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": { + "id": "RlJIiE68Xqm7" + }, + "outputs": [], + "source": [ + "# replace the text labels by numbers\n", + "brown3=brown2.replace(to_replace='nonfiction',value='0')\n", + "brown3=brown3.replace(to_replace='fiction',value='1')" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "id": "HoCqZquPXqm7" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
categoryRADJPRONRADVADJ
010.2188451.861111
110.2275642.028169
210.2648401.689655
310.5000000.958678
410.2182891.918919
............
49510.7231640.906250
49610.5317071.238532
49710.5122951.072000
49811.0110500.459016
49910.4484131.035398
\n", + "

324 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " category RADJPRON RADVADJ\n", + "0 1 0.218845 1.861111\n", + "1 1 0.227564 2.028169\n", + "2 1 0.264840 1.689655\n", + "3 1 0.500000 0.958678\n", + "4 1 0.218289 1.918919\n", + ".. ... ... ...\n", + "495 1 0.723164 0.906250\n", + "496 1 0.531707 1.238532\n", + "497 1 0.512295 1.072000\n", + "498 1 1.011050 0.459016\n", + "499 1 0.448413 1.035398\n", + "\n", + "[324 rows x 3 columns]" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "brown3" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": { + "id": "-boFZ9upXqm8" + }, + "outputs": [], + "source": [ + "x=brown3.drop(columns=['category'])\n", + "y=brown3.category" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": { + "id": "gQ47qa8xXqm8" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
RADJPRONRADVADJ
00.2188451.861111
10.2275642.028169
20.2648401.689655
30.5000000.958678
40.2182891.918919
.........
4950.7231640.906250
4960.5317071.238532
4970.5122951.072000
4981.0110500.459016
4990.4484131.035398
\n", + "

324 rows × 2 columns

\n", + "
" + ], + "text/plain": [ + " RADJPRON RADVADJ\n", + "0 0.218845 1.861111\n", + "1 0.227564 2.028169\n", + "2 0.264840 1.689655\n", + "3 0.500000 0.958678\n", + "4 0.218289 1.918919\n", + ".. ... ...\n", + "495 0.723164 0.906250\n", + "496 0.531707 1.238532\n", + "497 0.512295 1.072000\n", + "498 1.011050 0.459016\n", + "499 0.448413 1.035398\n", + "\n", + "[324 rows x 2 columns]" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": { + "id": "BKgWQWOWXqm8" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0 1\n", + "1 1\n", + "2 1\n", + "3 1\n", + "4 1\n", + " ..\n", + "495 1\n", + "496 1\n", + "497 1\n", + "498 1\n", + "499 1\n", + "Name: category, Length: 324, dtype: object" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": { + "id": "I_Q3e3qAXqm8" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
LogisticRegression()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" + ], + "text/plain": [ + "LogisticRegression()" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)\n", + "logreg = LogisticRegression(solver='lbfgs')\n", + "logreg.fit(x_train,y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": { + "id": "t9n6zh-RXqm8" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training Accuracy : 0.9613899613899614\n" + ] + } + ], + "source": [ + "# Training accuracy\n", + "\n", + "y_pred=logreg.predict(x_train)\n", + "accuracy = metrics.accuracy_score(y_train,y_pred)\n", + "print(\"Training Accuracy : \",accuracy)" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": { + "id": "POyF3prUXqm9" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Testing Accuracy : 0.9846153846153847\n" + ] + } + ], + "source": [ + "# Testing accuracy\n", + "\n", + "y_pred=logreg.predict(x_test)\n", + "accuracy = metrics.accuracy_score(y_test,y_pred)\n", + "print(\"Testing Accuracy : \", accuracy)" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": { + "id": "EhQHeonVXqm9" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[38, 0],\n", + " [ 1, 26]])" + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cm = confusion_matrix(y_test,y_pred)\n", + "cm" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": { + "id": "TRbMNr_BYMbN" + }, + "outputs": [ + { + "data": { + "image/png": "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APVzrlXkzuaNXE5cli9frv/5n//RyJEj5e/v79jfs2dPff311x4NDgAA1M+5ybnubN7I5cTlu+++U1xc3Hn7a2pqVFVV5ZGgAAAAauNy4pKQkKAPP/zwvP2vv/66rrzySo8EBQAA3GN4YPNGLq8qevzxx5WamqrvvvtONTU1evPNN5Wfn6/ly5crKyurIWIEAAAuYlXRT1JSUrRhwwa99957atGihR5//HHl5eVpw4YNuummmxoiRgAAAEn1vI/L9ddfr82bN3s6FgAA4CF+xtnNnfO9Ub1vQLdr1y7l5eVJOjvvpXfv3h4LCgAAuMesrSKXE5eDBw/q7rvv1scff6zw8HBJ0vHjx3XNNddo9erVateunadjBAAAkFSPOS4PPvigqqqqlJeXp2PHjunYsWPKy8tTTU2NHnzwwYaIEQAA1IPZbj4n1aPikpOTo08++UTx8fGOffHx8fr73/+u66+/3qPBAQCA+qFV9BObzVbrjeaqq6sVExPjkaAAAIB7zDo51+VW0V//+ldNnDhRu3btcuzbtWuXHnnkET3zzDMeDQ4AAODn6pS4tGzZUhEREYqIiND999+v3Nxc9enTRxaLRRaLRX369NGnn36q0aNHN3S8AACgDs61itzZXJGenq6rr75aoaGhatOmjW677Tbl5+c7HXPq1CmNHz9erVq1UkhIiIYPH67Dhw+7dJ06tYrmz5/v0qAAAKBpuXvbflfPzcnJ0fjx43X11VfrzJkz+q//+i8NHDhQX331lVq0aCFJmjx5st5++2394x//UFhYmCZMmKBhw4bp448/rvN16pS4pKamuhg+AAAwg7KyMqfX57otv7Rx40an15mZmWrTpo12796tvn37qrS0VEuXLtWqVat0ww03SJKWLVumbt26afv27frd735Xp3hcnuPyc6dOnVJZWZnTBgAAmp6fYbi9SWcX5YSFhTm29PT0Ol2/tLRUkhQRESFJ2r17t6qqqpScnOw4pmvXrmrfvr22bdtW58/l8qqiiooKTZs2TWvWrNHRo0fPe7+6utrVIQEAgIe5ez+Wc+cWFxfLarU69tdWbfmlmpoaTZo0Sddee626d+8uSTp06JACAgIcN689JzIyUocOHapzXC5XXB599FG9//77ysjIkMVi0UsvvaTZs2crJiZGy5cvd3U4AADgxaxWq9NWl8Rl/Pjx+vLLL7V6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Tp8+7Xi9ZcsW5efna/PmzcrKylJVVZUGDRqk0NBQffjhh/r4448VEhKiwYMHO87729/+pszMTL388sv66KOPdOzYMa1du/ai1x01apReffVVLVy4UHl5eVqyZIlCQkJks9n0xhtvSJLy8/NVUlKiBQsWSJLS09O1fPlyLV68WP/61780efJk3XvvvcrJyZF0NsEaNmyYbrnlFuXm5urBBx/U9OnTXf6ZhIaGKjMzU1999ZUWLFigF198Uc8995zTMfv27dOaNWu0YcMGbdy4UZ999pnGjRvneH/lypV6/PHHNXfuXOXl5empp57SY489pldeecXleADUgx2Az0tNTbWnpKTY7Xa7vaamxr5582a7xWKxT5061fF+ZGSkvbKy0nHOihUr7PHx8faamhrHvsrKSntQUJB906ZNdrvdbo+OjrbPmzfP8X5VVZW9Xbt2jmvZ7XZ7v3797I888ojdbrfb8/Pz7ZLsmzdvrjXODz74wC7J/uOPPzr2nTp1yh4cHGz/5JNPnI594IEH7HfffbfdbrfbZ8yYYU9ISHB6f9q0aeeN9UuS7GvXrr3g+3/961/tvXv3dryeOXOm3d/f337w4EHHvnfffdfu5+dnLykpsdvtdnvnzp3tq1atchrniSeesCclJdntdru9sLDQLsn+2WefXfC6AOqPOS6ASWRlZSkkJERVVVWqqanRPffco1mzZjne79Gjh9O8ls8//1z79u1TaGio0zinTp1SQUGBSktLVVJSoj59+jjea9asma666qrz2kXn5Obmyt/fX/369atz3Pv27dPJkyd10003Oe0/ffq0rrzySklSXl6eUxySlJSUVOdrnPPaa69p4cKFKigoUHl5uc6cOSOr1ep0TPv27dW2bVun69TU1Cg/P1+hoaEqKCjQAw88oDFjxjiOOXPmjMLCwlyOB4DrSFwAkxgwYIAyMjIUEBCgmJgYNWvm/J93ixYtnF6Xl5erd+/eWrly5XljXXbZZfWKISgoyOVzysvLJUlvv/22U8IgnZ234ynbtm3TyJEjNXv2bA0aNEhhYWFavXq1/va3v7kc64svvnheIuXv7++xWAFcGIkLYBItWrRQXFxcnY//zW9+o9dee01t2rQ5r+pwTnR0tHbs2KG+fftKOltZ2L17t37zm9/UenyPHj1UU1OjnJwcJScnn/f+uYpPdXW1Y19CQoIsFouKioouWKnp1q2bY6LxOdu3b//1D/kzn3zyiTp06KA///nPjn3ffvvteccVFRXp+++/V0xMjOM6fn5+io+PV2RkpGJiYrR//36NHDnSpesD8Awm5wKXqJEjR6p169ZKSUnRhx9+qMLCQmVnZ+vhhx/WwYMHJUmPPPKInn76aa1bt05ff/21xo0bd9F7sHTs2FGpqakaPXq01q1b5xhzzZo1kqQOHTrIMAxlZWXphx9+UHl5uUJDQzV16lRNnjxZr7zyigoKCvTpp5/q73//u2PC60MPPaS9e/fqT3/6k/Lz87Vq1SplZma69Hm7dOmioqIirV69WgUFBVq4cGGtE40DAwOVmpqqzz//XB9++KEefvhhjRgxQlFRUZKk2bNnKz09XQsXLtQ333yjPXv2aNmyZXr22WddigdA/ZC4AJeo4OBgbd26Ve3bt9ewYcPUrVs3PfDAAzp16pSjAvPHP/5R9913n1JTU5WUlKTQ0FD9/ve/v+i4GRkZuv322zVu3Dh17dpVY8aMUUVFhSSpbdu2mj17tqZPn67IyEhNmDBBkvTEE0/oscceU3p6urp166bBgwfr7bffVqdOnSSdnXfyxhtvaN26derZs6cWL16sp556yqXPe+utt2ry5MmaMGGCevXqpU8++USPPfbYecfFxcVp2LBhGjp0qAYOHKjExESn5c4PPvigXnrpJS1btkw9evRQv379lJmZ6YgVQMMy7BeaZQcAAOBlqLgAAACfQeICAAB8BokLAADwGSQuAADAZ5C4AAAAn0HiAgAAfAaJCwAA8BkkLgAAwGeQuAAAAJ9B4gIAAHwGiQsAAPAZ/z+mLz9TdPw3HAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=['nonfiction', 'fiction'])\n", + "disp.plot(cmap=plt.cm.Blues) # plot the confusion matrix\n", + "plt.show() # show the plot" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": { + "id": "bQBE0NTlYjoc" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1.34674492]\n", + "[[-3.96302032 2.06307081]]\n" + ] + } + ], + "source": [ + "# Parameter values of Logistic Regression after training\n", + "print(logreg.intercept_)\n", + "print(logreg.coef_)" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/su-do-coders/core/home/__init__.py b/su-do-coders/core/home/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/su-do-coders/core/home/__pycache__/__init__.cpython-310.pyc b/su-do-coders/core/home/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000..8ba678b Binary files /dev/null and b/su-do-coders/core/home/__pycache__/__init__.cpython-310.pyc differ diff --git a/su-do-coders/core/home/__pycache__/__init__.cpython-312.pyc b/su-do-coders/core/home/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000..4b67616 Binary files /dev/null and b/su-do-coders/core/home/__pycache__/__init__.cpython-312.pyc differ diff --git a/su-do-coders/core/home/__pycache__/admin.cpython-310.pyc b/su-do-coders/core/home/__pycache__/admin.cpython-310.pyc new file mode 100644 index 0000000..9e7bf9f Binary files /dev/null and b/su-do-coders/core/home/__pycache__/admin.cpython-310.pyc differ diff --git a/su-do-coders/core/home/__pycache__/admin.cpython-312.pyc b/su-do-coders/core/home/__pycache__/admin.cpython-312.pyc new file mode 100644 index 0000000..65025c5 Binary files /dev/null and b/su-do-coders/core/home/__pycache__/admin.cpython-312.pyc differ diff --git a/su-do-coders/core/home/__pycache__/apps.cpython-310.pyc b/su-do-coders/core/home/__pycache__/apps.cpython-310.pyc new file mode 100644 index 0000000..cf3b9f5 Binary files /dev/null and b/su-do-coders/core/home/__pycache__/apps.cpython-310.pyc differ diff --git a/su-do-coders/core/home/__pycache__/apps.cpython-312.pyc b/su-do-coders/core/home/__pycache__/apps.cpython-312.pyc new file mode 100644 index 0000000..4ffca09 Binary files /dev/null and b/su-do-coders/core/home/__pycache__/apps.cpython-312.pyc differ diff --git a/su-do-coders/core/home/__pycache__/models.cpython-310.pyc b/su-do-coders/core/home/__pycache__/models.cpython-310.pyc new file mode 100644 index 0000000..d6136d7 Binary files /dev/null and b/su-do-coders/core/home/__pycache__/models.cpython-310.pyc differ diff --git a/su-do-coders/core/home/__pycache__/models.cpython-312.pyc b/su-do-coders/core/home/__pycache__/models.cpython-312.pyc new file mode 100644 index 0000000..66ae0d1 Binary files /dev/null and b/su-do-coders/core/home/__pycache__/models.cpython-312.pyc differ diff --git a/su-do-coders/core/home/__pycache__/seed.cpython-312.pyc b/su-do-coders/core/home/__pycache__/seed.cpython-312.pyc new file mode 100644 index 0000000..397c988 Binary files /dev/null and b/su-do-coders/core/home/__pycache__/seed.cpython-312.pyc differ diff --git a/su-do-coders/core/home/__pycache__/views.cpython-310.pyc b/su-do-coders/core/home/__pycache__/views.cpython-310.pyc new file mode 100644 index 0000000..abd4d01 Binary files /dev/null and b/su-do-coders/core/home/__pycache__/views.cpython-310.pyc differ diff --git a/su-do-coders/core/home/__pycache__/views.cpython-312.pyc b/su-do-coders/core/home/__pycache__/views.cpython-312.pyc new file mode 100644 index 0000000..1d077c3 Binary files /dev/null and b/su-do-coders/core/home/__pycache__/views.cpython-312.pyc differ diff --git a/su-do-coders/core/home/admin.py b/su-do-coders/core/home/admin.py new file mode 100644 index 0000000..09bae8a --- /dev/null +++ b/su-do-coders/core/home/admin.py @@ -0,0 +1,7 @@ +from django.contrib import admin + +# Register your models here. + +from .models import * + +admin.site.register(Add_your_news) \ No newline at end of file diff --git a/su-do-coders/core/home/apps.py b/su-do-coders/core/home/apps.py new file mode 100644 index 0000000..e5ea0af --- /dev/null +++ b/su-do-coders/core/home/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class HomeConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'home' diff --git a/su-do-coders/core/home/genai_cleaner.py b/su-do-coders/core/home/genai_cleaner.py new file mode 100644 index 0000000..768ae1d --- /dev/null +++ b/su-do-coders/core/home/genai_cleaner.py @@ -0,0 +1,40 @@ +import requests + +# Define your API endpoint and API key (replace with actual endpoint and key) +API_URL = 'https://api.genai.com/v1/generate' # Replace with actual endpoint +API_KEY = 'your_api_key_here' # Replace with your API key + +# Define the prompt or input for the generative model +prompt = { + "task": "data_cleaning", # Specify the task + "input": { + "url": "https://www.timesjobs.com/candidate/job-search.html?searchType=personalizedSearch&from=submit&txtKeywords=python", + "instructions": [ + "Extract job postings from the page.", + "Clean and structure data fields: company name, skills, posted date, and apply link.", + "Handle missing fields gracefully and return the cleaned data in JSON format." + ] + } +} + +# Headers including the API key for authentication +headers = { + 'Authorization': f'Bearer {API_KEY}', + 'Content-Type': 'application/json' +} + +try: + # Make the POST request to the API + response = requests.post(API_URL, headers=headers, json=prompt) + + # Check if the response was successful + if response.status_code == 200: + # Parse the JSON response + data = response.json() + print("Cleaned Data:", data) + # Further processing of data if needed + else: + print(f"Failed to call the API. Status Code: {response.status_code}, Message: {response.text}") + +except Exception as e: + print(f"An error occurred: {e}") \ No newline at end of file diff --git a/su-do-coders/core/home/migrations/0001_initial.py b/su-do-coders/core/home/migrations/0001_initial.py new file mode 100644 index 0000000..7c77bc4 --- /dev/null +++ b/su-do-coders/core/home/migrations/0001_initial.py @@ -0,0 +1,25 @@ +# Generated by Django 4.2.7 on 2023-11-13 08:51 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Student', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100)), + ('age', models.IntegerField()), + ('email', models.EmailField(max_length=254)), + ('image', models.ImageField(upload_to='')), + ('file', models.FileField(upload_to='')), + ], + ), + ] diff --git a/su-do-coders/core/home/migrations/0002_alter_student_email.py b/su-do-coders/core/home/migrations/0002_alter_student_email.py new file mode 100644 index 0000000..cc7719d --- /dev/null +++ b/su-do-coders/core/home/migrations/0002_alter_student_email.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.7 on 2023-11-13 08:59 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('home', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='student', + name='email', + field=models.EmailField(max_length=254, null=True), + ), + ] diff --git a/su-do-coders/core/home/migrations/0003_product.py b/su-do-coders/core/home/migrations/0003_product.py new file mode 100644 index 0000000..30fbc0b --- /dev/null +++ b/su-do-coders/core/home/migrations/0003_product.py @@ -0,0 +1,21 @@ +# Generated by Django 4.2.7 on 2023-11-13 09:31 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('home', '0002_alter_student_email'), + ] + + operations = [ + migrations.CreateModel( + name='Product', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=50)), + ('price', models.IntegerField()), + ], + ), + ] diff --git a/su-do-coders/core/home/migrations/0004_remove_student_file_remove_student_image.py b/su-do-coders/core/home/migrations/0004_remove_student_file_remove_student_image.py new file mode 100644 index 0000000..8ea318e --- /dev/null +++ b/su-do-coders/core/home/migrations/0004_remove_student_file_remove_student_image.py @@ -0,0 +1,21 @@ +# Generated by Django 4.2.7 on 2023-11-13 10:13 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('home', '0003_product'), + ] + + operations = [ + migrations.RemoveField( + model_name='student', + name='file', + ), + migrations.RemoveField( + model_name='student', + name='image', + ), + ] diff --git a/su-do-coders/core/home/migrations/0005_rename_product_car_rename_price_car_speed.py b/su-do-coders/core/home/migrations/0005_rename_product_car_rename_price_car_speed.py new file mode 100644 index 0000000..4b3c06f --- /dev/null +++ b/su-do-coders/core/home/migrations/0005_rename_product_car_rename_price_car_speed.py @@ -0,0 +1,22 @@ +# Generated by Django 4.2.7 on 2023-11-14 00:34 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('home', '0004_remove_student_file_remove_student_image'), + ] + + operations = [ + migrations.RenameModel( + old_name='Product', + new_name='Car', + ), + migrations.RenameField( + model_name='car', + old_name='price', + new_name='speed', + ), + ] diff --git a/su-do-coders/core/home/migrations/0006_contest_delete_car_delete_student.py b/su-do-coders/core/home/migrations/0006_contest_delete_car_delete_student.py new file mode 100644 index 0000000..040965e --- /dev/null +++ b/su-do-coders/core/home/migrations/0006_contest_delete_car_delete_student.py @@ -0,0 +1,27 @@ +# Generated by Django 4.2.7 on 2023-11-16 23:28 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('home', '0005_rename_product_car_rename_price_car_speed'), + ] + + operations = [ + migrations.CreateModel( + name='Contest', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=100000)), + ('link', models.URLField()), + ], + ), + migrations.DeleteModel( + name='Car', + ), + migrations.DeleteModel( + name='Student', + ), + ] diff --git a/su-do-coders/core/home/migrations/0007_alter_contest_title.py b/su-do-coders/core/home/migrations/0007_alter_contest_title.py new file mode 100644 index 0000000..2f978ea --- /dev/null +++ b/su-do-coders/core/home/migrations/0007_alter_contest_title.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.7 on 2023-11-16 23:31 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('home', '0006_contest_delete_car_delete_student'), + ] + + operations = [ + migrations.AlterField( + model_name='contest', + name='title', + field=models.CharField(max_length=1000), + ), + ] diff --git a/su-do-coders/core/home/migrations/0008_job_news.py b/su-do-coders/core/home/migrations/0008_job_news.py new file mode 100644 index 0000000..deb1a6f --- /dev/null +++ b/su-do-coders/core/home/migrations/0008_job_news.py @@ -0,0 +1,31 @@ +# Generated by Django 4.2.7 on 2023-11-17 01:50 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('home', '0007_alter_contest_title'), + ] + + operations = [ + migrations.CreateModel( + name='Job', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('company_name', models.CharField(max_length=1000)), + ('skills', models.CharField(max_length=1000)), + ('apply_link', models.URLField()), + ], + ), + migrations.CreateModel( + name='News', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('headline', models.CharField(max_length=1000)), + ('summary', models.CharField(max_length=100000)), + ('link', models.URLField()), + ], + ), + ] diff --git a/su-do-coders/core/home/migrations/0009_job_posted_date_alter_job_skills.py b/su-do-coders/core/home/migrations/0009_job_posted_date_alter_job_skills.py new file mode 100644 index 0000000..feef51f --- /dev/null +++ b/su-do-coders/core/home/migrations/0009_job_posted_date_alter_job_skills.py @@ -0,0 +1,23 @@ +# Generated by Django 4.2.7 on 2023-11-17 02:46 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('home', '0008_job_news'), + ] + + operations = [ + migrations.AddField( + model_name='job', + name='posted_date', + field=models.CharField(max_length=1000, null=True), + ), + migrations.AlterField( + model_name='job', + name='skills', + field=models.CharField(max_length=10000), + ), + ] diff --git a/su-do-coders/core/home/migrations/0010_news_user_alter_news_summary.py b/su-do-coders/core/home/migrations/0010_news_user_alter_news_summary.py new file mode 100644 index 0000000..d45ebba --- /dev/null +++ b/su-do-coders/core/home/migrations/0010_news_user_alter_news_summary.py @@ -0,0 +1,26 @@ +# Generated by Django 4.2.7 on 2023-11-26 13:39 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('home', '0009_job_posted_date_alter_job_skills'), + ] + + operations = [ + migrations.AddField( + model_name='news', + name='user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='news', + name='summary', + field=models.CharField(max_length=10000000), + ), + ] diff --git a/su-do-coders/core/home/migrations/0011_contact.py b/su-do-coders/core/home/migrations/0011_contact.py new file mode 100644 index 0000000..5535ef7 --- /dev/null +++ b/su-do-coders/core/home/migrations/0011_contact.py @@ -0,0 +1,23 @@ +# Generated by Django 4.2.7 on 2023-11-26 18:48 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('home', '0010_news_user_alter_news_summary'), + ] + + operations = [ + migrations.CreateModel( + name='Contact', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('q_name', models.CharField(max_length=100)), + ('q_email', models.EmailField(max_length=254)), + ('q_subject', models.CharField(max_length=1000)), + ('q_message', models.CharField(max_length=10000000)), + ], + ), + ] diff --git a/su-do-coders/core/home/migrations/0012_add_your_news.py b/su-do-coders/core/home/migrations/0012_add_your_news.py new file mode 100644 index 0000000..7a24a6e --- /dev/null +++ b/su-do-coders/core/home/migrations/0012_add_your_news.py @@ -0,0 +1,23 @@ +# Generated by Django 4.2.7 on 2023-11-27 16:39 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('home', '0011_contact'), + ] + + operations = [ + migrations.CreateModel( + name='Add_your_news', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('headline', models.CharField(max_length=1000)), + ('link', models.URLField()), + ('summary', models.CharField(max_length=10000000)), + ('image', models.ImageField(upload_to='')), + ], + ), + ] diff --git a/su-do-coders/core/home/migrations/0013_alter_add_your_news_image.py b/su-do-coders/core/home/migrations/0013_alter_add_your_news_image.py new file mode 100644 index 0000000..26b73b2 --- /dev/null +++ b/su-do-coders/core/home/migrations/0013_alter_add_your_news_image.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.7 on 2023-11-27 17:01 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('home', '0012_add_your_news'), + ] + + operations = [ + migrations.AlterField( + model_name='add_your_news', + name='image', + field=models.ImageField(upload_to='static/img'), + ), + ] diff --git a/su-do-coders/core/home/migrations/0014_alter_add_your_news_image.py b/su-do-coders/core/home/migrations/0014_alter_add_your_news_image.py new file mode 100644 index 0000000..0a5c1a3 --- /dev/null +++ b/su-do-coders/core/home/migrations/0014_alter_add_your_news_image.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.7 on 2023-11-27 17:07 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('home', '0013_alter_add_your_news_image'), + ] + + operations = [ + migrations.AlterField( + model_name='add_your_news', + name='image', + field=models.ImageField(upload_to='../static/img'), + ), + ] diff --git a/su-do-coders/core/home/migrations/0015_alter_add_your_news_image.py b/su-do-coders/core/home/migrations/0015_alter_add_your_news_image.py new file mode 100644 index 0000000..885be1a --- /dev/null +++ b/su-do-coders/core/home/migrations/0015_alter_add_your_news_image.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.7 on 2023-11-27 17:10 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('home', '0014_alter_add_your_news_image'), + ] + + operations = [ + migrations.AlterField( + model_name='add_your_news', + name='image', + field=models.ImageField(upload_to='image'), + ), + ] diff --git a/su-do-coders/core/home/migrations/0016_alter_add_your_news_image.py b/su-do-coders/core/home/migrations/0016_alter_add_your_news_image.py new file mode 100644 index 0000000..255407c --- /dev/null +++ b/su-do-coders/core/home/migrations/0016_alter_add_your_news_image.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.7 on 2023-11-27 18:04 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('home', '0015_alter_add_your_news_image'), + ] + + operations = [ + migrations.AlterField( + model_name='add_your_news', + name='image', + field=models.ImageField(upload_to='ads_image'), + ), + ] diff --git a/su-do-coders/core/home/migrations/0017_news_razor_pay_order_id_and_more.py b/su-do-coders/core/home/migrations/0017_news_razor_pay_order_id_and_more.py new file mode 100644 index 0000000..4ae5ef7 --- /dev/null +++ b/su-do-coders/core/home/migrations/0017_news_razor_pay_order_id_and_more.py @@ -0,0 +1,28 @@ +# Generated by Django 4.2.7 on 2023-11-28 06:54 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('home', '0016_alter_add_your_news_image'), + ] + + operations = [ + migrations.AddField( + model_name='news', + name='razor_pay_order_id', + field=models.CharField(blank=True, max_length=100, null=True), + ), + migrations.AddField( + model_name='news', + name='razor_pay_patment_signature', + field=models.CharField(blank=True, max_length=100, null=True), + ), + migrations.AddField( + model_name='news', + name='razor_pay_payment_id', + field=models.CharField(blank=True, max_length=100, null=True), + ), + ] diff --git a/su-do-coders/core/home/migrations/0018_userprofile.py b/su-do-coders/core/home/migrations/0018_userprofile.py new file mode 100644 index 0000000..9d52725 --- /dev/null +++ b/su-do-coders/core/home/migrations/0018_userprofile.py @@ -0,0 +1,24 @@ +# Generated by Django 5.0.1 on 2024-02-29 04:48 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('home', '0017_news_razor_pay_order_id_and_more'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='UserProfile', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('has_paid', models.BooleanField(default=False)), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/su-do-coders/core/home/migrations/0019_delete_userprofile.py b/su-do-coders/core/home/migrations/0019_delete_userprofile.py new file mode 100644 index 0000000..3ff37c9 --- /dev/null +++ b/su-do-coders/core/home/migrations/0019_delete_userprofile.py @@ -0,0 +1,16 @@ +# Generated by Django 5.0.1 on 2024-02-29 05:06 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('home', '0018_userprofile'), + ] + + operations = [ + migrations.DeleteModel( + name='UserProfile', + ), + ] diff --git a/su-do-coders/core/home/migrations/0020_news_percent.py b/su-do-coders/core/home/migrations/0020_news_percent.py new file mode 100644 index 0000000..a91babb --- /dev/null +++ b/su-do-coders/core/home/migrations/0020_news_percent.py @@ -0,0 +1,19 @@ +# Generated by Django 5.0.1 on 2024-03-01 12:52 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('home', '0019_delete_userprofile'), + ] + + operations = [ + migrations.AddField( + model_name='news', + name='percent', + field=models.IntegerField(default=0), + preserve_default=False, + ), + ] diff --git a/su-do-coders/core/home/migrations/0021_rename_news_news1.py b/su-do-coders/core/home/migrations/0021_rename_news_news1.py new file mode 100644 index 0000000..1a33416 --- /dev/null +++ b/su-do-coders/core/home/migrations/0021_rename_news_news1.py @@ -0,0 +1,19 @@ +# Generated by Django 5.0.1 on 2024-03-01 13:02 + +from django.conf import settings +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('home', '0020_news_percent'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.RenameModel( + old_name='News', + new_name='News1', + ), + ] diff --git a/su-do-coders/core/home/migrations/0022_rename_news1_news.py b/su-do-coders/core/home/migrations/0022_rename_news1_news.py new file mode 100644 index 0000000..dfcc71b --- /dev/null +++ b/su-do-coders/core/home/migrations/0022_rename_news1_news.py @@ -0,0 +1,19 @@ +# Generated by Django 5.0.1 on 2024-03-01 13:37 + +from django.conf import settings +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('home', '0021_rename_news_news1'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.RenameModel( + old_name='News1', + new_name='News', + ), + ] diff --git a/su-do-coders/core/home/migrations/__init__.py b/su-do-coders/core/home/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/su-do-coders/core/home/migrations/__pycache__/0001_initial.cpython-310.pyc b/su-do-coders/core/home/migrations/__pycache__/0001_initial.cpython-310.pyc new file mode 100644 index 0000000..cedf101 Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0001_initial.cpython-310.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0001_initial.cpython-312.pyc b/su-do-coders/core/home/migrations/__pycache__/0001_initial.cpython-312.pyc new file mode 100644 index 0000000..a759dd9 Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0001_initial.cpython-312.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0002_alter_student_email.cpython-310.pyc b/su-do-coders/core/home/migrations/__pycache__/0002_alter_student_email.cpython-310.pyc new file mode 100644 index 0000000..0a1502b Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0002_alter_student_email.cpython-310.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0002_alter_student_email.cpython-312.pyc b/su-do-coders/core/home/migrations/__pycache__/0002_alter_student_email.cpython-312.pyc new file mode 100644 index 0000000..2b78e48 Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0002_alter_student_email.cpython-312.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0003_product.cpython-310.pyc b/su-do-coders/core/home/migrations/__pycache__/0003_product.cpython-310.pyc new file mode 100644 index 0000000..ba8f20e Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0003_product.cpython-310.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0003_product.cpython-312.pyc b/su-do-coders/core/home/migrations/__pycache__/0003_product.cpython-312.pyc new file mode 100644 index 0000000..372c85c Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0003_product.cpython-312.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0004_remove_student_file_remove_student_image.cpython-310.pyc b/su-do-coders/core/home/migrations/__pycache__/0004_remove_student_file_remove_student_image.cpython-310.pyc new file mode 100644 index 0000000..e8afa4a Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0004_remove_student_file_remove_student_image.cpython-310.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0004_remove_student_file_remove_student_image.cpython-312.pyc b/su-do-coders/core/home/migrations/__pycache__/0004_remove_student_file_remove_student_image.cpython-312.pyc new file mode 100644 index 0000000..6700933 Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0004_remove_student_file_remove_student_image.cpython-312.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0005_rename_product_car_rename_price_car_speed.cpython-310.pyc b/su-do-coders/core/home/migrations/__pycache__/0005_rename_product_car_rename_price_car_speed.cpython-310.pyc new file mode 100644 index 0000000..f7894fa Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0005_rename_product_car_rename_price_car_speed.cpython-310.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0005_rename_product_car_rename_price_car_speed.cpython-312.pyc b/su-do-coders/core/home/migrations/__pycache__/0005_rename_product_car_rename_price_car_speed.cpython-312.pyc new file mode 100644 index 0000000..839a1d4 Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0005_rename_product_car_rename_price_car_speed.cpython-312.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0006_contest_delete_car_delete_student.cpython-310.pyc b/su-do-coders/core/home/migrations/__pycache__/0006_contest_delete_car_delete_student.cpython-310.pyc new file mode 100644 index 0000000..9366b37 Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0006_contest_delete_car_delete_student.cpython-310.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0006_contest_delete_car_delete_student.cpython-312.pyc b/su-do-coders/core/home/migrations/__pycache__/0006_contest_delete_car_delete_student.cpython-312.pyc new file mode 100644 index 0000000..0d8d0f5 Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0006_contest_delete_car_delete_student.cpython-312.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0007_alter_contest_title.cpython-310.pyc b/su-do-coders/core/home/migrations/__pycache__/0007_alter_contest_title.cpython-310.pyc new file mode 100644 index 0000000..338d6b9 Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0007_alter_contest_title.cpython-310.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0007_alter_contest_title.cpython-312.pyc b/su-do-coders/core/home/migrations/__pycache__/0007_alter_contest_title.cpython-312.pyc new file mode 100644 index 0000000..a74d68c Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0007_alter_contest_title.cpython-312.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0008_job_news.cpython-310.pyc b/su-do-coders/core/home/migrations/__pycache__/0008_job_news.cpython-310.pyc new file mode 100644 index 0000000..075737c Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0008_job_news.cpython-310.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0008_job_news.cpython-312.pyc b/su-do-coders/core/home/migrations/__pycache__/0008_job_news.cpython-312.pyc new file mode 100644 index 0000000..6ffde46 Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0008_job_news.cpython-312.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0009_job_posted_date_alter_job_skills.cpython-310.pyc b/su-do-coders/core/home/migrations/__pycache__/0009_job_posted_date_alter_job_skills.cpython-310.pyc new file mode 100644 index 0000000..7977929 Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0009_job_posted_date_alter_job_skills.cpython-310.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0009_job_posted_date_alter_job_skills.cpython-312.pyc b/su-do-coders/core/home/migrations/__pycache__/0009_job_posted_date_alter_job_skills.cpython-312.pyc new file mode 100644 index 0000000..685db5c Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0009_job_posted_date_alter_job_skills.cpython-312.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0010_news_user_alter_news_summary.cpython-310.pyc b/su-do-coders/core/home/migrations/__pycache__/0010_news_user_alter_news_summary.cpython-310.pyc new file mode 100644 index 0000000..9243627 Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0010_news_user_alter_news_summary.cpython-310.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0010_news_user_alter_news_summary.cpython-312.pyc b/su-do-coders/core/home/migrations/__pycache__/0010_news_user_alter_news_summary.cpython-312.pyc new file mode 100644 index 0000000..e543588 Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0010_news_user_alter_news_summary.cpython-312.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0011_contact.cpython-310.pyc b/su-do-coders/core/home/migrations/__pycache__/0011_contact.cpython-310.pyc new file mode 100644 index 0000000..db381ac Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0011_contact.cpython-310.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0011_contact.cpython-312.pyc b/su-do-coders/core/home/migrations/__pycache__/0011_contact.cpython-312.pyc new file mode 100644 index 0000000..714fc77 Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0011_contact.cpython-312.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0012_add_your_news.cpython-310.pyc b/su-do-coders/core/home/migrations/__pycache__/0012_add_your_news.cpython-310.pyc new file mode 100644 index 0000000..a10fc5d Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0012_add_your_news.cpython-310.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0012_add_your_news.cpython-312.pyc b/su-do-coders/core/home/migrations/__pycache__/0012_add_your_news.cpython-312.pyc new file mode 100644 index 0000000..33fba6d Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0012_add_your_news.cpython-312.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0013_alter_add_your_news_image.cpython-310.pyc b/su-do-coders/core/home/migrations/__pycache__/0013_alter_add_your_news_image.cpython-310.pyc new file mode 100644 index 0000000..144ff40 Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0013_alter_add_your_news_image.cpython-310.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0013_alter_add_your_news_image.cpython-312.pyc b/su-do-coders/core/home/migrations/__pycache__/0013_alter_add_your_news_image.cpython-312.pyc new file mode 100644 index 0000000..f8abaee Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0013_alter_add_your_news_image.cpython-312.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0014_alter_add_your_news_image.cpython-310.pyc b/su-do-coders/core/home/migrations/__pycache__/0014_alter_add_your_news_image.cpython-310.pyc new file mode 100644 index 0000000..2914eb4 Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0014_alter_add_your_news_image.cpython-310.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0014_alter_add_your_news_image.cpython-312.pyc b/su-do-coders/core/home/migrations/__pycache__/0014_alter_add_your_news_image.cpython-312.pyc new file mode 100644 index 0000000..186c5d7 Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0014_alter_add_your_news_image.cpython-312.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0015_alter_add_your_news_image.cpython-310.pyc b/su-do-coders/core/home/migrations/__pycache__/0015_alter_add_your_news_image.cpython-310.pyc new file mode 100644 index 0000000..771c059 Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0015_alter_add_your_news_image.cpython-310.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0015_alter_add_your_news_image.cpython-312.pyc b/su-do-coders/core/home/migrations/__pycache__/0015_alter_add_your_news_image.cpython-312.pyc new file mode 100644 index 0000000..e7f8ff7 Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0015_alter_add_your_news_image.cpython-312.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0016_alter_add_your_news_image.cpython-310.pyc b/su-do-coders/core/home/migrations/__pycache__/0016_alter_add_your_news_image.cpython-310.pyc new file mode 100644 index 0000000..f6c2da7 Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0016_alter_add_your_news_image.cpython-310.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0016_alter_add_your_news_image.cpython-312.pyc b/su-do-coders/core/home/migrations/__pycache__/0016_alter_add_your_news_image.cpython-312.pyc new file mode 100644 index 0000000..8af8f4d Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0016_alter_add_your_news_image.cpython-312.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0017_news_razor_pay_order_id_and_more.cpython-310.pyc b/su-do-coders/core/home/migrations/__pycache__/0017_news_razor_pay_order_id_and_more.cpython-310.pyc new file mode 100644 index 0000000..8cb57b1 Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0017_news_razor_pay_order_id_and_more.cpython-310.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0017_news_razor_pay_order_id_and_more.cpython-312.pyc b/su-do-coders/core/home/migrations/__pycache__/0017_news_razor_pay_order_id_and_more.cpython-312.pyc new file mode 100644 index 0000000..304981f Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0017_news_razor_pay_order_id_and_more.cpython-312.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0018_userprofile.cpython-310.pyc b/su-do-coders/core/home/migrations/__pycache__/0018_userprofile.cpython-310.pyc new file mode 100644 index 0000000..aef8b1c Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0018_userprofile.cpython-310.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0018_userprofile.cpython-312.pyc b/su-do-coders/core/home/migrations/__pycache__/0018_userprofile.cpython-312.pyc new file mode 100644 index 0000000..41203f4 Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0018_userprofile.cpython-312.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0019_delete_userprofile.cpython-310.pyc b/su-do-coders/core/home/migrations/__pycache__/0019_delete_userprofile.cpython-310.pyc new file mode 100644 index 0000000..15c962a Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0019_delete_userprofile.cpython-310.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0019_delete_userprofile.cpython-312.pyc b/su-do-coders/core/home/migrations/__pycache__/0019_delete_userprofile.cpython-312.pyc new file mode 100644 index 0000000..3fb92e5 Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0019_delete_userprofile.cpython-312.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0020_news_percent.cpython-310.pyc b/su-do-coders/core/home/migrations/__pycache__/0020_news_percent.cpython-310.pyc new file mode 100644 index 0000000..84e5dda Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0020_news_percent.cpython-310.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0020_news_percent.cpython-312.pyc b/su-do-coders/core/home/migrations/__pycache__/0020_news_percent.cpython-312.pyc new file mode 100644 index 0000000..3c4fe29 Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0020_news_percent.cpython-312.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0021_rename_news_news1.cpython-310.pyc b/su-do-coders/core/home/migrations/__pycache__/0021_rename_news_news1.cpython-310.pyc new file mode 100644 index 0000000..a1a169f Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0021_rename_news_news1.cpython-310.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0021_rename_news_news1.cpython-312.pyc b/su-do-coders/core/home/migrations/__pycache__/0021_rename_news_news1.cpython-312.pyc new file mode 100644 index 0000000..3f47498 Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0021_rename_news_news1.cpython-312.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0022_rename_news1_news.cpython-310.pyc b/su-do-coders/core/home/migrations/__pycache__/0022_rename_news1_news.cpython-310.pyc new file mode 100644 index 0000000..730e751 Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0022_rename_news1_news.cpython-310.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/0022_rename_news1_news.cpython-312.pyc b/su-do-coders/core/home/migrations/__pycache__/0022_rename_news1_news.cpython-312.pyc new file mode 100644 index 0000000..f2dd9b9 Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/0022_rename_news1_news.cpython-312.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/__init__.cpython-310.pyc b/su-do-coders/core/home/migrations/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000..6787235 Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/__init__.cpython-310.pyc differ diff --git a/su-do-coders/core/home/migrations/__pycache__/__init__.cpython-312.pyc b/su-do-coders/core/home/migrations/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000..2a93f72 Binary files /dev/null and b/su-do-coders/core/home/migrations/__pycache__/__init__.cpython-312.pyc differ diff --git a/su-do-coders/core/home/models.py b/su-do-coders/core/home/models.py new file mode 100644 index 0000000..c0ef241 --- /dev/null +++ b/su-do-coders/core/home/models.py @@ -0,0 +1,59 @@ +from django.db import models +from django.contrib.auth.models import User + + +# These are my models, created for database. + +class Contest(models.Model): + # id = models.AutoField() + title = models.CharField(max_length=1000) + link = models.URLField() + + +class Job(models.Model): + company_name = models.CharField(max_length=1000) + skills = models.CharField(max_length=10000) + posted_date = models.CharField(max_length=1000, null=True) + apply_link = models.URLField() + + +# class UserProfile(models.Model): +# # This is for not accessing the adding news page without payments. +# user = models.OneToOneField(User, on_delete=models.CASCADE) +# # Add additional fields as needed. + +# def __str__(self): +# return self.user.username + +# @receiver(post_save, sender=User) +# def create_user_profile(sender, instance, created, **kwargs): +# if created: +# UserProfile.objects.create(user=instance) + + +class News(models.Model): + # If with news we can also add like and dislike button so that users can validae the machine learning model. + user = models.ForeignKey(User, on_delete = models.SET_NULL, null = True, blank = True) + + razor_pay_order_id = models.CharField(max_length=100, null=True, blank=True) + razor_pay_payment_id = models.CharField(max_length=100, null=True, blank=True) + razor_pay_patment_signature = models.CharField(max_length=100, null=True, blank=True) + + headline = models.CharField(max_length=1000) + summary = models.CharField(max_length=10000000) + link = models.URLField() + percent = models.IntegerField() + + +class Contact(models.Model): + q_name = models.CharField(max_length=100) + q_email = models.EmailField() + q_subject = models.CharField(max_length=1000) + q_message = models.CharField(max_length=10000000) + + +class Add_your_news(models.Model): + headline = models.CharField(max_length=1000) + link = models.URLField() + summary = models.CharField(max_length=10000000) + image = models.ImageField(upload_to="ads_image") \ No newline at end of file diff --git a/su-do-coders/core/home/personalisation.py b/su-do-coders/core/home/personalisation.py new file mode 100644 index 0000000..5e549d8 --- /dev/null +++ b/su-do-coders/core/home/personalisation.py @@ -0,0 +1,56 @@ +# Import necessary libraries +from transformers import pipeline +from sklearn.metrics.pairwise import cosine_similarity +import numpy as np + +# Initialize the Gemini model for embeddings (change the model name based on your access) +model_name = "gemini-large" # Use the appropriate model name if different +embedder = pipeline("feature-extraction", model=model_name, tokenizer=model_name) + +# Sample job descriptions and user data +jobs = [ + {"id": 1, "description": "Software engineer with experience in Python and Django."}, + {"id": 2, "description": "Data analyst with skills in SQL and data visualization."}, + {"id": 3, "description": "Frontend developer proficient in React and JavaScript."}, +] + +users = [ + {"id": 1, "profile": "Experienced software developer skilled in Python and backend development."}, + {"id": 2, "profile": "Recent graduate with a passion for data analytics and machine learning."}, +] + +# Function to generate embeddings using Gemini +def get_embeddings(texts): + embeddings = [] + for text in texts: + # Get the first element since the pipeline returns a list of lists + embedding = embedder(text)[0] + embeddings.append(np.mean(embedding, axis=0)) # Taking the mean of the embeddings for simplicity + return np.array(embeddings) + +# Get embeddings for job descriptions and user profiles +job_texts = [job["description"] for job in jobs] +user_texts = [user["profile"] for user in users] + +job_embeddings = get_embeddings(job_texts) +user_embeddings = get_embeddings(user_texts) + +# Function to recommend jobs to each user +def recommend_jobs(job_embeddings, user_embeddings, jobs, top_n=3): + recommendations = {} + for idx, user_embedding in enumerate(user_embeddings): + similarities = cosine_similarity([user_embedding], job_embeddings)[0] + # Get the indices of the top-n most similar jobs + top_jobs_idx = similarities.argsort()[-top_n:][::-1] + # Store the recommendations for the user + recommendations[idx] = [{"job_id": jobs[i]["id"], "similarity": similarities[i]} for i in top_jobs_idx] + return recommendations + +# Generate personalized job recommendations +personalized_recommendations = recommend_jobs(job_embeddings, user_embeddings, jobs) + +# Display recommendations +for user_id, recommendations in personalized_recommendations.items(): + print(f"Recommendations for User {user_id + 1}:") + for rec in recommendations: + print(f" - Job ID: {rec['job_id']}, Similarity Score: {rec['similarity']:.2f}") diff --git a/su-do-coders/core/home/seed.py b/su-do-coders/core/home/seed.py new file mode 100644 index 0000000..7040a0f --- /dev/null +++ b/su-do-coders/core/home/seed.py @@ -0,0 +1,110 @@ +import requests +from bs4 import BeautifulSoup +from home.models import * +import math +import nltk +from nltk.tokenize import word_tokenize + + +# Download the necessary NLTK resources. +nltk.download('punkt') +nltk.download('universal_tagset') + + +def contest_generator(): + # This function scrap contests from web and put it into our database for further uses. + url = 'https://clist.by/' + response = requests.get(url) + soup = BeautifulSoup(response.text, 'html.parser') + title_search_tags = soup.find_all('a', class_='title_search') + + # contest_list = [] + for title_search_tag in title_search_tags: + if response.status_code == 200: + if title_search_tag: + link = title_search_tag.get('href') + title = title_search_tag.get('title') + # contest_dict = {} + # contest_dict['title'] = title + # contest_dict['link'] = link + # contest_list.append(contest_dict) + Contest.objects.create(title=title, link=link) + else: + print("Anchor tag with class 'title_search' not found.") + else: + print("Failed to retrieve the webpage. Status code:", response.status_code) + + +def job_generator(): + # This function scrap jobs from web and put it into our database for further uses. + url = 'https://www.timesjobs.com/candidate/job-search.html?searchType=personalizedSearch&from=submit&txtKeywords=python' + response = requests.get(url) + soup = BeautifulSoup(response.text, 'html.parser') + jobs = soup.find_all('li', class_ = 'clearfix job-bx wht-shd-bx') + + for job in jobs: + if response.status_code == 200: + if job: + company_name = job.find('h3', class_ = 'joblist-comp-name').text.strip().capitalize() + skills = job.find('span', class_ = 'srp-skills').text.strip().replace(' ', '') + apply_link = 'https://shorturl.at/cuvMU' + posted_date = job.find('span', class_ = 'sim-posted').text.strip() + Job.objects.create(company_name = company_name, skills = skills, posted_date = posted_date, apply_link = apply_link) + else: + print("Anchor tag with class 'title_search' not found.") + else: + print("Failed to retrieve the webpage. Status code:", response.status_code) + + +def news_generator(): + # This function scrap news with their title and data from web and put it into our database for further uses. + url = 'https://timesofindia.indiatimes.com/briefs' + response = requests.get(url) + soup = BeautifulSoup(response.text, 'html.parser') + news = soup.find_all('div', class_='brief_box') + + ML_Model_cofficient = [1.34674492, -3.96302032, 2.06307081] #Theta-0(const), Theta-1(adj/pron), Theta-2(adv/adj) + + for new in news: + if response.status_code == 200: + if new.find('h2'): + headline = new.find('h2').find('a').text.strip() + if new.find('p'): + summary = new.find('p').find('a').text.strip() + apply_link = 'https://timesofindia.indiatimes.com/india/bhai-dont-tell-ma-that-im-trapped-in-tunnel/articleshow/105299928.cms' + + # Tokenize the text into words + words = word_tokenize(summary) + # Tag the words using NLTK's pos_tag function with the universal tagset + tagged_words = nltk.pos_tag(words, tagset='universal') + # Count the number of adjectives (ADJ), adverbs (ADV), and pronouns (PRON) + adj_count = sum(1 for word, tag in tagged_words if tag == 'ADJ') + adv_count = sum(1 for word, tag in tagged_words if tag == 'ADV') + pron_count = sum(1 for word, tag in tagged_words if tag == 'PRON') + + # Handling division by 0 + if (adj_count and pron_count) != 0: + # Calculate z + z = ML_Model_cofficient[0] + ML_Model_cofficient[1] * (adj_count/pron_count) + ML_Model_cofficient[2] * (adv_count / adj_count) + else: + z = ML_Model_cofficient[0] + + # Calculate sigmoid + sigmoid = 1 / (1 + math.exp(-z)) + + rounded_sigmoid = round(sigmoid ,4) * 100 + + if rounded_sigmoid > 0: + + News.objects.create(headline = headline, summary = summary, link = apply_link, percent = rounded_sigmoid) + + else: + print("Failed to retrieve the webpage. Status code:", response.status_code) + + +# Here I am calling the function for adding data into databses. +news_generator() +contest_generator() +job_generator() + + diff --git a/su-do-coders/core/home/static/contest.jpg b/su-do-coders/core/home/static/contest.jpg new file mode 100644 index 0000000..40082bd Binary files /dev/null and b/su-do-coders/core/home/static/contest.jpg differ diff --git a/su-do-coders/core/home/static/css/bootstrap.min.css b/su-do-coders/core/home/static/css/bootstrap.min.css new file mode 100644 index 0000000..b73c2bc --- /dev/null +++ b/su-do-coders/core/home/static/css/bootstrap.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v5.0.0 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors + * Copyright 2011-2021 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */:root{--bs-blue: #0d6efd;--bs-indigo: #6610f2;--bs-purple: #6f42c1;--bs-pink: #d63384;--bs-red: #dc3545;--bs-orange: #fd7e14;--bs-yellow: #ffc107;--bs-green: #198754;--bs-teal: #20c997;--bs-cyan: #0dcaf0;--bs-white: #fff;--bs-gray: #6c757d;--bs-gray-dark: #343a40;--bs-primary: #2124B1;--bs-secondary: #4777F5;--bs-success: #198754;--bs-info: #0dcaf0;--bs-warning: #ffc107;--bs-danger: #dc3545;--bs-light: #F7FAFF;--bs-dark: #1D1D27;--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255,255,255,0.15), rgba(255,255,255,0))}*,*::before,*::after{box-sizing:border-box}@media (prefers-reduced-motion: no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:"Heebo",sans-serif;font-size:1rem;font-weight:400;line-height:1.5;color:#888;background-color:#F3F6FF;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,.h1,h2,.h2,h3,.h3,h4,.h4,h5,.h5,h6,.h6{margin-top:0;margin-bottom:.5rem;font-family:"Roboto",sans-serif;font-weight:500;line-height:1.2;color:#1D1D27}h1,.h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width: 1200px){h1,.h1{font-size:2.5rem}}h2,.h2{font-size:calc(1.325rem + .9vw)}@media (min-width: 1200px){h2,.h2{font-size:2rem}}h3,.h3{font-size:calc(1.3rem + .6vw)}@media (min-width: 1200px){h3,.h3{font-size:1.75rem}}h4,.h4{font-size:calc(1.275rem + .3vw)}@media (min-width: 1200px){h4,.h4{font-size:1.5rem}}h5,.h5{font-size:1.25rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title],abbr[data-bs-original-title]{text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small,.small{font-size:.875em}mark,.mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#2124B1;text-decoration:none}a:hover{color:#1a1d8e}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:var(--bs-font-monospace);font-size:1em;direction:ltr /* rtl:ignore */;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role="button"]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}button,[type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button:not(:disabled),[type="button"]:not(:disabled),[type="reset"]:not(:disabled),[type="submit"]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type="search"]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none !important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:700;line-height:1.2}@media (min-width: 1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:700;line-height:1.2}@media (min-width: 1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:700;line-height:1.2}@media (min-width: 1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:700;line-height:1.2}@media (min-width: 1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:700;line-height:1.2}@media (min-width: 1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:700;line-height:1.2}@media (min-width: 1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#F3F6FF;border:1px solid #dee2e6;border-radius:10px;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:#6c757d}.container,.container-fluid,.container-sm,.container-md,.container-lg,.container-xl,.container-xxl{width:100%;padding-right:var(--bs-gutter-x, .75rem);padding-left:var(--bs-gutter-x, .75rem);margin-right:auto;margin-left:auto}@media (min-width: 576px){.container,.container-sm{max-width:540px}}@media (min-width: 768px){.container,.container-sm,.container-md{max-width:720px}}@media (min-width: 992px){.container,.container-sm,.container-md,.container-lg{max-width:960px}}@media (min-width: 1200px){.container,.container-sm,.container-md,.container-lg,.container-xl{max-width:1140px}}@media (min-width: 1400px){.container,.container-sm,.container-md,.container-lg,.container-xl,.container-xxl{max-width:1320px}}.row{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;display:flex;flex-wrap:wrap;margin-top:calc(var(--bs-gutter-y) * -1);margin-right:calc(var(--bs-gutter-x) / -2);margin-left:calc(var(--bs-gutter-x) / -2)}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) / 2);padding-left:calc(var(--bs-gutter-x) / 2);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.33333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.66667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333%}.col-2{flex:0 0 auto;width:16.66667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333%}.col-5{flex:0 0 auto;width:41.66667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333%}.col-8{flex:0 0 auto;width:66.66667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333%}.col-11{flex:0 0 auto;width:91.66667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333%}.offset-2{margin-left:16.66667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333%}.offset-5{margin-left:41.66667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333%}.offset-8{margin-left:66.66667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333%}.offset-11{margin-left:91.66667%}.g-0,.gx-0{--bs-gutter-x: 0}.g-0,.gy-0{--bs-gutter-y: 0}.g-1,.gx-1{--bs-gutter-x: .25rem}.g-1,.gy-1{--bs-gutter-y: .25rem}.g-2,.gx-2{--bs-gutter-x: .5rem}.g-2,.gy-2{--bs-gutter-y: .5rem}.g-3,.gx-3{--bs-gutter-x: 1rem}.g-3,.gy-3{--bs-gutter-y: 1rem}.g-4,.gx-4{--bs-gutter-x: 1.5rem}.g-4,.gy-4{--bs-gutter-y: 1.5rem}.g-5,.gx-5{--bs-gutter-x: 3rem}.g-5,.gy-5{--bs-gutter-y: 3rem}@media (min-width: 576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.33333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.66667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333%}.col-sm-2{flex:0 0 auto;width:16.66667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333%}.col-sm-5{flex:0 0 auto;width:41.66667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333%}.col-sm-8{flex:0 0 auto;width:66.66667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333%}.col-sm-11{flex:0 0 auto;width:91.66667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333%}.offset-sm-2{margin-left:16.66667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333%}.offset-sm-5{margin-left:41.66667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333%}.offset-sm-8{margin-left:66.66667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333%}.offset-sm-11{margin-left:91.66667%}.g-sm-0,.gx-sm-0{--bs-gutter-x: 0}.g-sm-0,.gy-sm-0{--bs-gutter-y: 0}.g-sm-1,.gx-sm-1{--bs-gutter-x: .25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y: .25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x: .5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y: .5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x: 1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y: 1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x: 1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y: 1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x: 3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y: 3rem}}@media (min-width: 768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.33333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.66667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333%}.col-md-2{flex:0 0 auto;width:16.66667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333%}.col-md-5{flex:0 0 auto;width:41.66667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333%}.col-md-8{flex:0 0 auto;width:66.66667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333%}.col-md-11{flex:0 0 auto;width:91.66667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333%}.offset-md-2{margin-left:16.66667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333%}.offset-md-5{margin-left:41.66667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333%}.offset-md-8{margin-left:66.66667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333%}.offset-md-11{margin-left:91.66667%}.g-md-0,.gx-md-0{--bs-gutter-x: 0}.g-md-0,.gy-md-0{--bs-gutter-y: 0}.g-md-1,.gx-md-1{--bs-gutter-x: .25rem}.g-md-1,.gy-md-1{--bs-gutter-y: .25rem}.g-md-2,.gx-md-2{--bs-gutter-x: .5rem}.g-md-2,.gy-md-2{--bs-gutter-y: .5rem}.g-md-3,.gx-md-3{--bs-gutter-x: 1rem}.g-md-3,.gy-md-3{--bs-gutter-y: 1rem}.g-md-4,.gx-md-4{--bs-gutter-x: 1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y: 1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x: 3rem}.g-md-5,.gy-md-5{--bs-gutter-y: 3rem}}@media (min-width: 992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.33333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.66667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333%}.col-lg-2{flex:0 0 auto;width:16.66667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333%}.col-lg-5{flex:0 0 auto;width:41.66667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333%}.col-lg-8{flex:0 0 auto;width:66.66667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333%}.col-lg-11{flex:0 0 auto;width:91.66667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333%}.offset-lg-2{margin-left:16.66667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333%}.offset-lg-5{margin-left:41.66667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333%}.offset-lg-8{margin-left:66.66667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333%}.offset-lg-11{margin-left:91.66667%}.g-lg-0,.gx-lg-0{--bs-gutter-x: 0}.g-lg-0,.gy-lg-0{--bs-gutter-y: 0}.g-lg-1,.gx-lg-1{--bs-gutter-x: .25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y: .25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x: .5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y: .5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x: 1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y: 1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x: 1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y: 1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x: 3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y: 3rem}}@media (min-width: 1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.33333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.66667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333%}.col-xl-2{flex:0 0 auto;width:16.66667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333%}.col-xl-5{flex:0 0 auto;width:41.66667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333%}.col-xl-8{flex:0 0 auto;width:66.66667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333%}.col-xl-11{flex:0 0 auto;width:91.66667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333%}.offset-xl-2{margin-left:16.66667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333%}.offset-xl-5{margin-left:41.66667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333%}.offset-xl-8{margin-left:66.66667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333%}.offset-xl-11{margin-left:91.66667%}.g-xl-0,.gx-xl-0{--bs-gutter-x: 0}.g-xl-0,.gy-xl-0{--bs-gutter-y: 0}.g-xl-1,.gx-xl-1{--bs-gutter-x: .25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y: .25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x: .5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y: .5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x: 1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y: 1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x: 1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y: 1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x: 3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y: 3rem}}@media (min-width: 1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.33333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.66667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333%}.col-xxl-2{flex:0 0 auto;width:16.66667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333%}.col-xxl-5{flex:0 0 auto;width:41.66667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333%}.col-xxl-8{flex:0 0 auto;width:66.66667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333%}.col-xxl-11{flex:0 0 auto;width:91.66667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333%}.offset-xxl-2{margin-left:16.66667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333%}.offset-xxl-5{margin-left:41.66667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333%}.offset-xxl-8{margin-left:66.66667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333%}.offset-xxl-11{margin-left:91.66667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x: 0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y: 0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x: .25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y: .25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x: .5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y: .5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x: 1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y: 1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x: 1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y: 1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x: 3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y: 3rem}}.table{--bs-table-bg: rgba(0,0,0,0);--bs-table-striped-color: #888;--bs-table-striped-bg: rgba(0,0,0,0.05);--bs-table-active-color: #888;--bs-table-active-bg: rgba(0,0,0,0.1);--bs-table-hover-color: #888;--bs-table-hover-bg: rgba(0,0,0,0.075);width:100%;margin-bottom:1rem;color:#888;vertical-align:top;border-color:#dee2e6}.table>:not(caption)>*>*{padding:.5rem .5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table>:not(:last-child)>:last-child>*{border-bottom-color:currentColor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-striped>tbody>tr:nth-of-type(odd){--bs-table-accent-bg: var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg: var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover{--bs-table-accent-bg: var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-bg: #d3d3ef;--bs-table-striped-bg: #c8c8e3;--bs-table-striped-color: #000;--bs-table-active-bg: #bebed7;--bs-table-active-color: #000;--bs-table-hover-bg: #c3c3dd;--bs-table-hover-color: #000;color:#000;border-color:#bebed7}.table-secondary{--bs-table-bg: #dae4fd;--bs-table-striped-bg: #cfd9f0;--bs-table-striped-color: #000;--bs-table-active-bg: #c4cde4;--bs-table-active-color: #000;--bs-table-hover-bg: #cad3ea;--bs-table-hover-color: #000;color:#000;border-color:#c4cde4}.table-success{--bs-table-bg: #d1e7dd;--bs-table-striped-bg: #c7dbd2;--bs-table-striped-color: #000;--bs-table-active-bg: #bcd0c7;--bs-table-active-color: #000;--bs-table-hover-bg: #c1d6cc;--bs-table-hover-color: #000;color:#000;border-color:#bcd0c7}.table-info{--bs-table-bg: #cff4fc;--bs-table-striped-bg: #c5e8ef;--bs-table-striped-color: #000;--bs-table-active-bg: #badce3;--bs-table-active-color: #000;--bs-table-hover-bg: #bfe2e9;--bs-table-hover-color: #000;color:#000;border-color:#badce3}.table-warning{--bs-table-bg: #fff3cd;--bs-table-striped-bg: #f2e7c3;--bs-table-striped-color: #000;--bs-table-active-bg: #e6dbb9;--bs-table-active-color: #000;--bs-table-hover-bg: #ece1be;--bs-table-hover-color: #000;color:#000;border-color:#e6dbb9}.table-danger{--bs-table-bg: #f8d7da;--bs-table-striped-bg: #eccccf;--bs-table-striped-color: #000;--bs-table-active-bg: #dfc2c4;--bs-table-active-color: #000;--bs-table-hover-bg: #e5c7ca;--bs-table-hover-color: #000;color:#000;border-color:#dfc2c4}.table-light{--bs-table-bg: #F7FAFF;--bs-table-striped-bg: #ebeef2;--bs-table-striped-color: #000;--bs-table-active-bg: #dee1e6;--bs-table-active-color: #000;--bs-table-hover-bg: #e4e7ec;--bs-table-hover-color: #000;color:#000;border-color:#dee1e6}.table-dark{--bs-table-bg: #1D1D27;--bs-table-striped-bg: #282832;--bs-table-striped-color: #fff;--bs-table-active-bg: #34343d;--bs-table-active-color: #fff;--bs-table-hover-bg: #2e2e37;--bs-table-hover-color: #fff;color:#fff;border-color:#34343d}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:#6c757d}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#888;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;appearance:none;border-radius:10px;transition:border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control[type="file"]{overflow:hidden}.form-control[type="file"]:not(:disabled):not(:read-only){cursor:pointer}.form-control:focus{color:#888;background-color:#fff;border-color:#9092d8;outline:0;box-shadow:0 0 0 .25rem rgba(33,36,177,0.25)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control:read-only{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;margin-inline-end:.75rem;color:#888;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not(:read-only)::file-selector-button{background-color:#dde0e3}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;margin-inline-end:.75rem;color:#888;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-control::-webkit-file-upload-button{transition:none}}.form-control:hover:not(:disabled):not(:read-only)::-webkit-file-upload-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#888;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;margin-inline-end:.5rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;margin-inline-end:1rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + 2px)}textarea.form-control-sm{min-height:calc(1.5em + .5rem + 2px)}textarea.form-control-lg{min-height:calc(1.5em + 1rem + 2px)}.form-control-color{max-width:3rem;height:auto;padding:.375rem}.form-control-color:not(:disabled):not(:read-only){cursor:pointer}.form-control-color::-moz-color-swatch{height:1.5em;border-radius:10px}.form-control-color::-webkit-color-swatch{height:1.5em;border-radius:10px}.form-select{display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#888;background-color:#fff;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #ced4da;border-radius:10px;appearance:none}.form-select:focus{border-color:#9092d8;outline:0;box-shadow:0 0 0 .25rem rgba(33,36,177,0.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #888}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,0.25);appearance:none;color-adjust:exact}.form-check-input[type="checkbox"]{border-radius:.25em}.form-check-input[type="radio"]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#9092d8;outline:0;box-shadow:0 0 0 .25rem rgba(33,36,177,0.25)}.form-check-input:checked{background-color:#2124B1;border-color:#2124B1}.form-check-input:checked[type="checkbox"]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type="radio"]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type="checkbox"]:indeterminate{background-color:#2124B1;border-color:#2124B1;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled] ~ .form-check-label,.form-check-input:disabled ~ .form-check-label{opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280,0,0,0.25%29'/%3e%3c/svg%3e");background-position:left center;border-radius:2em;transition:background-position 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%239092d8'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #F3F6FF,0 0 0 .25rem rgba(33,36,177,0.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #F3F6FF,0 0 0 .25rem rgba(33,36,177,0.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#2124B1;border:0;border-radius:1rem;transition:background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out;appearance:none}@media (prefers-reduced-motion: reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#bcbde8}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#2124B1;border:0;border-radius:1rem;transition:background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out;appearance:none}@media (prefers-reduced-motion: reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#bcbde8}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-select{height:calc(3.5rem + 2px);padding:1rem .75rem}.form-floating>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity 0.1s ease-in-out,transform 0.1s ease-in-out}@media (prefers-reduced-motion: reduce){.form-floating>label{transition:none}}.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus ~ label,.form-floating>.form-control:not(:placeholder-shown) ~ label,.form-floating>.form-select ~ label{opacity:.65;transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control:-webkit-autofill ~ label{opacity:.65;transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus{z-index:3}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:3}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#888;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:10px}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu),.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu),.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#198754}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(25,135,84,0.9);border-radius:10px}.was-validated :valid ~ .valid-feedback,.was-validated :valid ~ .valid-tooltip,.is-valid ~ .valid-feedback,.is-valid ~ .valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#198754;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,0.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.was-validated .form-select:valid,.form-select.is-valid{border-color:#198754}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,0.25)}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:#198754}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:#198754}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,0.25)}.was-validated .form-check-input:valid ~ .form-check-label,.form-check-input.is-valid ~ .form-check-label{color:#198754}.form-check-inline .form-check-input ~ .valid-feedback{margin-left:.5em}.was-validated .input-group .form-control:valid,.input-group .form-control.is-valid,.was-validated .input-group .form-select:valid,.input-group .form-select.is-valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(220,53,69,0.9);border-radius:10px}.was-validated :invalid ~ .invalid-feedback,.was-validated :invalid ~ .invalid-tooltip,.is-invalid ~ .invalid-feedback,.is-invalid ~ .invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,0.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:#dc3545}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,0.25)}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:#dc3545}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:#dc3545}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,0.25)}.was-validated .form-check-input:invalid ~ .form-check-label,.form-check-input.is-invalid ~ .form-check-label{color:#dc3545}.form-check-inline .form-check-input ~ .invalid-feedback{margin-left:.5em}.was-validated .input-group .form-control:invalid,.input-group .form-control.is-invalid,.was-validated .input-group .form-select:invalid,.input-group .form-select.is-invalid{z-index:3}.btn{display:inline-block;font-weight:400;line-height:1.5;color:#888;text-align:center;vertical-align:middle;cursor:pointer;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;border-radius:10px;transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:#888}.btn-check:focus+.btn,.btn:focus{outline:0;box-shadow:0 0 0 .25rem rgba(33,36,177,0.25)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{pointer-events:none;opacity:.65}.btn-primary{color:#fff;background-color:#2124B1;border-color:#2124B1}.btn-primary:hover{color:#fff;background-color:#1c1f96;border-color:#1a1d8e}.btn-check:focus+.btn-primary,.btn-primary:focus{color:#fff;background-color:#1c1f96;border-color:#1a1d8e;box-shadow:0 0 0 .25rem rgba(66,69,189,0.5)}.btn-check:checked+.btn-primary,.btn-check:active+.btn-primary,.btn-primary:active,.btn-primary.active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#1a1d8e;border-color:#191b85}.btn-check:checked+.btn-primary:focus,.btn-check:active+.btn-primary:focus,.btn-primary:active:focus,.btn-primary.active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(66,69,189,0.5)}.btn-primary:disabled,.btn-primary.disabled{color:#fff;background-color:#2124B1;border-color:#2124B1}.btn-secondary{color:#000;background-color:#4777F5;border-color:#4777F5}.btn-secondary:hover{color:#000;background-color:#638bf7;border-color:#5985f6}.btn-check:focus+.btn-secondary,.btn-secondary:focus{color:#000;background-color:#638bf7;border-color:#5985f6;box-shadow:0 0 0 .25rem rgba(60,101,208,0.5)}.btn-check:checked+.btn-secondary,.btn-check:active+.btn-secondary,.btn-secondary:active,.btn-secondary.active,.show>.btn-secondary.dropdown-toggle{color:#000;background-color:#6c92f7;border-color:#5985f6}.btn-check:checked+.btn-secondary:focus,.btn-check:active+.btn-secondary:focus,.btn-secondary:active:focus,.btn-secondary.active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(60,101,208,0.5)}.btn-secondary:disabled,.btn-secondary.disabled{color:#000;background-color:#4777F5;border-color:#4777F5}.btn-success{color:#fff;background-color:#198754;border-color:#198754}.btn-success:hover{color:#fff;background-color:#157347;border-color:#146c43}.btn-check:focus+.btn-success,.btn-success:focus{color:#fff;background-color:#157347;border-color:#146c43;box-shadow:0 0 0 .25rem rgba(60,153,110,0.5)}.btn-check:checked+.btn-success,.btn-check:active+.btn-success,.btn-success:active,.btn-success.active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#146c43;border-color:#13653f}.btn-check:checked+.btn-success:focus,.btn-check:active+.btn-success:focus,.btn-success:active:focus,.btn-success.active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(60,153,110,0.5)}.btn-success:disabled,.btn-success.disabled{color:#fff;background-color:#198754;border-color:#198754}.btn-info{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-info:hover{color:#000;background-color:#31d2f2;border-color:#25cff2}.btn-check:focus+.btn-info,.btn-info:focus{color:#000;background-color:#31d2f2;border-color:#25cff2;box-shadow:0 0 0 .25rem rgba(11,172,204,0.5)}.btn-check:checked+.btn-info,.btn-check:active+.btn-info,.btn-info:active,.btn-info.active,.show>.btn-info.dropdown-toggle{color:#000;background-color:#3dd5f3;border-color:#25cff2}.btn-check:checked+.btn-info:focus,.btn-check:active+.btn-info:focus,.btn-info:active:focus,.btn-info.active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(11,172,204,0.5)}.btn-info:disabled,.btn-info.disabled{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-warning{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#000;background-color:#ffca2c;border-color:#ffc720}.btn-check:focus+.btn-warning,.btn-warning:focus{color:#000;background-color:#ffca2c;border-color:#ffc720;box-shadow:0 0 0 .25rem rgba(217,164,6,0.5)}.btn-check:checked+.btn-warning,.btn-check:active+.btn-warning,.btn-warning:active,.btn-warning.active,.show>.btn-warning.dropdown-toggle{color:#000;background-color:#ffcd39;border-color:#ffc720}.btn-check:checked+.btn-warning:focus,.btn-check:active+.btn-warning:focus,.btn-warning:active:focus,.btn-warning.active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(217,164,6,0.5)}.btn-warning:disabled,.btn-warning.disabled{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#bb2d3b;border-color:#b02a37}.btn-check:focus+.btn-danger,.btn-danger:focus{color:#fff;background-color:#bb2d3b;border-color:#b02a37;box-shadow:0 0 0 .25rem rgba(225,83,97,0.5)}.btn-check:checked+.btn-danger,.btn-check:active+.btn-danger,.btn-danger:active,.btn-danger.active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#b02a37;border-color:#a52834}.btn-check:checked+.btn-danger:focus,.btn-check:active+.btn-danger:focus,.btn-danger:active:focus,.btn-danger.active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(225,83,97,0.5)}.btn-danger:disabled,.btn-danger.disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-light{color:#000;background-color:#F7FAFF;border-color:#F7FAFF}.btn-light:hover{color:#000;background-color:#f8fbff;border-color:#f8fbff}.btn-check:focus+.btn-light,.btn-light:focus{color:#000;background-color:#f8fbff;border-color:#f8fbff;box-shadow:0 0 0 .25rem rgba(210,213,217,0.5)}.btn-check:checked+.btn-light,.btn-check:active+.btn-light,.btn-light:active,.btn-light.active,.show>.btn-light.dropdown-toggle{color:#000;background-color:#f9fbff;border-color:#f8fbff}.btn-check:checked+.btn-light:focus,.btn-check:active+.btn-light:focus,.btn-light:active:focus,.btn-light.active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(210,213,217,0.5)}.btn-light:disabled,.btn-light.disabled{color:#000;background-color:#F7FAFF;border-color:#F7FAFF}.btn-dark{color:#fff;background-color:#1D1D27;border-color:#1D1D27}.btn-dark:hover{color:#fff;background-color:#191921;border-color:#17171f}.btn-check:focus+.btn-dark,.btn-dark:focus{color:#fff;background-color:#191921;border-color:#17171f;box-shadow:0 0 0 .25rem rgba(63,63,71,0.5)}.btn-check:checked+.btn-dark,.btn-check:active+.btn-dark,.btn-dark:active,.btn-dark.active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#17171f;border-color:#16161d}.btn-check:checked+.btn-dark:focus,.btn-check:active+.btn-dark:focus,.btn-dark:active:focus,.btn-dark.active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(63,63,71,0.5)}.btn-dark:disabled,.btn-dark.disabled{color:#fff;background-color:#1D1D27;border-color:#1D1D27}.btn-outline-primary{color:#2124B1;border-color:#2124B1}.btn-outline-primary:hover{color:#fff;background-color:#2124B1;border-color:#2124B1}.btn-check:focus+.btn-outline-primary,.btn-outline-primary:focus{box-shadow:0 0 0 .25rem rgba(33,36,177,0.5)}.btn-check:checked+.btn-outline-primary,.btn-check:active+.btn-outline-primary,.btn-outline-primary:active,.btn-outline-primary.active,.btn-outline-primary.dropdown-toggle.show{color:#fff;background-color:#2124B1;border-color:#2124B1}.btn-check:checked+.btn-outline-primary:focus,.btn-check:active+.btn-outline-primary:focus,.btn-outline-primary:active:focus,.btn-outline-primary.active:focus,.btn-outline-primary.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(33,36,177,0.5)}.btn-outline-primary:disabled,.btn-outline-primary.disabled{color:#2124B1;background-color:transparent}.btn-outline-secondary{color:#4777F5;border-color:#4777F5}.btn-outline-secondary:hover{color:#000;background-color:#4777F5;border-color:#4777F5}.btn-check:focus+.btn-outline-secondary,.btn-outline-secondary:focus{box-shadow:0 0 0 .25rem rgba(71,119,245,0.5)}.btn-check:checked+.btn-outline-secondary,.btn-check:active+.btn-outline-secondary,.btn-outline-secondary:active,.btn-outline-secondary.active,.btn-outline-secondary.dropdown-toggle.show{color:#000;background-color:#4777F5;border-color:#4777F5}.btn-check:checked+.btn-outline-secondary:focus,.btn-check:active+.btn-outline-secondary:focus,.btn-outline-secondary:active:focus,.btn-outline-secondary.active:focus,.btn-outline-secondary.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(71,119,245,0.5)}.btn-outline-secondary:disabled,.btn-outline-secondary.disabled{color:#4777F5;background-color:transparent}.btn-outline-success{color:#198754;border-color:#198754}.btn-outline-success:hover{color:#fff;background-color:#198754;border-color:#198754}.btn-check:focus+.btn-outline-success,.btn-outline-success:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,0.5)}.btn-check:checked+.btn-outline-success,.btn-check:active+.btn-outline-success,.btn-outline-success:active,.btn-outline-success.active,.btn-outline-success.dropdown-toggle.show{color:#fff;background-color:#198754;border-color:#198754}.btn-check:checked+.btn-outline-success:focus,.btn-check:active+.btn-outline-success:focus,.btn-outline-success:active:focus,.btn-outline-success.active:focus,.btn-outline-success.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,0.5)}.btn-outline-success:disabled,.btn-outline-success.disabled{color:#198754;background-color:transparent}.btn-outline-info{color:#0dcaf0;border-color:#0dcaf0}.btn-outline-info:hover{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:focus+.btn-outline-info,.btn-outline-info:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,0.5)}.btn-check:checked+.btn-outline-info,.btn-check:active+.btn-outline-info,.btn-outline-info:active,.btn-outline-info.active,.btn-outline-info.dropdown-toggle.show{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:checked+.btn-outline-info:focus,.btn-check:active+.btn-outline-info:focus,.btn-outline-info:active:focus,.btn-outline-info.active:focus,.btn-outline-info.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,0.5)}.btn-outline-info:disabled,.btn-outline-info.disabled{color:#0dcaf0;background-color:transparent}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:focus+.btn-outline-warning,.btn-outline-warning:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,0.5)}.btn-check:checked+.btn-outline-warning,.btn-check:active+.btn-outline-warning,.btn-outline-warning:active,.btn-outline-warning.active,.btn-outline-warning.dropdown-toggle.show{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:checked+.btn-outline-warning:focus,.btn-check:active+.btn-outline-warning:focus,.btn-outline-warning:active:focus,.btn-outline-warning.active:focus,.btn-outline-warning.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,0.5)}.btn-outline-warning:disabled,.btn-outline-warning.disabled{color:#ffc107;background-color:transparent}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:focus+.btn-outline-danger,.btn-outline-danger:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,0.5)}.btn-check:checked+.btn-outline-danger,.btn-check:active+.btn-outline-danger,.btn-outline-danger:active,.btn-outline-danger.active,.btn-outline-danger.dropdown-toggle.show{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:checked+.btn-outline-danger:focus,.btn-check:active+.btn-outline-danger:focus,.btn-outline-danger:active:focus,.btn-outline-danger.active:focus,.btn-outline-danger.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,0.5)}.btn-outline-danger:disabled,.btn-outline-danger.disabled{color:#dc3545;background-color:transparent}.btn-outline-light{color:#F7FAFF;border-color:#F7FAFF}.btn-outline-light:hover{color:#000;background-color:#F7FAFF;border-color:#F7FAFF}.btn-check:focus+.btn-outline-light,.btn-outline-light:focus{box-shadow:0 0 0 .25rem rgba(247,250,255,0.5)}.btn-check:checked+.btn-outline-light,.btn-check:active+.btn-outline-light,.btn-outline-light:active,.btn-outline-light.active,.btn-outline-light.dropdown-toggle.show{color:#000;background-color:#F7FAFF;border-color:#F7FAFF}.btn-check:checked+.btn-outline-light:focus,.btn-check:active+.btn-outline-light:focus,.btn-outline-light:active:focus,.btn-outline-light.active:focus,.btn-outline-light.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(247,250,255,0.5)}.btn-outline-light:disabled,.btn-outline-light.disabled{color:#F7FAFF;background-color:transparent}.btn-outline-dark{color:#1D1D27;border-color:#1D1D27}.btn-outline-dark:hover{color:#fff;background-color:#1D1D27;border-color:#1D1D27}.btn-check:focus+.btn-outline-dark,.btn-outline-dark:focus{box-shadow:0 0 0 .25rem rgba(29,29,39,0.5)}.btn-check:checked+.btn-outline-dark,.btn-check:active+.btn-outline-dark,.btn-outline-dark:active,.btn-outline-dark.active,.btn-outline-dark.dropdown-toggle.show{color:#fff;background-color:#1D1D27;border-color:#1D1D27}.btn-check:checked+.btn-outline-dark:focus,.btn-check:active+.btn-outline-dark:focus,.btn-outline-dark:active:focus,.btn-outline-dark.active:focus,.btn-outline-dark.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(29,29,39,0.5)}.btn-outline-dark:disabled,.btn-outline-dark.disabled{color:#1D1D27;background-color:transparent}.btn-link{font-weight:400;color:#2124B1;text-decoration:none}.btn-link:hover{color:#1a1d8e}.btn-link:disabled,.btn-link.disabled{color:#6c757d}.btn-lg,.btn-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.btn-sm,.btn-group-sm>.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.fade{transition:opacity 0.15s linear}@media (prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height 0.35s ease}@media (prefers-reduced-motion: reduce){.collapsing{transition:none}}.dropup,.dropend,.dropdown,.dropstart{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;z-index:1000;display:none;min-width:10rem;padding:.5rem 0;margin:0;font-size:1rem;color:#888;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.15);border-radius:10px}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:.125rem}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto /* rtl:ignore */;left:0 /* rtl:ignore */}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0 /* rtl:ignore */;left:auto /* rtl:ignore */}@media (min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto /* rtl:ignore */;left:0 /* rtl:ignore */}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0 /* rtl:ignore */;left:auto /* rtl:ignore */}}@media (min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto /* rtl:ignore */;left:0 /* rtl:ignore */}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0 /* rtl:ignore */;left:auto /* rtl:ignore */}}@media (min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto /* rtl:ignore */;left:0 /* rtl:ignore */}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0 /* rtl:ignore */;left:auto /* rtl:ignore */}}@media (min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto /* rtl:ignore */;left:0 /* rtl:ignore */}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0 /* rtl:ignore */;left:auto /* rtl:ignore */}}@media (min-width: 1400px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto /* rtl:ignore */;left:0 /* rtl:ignore */}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0 /* rtl:ignore */;left:auto /* rtl:ignore */}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid rgba(0,0,0,0.15)}.dropdown-item{display:block;width:100%;padding:.25rem 1rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:hover,.dropdown-item:focus{color:#1e2125;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#2124B1}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1rem;color:#212529}.dropdown-menu-dark{color:#dee2e6;background-color:#343a40;border-color:rgba(0,0,0,0.15)}.dropdown-menu-dark .dropdown-item{color:#dee2e6}.dropdown-menu-dark .dropdown-item:hover,.dropdown-menu-dark .dropdown-item:focus{color:#fff;background-color:rgba(255,255,255,0.15)}.dropdown-menu-dark .dropdown-item.active,.dropdown-menu-dark .dropdown-item:active{color:#fff;background-color:#2124B1}.dropdown-menu-dark .dropdown-item.disabled,.dropdown-menu-dark .dropdown-item:disabled{color:#adb5bd}.dropdown-menu-dark .dropdown-divider{border-color:rgba(0,0,0,0.15)}.dropdown-menu-dark .dropdown-item-text{color:#dee2e6}.dropdown-menu-dark .dropdown-header{color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:not(:first-child),.btn-group>.btn-group:not(:first-child){margin-left:-1px}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn,.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn ~ .btn,.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem;color:#2124B1;transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:#1a1d8e}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background:none;border:1px solid transparent;border-top-left-radius:10px;border-top-right-radius:10px}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{border-color:#e9ecef #e9ecef #dee2e6;isolation:isolate}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:#495057;background-color:#F3F6FF;border-color:#dee2e6 #dee2e6 #F3F6FF}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{background:none;border:0;border-radius:10px}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#2124B1}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding-top:.5rem;padding-bottom:.5rem}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;white-space:nowrap}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:10px;transition:box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 .25rem}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height, 75vh);overflow-y:auto}@media (min-width: 576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (min-width: 768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (min-width: 992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (min-width: 1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}@media (min-width: 1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,0.9)}.navbar-light .navbar-brand:hover,.navbar-light .navbar-brand:focus{color:rgba(0,0,0,0.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,0.55)}.navbar-light .navbar-nav .nav-link:hover,.navbar-light .navbar-nav .nav-link:focus{color:rgba(0,0,0,0.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,0.3)}.navbar-light .navbar-nav .show>.nav-link,.navbar-light .navbar-nav .nav-link.active{color:rgba(0,0,0,0.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,0.55);border-color:rgba(0,0,0,0.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280,0,0,0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,0.55)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:hover,.navbar-light .navbar-text a:focus{color:rgba(0,0,0,0.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:hover,.navbar-dark .navbar-brand:focus{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,0.55)}.navbar-dark .navbar-nav .nav-link:hover,.navbar-dark .navbar-nav .nav-link:focus{color:rgba(255,255,255,0.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,0.25)}.navbar-dark .navbar-nav .show>.nav-link,.navbar-dark .navbar-nav .nav-link.active{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,0.55);border-color:rgba(255,255,255,0.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255,255,255,0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,0.55)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:hover,.navbar-dark .navbar-text a:focus{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,0.125);border-radius:10px}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:9px;border-top-right-radius:9px}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:9px;border-bottom-left-radius:9px}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:1rem 1rem}.card-title{margin-bottom:.5rem}.card-subtitle{margin-top:-.25rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1rem}.card-header{padding:.5rem 1rem;margin-bottom:0;background-color:rgba(0,0,0,0.03);border-bottom:1px solid rgba(0,0,0,0.125)}.card-header:first-child{border-radius:9px 9px 0 0}.card-footer{padding:.5rem 1rem;background-color:rgba(0,0,0,0.03);border-top:1px solid rgba(0,0,0,0.125)}.card-footer:last-child{border-radius:0 0 9px 9px}.card-header-tabs{margin-right:-.5rem;margin-bottom:-.5rem;margin-left:-.5rem;border-bottom:0}.card-header-tabs .nav-link.active{background-color:#fff;border-bottom-color:#fff}.card-header-pills{margin-right:-.5rem;margin-left:-.5rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:9px}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-img,.card-img-top{border-top-left-radius:9px;border-top-right-radius:9px}.card-img,.card-img-bottom{border-bottom-right-radius:9px;border-bottom-left-radius:9px}.card-group>.card{margin-bottom:.75rem}@media (min-width: 576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:1rem 1.25rem;font-size:1rem;color:#888;text-align:left;background-color:#F3F6FF;border:0;border-radius:0;overflow-anchor:none;transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out,border-radius 0.15s ease}@media (prefers-reduced-motion: reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:#1e209f;background-color:#e9e9f7;box-shadow:inset 0 -1px 0 rgba(0,0,0,0.125)}.accordion-button:not(.collapsed)::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%231e209f'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");transform:rotate(-180deg)}.accordion-button::after{flex-shrink:0;width:1.25rem;height:1.25rem;margin-left:auto;content:"";background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23888'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:1.25rem;transition:transform 0.2s ease-in-out}@media (prefers-reduced-motion: reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:#9092d8;outline:0;box-shadow:0 0 0 .25rem rgba(33,36,177,0.25)}.accordion-header{margin-bottom:0}.accordion-item{background-color:#F3F6FF;border:1px solid rgba(0,0,0,0.125)}.accordion-item:first-of-type{border-top-left-radius:10px;border-top-right-radius:10px}.accordion-item:first-of-type .accordion-button{border-top-left-radius:9px;border-top-right-radius:9px}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:10px;border-bottom-left-radius:10px}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:9px;border-bottom-left-radius:9px}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:10px;border-bottom-left-radius:10px}.accordion-body{padding:1rem 1.25rem}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button{border-radius:0}.breadcrumb{display:flex;flex-wrap:wrap;padding:0 0;margin-bottom:1rem;list-style:none}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:var(--bs-breadcrumb-divider, "/") /* rtl: var(--bs-breadcrumb-divider, "/") */}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;color:#2124B1;background-color:#fff;border:1px solid #dee2e6;transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:#1a1d8e;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;color:#1a1d8e;background-color:#e9ecef;outline:0;box-shadow:0 0 0 .25rem rgba(33,36,177,0.25)}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item.active .page-link{z-index:3;color:#fff;background-color:#2124B1;border-color:#2124B1}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;background-color:#fff;border-color:#dee2e6}.page-link{padding:.375rem .75rem}.page-item:first-child .page-link{border-top-left-radius:10px;border-bottom-left-radius:10px}.page-item:last-child .page-link{border-top-right-radius:10px;border-bottom-right-radius:10px}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{position:relative;padding:1rem 1rem;margin-bottom:1rem;border:1px solid transparent;border-radius:10px}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{color:#14166a;background-color:#d3d3ef;border-color:#bcbde8}.alert-primary .alert-link{color:#101255}.alert-secondary{color:#2b4793;background-color:#dae4fd;border-color:#c8d6fc}.alert-secondary .alert-link{color:#223976}.alert-success{color:#0f5132;background-color:#d1e7dd;border-color:#badbcc}.alert-success .alert-link{color:#0c4128}.alert-info{color:#055160;background-color:#cff4fc;border-color:#b6effb}.alert-info .alert-link{color:#04414d}.alert-warning{color:#664d03;background-color:#fff3cd;border-color:#ffecb5}.alert-warning .alert-link{color:#523e02}.alert-danger{color:#842029;background-color:#f8d7da;border-color:#f5c2c7}.alert-danger .alert-link{color:#6a1a21}.alert-light{color:#636466;background-color:#fdfeff;border-color:#fdfeff}.alert-light .alert-link{color:#4f5052}.alert-dark{color:#111117;background-color:#d2d2d4;border-color:#bbbbbe}.alert-dark .alert-link{color:#0e0e12}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:10px}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#2124B1;transition:width 0.6s ease}@media (prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-size:1rem 1rem}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:10px}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>li::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#888;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.5rem 1rem;color:#212529;background-color:#fff;border:1px solid rgba(0,0,0,0.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#2124B1;border-color:#2124B1}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:10px;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:10px;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width: 576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:10px;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:10px;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:10px;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:10px;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:10px;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:10px;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:10px;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:10px;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-left-radius:10px;border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child{border-top-right-radius:10px;border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#14166a;background-color:#d3d3ef}.list-group-item-primary.list-group-item-action:hover,.list-group-item-primary.list-group-item-action:focus{color:#14166a;background-color:#bebed7}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#14166a;border-color:#14166a}.list-group-item-secondary{color:#2b4793;background-color:#dae4fd}.list-group-item-secondary.list-group-item-action:hover,.list-group-item-secondary.list-group-item-action:focus{color:#2b4793;background-color:#c4cde4}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#2b4793;border-color:#2b4793}.list-group-item-success{color:#0f5132;background-color:#d1e7dd}.list-group-item-success.list-group-item-action:hover,.list-group-item-success.list-group-item-action:focus{color:#0f5132;background-color:#bcd0c7}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}.list-group-item-info{color:#055160;background-color:#cff4fc}.list-group-item-info.list-group-item-action:hover,.list-group-item-info.list-group-item-action:focus{color:#055160;background-color:#badce3}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#055160;border-color:#055160}.list-group-item-warning{color:#664d03;background-color:#fff3cd}.list-group-item-warning.list-group-item-action:hover,.list-group-item-warning.list-group-item-action:focus{color:#664d03;background-color:#e6dbb9}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}.list-group-item-danger{color:#842029;background-color:#f8d7da}.list-group-item-danger.list-group-item-action:hover,.list-group-item-danger.list-group-item-action:focus{color:#842029;background-color:#dfc2c4}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}.list-group-item-light{color:#636466;background-color:#fdfeff}.list-group-item-light.list-group-item-action:hover,.list-group-item-light.list-group-item-action:focus{color:#636466;background-color:#e4e5e6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#636466;border-color:#636466}.list-group-item-dark{color:#111117;background-color:#d2d2d4}.list-group-item-dark.list-group-item-action:hover,.list-group-item-dark.list-group-item-action:focus{color:#111117;background-color:#bdbdbf}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#111117;border-color:#111117}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:#000;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:10px;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(33,36,177,0.25);opacity:1}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{width:350px;max-width:100%;font-size:.875rem;pointer-events:auto;background-color:rgba(255,255,255,0.85);background-clip:padding-box;border:1px solid rgba(0,0,0,0.1);box-shadow:0 0.5rem 1rem rgba(0,0,0,0.15);border-radius:10px}.toast:not(.showing):not(.show){opacity:0}.toast.hide{display:none}.toast-container{width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:.75rem}.toast-header{display:flex;align-items:center;padding:.5rem .75rem;color:#6c757d;background-color:rgba(255,255,255,0.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,0.05);border-top-left-radius:9px;border-top-right-radius:9px}.toast-header .btn-close{margin-right:-.375rem;margin-left:.75rem}.toast-body{padding:.75rem;word-wrap:break-word}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1060;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform 0.3s ease-out;transform:translate(0, -50px)}@media (prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .btn-close{padding:.5rem .5rem;margin:-.5rem -.5rem -.5rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;flex-shrink:0;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}@media (min-width: 576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{height:calc(100% - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width: 992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width: 1200px){.modal-xl{max-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}.modal-fullscreen .modal-footer{border-radius:0}@media (max-width: 575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}.modal-fullscreen-sm-down .modal-footer{border-radius:0}}@media (max-width: 767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}.modal-fullscreen-md-down .modal-footer{border-radius:0}}@media (max-width: 991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}.modal-fullscreen-lg-down .modal-footer{border-radius:0}}@media (max-width: 1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}.modal-fullscreen-xl-down .modal-footer{border-radius:0}}@media (max-width: 1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}.modal-fullscreen-xxl-down .modal-footer{border-radius:0}}.tooltip{position:absolute;z-index:1080;display:block;margin:0;font-family:"Heebo",sans-serif;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-top,.bs-tooltip-auto[data-popper-placement^="top"]{padding:.4rem 0}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^="top"] .tooltip-arrow{bottom:0}.bs-tooltip-top .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^="top"] .tooltip-arrow::before{top:-1px;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-end,.bs-tooltip-auto[data-popper-placement^="right"]{padding:0 .4rem}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^="right"] .tooltip-arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-end .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^="right"] .tooltip-arrow::before{right:-1px;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-bottom,.bs-tooltip-auto[data-popper-placement^="bottom"]{padding:.4rem 0}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^="bottom"] .tooltip-arrow{top:0}.bs-tooltip-bottom .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^="bottom"] .tooltip-arrow::before{bottom:-1px;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-start,.bs-tooltip-auto[data-popper-placement^="left"]{padding:0 .4rem}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^="left"] .tooltip-arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-start .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^="left"] .tooltip-arrow::before{left:-1px;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:10px}.popover{position:absolute;top:0;left:0 /* rtl:ignore */;z-index:1070;display:block;max-width:276px;font-family:"Heebo",sans-serif;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.2);border-radius:.3rem}.popover .popover-arrow{position:absolute;display:block;width:1rem;height:.5rem}.popover .popover-arrow::before,.popover .popover-arrow::after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^="top"]>.popover-arrow{bottom:calc(-.5rem - 1px)}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^="top"]>.popover-arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,0.25)}.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^="top"]>.popover-arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^="right"]>.popover-arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^="right"]>.popover-arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,0.25)}.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^="right"]>.popover-arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^="bottom"]>.popover-arrow{top:calc(-.5rem - 1px)}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^="bottom"]>.popover-arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,0.25)}.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^="bottom"]>.popover-arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-bottom .popover-header::before,.bs-popover-auto[data-popper-placement^="bottom"] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f0f0f0}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^="left"]>.popover-arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^="left"]>.popover-arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,0.25)}.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^="left"]>.popover-arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;color:#1D1D27;background-color:#f0f0f0;border-bottom:1px solid #d8d8d8;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:1rem 1rem;color:#888}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity 0.15s ease}@media (prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity 0.6s ease}@media (prefers-reduced-motion: reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}@keyframes spinner-border{to{transform:rotate(360deg) /* rtl:ignore */}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentColor;border-radius:50%;opacity:0;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{animation-duration:1.5s}}.offcanvas{position:fixed;bottom:0;z-index:1050;display:flex;flex-direction:column;max-width:100%;visibility:hidden;background-color:#fff;background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}@media (prefers-reduced-motion: reduce){.offcanvas{transition:none}}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:1rem 1rem}.offcanvas-header .btn-close{padding:.5rem .5rem;margin:-.5rem -.5rem -.5rem auto}.offcanvas-title{margin-bottom:0;line-height:1.5}.offcanvas-body{flex-grow:1;padding:1rem 1rem;overflow-y:auto}.offcanvas-start{top:0;left:0;width:400px;border-right:1px solid rgba(0,0,0,0.2);transform:translateX(-100%)}.offcanvas-end{top:0;right:0;width:400px;border-left:1px solid rgba(0,0,0,0.2);transform:translateX(100%)}.offcanvas-top{top:0;right:0;left:0;height:30vh;max-height:100%;border-bottom:1px solid rgba(0,0,0,0.2);transform:translateY(-100%)}.offcanvas-bottom{right:0;left:0;height:30vh;max-height:100%;border-top:1px solid rgba(0,0,0,0.2);transform:translateY(100%)}.offcanvas.show{transform:none}.clearfix::after{display:block;clear:both;content:""}.link-primary{color:#2124B1}.link-primary:hover,.link-primary:focus{color:#1a1d8e}.link-secondary{color:#4777F5}.link-secondary:hover,.link-secondary:focus{color:#6c92f7}.link-success{color:#198754}.link-success:hover,.link-success:focus{color:#146c43}.link-info{color:#0dcaf0}.link-info:hover,.link-info:focus{color:#3dd5f3}.link-warning{color:#ffc107}.link-warning:hover,.link-warning:focus{color:#ffcd39}.link-danger{color:#dc3545}.link-danger:hover,.link-danger:focus{color:#b02a37}.link-light{color:#F7FAFF}.link-light:hover,.link-light:focus{color:#f9fbff}.link-dark{color:#1D1D27}.link-dark:hover,.link-dark:focus{color:#17171f}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio: 100%}.ratio-4x3{--bs-aspect-ratio: calc(3 / 4 * 100%)}.ratio-16x9{--bs-aspect-ratio: calc(9 / 16 * 100%)}.ratio-21x9{--bs-aspect-ratio: calc(9 / 21 * 100%)}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:sticky;top:0;z-index:1020}@media (min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}}@media (min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}}@media (min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}}@media (min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}}@media (min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.float-start{float:left !important}.float-end{float:right !important}.float-none{float:none !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.overflow-visible{overflow:visible !important}.overflow-scroll{overflow:scroll !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-grid{display:grid !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}.d-none{display:none !important}.shadow{box-shadow:0 0.5rem 1rem rgba(0,0,0,0.15) !important}.shadow-sm{box-shadow:0 0.125rem 0.25rem rgba(0,0,0,0.075) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,0.175) !important}.shadow-none{box-shadow:none !important}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.top-0{top:0 !important}.top-50{top:50% !important}.top-100{top:100% !important}.bottom-0{bottom:0 !important}.bottom-50{bottom:50% !important}.bottom-100{bottom:100% !important}.start-0{left:0 !important}.start-50{left:50% !important}.start-100{left:100% !important}.end-0{right:0 !important}.end-50{right:50% !important}.end-100{right:100% !important}.translate-middle{transform:translate(-50%, -50%) !important}.translate-middle-x{transform:translateX(-50%) !important}.translate-middle-y{transform:translateY(-50%) !important}.border{border:1px solid #dee2e6 !important}.border-0{border:0 !important}.border-top{border-top:1px solid #dee2e6 !important}.border-top-0{border-top:0 !important}.border-end{border-right:1px solid #dee2e6 !important}.border-end-0{border-right:0 !important}.border-bottom{border-bottom:1px solid #dee2e6 !important}.border-bottom-0{border-bottom:0 !important}.border-start{border-left:1px solid #dee2e6 !important}.border-start-0{border-left:0 !important}.border-primary{border-color:#2124B1 !important}.border-secondary{border-color:#4777F5 !important}.border-success{border-color:#198754 !important}.border-info{border-color:#0dcaf0 !important}.border-warning{border-color:#ffc107 !important}.border-danger{border-color:#dc3545 !important}.border-light{border-color:#F7FAFF !important}.border-dark{border-color:#1D1D27 !important}.border-white{border-color:#fff !important}.border-1{border-width:1px !important}.border-2{border-width:2px !important}.border-3{border-width:3px !important}.border-4{border-width:4px !important}.border-5{border-width:5px !important}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.mw-100{max-width:100% !important}.vw-100{width:100vw !important}.min-vw-100{min-width:100vw !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mh-100{max-height:100% !important}.vh-100{height:100vh !important}.min-vh-100{min-height:100vh !important}.flex-fill{flex:1 1 auto !important}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.gap-0{gap:0 !important}.gap-1{gap:.25rem !important}.gap-2{gap:.5rem !important}.gap-3{gap:1rem !important}.gap-4{gap:1.5rem !important}.gap-5{gap:3rem !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.justify-content-evenly{justify-content:space-evenly !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}.order-first{order:-1 !important}.order-0{order:0 !important}.order-1{order:1 !important}.order-2{order:2 !important}.order-3{order:3 !important}.order-4{order:4 !important}.order-5{order:5 !important}.order-last{order:6 !important}.m-0{margin:0 !important}.m-1{margin:.25rem !important}.m-2{margin:.5rem !important}.m-3{margin:1rem !important}.m-4{margin:1.5rem !important}.m-5{margin:3rem !important}.m-auto{margin:auto !important}.mx-0{margin-right:0 !important;margin-left:0 !important}.mx-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-3{margin-right:1rem !important;margin-left:1rem !important}.mx-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-5{margin-right:3rem !important;margin-left:3rem !important}.mx-auto{margin-right:auto !important;margin-left:auto !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-0{margin-top:0 !important}.mt-1{margin-top:.25rem !important}.mt-2{margin-top:.5rem !important}.mt-3{margin-top:1rem !important}.mt-4{margin-top:1.5rem !important}.mt-5{margin-top:3rem !important}.mt-auto{margin-top:auto !important}.me-0{margin-right:0 !important}.me-1{margin-right:.25rem !important}.me-2{margin-right:.5rem !important}.me-3{margin-right:1rem !important}.me-4{margin-right:1.5rem !important}.me-5{margin-right:3rem !important}.me-auto{margin-right:auto !important}.mb-0{margin-bottom:0 !important}.mb-1{margin-bottom:.25rem !important}.mb-2{margin-bottom:.5rem !important}.mb-3{margin-bottom:1rem !important}.mb-4{margin-bottom:1.5rem !important}.mb-5{margin-bottom:3rem !important}.mb-auto{margin-bottom:auto !important}.ms-0{margin-left:0 !important}.ms-1{margin-left:.25rem !important}.ms-2{margin-left:.5rem !important}.ms-3{margin-left:1rem !important}.ms-4{margin-left:1.5rem !important}.ms-5{margin-left:3rem !important}.ms-auto{margin-left:auto !important}.m-n1{margin:-.25rem !important}.m-n2{margin:-.5rem !important}.m-n3{margin:-1rem !important}.m-n4{margin:-1.5rem !important}.m-n5{margin:-3rem !important}.mx-n1{margin-right:-.25rem !important;margin-left:-.25rem !important}.mx-n2{margin-right:-.5rem !important;margin-left:-.5rem !important}.mx-n3{margin-right:-1rem !important;margin-left:-1rem !important}.mx-n4{margin-right:-1.5rem !important;margin-left:-1.5rem !important}.mx-n5{margin-right:-3rem !important;margin-left:-3rem !important}.my-n1{margin-top:-.25rem !important;margin-bottom:-.25rem !important}.my-n2{margin-top:-.5rem !important;margin-bottom:-.5rem !important}.my-n3{margin-top:-1rem !important;margin-bottom:-1rem !important}.my-n4{margin-top:-1.5rem !important;margin-bottom:-1.5rem !important}.my-n5{margin-top:-3rem !important;margin-bottom:-3rem !important}.mt-n1{margin-top:-.25rem !important}.mt-n2{margin-top:-.5rem !important}.mt-n3{margin-top:-1rem !important}.mt-n4{margin-top:-1.5rem !important}.mt-n5{margin-top:-3rem !important}.me-n1{margin-right:-.25rem !important}.me-n2{margin-right:-.5rem !important}.me-n3{margin-right:-1rem !important}.me-n4{margin-right:-1.5rem !important}.me-n5{margin-right:-3rem !important}.mb-n1{margin-bottom:-.25rem !important}.mb-n2{margin-bottom:-.5rem !important}.mb-n3{margin-bottom:-1rem !important}.mb-n4{margin-bottom:-1.5rem !important}.mb-n5{margin-bottom:-3rem !important}.ms-n1{margin-left:-.25rem !important}.ms-n2{margin-left:-.5rem !important}.ms-n3{margin-left:-1rem !important}.ms-n4{margin-left:-1.5rem !important}.ms-n5{margin-left:-3rem !important}.p-0{padding:0 !important}.p-1{padding:.25rem !important}.p-2{padding:.5rem !important}.p-3{padding:1rem !important}.p-4{padding:1.5rem !important}.p-5{padding:3rem !important}.px-0{padding-right:0 !important;padding-left:0 !important}.px-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-3{padding-right:1rem !important;padding-left:1rem !important}.px-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-5{padding-right:3rem !important;padding-left:3rem !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-0{padding-top:0 !important}.pt-1{padding-top:.25rem !important}.pt-2{padding-top:.5rem !important}.pt-3{padding-top:1rem !important}.pt-4{padding-top:1.5rem !important}.pt-5{padding-top:3rem !important}.pe-0{padding-right:0 !important}.pe-1{padding-right:.25rem !important}.pe-2{padding-right:.5rem !important}.pe-3{padding-right:1rem !important}.pe-4{padding-right:1.5rem !important}.pe-5{padding-right:3rem !important}.pb-0{padding-bottom:0 !important}.pb-1{padding-bottom:.25rem !important}.pb-2{padding-bottom:.5rem !important}.pb-3{padding-bottom:1rem !important}.pb-4{padding-bottom:1.5rem !important}.pb-5{padding-bottom:3rem !important}.ps-0{padding-left:0 !important}.ps-1{padding-left:.25rem !important}.ps-2{padding-left:.5rem !important}.ps-3{padding-left:1rem !important}.ps-4{padding-left:1.5rem !important}.ps-5{padding-left:3rem !important}.font-monospace{font-family:var(--bs-font-monospace) !important}.fs-1{font-size:calc(1.375rem + 1.5vw) !important}.fs-2{font-size:calc(1.325rem + .9vw) !important}.fs-3{font-size:calc(1.3rem + .6vw) !important}.fs-4{font-size:calc(1.275rem + .3vw) !important}.fs-5{font-size:1.25rem !important}.fs-6{font-size:1rem !important}.fst-italic{font-style:italic !important}.fst-normal{font-style:normal !important}.fw-light{font-weight:300 !important}.fw-lighter{font-weight:lighter !important}.fw-normal{font-weight:400 !important}.fw-bold{font-weight:700 !important}.fw-bolder{font-weight:bolder !important}.lh-1{line-height:1 !important}.lh-sm{line-height:1.25 !important}.lh-base{line-height:1.5 !important}.lh-lg{line-height:2 !important}.text-start{text-align:left !important}.text-end{text-align:right !important}.text-center{text-align:center !important}.text-decoration-none{text-decoration:none !important}.text-decoration-underline{text-decoration:underline !important}.text-decoration-line-through{text-decoration:line-through !important}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-break{word-wrap:break-word !important;word-break:break-word !important}.text-primary{color:#2124B1 !important}.text-secondary{color:#4777F5 !important}.text-success{color:#198754 !important}.text-info{color:#0dcaf0 !important}.text-warning{color:#ffc107 !important}.text-danger{color:#dc3545 !important}.text-light{color:#F7FAFF !important}.text-dark{color:#1D1D27 !important}.text-white{color:#fff !important}.text-body{color:#888 !important}.text-muted{color:#6c757d !important}.text-black-50{color:rgba(0,0,0,0.5) !important}.text-white-50{color:rgba(255,255,255,0.5) !important}.text-reset{color:inherit !important}.bg-primary{background-color:#2124B1 !important}.bg-secondary{background-color:#4777F5 !important}.bg-success{background-color:#198754 !important}.bg-info{background-color:#0dcaf0 !important}.bg-warning{background-color:#ffc107 !important}.bg-danger{background-color:#dc3545 !important}.bg-light{background-color:#F7FAFF !important}.bg-dark{background-color:#1D1D27 !important}.bg-body{background-color:#F3F6FF !important}.bg-white{background-color:#fff !important}.bg-transparent{background-color:rgba(0,0,0,0) !important}.bg-gradient{background-image:var(--bs-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:10px !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:.2rem !important}.rounded-2{border-radius:10px !important}.rounded-3{border-radius:.3rem !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:50rem !important}.rounded-top{border-top-left-radius:10px !important;border-top-right-radius:10px !important}.rounded-end{border-top-right-radius:10px !important;border-bottom-right-radius:10px !important}.rounded-bottom{border-bottom-right-radius:10px !important;border-bottom-left-radius:10px !important}.rounded-start{border-bottom-left-radius:10px !important;border-top-left-radius:10px !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}@media (min-width: 576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-grid{display:grid !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}.d-sm-none{display:none !important}.flex-sm-fill{flex:1 1 auto !important}.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.gap-sm-0{gap:0 !important}.gap-sm-1{gap:.25rem !important}.gap-sm-2{gap:.5rem !important}.gap-sm-3{gap:1rem !important}.gap-sm-4{gap:1.5rem !important}.gap-sm-5{gap:3rem !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.justify-content-sm-evenly{justify-content:space-evenly !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}.order-sm-first{order:-1 !important}.order-sm-0{order:0 !important}.order-sm-1{order:1 !important}.order-sm-2{order:2 !important}.order-sm-3{order:3 !important}.order-sm-4{order:4 !important}.order-sm-5{order:5 !important}.order-sm-last{order:6 !important}.m-sm-0{margin:0 !important}.m-sm-1{margin:.25rem !important}.m-sm-2{margin:.5rem !important}.m-sm-3{margin:1rem !important}.m-sm-4{margin:1.5rem !important}.m-sm-5{margin:3rem !important}.m-sm-auto{margin:auto !important}.mx-sm-0{margin-right:0 !important;margin-left:0 !important}.mx-sm-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-sm-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-sm-3{margin-right:1rem !important;margin-left:1rem !important}.mx-sm-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-sm-5{margin-right:3rem !important;margin-left:3rem !important}.mx-sm-auto{margin-right:auto !important;margin-left:auto !important}.my-sm-0{margin-top:0 !important;margin-bottom:0 !important}.my-sm-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-sm-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-sm-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-sm-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-sm-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-sm-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-sm-0{margin-top:0 !important}.mt-sm-1{margin-top:.25rem !important}.mt-sm-2{margin-top:.5rem !important}.mt-sm-3{margin-top:1rem !important}.mt-sm-4{margin-top:1.5rem !important}.mt-sm-5{margin-top:3rem !important}.mt-sm-auto{margin-top:auto !important}.me-sm-0{margin-right:0 !important}.me-sm-1{margin-right:.25rem !important}.me-sm-2{margin-right:.5rem !important}.me-sm-3{margin-right:1rem !important}.me-sm-4{margin-right:1.5rem !important}.me-sm-5{margin-right:3rem !important}.me-sm-auto{margin-right:auto !important}.mb-sm-0{margin-bottom:0 !important}.mb-sm-1{margin-bottom:.25rem !important}.mb-sm-2{margin-bottom:.5rem !important}.mb-sm-3{margin-bottom:1rem !important}.mb-sm-4{margin-bottom:1.5rem !important}.mb-sm-5{margin-bottom:3rem !important}.mb-sm-auto{margin-bottom:auto !important}.ms-sm-0{margin-left:0 !important}.ms-sm-1{margin-left:.25rem !important}.ms-sm-2{margin-left:.5rem !important}.ms-sm-3{margin-left:1rem !important}.ms-sm-4{margin-left:1.5rem !important}.ms-sm-5{margin-left:3rem !important}.ms-sm-auto{margin-left:auto !important}.m-sm-n1{margin:-.25rem !important}.m-sm-n2{margin:-.5rem !important}.m-sm-n3{margin:-1rem !important}.m-sm-n4{margin:-1.5rem !important}.m-sm-n5{margin:-3rem !important}.mx-sm-n1{margin-right:-.25rem !important;margin-left:-.25rem !important}.mx-sm-n2{margin-right:-.5rem !important;margin-left:-.5rem !important}.mx-sm-n3{margin-right:-1rem !important;margin-left:-1rem !important}.mx-sm-n4{margin-right:-1.5rem !important;margin-left:-1.5rem !important}.mx-sm-n5{margin-right:-3rem !important;margin-left:-3rem !important}.my-sm-n1{margin-top:-.25rem !important;margin-bottom:-.25rem !important}.my-sm-n2{margin-top:-.5rem !important;margin-bottom:-.5rem !important}.my-sm-n3{margin-top:-1rem !important;margin-bottom:-1rem !important}.my-sm-n4{margin-top:-1.5rem !important;margin-bottom:-1.5rem !important}.my-sm-n5{margin-top:-3rem !important;margin-bottom:-3rem !important}.mt-sm-n1{margin-top:-.25rem !important}.mt-sm-n2{margin-top:-.5rem !important}.mt-sm-n3{margin-top:-1rem !important}.mt-sm-n4{margin-top:-1.5rem !important}.mt-sm-n5{margin-top:-3rem !important}.me-sm-n1{margin-right:-.25rem !important}.me-sm-n2{margin-right:-.5rem !important}.me-sm-n3{margin-right:-1rem !important}.me-sm-n4{margin-right:-1.5rem !important}.me-sm-n5{margin-right:-3rem !important}.mb-sm-n1{margin-bottom:-.25rem !important}.mb-sm-n2{margin-bottom:-.5rem !important}.mb-sm-n3{margin-bottom:-1rem !important}.mb-sm-n4{margin-bottom:-1.5rem !important}.mb-sm-n5{margin-bottom:-3rem !important}.ms-sm-n1{margin-left:-.25rem !important}.ms-sm-n2{margin-left:-.5rem !important}.ms-sm-n3{margin-left:-1rem !important}.ms-sm-n4{margin-left:-1.5rem !important}.ms-sm-n5{margin-left:-3rem !important}.p-sm-0{padding:0 !important}.p-sm-1{padding:.25rem !important}.p-sm-2{padding:.5rem !important}.p-sm-3{padding:1rem !important}.p-sm-4{padding:1.5rem !important}.p-sm-5{padding:3rem !important}.px-sm-0{padding-right:0 !important;padding-left:0 !important}.px-sm-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-sm-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-sm-3{padding-right:1rem !important;padding-left:1rem !important}.px-sm-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-sm-5{padding-right:3rem !important;padding-left:3rem !important}.py-sm-0{padding-top:0 !important;padding-bottom:0 !important}.py-sm-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-sm-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-sm-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-sm-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-sm-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-sm-0{padding-top:0 !important}.pt-sm-1{padding-top:.25rem !important}.pt-sm-2{padding-top:.5rem !important}.pt-sm-3{padding-top:1rem !important}.pt-sm-4{padding-top:1.5rem !important}.pt-sm-5{padding-top:3rem !important}.pe-sm-0{padding-right:0 !important}.pe-sm-1{padding-right:.25rem !important}.pe-sm-2{padding-right:.5rem !important}.pe-sm-3{padding-right:1rem !important}.pe-sm-4{padding-right:1.5rem !important}.pe-sm-5{padding-right:3rem !important}.pb-sm-0{padding-bottom:0 !important}.pb-sm-1{padding-bottom:.25rem !important}.pb-sm-2{padding-bottom:.5rem !important}.pb-sm-3{padding-bottom:1rem !important}.pb-sm-4{padding-bottom:1.5rem !important}.pb-sm-5{padding-bottom:3rem !important}.ps-sm-0{padding-left:0 !important}.ps-sm-1{padding-left:.25rem !important}.ps-sm-2{padding-left:.5rem !important}.ps-sm-3{padding-left:1rem !important}.ps-sm-4{padding-left:1.5rem !important}.ps-sm-5{padding-left:3rem !important}.text-sm-start{text-align:left !important}.text-sm-end{text-align:right !important}.text-sm-center{text-align:center !important}}@media (min-width: 768px){.float-md-start{float:left !important}.float-md-end{float:right !important}.float-md-none{float:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-grid{display:grid !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}.d-md-none{display:none !important}.flex-md-fill{flex:1 1 auto !important}.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.gap-md-0{gap:0 !important}.gap-md-1{gap:.25rem !important}.gap-md-2{gap:.5rem !important}.gap-md-3{gap:1rem !important}.gap-md-4{gap:1.5rem !important}.gap-md-5{gap:3rem !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.justify-content-md-evenly{justify-content:space-evenly !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}.order-md-first{order:-1 !important}.order-md-0{order:0 !important}.order-md-1{order:1 !important}.order-md-2{order:2 !important}.order-md-3{order:3 !important}.order-md-4{order:4 !important}.order-md-5{order:5 !important}.order-md-last{order:6 !important}.m-md-0{margin:0 !important}.m-md-1{margin:.25rem !important}.m-md-2{margin:.5rem !important}.m-md-3{margin:1rem !important}.m-md-4{margin:1.5rem !important}.m-md-5{margin:3rem !important}.m-md-auto{margin:auto !important}.mx-md-0{margin-right:0 !important;margin-left:0 !important}.mx-md-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-md-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-md-3{margin-right:1rem !important;margin-left:1rem !important}.mx-md-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-md-5{margin-right:3rem !important;margin-left:3rem !important}.mx-md-auto{margin-right:auto !important;margin-left:auto !important}.my-md-0{margin-top:0 !important;margin-bottom:0 !important}.my-md-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-md-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-md-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-md-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-md-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-md-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-md-0{margin-top:0 !important}.mt-md-1{margin-top:.25rem !important}.mt-md-2{margin-top:.5rem !important}.mt-md-3{margin-top:1rem !important}.mt-md-4{margin-top:1.5rem !important}.mt-md-5{margin-top:3rem !important}.mt-md-auto{margin-top:auto !important}.me-md-0{margin-right:0 !important}.me-md-1{margin-right:.25rem !important}.me-md-2{margin-right:.5rem !important}.me-md-3{margin-right:1rem !important}.me-md-4{margin-right:1.5rem !important}.me-md-5{margin-right:3rem !important}.me-md-auto{margin-right:auto !important}.mb-md-0{margin-bottom:0 !important}.mb-md-1{margin-bottom:.25rem !important}.mb-md-2{margin-bottom:.5rem !important}.mb-md-3{margin-bottom:1rem !important}.mb-md-4{margin-bottom:1.5rem !important}.mb-md-5{margin-bottom:3rem !important}.mb-md-auto{margin-bottom:auto !important}.ms-md-0{margin-left:0 !important}.ms-md-1{margin-left:.25rem !important}.ms-md-2{margin-left:.5rem !important}.ms-md-3{margin-left:1rem !important}.ms-md-4{margin-left:1.5rem !important}.ms-md-5{margin-left:3rem !important}.ms-md-auto{margin-left:auto !important}.m-md-n1{margin:-.25rem !important}.m-md-n2{margin:-.5rem !important}.m-md-n3{margin:-1rem !important}.m-md-n4{margin:-1.5rem !important}.m-md-n5{margin:-3rem !important}.mx-md-n1{margin-right:-.25rem !important;margin-left:-.25rem !important}.mx-md-n2{margin-right:-.5rem !important;margin-left:-.5rem !important}.mx-md-n3{margin-right:-1rem !important;margin-left:-1rem !important}.mx-md-n4{margin-right:-1.5rem !important;margin-left:-1.5rem !important}.mx-md-n5{margin-right:-3rem !important;margin-left:-3rem !important}.my-md-n1{margin-top:-.25rem !important;margin-bottom:-.25rem !important}.my-md-n2{margin-top:-.5rem !important;margin-bottom:-.5rem !important}.my-md-n3{margin-top:-1rem !important;margin-bottom:-1rem !important}.my-md-n4{margin-top:-1.5rem !important;margin-bottom:-1.5rem !important}.my-md-n5{margin-top:-3rem !important;margin-bottom:-3rem !important}.mt-md-n1{margin-top:-.25rem !important}.mt-md-n2{margin-top:-.5rem !important}.mt-md-n3{margin-top:-1rem !important}.mt-md-n4{margin-top:-1.5rem !important}.mt-md-n5{margin-top:-3rem !important}.me-md-n1{margin-right:-.25rem !important}.me-md-n2{margin-right:-.5rem !important}.me-md-n3{margin-right:-1rem !important}.me-md-n4{margin-right:-1.5rem !important}.me-md-n5{margin-right:-3rem !important}.mb-md-n1{margin-bottom:-.25rem !important}.mb-md-n2{margin-bottom:-.5rem !important}.mb-md-n3{margin-bottom:-1rem !important}.mb-md-n4{margin-bottom:-1.5rem !important}.mb-md-n5{margin-bottom:-3rem !important}.ms-md-n1{margin-left:-.25rem !important}.ms-md-n2{margin-left:-.5rem !important}.ms-md-n3{margin-left:-1rem !important}.ms-md-n4{margin-left:-1.5rem !important}.ms-md-n5{margin-left:-3rem !important}.p-md-0{padding:0 !important}.p-md-1{padding:.25rem !important}.p-md-2{padding:.5rem !important}.p-md-3{padding:1rem !important}.p-md-4{padding:1.5rem !important}.p-md-5{padding:3rem !important}.px-md-0{padding-right:0 !important;padding-left:0 !important}.px-md-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-md-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-md-3{padding-right:1rem !important;padding-left:1rem !important}.px-md-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-md-5{padding-right:3rem !important;padding-left:3rem !important}.py-md-0{padding-top:0 !important;padding-bottom:0 !important}.py-md-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-md-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-md-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-md-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-md-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-md-0{padding-top:0 !important}.pt-md-1{padding-top:.25rem !important}.pt-md-2{padding-top:.5rem !important}.pt-md-3{padding-top:1rem !important}.pt-md-4{padding-top:1.5rem !important}.pt-md-5{padding-top:3rem !important}.pe-md-0{padding-right:0 !important}.pe-md-1{padding-right:.25rem !important}.pe-md-2{padding-right:.5rem !important}.pe-md-3{padding-right:1rem !important}.pe-md-4{padding-right:1.5rem !important}.pe-md-5{padding-right:3rem !important}.pb-md-0{padding-bottom:0 !important}.pb-md-1{padding-bottom:.25rem !important}.pb-md-2{padding-bottom:.5rem !important}.pb-md-3{padding-bottom:1rem !important}.pb-md-4{padding-bottom:1.5rem !important}.pb-md-5{padding-bottom:3rem !important}.ps-md-0{padding-left:0 !important}.ps-md-1{padding-left:.25rem !important}.ps-md-2{padding-left:.5rem !important}.ps-md-3{padding-left:1rem !important}.ps-md-4{padding-left:1.5rem !important}.ps-md-5{padding-left:3rem !important}.text-md-start{text-align:left !important}.text-md-end{text-align:right !important}.text-md-center{text-align:center !important}}@media (min-width: 992px){.float-lg-start{float:left !important}.float-lg-end{float:right !important}.float-lg-none{float:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-grid{display:grid !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}.d-lg-none{display:none !important}.flex-lg-fill{flex:1 1 auto !important}.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.gap-lg-0{gap:0 !important}.gap-lg-1{gap:.25rem !important}.gap-lg-2{gap:.5rem !important}.gap-lg-3{gap:1rem !important}.gap-lg-4{gap:1.5rem !important}.gap-lg-5{gap:3rem !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.justify-content-lg-evenly{justify-content:space-evenly !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}.order-lg-first{order:-1 !important}.order-lg-0{order:0 !important}.order-lg-1{order:1 !important}.order-lg-2{order:2 !important}.order-lg-3{order:3 !important}.order-lg-4{order:4 !important}.order-lg-5{order:5 !important}.order-lg-last{order:6 !important}.m-lg-0{margin:0 !important}.m-lg-1{margin:.25rem !important}.m-lg-2{margin:.5rem !important}.m-lg-3{margin:1rem !important}.m-lg-4{margin:1.5rem !important}.m-lg-5{margin:3rem !important}.m-lg-auto{margin:auto !important}.mx-lg-0{margin-right:0 !important;margin-left:0 !important}.mx-lg-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-lg-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-lg-3{margin-right:1rem !important;margin-left:1rem !important}.mx-lg-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-lg-5{margin-right:3rem !important;margin-left:3rem !important}.mx-lg-auto{margin-right:auto !important;margin-left:auto !important}.my-lg-0{margin-top:0 !important;margin-bottom:0 !important}.my-lg-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-lg-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-lg-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-lg-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-lg-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-lg-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-lg-0{margin-top:0 !important}.mt-lg-1{margin-top:.25rem !important}.mt-lg-2{margin-top:.5rem !important}.mt-lg-3{margin-top:1rem !important}.mt-lg-4{margin-top:1.5rem !important}.mt-lg-5{margin-top:3rem !important}.mt-lg-auto{margin-top:auto !important}.me-lg-0{margin-right:0 !important}.me-lg-1{margin-right:.25rem !important}.me-lg-2{margin-right:.5rem !important}.me-lg-3{margin-right:1rem !important}.me-lg-4{margin-right:1.5rem !important}.me-lg-5{margin-right:3rem !important}.me-lg-auto{margin-right:auto !important}.mb-lg-0{margin-bottom:0 !important}.mb-lg-1{margin-bottom:.25rem !important}.mb-lg-2{margin-bottom:.5rem !important}.mb-lg-3{margin-bottom:1rem !important}.mb-lg-4{margin-bottom:1.5rem !important}.mb-lg-5{margin-bottom:3rem !important}.mb-lg-auto{margin-bottom:auto !important}.ms-lg-0{margin-left:0 !important}.ms-lg-1{margin-left:.25rem !important}.ms-lg-2{margin-left:.5rem !important}.ms-lg-3{margin-left:1rem !important}.ms-lg-4{margin-left:1.5rem !important}.ms-lg-5{margin-left:3rem !important}.ms-lg-auto{margin-left:auto !important}.m-lg-n1{margin:-.25rem !important}.m-lg-n2{margin:-.5rem !important}.m-lg-n3{margin:-1rem !important}.m-lg-n4{margin:-1.5rem !important}.m-lg-n5{margin:-3rem !important}.mx-lg-n1{margin-right:-.25rem !important;margin-left:-.25rem !important}.mx-lg-n2{margin-right:-.5rem !important;margin-left:-.5rem !important}.mx-lg-n3{margin-right:-1rem !important;margin-left:-1rem !important}.mx-lg-n4{margin-right:-1.5rem !important;margin-left:-1.5rem !important}.mx-lg-n5{margin-right:-3rem !important;margin-left:-3rem !important}.my-lg-n1{margin-top:-.25rem !important;margin-bottom:-.25rem !important}.my-lg-n2{margin-top:-.5rem !important;margin-bottom:-.5rem !important}.my-lg-n3{margin-top:-1rem !important;margin-bottom:-1rem !important}.my-lg-n4{margin-top:-1.5rem !important;margin-bottom:-1.5rem !important}.my-lg-n5{margin-top:-3rem !important;margin-bottom:-3rem !important}.mt-lg-n1{margin-top:-.25rem !important}.mt-lg-n2{margin-top:-.5rem !important}.mt-lg-n3{margin-top:-1rem !important}.mt-lg-n4{margin-top:-1.5rem !important}.mt-lg-n5{margin-top:-3rem !important}.me-lg-n1{margin-right:-.25rem !important}.me-lg-n2{margin-right:-.5rem !important}.me-lg-n3{margin-right:-1rem !important}.me-lg-n4{margin-right:-1.5rem !important}.me-lg-n5{margin-right:-3rem !important}.mb-lg-n1{margin-bottom:-.25rem !important}.mb-lg-n2{margin-bottom:-.5rem !important}.mb-lg-n3{margin-bottom:-1rem !important}.mb-lg-n4{margin-bottom:-1.5rem !important}.mb-lg-n5{margin-bottom:-3rem !important}.ms-lg-n1{margin-left:-.25rem !important}.ms-lg-n2{margin-left:-.5rem !important}.ms-lg-n3{margin-left:-1rem !important}.ms-lg-n4{margin-left:-1.5rem !important}.ms-lg-n5{margin-left:-3rem !important}.p-lg-0{padding:0 !important}.p-lg-1{padding:.25rem !important}.p-lg-2{padding:.5rem !important}.p-lg-3{padding:1rem !important}.p-lg-4{padding:1.5rem !important}.p-lg-5{padding:3rem !important}.px-lg-0{padding-right:0 !important;padding-left:0 !important}.px-lg-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-lg-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-lg-3{padding-right:1rem !important;padding-left:1rem !important}.px-lg-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-lg-5{padding-right:3rem !important;padding-left:3rem !important}.py-lg-0{padding-top:0 !important;padding-bottom:0 !important}.py-lg-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-lg-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-lg-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-lg-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-lg-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-lg-0{padding-top:0 !important}.pt-lg-1{padding-top:.25rem !important}.pt-lg-2{padding-top:.5rem !important}.pt-lg-3{padding-top:1rem !important}.pt-lg-4{padding-top:1.5rem !important}.pt-lg-5{padding-top:3rem !important}.pe-lg-0{padding-right:0 !important}.pe-lg-1{padding-right:.25rem !important}.pe-lg-2{padding-right:.5rem !important}.pe-lg-3{padding-right:1rem !important}.pe-lg-4{padding-right:1.5rem !important}.pe-lg-5{padding-right:3rem !important}.pb-lg-0{padding-bottom:0 !important}.pb-lg-1{padding-bottom:.25rem !important}.pb-lg-2{padding-bottom:.5rem !important}.pb-lg-3{padding-bottom:1rem !important}.pb-lg-4{padding-bottom:1.5rem !important}.pb-lg-5{padding-bottom:3rem !important}.ps-lg-0{padding-left:0 !important}.ps-lg-1{padding-left:.25rem !important}.ps-lg-2{padding-left:.5rem !important}.ps-lg-3{padding-left:1rem !important}.ps-lg-4{padding-left:1.5rem !important}.ps-lg-5{padding-left:3rem !important}.text-lg-start{text-align:left !important}.text-lg-end{text-align:right !important}.text-lg-center{text-align:center !important}}@media (min-width: 1200px){.float-xl-start{float:left !important}.float-xl-end{float:right !important}.float-xl-none{float:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-grid{display:grid !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}.d-xl-none{display:none !important}.flex-xl-fill{flex:1 1 auto !important}.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.gap-xl-0{gap:0 !important}.gap-xl-1{gap:.25rem !important}.gap-xl-2{gap:.5rem !important}.gap-xl-3{gap:1rem !important}.gap-xl-4{gap:1.5rem !important}.gap-xl-5{gap:3rem !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.justify-content-xl-evenly{justify-content:space-evenly !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}.order-xl-first{order:-1 !important}.order-xl-0{order:0 !important}.order-xl-1{order:1 !important}.order-xl-2{order:2 !important}.order-xl-3{order:3 !important}.order-xl-4{order:4 !important}.order-xl-5{order:5 !important}.order-xl-last{order:6 !important}.m-xl-0{margin:0 !important}.m-xl-1{margin:.25rem !important}.m-xl-2{margin:.5rem !important}.m-xl-3{margin:1rem !important}.m-xl-4{margin:1.5rem !important}.m-xl-5{margin:3rem !important}.m-xl-auto{margin:auto !important}.mx-xl-0{margin-right:0 !important;margin-left:0 !important}.mx-xl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xl-auto{margin-right:auto !important;margin-left:auto !important}.my-xl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xl-0{margin-top:0 !important}.mt-xl-1{margin-top:.25rem !important}.mt-xl-2{margin-top:.5rem !important}.mt-xl-3{margin-top:1rem !important}.mt-xl-4{margin-top:1.5rem !important}.mt-xl-5{margin-top:3rem !important}.mt-xl-auto{margin-top:auto !important}.me-xl-0{margin-right:0 !important}.me-xl-1{margin-right:.25rem !important}.me-xl-2{margin-right:.5rem !important}.me-xl-3{margin-right:1rem !important}.me-xl-4{margin-right:1.5rem !important}.me-xl-5{margin-right:3rem !important}.me-xl-auto{margin-right:auto !important}.mb-xl-0{margin-bottom:0 !important}.mb-xl-1{margin-bottom:.25rem !important}.mb-xl-2{margin-bottom:.5rem !important}.mb-xl-3{margin-bottom:1rem !important}.mb-xl-4{margin-bottom:1.5rem !important}.mb-xl-5{margin-bottom:3rem !important}.mb-xl-auto{margin-bottom:auto !important}.ms-xl-0{margin-left:0 !important}.ms-xl-1{margin-left:.25rem !important}.ms-xl-2{margin-left:.5rem !important}.ms-xl-3{margin-left:1rem !important}.ms-xl-4{margin-left:1.5rem !important}.ms-xl-5{margin-left:3rem !important}.ms-xl-auto{margin-left:auto !important}.m-xl-n1{margin:-.25rem !important}.m-xl-n2{margin:-.5rem !important}.m-xl-n3{margin:-1rem !important}.m-xl-n4{margin:-1.5rem !important}.m-xl-n5{margin:-3rem !important}.mx-xl-n1{margin-right:-.25rem !important;margin-left:-.25rem !important}.mx-xl-n2{margin-right:-.5rem !important;margin-left:-.5rem !important}.mx-xl-n3{margin-right:-1rem !important;margin-left:-1rem !important}.mx-xl-n4{margin-right:-1.5rem !important;margin-left:-1.5rem !important}.mx-xl-n5{margin-right:-3rem !important;margin-left:-3rem !important}.my-xl-n1{margin-top:-.25rem !important;margin-bottom:-.25rem !important}.my-xl-n2{margin-top:-.5rem !important;margin-bottom:-.5rem !important}.my-xl-n3{margin-top:-1rem !important;margin-bottom:-1rem !important}.my-xl-n4{margin-top:-1.5rem !important;margin-bottom:-1.5rem !important}.my-xl-n5{margin-top:-3rem !important;margin-bottom:-3rem !important}.mt-xl-n1{margin-top:-.25rem !important}.mt-xl-n2{margin-top:-.5rem !important}.mt-xl-n3{margin-top:-1rem !important}.mt-xl-n4{margin-top:-1.5rem !important}.mt-xl-n5{margin-top:-3rem !important}.me-xl-n1{margin-right:-.25rem !important}.me-xl-n2{margin-right:-.5rem !important}.me-xl-n3{margin-right:-1rem !important}.me-xl-n4{margin-right:-1.5rem !important}.me-xl-n5{margin-right:-3rem !important}.mb-xl-n1{margin-bottom:-.25rem !important}.mb-xl-n2{margin-bottom:-.5rem !important}.mb-xl-n3{margin-bottom:-1rem !important}.mb-xl-n4{margin-bottom:-1.5rem !important}.mb-xl-n5{margin-bottom:-3rem !important}.ms-xl-n1{margin-left:-.25rem !important}.ms-xl-n2{margin-left:-.5rem !important}.ms-xl-n3{margin-left:-1rem !important}.ms-xl-n4{margin-left:-1.5rem !important}.ms-xl-n5{margin-left:-3rem !important}.p-xl-0{padding:0 !important}.p-xl-1{padding:.25rem !important}.p-xl-2{padding:.5rem !important}.p-xl-3{padding:1rem !important}.p-xl-4{padding:1.5rem !important}.p-xl-5{padding:3rem !important}.px-xl-0{padding-right:0 !important;padding-left:0 !important}.px-xl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xl-0{padding-top:0 !important}.pt-xl-1{padding-top:.25rem !important}.pt-xl-2{padding-top:.5rem !important}.pt-xl-3{padding-top:1rem !important}.pt-xl-4{padding-top:1.5rem !important}.pt-xl-5{padding-top:3rem !important}.pe-xl-0{padding-right:0 !important}.pe-xl-1{padding-right:.25rem !important}.pe-xl-2{padding-right:.5rem !important}.pe-xl-3{padding-right:1rem !important}.pe-xl-4{padding-right:1.5rem !important}.pe-xl-5{padding-right:3rem !important}.pb-xl-0{padding-bottom:0 !important}.pb-xl-1{padding-bottom:.25rem !important}.pb-xl-2{padding-bottom:.5rem !important}.pb-xl-3{padding-bottom:1rem !important}.pb-xl-4{padding-bottom:1.5rem !important}.pb-xl-5{padding-bottom:3rem !important}.ps-xl-0{padding-left:0 !important}.ps-xl-1{padding-left:.25rem !important}.ps-xl-2{padding-left:.5rem !important}.ps-xl-3{padding-left:1rem !important}.ps-xl-4{padding-left:1.5rem !important}.ps-xl-5{padding-left:3rem !important}.text-xl-start{text-align:left !important}.text-xl-end{text-align:right !important}.text-xl-center{text-align:center !important}}@media (min-width: 1400px){.float-xxl-start{float:left !important}.float-xxl-end{float:right !important}.float-xxl-none{float:none !important}.d-xxl-inline{display:inline !important}.d-xxl-inline-block{display:inline-block !important}.d-xxl-block{display:block !important}.d-xxl-grid{display:grid !important}.d-xxl-table{display:table !important}.d-xxl-table-row{display:table-row !important}.d-xxl-table-cell{display:table-cell !important}.d-xxl-flex{display:flex !important}.d-xxl-inline-flex{display:inline-flex !important}.d-xxl-none{display:none !important}.flex-xxl-fill{flex:1 1 auto !important}.flex-xxl-row{flex-direction:row !important}.flex-xxl-column{flex-direction:column !important}.flex-xxl-row-reverse{flex-direction:row-reverse !important}.flex-xxl-column-reverse{flex-direction:column-reverse !important}.flex-xxl-grow-0{flex-grow:0 !important}.flex-xxl-grow-1{flex-grow:1 !important}.flex-xxl-shrink-0{flex-shrink:0 !important}.flex-xxl-shrink-1{flex-shrink:1 !important}.flex-xxl-wrap{flex-wrap:wrap !important}.flex-xxl-nowrap{flex-wrap:nowrap !important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse !important}.gap-xxl-0{gap:0 !important}.gap-xxl-1{gap:.25rem !important}.gap-xxl-2{gap:.5rem !important}.gap-xxl-3{gap:1rem !important}.gap-xxl-4{gap:1.5rem !important}.gap-xxl-5{gap:3rem !important}.justify-content-xxl-start{justify-content:flex-start !important}.justify-content-xxl-end{justify-content:flex-end !important}.justify-content-xxl-center{justify-content:center !important}.justify-content-xxl-between{justify-content:space-between !important}.justify-content-xxl-around{justify-content:space-around !important}.justify-content-xxl-evenly{justify-content:space-evenly !important}.align-items-xxl-start{align-items:flex-start !important}.align-items-xxl-end{align-items:flex-end !important}.align-items-xxl-center{align-items:center !important}.align-items-xxl-baseline{align-items:baseline !important}.align-items-xxl-stretch{align-items:stretch !important}.align-content-xxl-start{align-content:flex-start !important}.align-content-xxl-end{align-content:flex-end !important}.align-content-xxl-center{align-content:center !important}.align-content-xxl-between{align-content:space-between !important}.align-content-xxl-around{align-content:space-around !important}.align-content-xxl-stretch{align-content:stretch !important}.align-self-xxl-auto{align-self:auto !important}.align-self-xxl-start{align-self:flex-start !important}.align-self-xxl-end{align-self:flex-end !important}.align-self-xxl-center{align-self:center !important}.align-self-xxl-baseline{align-self:baseline !important}.align-self-xxl-stretch{align-self:stretch !important}.order-xxl-first{order:-1 !important}.order-xxl-0{order:0 !important}.order-xxl-1{order:1 !important}.order-xxl-2{order:2 !important}.order-xxl-3{order:3 !important}.order-xxl-4{order:4 !important}.order-xxl-5{order:5 !important}.order-xxl-last{order:6 !important}.m-xxl-0{margin:0 !important}.m-xxl-1{margin:.25rem !important}.m-xxl-2{margin:.5rem !important}.m-xxl-3{margin:1rem !important}.m-xxl-4{margin:1.5rem !important}.m-xxl-5{margin:3rem !important}.m-xxl-auto{margin:auto !important}.mx-xxl-0{margin-right:0 !important;margin-left:0 !important}.mx-xxl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xxl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xxl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xxl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xxl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xxl-auto{margin-right:auto !important;margin-left:auto !important}.my-xxl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xxl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xxl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xxl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xxl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xxl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xxl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xxl-0{margin-top:0 !important}.mt-xxl-1{margin-top:.25rem !important}.mt-xxl-2{margin-top:.5rem !important}.mt-xxl-3{margin-top:1rem !important}.mt-xxl-4{margin-top:1.5rem !important}.mt-xxl-5{margin-top:3rem !important}.mt-xxl-auto{margin-top:auto !important}.me-xxl-0{margin-right:0 !important}.me-xxl-1{margin-right:.25rem !important}.me-xxl-2{margin-right:.5rem !important}.me-xxl-3{margin-right:1rem !important}.me-xxl-4{margin-right:1.5rem !important}.me-xxl-5{margin-right:3rem !important}.me-xxl-auto{margin-right:auto !important}.mb-xxl-0{margin-bottom:0 !important}.mb-xxl-1{margin-bottom:.25rem !important}.mb-xxl-2{margin-bottom:.5rem !important}.mb-xxl-3{margin-bottom:1rem !important}.mb-xxl-4{margin-bottom:1.5rem !important}.mb-xxl-5{margin-bottom:3rem !important}.mb-xxl-auto{margin-bottom:auto !important}.ms-xxl-0{margin-left:0 !important}.ms-xxl-1{margin-left:.25rem !important}.ms-xxl-2{margin-left:.5rem !important}.ms-xxl-3{margin-left:1rem !important}.ms-xxl-4{margin-left:1.5rem !important}.ms-xxl-5{margin-left:3rem !important}.ms-xxl-auto{margin-left:auto !important}.m-xxl-n1{margin:-.25rem !important}.m-xxl-n2{margin:-.5rem !important}.m-xxl-n3{margin:-1rem !important}.m-xxl-n4{margin:-1.5rem !important}.m-xxl-n5{margin:-3rem !important}.mx-xxl-n1{margin-right:-.25rem !important;margin-left:-.25rem !important}.mx-xxl-n2{margin-right:-.5rem !important;margin-left:-.5rem !important}.mx-xxl-n3{margin-right:-1rem !important;margin-left:-1rem !important}.mx-xxl-n4{margin-right:-1.5rem !important;margin-left:-1.5rem !important}.mx-xxl-n5{margin-right:-3rem !important;margin-left:-3rem !important}.my-xxl-n1{margin-top:-.25rem !important;margin-bottom:-.25rem !important}.my-xxl-n2{margin-top:-.5rem !important;margin-bottom:-.5rem !important}.my-xxl-n3{margin-top:-1rem !important;margin-bottom:-1rem !important}.my-xxl-n4{margin-top:-1.5rem !important;margin-bottom:-1.5rem !important}.my-xxl-n5{margin-top:-3rem !important;margin-bottom:-3rem !important}.mt-xxl-n1{margin-top:-.25rem !important}.mt-xxl-n2{margin-top:-.5rem !important}.mt-xxl-n3{margin-top:-1rem !important}.mt-xxl-n4{margin-top:-1.5rem !important}.mt-xxl-n5{margin-top:-3rem !important}.me-xxl-n1{margin-right:-.25rem !important}.me-xxl-n2{margin-right:-.5rem !important}.me-xxl-n3{margin-right:-1rem !important}.me-xxl-n4{margin-right:-1.5rem !important}.me-xxl-n5{margin-right:-3rem !important}.mb-xxl-n1{margin-bottom:-.25rem !important}.mb-xxl-n2{margin-bottom:-.5rem !important}.mb-xxl-n3{margin-bottom:-1rem !important}.mb-xxl-n4{margin-bottom:-1.5rem !important}.mb-xxl-n5{margin-bottom:-3rem !important}.ms-xxl-n1{margin-left:-.25rem !important}.ms-xxl-n2{margin-left:-.5rem !important}.ms-xxl-n3{margin-left:-1rem !important}.ms-xxl-n4{margin-left:-1.5rem !important}.ms-xxl-n5{margin-left:-3rem !important}.p-xxl-0{padding:0 !important}.p-xxl-1{padding:.25rem !important}.p-xxl-2{padding:.5rem !important}.p-xxl-3{padding:1rem !important}.p-xxl-4{padding:1.5rem !important}.p-xxl-5{padding:3rem !important}.px-xxl-0{padding-right:0 !important;padding-left:0 !important}.px-xxl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xxl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xxl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xxl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xxl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xxl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xxl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xxl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xxl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xxl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xxl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xxl-0{padding-top:0 !important}.pt-xxl-1{padding-top:.25rem !important}.pt-xxl-2{padding-top:.5rem !important}.pt-xxl-3{padding-top:1rem !important}.pt-xxl-4{padding-top:1.5rem !important}.pt-xxl-5{padding-top:3rem !important}.pe-xxl-0{padding-right:0 !important}.pe-xxl-1{padding-right:.25rem !important}.pe-xxl-2{padding-right:.5rem !important}.pe-xxl-3{padding-right:1rem !important}.pe-xxl-4{padding-right:1.5rem !important}.pe-xxl-5{padding-right:3rem !important}.pb-xxl-0{padding-bottom:0 !important}.pb-xxl-1{padding-bottom:.25rem !important}.pb-xxl-2{padding-bottom:.5rem !important}.pb-xxl-3{padding-bottom:1rem !important}.pb-xxl-4{padding-bottom:1.5rem !important}.pb-xxl-5{padding-bottom:3rem !important}.ps-xxl-0{padding-left:0 !important}.ps-xxl-1{padding-left:.25rem !important}.ps-xxl-2{padding-left:.5rem !important}.ps-xxl-3{padding-left:1rem !important}.ps-xxl-4{padding-left:1.5rem !important}.ps-xxl-5{padding-left:3rem !important}.text-xxl-start{text-align:left !important}.text-xxl-end{text-align:right !important}.text-xxl-center{text-align:center !important}}@media (min-width: 1200px){.fs-1{font-size:2.5rem !important}.fs-2{font-size:2rem !important}.fs-3{font-size:1.75rem !important}.fs-4{font-size:1.5rem !important}}@media print{.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-grid{display:grid !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}.d-print-none{display:none !important}} diff --git a/su-do-coders/core/home/static/css/style.css b/su-do-coders/core/home/static/css/style.css new file mode 100644 index 0000000..9678e36 --- /dev/null +++ b/su-do-coders/core/home/static/css/style.css @@ -0,0 +1,525 @@ +/********** Template CSS **********/ +:root { + --primary: #2124B1; + --secondary: #4777F5; + --light: #F7FAFF; + --dark: #1D1D27; +} + + +/*** Spinner ***/ +#spinner { + opacity: 0; + visibility: hidden; + transition: opacity .5s ease-out, visibility 0s linear .5s; + z-index: 99999; +} + +#spinner.show { + transition: opacity .5s ease-out, visibility 0s linear 0s; + visibility: visible; + opacity: 1; +} + +.back-to-top { + position: fixed; + display: none; + right: 45px; + bottom: 45px; + z-index: 99; +} + + +/*** Heading ***/ +h1, +h2, +h3, +.fw-bold { + font-weight: 700 !important; +} + +h4, +h5, +h6, +.fw-medium { + font-weight: 500 !important; +} + + +/*** Button ***/ +.btn { + font-weight: 500; + transition: .5s; +} + +.btn-square { + width: 38px; + height: 38px; +} + +.btn-sm-square { + width: 32px; + height: 32px; +} + +.btn-lg-square { + width: 48px; + height: 48px; +} + +.btn-square, +.btn-sm-square, +.btn-lg-square { + padding: 0; + display: flex; + align-items: center; + justify-content: center; + font-weight: normal; + border-radius: 50px; +} + + +/*** Navbar ***/ +.navbar-light .navbar-nav .nav-link { + position: relative; + margin-left: 25px; + padding: 35px 0; + color: var(--light) !important; + outline: none; + transition: .5s; +} + +.sticky-top.navbar-light .navbar-nav .nav-link { + padding: 20px 0; + color: var(--dark) !important; +} + +.navbar-light .navbar-nav .nav-link:hover, +.navbar-light .navbar-nav .nav-link.active { + color: var(--secondary) !important; +} + +.navbar-light .navbar-brand h1 { + color: #FFFFFF; +} + +.navbar-light .navbar-brand img { + max-height: 60px; + transition: .5s; +} + +.sticky-top.navbar-light .navbar-brand img { + max-height: 45px; +} + +@media (max-width: 991.98px) { + .sticky-top.navbar-light { + position: relative; + background: #FFFFFF; + } + + .navbar-light .navbar-collapse { + margin-top: 15px; + border-top: 1px solid #DDDDDD; + } + + .navbar-light .navbar-nav .nav-link, + .sticky-top.navbar-light .navbar-nav .nav-link { + padding: 10px 0; + margin-left: 0; + color: var(--dark) !important; + } + + .navbar-light .navbar-brand h1 { + color: var(--primary); + } + + .navbar-light .navbar-brand img { + max-height: 45px; + } +} + +@media (min-width: 992px) { + .navbar-light { + position: absolute; + width: 100%; + top: 0; + left: 0; + border-bottom: 1px solid rgba(256, 256, 256, .1); + z-index: 999; + } + + .sticky-top.navbar-light { + position: fixed; + background: #FFFFFF; + } + + .navbar-light .navbar-nav .nav-link::before { + position: absolute; + content: ""; + width: 0; + height: 2px; + bottom: -1px; + left: 50%; + background: var(--secondary); + transition: .5s; + } + + .navbar-light .navbar-nav .nav-link:hover::before, + .navbar-light .navbar-nav .nav-link.active::before { + width: 100%; + left: 0; + } + + .navbar-light .navbar-nav .nav-link.nav-contact::before { + display: none; + } + + .sticky-top.navbar-light .navbar-brand h1 { + color: var(--primary); + } +} + + +/*** Hero Header ***/ +.hero-header { + background: + url(../img/bg-dot.png), + url(../img/bg-dot.png), + url(../img/bg-round.png), + url(../img/bg-tree.png), + url(../img/bg-bottom-hero.png); + background-position: + 10px 10px, + bottom 190px right 10px, + left 55% top -1px, + left 45% bottom -1px, + center bottom -1px; + background-repeat: no-repeat; +} + + +/*** Section Title ***/ +.section-title::before { + position: absolute; + content: ""; + width: 45px; + height: 4px; + bottom: 0; + left: 0; + background: var(--dark); +} + +.section-title::after { + position: absolute; + content: ""; + width: 4px; + height: 4px; + bottom: 0; + left: 50px; + background: var(--dark); +} + +.section-title.text-center::before { + left: 50%; + margin-left: -25px; +} + +.section-title.text-center::after { + left: 50%; + margin-left: 25px; +} + +.section-title h6::before, +.section-title h6::after { + position: absolute; + content: ""; + width: 10px; + height: 10px; + top: 2px; + left: 0; + background: rgba(33, 66, 177, .5); +} + +.section-title h6::after { + top: 5px; + left: 3px; +} + + +/*** Service ***/ +.service-item { + position: relative; + height: 350px; + padding: 30px 25px; + background: #FFFFFF; + box-shadow: 0 0 45px rgba(0, 0, 0, .08); + transition: .5s; +} + +.service-item:hover { + background: var(--primary); +} + +.service-item .service-icon { + margin: 0 auto 20px auto; + width: 90px; + height: 90px; + display: flex; + align-items: center; + justify-content: center; + color: var(--light); + background: url(../img/icon-shape-primary.png) center center no-repeat; + transition: .5s; +} + +.service-item:hover .service-icon { + color: var(--primary); + background: url(../img/icon-shape-white.png); +} + +.service-item h5, +.service-item p { + transition: .5s; +} + +.service-item:hover h5, +.service-item:hover p { + color: var(--light); +} + +.service-item a.btn { + position: relative; + display: flex; + color: var(--primary); + transition: .5s; + z-index: 1; +} + +.service-item:hover a.btn { + color: var(--primary); +} + +.service-item a.btn::before { + position: absolute; + content: ""; + width: 35px; + height: 35px; + top: 0; + left: 0; + border-radius: 35px; + background: #DDDDDD; + transition: .5s; + z-index: -1; +} + +.service-item:hover a.btn::before { + width: 100%; + background: var(--light); +} + + +/*** Testimonial ***/ +.newsletter, +.testimonial { + background: + url(../img/bg-top.png), + url(../img/bg-bottom.png); + background-position: + left top, + right bottom; + background-repeat: no-repeat; +} + +.testimonial-carousel .owl-item .testimonial-item, +.testimonial-carousel .owl-item.center .testimonial-item * { + transition: .5s; +} + +.testimonial-carousel .owl-item.center .testimonial-item { + background: var(--light) !important; + border-color: var(--light); +} + +.testimonial-carousel .owl-item.center .testimonial-item * { + color: #888888; +} + +.testimonial-carousel .owl-item.center .testimonial-item i { + color: var(--primary) !important; +} + +.testimonial-carousel .owl-item.center .testimonial-item h6 { + color: var(--dark) !important; +} + + +/*** Team ***/ +.team-item { + position: relative; + transition: .5s; + z-index: 1; +} + +.team-item::after { + position: absolute; + content: ""; + top: 3rem; + right: 3rem; + bottom: 0; + left: 0; + border-radius: 10px; + background: #FFFFFF; + box-shadow: 0 0 45px rgba(0, 0, 0, .1); + transition: .5s; + z-index: -1; +} + +.team-item:hover::after { + background: var(--primary); +} + +.team-item h5, +.team-item small { + transition: .5s; +} + +.team-item:hover h5, +.team-item:hover small { + color: var(--light); +} + + +/*** Project Portfolio ***/ +#portfolio-flters .btn { + position: relative; + display: inline-block; + margin: 10px 4px 0 4px; + transition: .5s; +} + +#portfolio-flters .btn::after { + position: absolute; + content: ""; + right: -1px; + bottom: -1px; + border-left: 20px solid transparent; + border-right: 0 solid transparent; + border-bottom: 50px solid #FFFFFF; +} + +#portfolio-flters .btn:hover, +#portfolio-flters .btn.active { + color: var(--light); + background: var(--primary); +} + +.portfolio-overlay { + position: absolute; + display: flex; + flex-direction: column; + justify-content: center; + width: 100%; + height: 100%; + padding: 30px; + top: 0; + left: 0; + background: var(--primary); + transition: .5s; + z-index: 1; + opacity: 0; +} + +.portfolio-item:hover .portfolio-overlay { + opacity: 1; +} + +.portfolio-item .btn { + position: absolute; + width: 90px; + height: 90px; + top: 0px; + right: 0px; + display: flex; + align-items: center; + justify-content: center; + background: url(../img/icon-shape-white.png) center center no-repeat; + border: none; + transition: .5s; + opacity: 0; + z-index: 2; +} + +.portfolio-item:hover .btn { + opacity: 1; + transition-delay: .15s; +} + + +/*** Footer ***/ +.footer { + background: url(../img/footer.png) center center no-repeat; + background-size: contain; +} + +.footer .btn.btn-social { + margin-right: 5px; + width: 40px; + height: 40px; + display: flex; + align-items: center; + justify-content: center; + color: var(--light); + border: 1px solid rgba(256, 256, 256, .1); + border-radius: 40px; + transition: .3s; +} + +.footer .btn.btn-social:hover { + color: var(--primary); +} + +.footer .btn.btn-link { + display: block; + margin-bottom: 10px; + padding: 0; + text-align: left; + color: var(--light); + font-weight: normal; + transition: .3s; +} + +.footer .btn.btn-link::before { + position: relative; + content: "\f105"; + font-family: "Font Awesome 5 Free"; + font-weight: 900; + margin-right: 10px; +} + +.footer .btn.btn-link:hover { + letter-spacing: 1px; + box-shadow: none; +} + +.footer .copyright { + padding: 25px 0; + font-size: 14px; + border-top: 1px solid rgba(256, 256, 256, .1); +} + +.footer .copyright a { + color: var(--light); +} + +.footer .footer-menu a { + margin-right: 15px; + padding-right: 15px; + border-right: 1px solid rgba(255, 255, 255, .1); +} + +.footer .footer-menu a:last-child { + margin-right: 0; + padding-right: 0; + border-right: none; +} \ No newline at end of file diff --git a/su-do-coders/core/home/static/img/WhatsApp Image 2023-11-23 at 3.08.51 PM.jpeg b/su-do-coders/core/home/static/img/WhatsApp Image 2023-11-23 at 3.08.51 PM.jpeg new file mode 100644 index 0000000..9c6910d Binary files /dev/null and b/su-do-coders/core/home/static/img/WhatsApp Image 2023-11-23 at 3.08.51 PM.jpeg differ diff --git a/su-do-coders/core/home/static/img/about.jpg b/su-do-coders/core/home/static/img/about.jpg new file mode 100644 index 0000000..1bf6ee0 Binary files /dev/null and b/su-do-coders/core/home/static/img/about.jpg differ diff --git a/su-do-coders/core/home/static/img/amit.jpg b/su-do-coders/core/home/static/img/amit.jpg new file mode 100644 index 0000000..fbfb192 Binary files /dev/null and b/su-do-coders/core/home/static/img/amit.jpg differ diff --git a/su-do-coders/core/home/static/img/bg-bottom-hero -other.png b/su-do-coders/core/home/static/img/bg-bottom-hero -other.png new file mode 100644 index 0000000..893b9ed Binary files /dev/null and b/su-do-coders/core/home/static/img/bg-bottom-hero -other.png differ diff --git a/su-do-coders/core/home/static/img/bg-bottom-hero.png b/su-do-coders/core/home/static/img/bg-bottom-hero.png new file mode 100644 index 0000000..6dbb936 Binary files /dev/null and b/su-do-coders/core/home/static/img/bg-bottom-hero.png differ diff --git a/su-do-coders/core/home/static/img/bg-bottom.png b/su-do-coders/core/home/static/img/bg-bottom.png new file mode 100644 index 0000000..5050b44 Binary files /dev/null and b/su-do-coders/core/home/static/img/bg-bottom.png differ diff --git a/su-do-coders/core/home/static/img/bg-dot.png b/su-do-coders/core/home/static/img/bg-dot.png new file mode 100644 index 0000000..b755c7c Binary files /dev/null and b/su-do-coders/core/home/static/img/bg-dot.png differ diff --git a/su-do-coders/core/home/static/img/bg-newsletter.png b/su-do-coders/core/home/static/img/bg-newsletter.png new file mode 100644 index 0000000..5faacd0 Binary files /dev/null and b/su-do-coders/core/home/static/img/bg-newsletter.png differ diff --git a/su-do-coders/core/home/static/img/bg-round.png b/su-do-coders/core/home/static/img/bg-round.png new file mode 100644 index 0000000..a0deb99 Binary files /dev/null and b/su-do-coders/core/home/static/img/bg-round.png differ diff --git a/su-do-coders/core/home/static/img/bg-top.png b/su-do-coders/core/home/static/img/bg-top.png new file mode 100644 index 0000000..e3d1bce Binary files /dev/null and b/su-do-coders/core/home/static/img/bg-top.png differ diff --git a/su-do-coders/core/home/static/img/bg-tree.png b/su-do-coders/core/home/static/img/bg-tree.png new file mode 100644 index 0000000..3267ed9 Binary files /dev/null and b/su-do-coders/core/home/static/img/bg-tree.png differ diff --git a/su-do-coders/core/home/static/img/footer.png b/su-do-coders/core/home/static/img/footer.png new file mode 100644 index 0000000..00366d1 Binary files /dev/null and b/su-do-coders/core/home/static/img/footer.png differ diff --git a/su-do-coders/core/home/static/img/hero.png b/su-do-coders/core/home/static/img/hero.png new file mode 100644 index 0000000..1d5810b Binary files /dev/null and b/su-do-coders/core/home/static/img/hero.png differ diff --git a/su-do-coders/core/home/static/img/icon-shape-primary.png b/su-do-coders/core/home/static/img/icon-shape-primary.png new file mode 100644 index 0000000..f4200ac Binary files /dev/null and b/su-do-coders/core/home/static/img/icon-shape-primary.png differ diff --git a/su-do-coders/core/home/static/img/icon-shape-white.png b/su-do-coders/core/home/static/img/icon-shape-white.png new file mode 100644 index 0000000..ad9f0e8 Binary files /dev/null and b/su-do-coders/core/home/static/img/icon-shape-white.png differ diff --git a/su-do-coders/core/home/static/img/nagmani.png b/su-do-coders/core/home/static/img/nagmani.png new file mode 100644 index 0000000..4b7035e Binary files /dev/null and b/su-do-coders/core/home/static/img/nagmani.png differ diff --git a/su-do-coders/core/home/static/img/newsletter.png b/su-do-coders/core/home/static/img/newsletter.png new file mode 100644 index 0000000..0ff1f78 Binary files /dev/null and b/su-do-coders/core/home/static/img/newsletter.png differ diff --git a/su-do-coders/core/home/static/img/rambaran.jpg b/su-do-coders/core/home/static/img/rambaran.jpg new file mode 100644 index 0000000..9b2e1d1 Binary files /dev/null and b/su-do-coders/core/home/static/img/rambaran.jpg differ diff --git a/su-do-coders/core/home/static/img/team-1.jpg b/su-do-coders/core/home/static/img/team-1.jpg new file mode 100644 index 0000000..f861d2b Binary files /dev/null and b/su-do-coders/core/home/static/img/team-1.jpg differ diff --git a/su-do-coders/core/home/static/img/team-2.jpg b/su-do-coders/core/home/static/img/team-2.jpg new file mode 100644 index 0000000..b6a1b34 Binary files /dev/null and b/su-do-coders/core/home/static/img/team-2.jpg differ diff --git a/su-do-coders/core/home/static/img/team-3.jpg b/su-do-coders/core/home/static/img/team-3.jpg new file mode 100644 index 0000000..5d496a5 Binary files /dev/null and b/su-do-coders/core/home/static/img/team-3.jpg differ diff --git a/su-do-coders/core/home/static/img/testimonial-1.jpg b/su-do-coders/core/home/static/img/testimonial-1.jpg new file mode 100644 index 0000000..9ba0d9a Binary files /dev/null and b/su-do-coders/core/home/static/img/testimonial-1.jpg differ diff --git a/su-do-coders/core/home/static/img/testimonial-2.jpg b/su-do-coders/core/home/static/img/testimonial-2.jpg new file mode 100644 index 0000000..1fded23 Binary files /dev/null and b/su-do-coders/core/home/static/img/testimonial-2.jpg differ diff --git a/su-do-coders/core/home/static/img/testimonial-3.jpg b/su-do-coders/core/home/static/img/testimonial-3.jpg new file mode 100644 index 0000000..a48046a Binary files /dev/null and b/su-do-coders/core/home/static/img/testimonial-3.jpg differ diff --git a/su-do-coders/core/home/static/img/testimonial-4.jpg b/su-do-coders/core/home/static/img/testimonial-4.jpg new file mode 100644 index 0000000..00e8eb3 Binary files /dev/null and b/su-do-coders/core/home/static/img/testimonial-4.jpg differ diff --git a/su-do-coders/core/home/static/job.jpg b/su-do-coders/core/home/static/job.jpg new file mode 100644 index 0000000..7024426 Binary files /dev/null and b/su-do-coders/core/home/static/job.jpg differ diff --git a/su-do-coders/core/home/static/js/main.js b/su-do-coders/core/home/static/js/main.js new file mode 100644 index 0000000..aa34a4f --- /dev/null +++ b/su-do-coders/core/home/static/js/main.js @@ -0,0 +1,109 @@ +(function ($) { + "use strict"; + + // Spinner + var spinner = function () { + setTimeout(function () { + if ($('#spinner').length > 0) { + $('#spinner').removeClass('show'); + } + }, 1); + }; + spinner(); + + + // Initiate the wowjs + new WOW().init(); + + + // Sticky Navbar + $(window).scroll(function () { + if ($(this).scrollTop() > 45) { + $('.navbar').addClass('sticky-top shadow-sm'); + } else { + $('.navbar').removeClass('sticky-top shadow-sm'); + } + }); + + + // Dropdown on mouse hover + const $dropdown = $(".dropdown"); + const $dropdownToggle = $(".dropdown-toggle"); + const $dropdownMenu = $(".dropdown-menu"); + const showClass = "show"; + + $(window).on("load resize", function() { + if (this.matchMedia("(min-width: 992px)").matches) { + $dropdown.hover( + function() { + const $this = $(this); + $this.addClass(showClass); + $this.find($dropdownToggle).attr("aria-expanded", "true"); + $this.find($dropdownMenu).addClass(showClass); + }, + function() { + const $this = $(this); + $this.removeClass(showClass); + $this.find($dropdownToggle).attr("aria-expanded", "false"); + $this.find($dropdownMenu).removeClass(showClass); + } + ); + } else { + $dropdown.off("mouseenter mouseleave"); + } + }); + + + // Back to top button + $(window).scroll(function () { + if ($(this).scrollTop() > 100) { + $('.back-to-top').fadeIn('slow'); + } else { + $('.back-to-top').fadeOut('slow'); + } + }); + $('.back-to-top').click(function () { + $('html, body').animate({scrollTop: 0}, 1500, 'easeInOutExpo'); + return false; + }); + + + // Testimonials carousel + $(".testimonial-carousel").owlCarousel({ + autoplay: true, + smartSpeed: 1000, + margin: 25, + dots: false, + loop: true, + center: true, + responsive: { + 0:{ + items:1 + }, + 576:{ + items:1 + }, + 768:{ + items:2 + }, + 992:{ + items:3 + } + } + }); + + + // Portfolio isotope and filter + var portfolioIsotope = $('.portfolio-container').isotope({ + itemSelector: '.portfolio-item', + layoutMode: 'fitRows' + }); + $('#portfolio-flters li').on('click', function () { + $("#portfolio-flters li").removeClass('active'); + $(this).addClass('active'); + + portfolioIsotope.isotope({filter: $(this).data('filter')}); + }); + +})(jQuery); + diff --git a/su-do-coders/core/home/static/lib/animate/animate.css b/su-do-coders/core/home/static/lib/animate/animate.css new file mode 100644 index 0000000..1e79e03 --- /dev/null +++ b/su-do-coders/core/home/static/lib/animate/animate.css @@ -0,0 +1,1579 @@ +@charset "UTF-8"; + +/*! + * animate.css -http://daneden.me/animate + * Version - 3.5.2 + * Licensed under the MIT license - http://opensource.org/licenses/MIT + * + * Copyright (c) 2017 Daniel Eden + */ + +.animated { + animation-duration: 1s; + animation-fill-mode: both; +} + +.animated.infinite { + animation-iteration-count: infinite; +} + +.animated.hinge { + animation-duration: 2s; +} + +.animated.flipOutX, +.animated.flipOutY, +.animated.bounceIn, +.animated.bounceOut { + animation-duration: .75s; +} + +@keyframes bounce { + from, 20%, 53%, 80%, to { + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + transform: translate3d(0,0,0); + } + + 40%, 43% { + animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + transform: translate3d(0, -30px, 0); + } + + 70% { + animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + transform: translate3d(0, -15px, 0); + } + + 90% { + transform: translate3d(0,-4px,0); + } +} + +.bounce { + animation-name: bounce; + transform-origin: center bottom; +} + +@keyframes flash { + from, 50%, to { + opacity: 1; + } + + 25%, 75% { + opacity: 0; + } +} + +.flash { + animation-name: flash; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@keyframes pulse { + from { + transform: scale3d(1, 1, 1); + } + + 50% { + transform: scale3d(1.05, 1.05, 1.05); + } + + to { + transform: scale3d(1, 1, 1); + } +} + +.pulse { + animation-name: pulse; +} + +@keyframes rubberBand { + from { + transform: scale3d(1, 1, 1); + } + + 30% { + transform: scale3d(1.25, 0.75, 1); + } + + 40% { + transform: scale3d(0.75, 1.25, 1); + } + + 50% { + transform: scale3d(1.15, 0.85, 1); + } + + 65% { + transform: scale3d(.95, 1.05, 1); + } + + 75% { + transform: scale3d(1.05, .95, 1); + } + + to { + transform: scale3d(1, 1, 1); + } +} + +.rubberBand { + animation-name: rubberBand; +} + +@keyframes shake { + from, to { + transform: translate3d(0, 0, 0); + } + + 10%, 30%, 50%, 70%, 90% { + transform: translate3d(-10px, 0, 0); + } + + 20%, 40%, 60%, 80% { + transform: translate3d(10px, 0, 0); + } +} + +.shake { + animation-name: shake; +} + +@keyframes headShake { + 0% { + transform: translateX(0); + } + + 6.5% { + transform: translateX(-6px) rotateY(-9deg); + } + + 18.5% { + transform: translateX(5px) rotateY(7deg); + } + + 31.5% { + transform: translateX(-3px) rotateY(-5deg); + } + + 43.5% { + transform: translateX(2px) rotateY(3deg); + } + + 50% { + transform: translateX(0); + } +} + +.headShake { + animation-timing-function: ease-in-out; + animation-name: headShake; +} + +@keyframes swing { + 20% { + transform: rotate3d(0, 0, 1, 15deg); + } + + 40% { + transform: rotate3d(0, 0, 1, -10deg); + } + + 60% { + transform: rotate3d(0, 0, 1, 5deg); + } + + 80% { + transform: rotate3d(0, 0, 1, -5deg); + } + + to { + transform: rotate3d(0, 0, 1, 0deg); + } +} + +.swing { + transform-origin: top center; + animation-name: swing; +} + +@keyframes tada { + from { + transform: scale3d(1, 1, 1); + } + + 10%, 20% { + transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg); + } + + 30%, 50%, 70%, 90% { + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + } + + 40%, 60%, 80% { + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + } + + to { + transform: scale3d(1, 1, 1); + } +} + +.tada { + animation-name: tada; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@keyframes wobble { + from { + transform: none; + } + + 15% { + transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + } + + 30% { + transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + } + + 45% { + transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + } + + 60% { + transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + } + + 75% { + transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + } + + to { + transform: none; + } +} + +.wobble { + animation-name: wobble; +} + +@keyframes jello { + from, 11.1%, to { + transform: none; + } + + 22.2% { + transform: skewX(-12.5deg) skewY(-12.5deg); + } + + 33.3% { + transform: skewX(6.25deg) skewY(6.25deg); + } + + 44.4% { + transform: skewX(-3.125deg) skewY(-3.125deg); + } + + 55.5% { + transform: skewX(1.5625deg) skewY(1.5625deg); + } + + 66.6% { + transform: skewX(-0.78125deg) skewY(-0.78125deg); + } + + 77.7% { + transform: skewX(0.390625deg) skewY(0.390625deg); + } + + 88.8% { + transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + } +} + +.jello { + animation-name: jello; + transform-origin: center; +} + +@keyframes bounceIn { + from, 20%, 40%, 60%, 80%, to { + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + transform: scale3d(.3, .3, .3); + } + + 20% { + transform: scale3d(1.1, 1.1, 1.1); + } + + 40% { + transform: scale3d(.9, .9, .9); + } + + 60% { + opacity: 1; + transform: scale3d(1.03, 1.03, 1.03); + } + + 80% { + transform: scale3d(.97, .97, .97); + } + + to { + opacity: 1; + transform: scale3d(1, 1, 1); + } +} + +.bounceIn { + animation-name: bounceIn; +} + +@keyframes bounceInDown { + from, 60%, 75%, 90%, to { + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + transform: translate3d(0, -3000px, 0); + } + + 60% { + opacity: 1; + transform: translate3d(0, 25px, 0); + } + + 75% { + transform: translate3d(0, -10px, 0); + } + + 90% { + transform: translate3d(0, 5px, 0); + } + + to { + transform: none; + } +} + +.bounceInDown { + animation-name: bounceInDown; +} + +@keyframes bounceInLeft { + from, 60%, 75%, 90%, to { + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + transform: translate3d(-3000px, 0, 0); + } + + 60% { + opacity: 1; + transform: translate3d(25px, 0, 0); + } + + 75% { + transform: translate3d(-10px, 0, 0); + } + + 90% { + transform: translate3d(5px, 0, 0); + } + + to { + transform: none; + } +} + +.bounceInLeft { + animation-name: bounceInLeft; +} + +@keyframes bounceInRight { + from, 60%, 75%, 90%, to { + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + from { + opacity: 0; + transform: translate3d(3000px, 0, 0); + } + + 60% { + opacity: 1; + transform: translate3d(-25px, 0, 0); + } + + 75% { + transform: translate3d(10px, 0, 0); + } + + 90% { + transform: translate3d(-5px, 0, 0); + } + + to { + transform: none; + } +} + +.bounceInRight { + animation-name: bounceInRight; +} + +@keyframes bounceInUp { + from, 60%, 75%, 90%, to { + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + from { + opacity: 0; + transform: translate3d(0, 3000px, 0); + } + + 60% { + opacity: 1; + transform: translate3d(0, -20px, 0); + } + + 75% { + transform: translate3d(0, 10px, 0); + } + + 90% { + transform: translate3d(0, -5px, 0); + } + + to { + transform: translate3d(0, 0, 0); + } +} + +.bounceInUp { + animation-name: bounceInUp; +} + +@keyframes bounceOut { + 20% { + transform: scale3d(.9, .9, .9); + } + + 50%, 55% { + opacity: 1; + transform: scale3d(1.1, 1.1, 1.1); + } + + to { + opacity: 0; + transform: scale3d(.3, .3, .3); + } +} + +.bounceOut { + animation-name: bounceOut; +} + +@keyframes bounceOutDown { + 20% { + transform: translate3d(0, 10px, 0); + } + + 40%, 45% { + opacity: 1; + transform: translate3d(0, -20px, 0); + } + + to { + opacity: 0; + transform: translate3d(0, 2000px, 0); + } +} + +.bounceOutDown { + animation-name: bounceOutDown; +} + +@keyframes bounceOutLeft { + 20% { + opacity: 1; + transform: translate3d(20px, 0, 0); + } + + to { + opacity: 0; + transform: translate3d(-2000px, 0, 0); + } +} + +.bounceOutLeft { + animation-name: bounceOutLeft; +} + +@keyframes bounceOutRight { + 20% { + opacity: 1; + transform: translate3d(-20px, 0, 0); + } + + to { + opacity: 0; + transform: translate3d(2000px, 0, 0); + } +} + +.bounceOutRight { + animation-name: bounceOutRight; +} + +@keyframes bounceOutUp { + 20% { + transform: translate3d(0, -10px, 0); + } + + 40%, 45% { + opacity: 1; + transform: translate3d(0, 20px, 0); + } + + to { + opacity: 0; + transform: translate3d(0, -2000px, 0); + } +} + +.bounceOutUp { + animation-name: bounceOutUp; +} + +@keyframes fadeIn { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + +.fadeIn { + animation-name: fadeIn; +} + +@keyframes fadeInDown { + from { + opacity: 0; + transform: translate3d(0, -100%, 0); + } + + to { + opacity: 1; + transform: none; + } +} + +.fadeInDown { + animation-name: fadeInDown; +} + +@keyframes fadeInDownBig { + from { + opacity: 0; + transform: translate3d(0, -2000px, 0); + } + + to { + opacity: 1; + transform: none; + } +} + +.fadeInDownBig { + animation-name: fadeInDownBig; +} + +@keyframes fadeInLeft { + from { + opacity: 0; + transform: translate3d(-100%, 0, 0); + } + + to { + opacity: 1; + transform: none; + } +} + +.fadeInLeft { + animation-name: fadeInLeft; +} + +@keyframes fadeInLeftBig { + from { + opacity: 0; + transform: translate3d(-2000px, 0, 0); + } + + to { + opacity: 1; + transform: none; + } +} + +.fadeInLeftBig { + animation-name: fadeInLeftBig; +} + +@keyframes fadeInRight { + from { + opacity: 0; + transform: translate3d(100%, 0, 0); + } + + to { + opacity: 1; + transform: none; + } +} + +.fadeInRight { + animation-name: fadeInRight; +} + +@keyframes fadeInRightBig { + from { + opacity: 0; + transform: translate3d(2000px, 0, 0); + } + + to { + opacity: 1; + transform: none; + } +} + +.fadeInRightBig { + animation-name: fadeInRightBig; +} + +@keyframes fadeInUp { + from { + opacity: 0; + transform: translate3d(0, 100%, 0); + } + + to { + opacity: 1; + transform: none; + } +} + +.fadeInUp { + animation-name: fadeInUp; +} + +@keyframes fadeInUpBig { + from { + opacity: 0; + transform: translate3d(0, 2000px, 0); + } + + to { + opacity: 1; + transform: none; + } +} + +.fadeInUpBig { + animation-name: fadeInUpBig; +} + +@keyframes fadeOut { + from { + opacity: 1; + } + + to { + opacity: 0; + } +} + +.fadeOut { + animation-name: fadeOut; +} + +@keyframes fadeOutDown { + from { + opacity: 1; + } + + to { + opacity: 0; + transform: translate3d(0, 100%, 0); + } +} + +.fadeOutDown { + animation-name: fadeOutDown; +} + +@keyframes fadeOutDownBig { + from { + opacity: 1; + } + + to { + opacity: 0; + transform: translate3d(0, 2000px, 0); + } +} + +.fadeOutDownBig { + animation-name: fadeOutDownBig; +} + +@keyframes fadeOutLeft { + from { + opacity: 1; + } + + to { + opacity: 0; + transform: translate3d(-100%, 0, 0); + } +} + +.fadeOutLeft { + animation-name: fadeOutLeft; +} + +@keyframes fadeOutLeftBig { + from { + opacity: 1; + } + + to { + opacity: 0; + transform: translate3d(-2000px, 0, 0); + } +} + +.fadeOutLeftBig { + animation-name: fadeOutLeftBig; +} + +@keyframes fadeOutRight { + from { + opacity: 1; + } + + to { + opacity: 0; + transform: translate3d(100%, 0, 0); + } +} + +.fadeOutRight { + animation-name: fadeOutRight; +} + +@keyframes fadeOutRightBig { + from { + opacity: 1; + } + + to { + opacity: 0; + transform: translate3d(2000px, 0, 0); + } +} + +.fadeOutRightBig { + animation-name: fadeOutRightBig; +} + +@keyframes fadeOutUp { + from { + opacity: 1; + } + + to { + opacity: 0; + transform: translate3d(0, -100%, 0); + } +} + +.fadeOutUp { + animation-name: fadeOutUp; +} + +@keyframes fadeOutUpBig { + from { + opacity: 1; + } + + to { + opacity: 0; + transform: translate3d(0, -2000px, 0); + } +} + +.fadeOutUpBig { + animation-name: fadeOutUpBig; +} + +@keyframes flip { + from { + transform: perspective(400px) rotate3d(0, 1, 0, -360deg); + animation-timing-function: ease-out; + } + + 40% { + transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + animation-timing-function: ease-out; + } + + 50% { + transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + animation-timing-function: ease-in; + } + + 80% { + transform: perspective(400px) scale3d(.95, .95, .95); + animation-timing-function: ease-in; + } + + to { + transform: perspective(400px); + animation-timing-function: ease-in; + } +} + +.animated.flip { + -webkit-backface-visibility: visible; + backface-visibility: visible; + animation-name: flip; +} + +@keyframes flipInX { + from { + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + animation-timing-function: ease-in; + } + + 60% { + transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + + 80% { + transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + + to { + transform: perspective(400px); + } +} + +.flipInX { + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + animation-name: flipInX; +} + +@keyframes flipInY { + from { + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + animation-timing-function: ease-in; + } + + 60% { + transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + opacity: 1; + } + + 80% { + transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + } + + to { + transform: perspective(400px); + } +} + +.flipInY { + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + animation-name: flipInY; +} + +@keyframes flipOutX { + from { + transform: perspective(400px); + } + + 30% { + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + opacity: 1; + } + + to { + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + opacity: 0; + } +} + +.flipOutX { + animation-name: flipOutX; + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; +} + +@keyframes flipOutY { + from { + transform: perspective(400px); + } + + 30% { + transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + opacity: 1; + } + + to { + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + opacity: 0; + } +} + +.flipOutY { + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + animation-name: flipOutY; +} + +@keyframes lightSpeedIn { + from { + transform: translate3d(100%, 0, 0) skewX(-30deg); + opacity: 0; + } + + 60% { + transform: skewX(20deg); + opacity: 1; + } + + 80% { + transform: skewX(-5deg); + opacity: 1; + } + + to { + transform: none; + opacity: 1; + } +} + +.lightSpeedIn { + animation-name: lightSpeedIn; + animation-timing-function: ease-out; +} + +@keyframes lightSpeedOut { + from { + opacity: 1; + } + + to { + transform: translate3d(100%, 0, 0) skewX(30deg); + opacity: 0; + } +} + +.lightSpeedOut { + animation-name: lightSpeedOut; + animation-timing-function: ease-in; +} + +@keyframes rotateIn { + from { + transform-origin: center; + transform: rotate3d(0, 0, 1, -200deg); + opacity: 0; + } + + to { + transform-origin: center; + transform: none; + opacity: 1; + } +} + +.rotateIn { + animation-name: rotateIn; +} + +@keyframes rotateInDownLeft { + from { + transform-origin: left bottom; + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } + + to { + transform-origin: left bottom; + transform: none; + opacity: 1; + } +} + +.rotateInDownLeft { + animation-name: rotateInDownLeft; +} + +@keyframes rotateInDownRight { + from { + transform-origin: right bottom; + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + to { + transform-origin: right bottom; + transform: none; + opacity: 1; + } +} + +.rotateInDownRight { + animation-name: rotateInDownRight; +} + +@keyframes rotateInUpLeft { + from { + transform-origin: left bottom; + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + to { + transform-origin: left bottom; + transform: none; + opacity: 1; + } +} + +.rotateInUpLeft { + animation-name: rotateInUpLeft; +} + +@keyframes rotateInUpRight { + from { + transform-origin: right bottom; + transform: rotate3d(0, 0, 1, -90deg); + opacity: 0; + } + + to { + transform-origin: right bottom; + transform: none; + opacity: 1; + } +} + +.rotateInUpRight { + animation-name: rotateInUpRight; +} + +@keyframes rotateOut { + from { + transform-origin: center; + opacity: 1; + } + + to { + transform-origin: center; + transform: rotate3d(0, 0, 1, 200deg); + opacity: 0; + } +} + +.rotateOut { + animation-name: rotateOut; +} + +@keyframes rotateOutDownLeft { + from { + transform-origin: left bottom; + opacity: 1; + } + + to { + transform-origin: left bottom; + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } +} + +.rotateOutDownLeft { + animation-name: rotateOutDownLeft; +} + +@keyframes rotateOutDownRight { + from { + transform-origin: right bottom; + opacity: 1; + } + + to { + transform-origin: right bottom; + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} + +.rotateOutDownRight { + animation-name: rotateOutDownRight; +} + +@keyframes rotateOutUpLeft { + from { + transform-origin: left bottom; + opacity: 1; + } + + to { + transform-origin: left bottom; + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} + +.rotateOutUpLeft { + animation-name: rotateOutUpLeft; +} + +@keyframes rotateOutUpRight { + from { + transform-origin: right bottom; + opacity: 1; + } + + to { + transform-origin: right bottom; + transform: rotate3d(0, 0, 1, 90deg); + opacity: 0; + } +} + +.rotateOutUpRight { + animation-name: rotateOutUpRight; +} + +@keyframes hinge { + 0% { + transform-origin: top left; + animation-timing-function: ease-in-out; + } + + 20%, 60% { + transform: rotate3d(0, 0, 1, 80deg); + transform-origin: top left; + animation-timing-function: ease-in-out; + } + + 40%, 80% { + transform: rotate3d(0, 0, 1, 60deg); + transform-origin: top left; + animation-timing-function: ease-in-out; + opacity: 1; + } + + to { + transform: translate3d(0, 700px, 0); + opacity: 0; + } +} + +.hinge { + animation-name: hinge; +} + +@keyframes jackInTheBox { + from { + opacity: 0; + transform: scale(0.1) rotate(30deg); + transform-origin: center bottom; + } + + 50% { + transform: rotate(-10deg); + } + + 70% { + transform: rotate(3deg); + } + + to { + opacity: 1; + transform: scale(1); + } +} + +.jackInTheBox { + animation-name: jackInTheBox; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@keyframes rollIn { + from { + opacity: 0; + transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + } + + to { + opacity: 1; + transform: none; + } +} + +.rollIn { + animation-name: rollIn; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@keyframes rollOut { + from { + opacity: 1; + } + + to { + opacity: 0; + transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + } +} + +.rollOut { + animation-name: rollOut; +} + +@keyframes zoomIn { + from { + opacity: 0; + transform: scale3d(.3, .3, .3); + } + + 50% { + opacity: 1; + } +} + +.zoomIn { + animation-name: zoomIn; +} + +@keyframes zoomInDown { + from { + opacity: 0; + transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomInDown { + animation-name: zoomInDown; +} + +@keyframes zoomInLeft { + from { + opacity: 0; + transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomInLeft { + animation-name: zoomInLeft; +} + +@keyframes zoomInRight { + from { + opacity: 0; + transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomInRight { + animation-name: zoomInRight; +} + +@keyframes zoomInUp { + from { + opacity: 0; + transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomInUp { + animation-name: zoomInUp; +} + +@keyframes zoomOut { + from { + opacity: 1; + } + + 50% { + opacity: 0; + transform: scale3d(.3, .3, .3); + } + + to { + opacity: 0; + } +} + +.zoomOut { + animation-name: zoomOut; +} + +@keyframes zoomOutDown { + 40% { + opacity: 1; + transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + to { + opacity: 0; + transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0); + transform-origin: center bottom; + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomOutDown { + animation-name: zoomOutDown; +} + +@keyframes zoomOutLeft { + 40% { + opacity: 1; + transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0); + } + + to { + opacity: 0; + transform: scale(.1) translate3d(-2000px, 0, 0); + transform-origin: left center; + } +} + +.zoomOutLeft { + animation-name: zoomOutLeft; +} + +@keyframes zoomOutRight { + 40% { + opacity: 1; + transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0); + } + + to { + opacity: 0; + transform: scale(.1) translate3d(2000px, 0, 0); + transform-origin: right center; + } +} + +.zoomOutRight { + animation-name: zoomOutRight; +} + +@keyframes zoomOutUp { + 40% { + opacity: 1; + transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + to { + opacity: 0; + transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0); + transform-origin: center bottom; + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomOutUp { + animation-name: zoomOutUp; +} + +@keyframes slideInDown { + from { + transform: translate3d(0, -100%, 0); + visibility: visible; + } + + to { + transform: translate3d(0, 0, 0); + } +} + +.slideInDown { + animation-name: slideInDown; +} + +@keyframes slideInLeft { + from { + transform: translate3d(-100%, 0, 0); + visibility: visible; + } + + to { + transform: translate3d(0, 0, 0); + } +} + +.slideInLeft { + animation-name: slideInLeft; +} + +@keyframes slideInRight { + from { + transform: translate3d(100%, 0, 0); + visibility: visible; + } + + to { + transform: translate3d(0, 0, 0); + } +} + +.slideInRight { + animation-name: slideInRight; +} + +@keyframes slideInUp { + from { + transform: translate3d(0, 100%, 0); + visibility: visible; + } + + to { + transform: translate3d(0, 0, 0); + } +} + +.slideInUp { + animation-name: slideInUp; +} + +@keyframes slideOutDown { + from { + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + transform: translate3d(0, 100%, 0); + } +} + +.slideOutDown { + animation-name: slideOutDown; +} + +@keyframes slideOutLeft { + from { + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + transform: translate3d(-100%, 0, 0); + } +} + +.slideOutLeft { + animation-name: slideOutLeft; +} + +@keyframes slideOutRight { + from { + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + transform: translate3d(100%, 0, 0); + } +} + +.slideOutRight { + animation-name: slideOutRight; +} + +@keyframes slideOutUp { + from { + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + transform: translate3d(0, -100%, 0); + } +} + +.slideOutUp { + animation-name: slideOutUp; +} diff --git a/su-do-coders/core/home/static/lib/animate/animate.min.css b/su-do-coders/core/home/static/lib/animate/animate.min.css new file mode 100644 index 0000000..511b52a --- /dev/null +++ b/su-do-coders/core/home/static/lib/animate/animate.min.css @@ -0,0 +1,11 @@ +@charset "UTF-8"; + +/*! + * animate.css -http://daneden.me/animate + * Version - 3.5.2 + * Licensed under the MIT license - http://opensource.org/licenses/MIT + * + * Copyright (c) 2017 Daniel Eden + */ + +.animated{animation-duration:1s;animation-fill-mode:both}.animated.infinite{animation-iteration-count:infinite}.animated.hinge{animation-duration:2s}.animated.bounceIn,.animated.bounceOut,.animated.flipOutX,.animated.flipOutY{animation-duration:.75s}@keyframes bounce{0%,20%,53%,80%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1);transform:translateZ(0)}40%,43%{animation-timing-function:cubic-bezier(.755,.05,.855,.06);transform:translate3d(0,-30px,0)}70%{animation-timing-function:cubic-bezier(.755,.05,.855,.06);transform:translate3d(0,-15px,0)}90%{transform:translate3d(0,-4px,0)}}.bounce{animation-name:bounce;transform-origin:center bottom}@keyframes flash{0%,50%,to{opacity:1}25%,75%{opacity:0}}.flash{animation-name:flash}@keyframes pulse{0%{transform:scaleX(1)}50%{transform:scale3d(1.05,1.05,1.05)}to{transform:scaleX(1)}}.pulse{animation-name:pulse}@keyframes rubberBand{0%{transform:scaleX(1)}30%{transform:scale3d(1.25,.75,1)}40%{transform:scale3d(.75,1.25,1)}50%{transform:scale3d(1.15,.85,1)}65%{transform:scale3d(.95,1.05,1)}75%{transform:scale3d(1.05,.95,1)}to{transform:scaleX(1)}}.rubberBand{animation-name:rubberBand}@keyframes shake{0%,to{transform:translateZ(0)}10%,30%,50%,70%,90%{transform:translate3d(-10px,0,0)}20%,40%,60%,80%{transform:translate3d(10px,0,0)}}.shake{animation-name:shake}@keyframes headShake{0%{transform:translateX(0)}6.5%{transform:translateX(-6px) rotateY(-9deg)}18.5%{transform:translateX(5px) rotateY(7deg)}31.5%{transform:translateX(-3px) rotateY(-5deg)}43.5%{transform:translateX(2px) rotateY(3deg)}50%{transform:translateX(0)}}.headShake{animation-timing-function:ease-in-out;animation-name:headShake}@keyframes swing{20%{transform:rotate(15deg)}40%{transform:rotate(-10deg)}60%{transform:rotate(5deg)}80%{transform:rotate(-5deg)}to{transform:rotate(0deg)}}.swing{transform-origin:top center;animation-name:swing}@keyframes tada{0%{transform:scaleX(1)}10%,20%{transform:scale3d(.9,.9,.9) rotate(-3deg)}30%,50%,70%,90%{transform:scale3d(1.1,1.1,1.1) rotate(3deg)}40%,60%,80%{transform:scale3d(1.1,1.1,1.1) rotate(-3deg)}to{transform:scaleX(1)}}.tada{animation-name:tada}@keyframes wobble{0%{transform:none}15%{transform:translate3d(-25%,0,0) rotate(-5deg)}30%{transform:translate3d(20%,0,0) rotate(3deg)}45%{transform:translate3d(-15%,0,0) rotate(-3deg)}60%{transform:translate3d(10%,0,0) rotate(2deg)}75%{transform:translate3d(-5%,0,0) rotate(-1deg)}to{transform:none}}.wobble{animation-name:wobble}@keyframes jello{0%,11.1%,to{transform:none}22.2%{transform:skewX(-12.5deg) skewY(-12.5deg)}33.3%{transform:skewX(6.25deg) skewY(6.25deg)}44.4%{transform:skewX(-3.125deg) skewY(-3.125deg)}55.5%{transform:skewX(1.5625deg) skewY(1.5625deg)}66.6%{transform:skewX(-.78125deg) skewY(-.78125deg)}77.7%{transform:skewX(.390625deg) skewY(.390625deg)}88.8%{transform:skewX(-.1953125deg) skewY(-.1953125deg)}}.jello{animation-name:jello;transform-origin:center}@keyframes bounceIn{0%,20%,40%,60%,80%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:scale3d(.3,.3,.3)}20%{transform:scale3d(1.1,1.1,1.1)}40%{transform:scale3d(.9,.9,.9)}60%{opacity:1;transform:scale3d(1.03,1.03,1.03)}80%{transform:scale3d(.97,.97,.97)}to{opacity:1;transform:scaleX(1)}}.bounceIn{animation-name:bounceIn}@keyframes bounceInDown{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(0,-3000px,0)}60%{opacity:1;transform:translate3d(0,25px,0)}75%{transform:translate3d(0,-10px,0)}90%{transform:translate3d(0,5px,0)}to{transform:none}}.bounceInDown{animation-name:bounceInDown}@keyframes bounceInLeft{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(-3000px,0,0)}60%{opacity:1;transform:translate3d(25px,0,0)}75%{transform:translate3d(-10px,0,0)}90%{transform:translate3d(5px,0,0)}to{transform:none}}.bounceInLeft{animation-name:bounceInLeft}@keyframes bounceInRight{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(3000px,0,0)}60%{opacity:1;transform:translate3d(-25px,0,0)}75%{transform:translate3d(10px,0,0)}90%{transform:translate3d(-5px,0,0)}to{transform:none}}.bounceInRight{animation-name:bounceInRight}@keyframes bounceInUp{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(0,3000px,0)}60%{opacity:1;transform:translate3d(0,-20px,0)}75%{transform:translate3d(0,10px,0)}90%{transform:translate3d(0,-5px,0)}to{transform:translateZ(0)}}.bounceInUp{animation-name:bounceInUp}@keyframes bounceOut{20%{transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;transform:scale3d(1.1,1.1,1.1)}to{opacity:0;transform:scale3d(.3,.3,.3)}}.bounceOut{animation-name:bounceOut}@keyframes bounceOutDown{20%{transform:translate3d(0,10px,0)}40%,45%{opacity:1;transform:translate3d(0,-20px,0)}to{opacity:0;transform:translate3d(0,2000px,0)}}.bounceOutDown{animation-name:bounceOutDown}@keyframes bounceOutLeft{20%{opacity:1;transform:translate3d(20px,0,0)}to{opacity:0;transform:translate3d(-2000px,0,0)}}.bounceOutLeft{animation-name:bounceOutLeft}@keyframes bounceOutRight{20%{opacity:1;transform:translate3d(-20px,0,0)}to{opacity:0;transform:translate3d(2000px,0,0)}}.bounceOutRight{animation-name:bounceOutRight}@keyframes bounceOutUp{20%{transform:translate3d(0,-10px,0)}40%,45%{opacity:1;transform:translate3d(0,20px,0)}to{opacity:0;transform:translate3d(0,-2000px,0)}}.bounceOutUp{animation-name:bounceOutUp}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.fadeIn{animation-name:fadeIn}@keyframes fadeInDown{0%{opacity:0;transform:translate3d(0,-100%,0)}to{opacity:1;transform:none}}.fadeInDown{animation-name:fadeInDown}@keyframes fadeInDownBig{0%{opacity:0;transform:translate3d(0,-2000px,0)}to{opacity:1;transform:none}}.fadeInDownBig{animation-name:fadeInDownBig}@keyframes fadeInLeft{0%{opacity:0;transform:translate3d(-100%,0,0)}to{opacity:1;transform:none}}.fadeInLeft{animation-name:fadeInLeft}@keyframes fadeInLeftBig{0%{opacity:0;transform:translate3d(-2000px,0,0)}to{opacity:1;transform:none}}.fadeInLeftBig{animation-name:fadeInLeftBig}@keyframes fadeInRight{0%{opacity:0;transform:translate3d(100%,0,0)}to{opacity:1;transform:none}}.fadeInRight{animation-name:fadeInRight}@keyframes fadeInRightBig{0%{opacity:0;transform:translate3d(2000px,0,0)}to{opacity:1;transform:none}}.fadeInRightBig{animation-name:fadeInRightBig}@keyframes fadeInUp{0%{opacity:0;transform:translate3d(0,100%,0)}to{opacity:1;transform:none}}.fadeInUp{animation-name:fadeInUp}@keyframes fadeInUpBig{0%{opacity:0;transform:translate3d(0,2000px,0)}to{opacity:1;transform:none}}.fadeInUpBig{animation-name:fadeInUpBig}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}.fadeOut{animation-name:fadeOut}@keyframes fadeOutDown{0%{opacity:1}to{opacity:0;transform:translate3d(0,100%,0)}}.fadeOutDown{animation-name:fadeOutDown}@keyframes fadeOutDownBig{0%{opacity:1}to{opacity:0;transform:translate3d(0,2000px,0)}}.fadeOutDownBig{animation-name:fadeOutDownBig}@keyframes fadeOutLeft{0%{opacity:1}to{opacity:0;transform:translate3d(-100%,0,0)}}.fadeOutLeft{animation-name:fadeOutLeft}@keyframes fadeOutLeftBig{0%{opacity:1}to{opacity:0;transform:translate3d(-2000px,0,0)}}.fadeOutLeftBig{animation-name:fadeOutLeftBig}@keyframes fadeOutRight{0%{opacity:1}to{opacity:0;transform:translate3d(100%,0,0)}}.fadeOutRight{animation-name:fadeOutRight}@keyframes fadeOutRightBig{0%{opacity:1}to{opacity:0;transform:translate3d(2000px,0,0)}}.fadeOutRightBig{animation-name:fadeOutRightBig}@keyframes fadeOutUp{0%{opacity:1}to{opacity:0;transform:translate3d(0,-100%,0)}}.fadeOutUp{animation-name:fadeOutUp}@keyframes fadeOutUpBig{0%{opacity:1}to{opacity:0;transform:translate3d(0,-2000px,0)}}.fadeOutUpBig{animation-name:fadeOutUpBig}@keyframes flip{0%{transform:perspective(400px) rotateY(-1turn);animation-timing-function:ease-out}40%{transform:perspective(400px) translateZ(150px) rotateY(-190deg);animation-timing-function:ease-out}50%{transform:perspective(400px) translateZ(150px) rotateY(-170deg);animation-timing-function:ease-in}80%{transform:perspective(400px) scale3d(.95,.95,.95);animation-timing-function:ease-in}to{transform:perspective(400px);animation-timing-function:ease-in}}.animated.flip{-webkit-backface-visibility:visible;backface-visibility:visible;animation-name:flip}@keyframes flipInX{0%{transform:perspective(400px) rotateX(90deg);animation-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotateX(-20deg);animation-timing-function:ease-in}60%{transform:perspective(400px) rotateX(10deg);opacity:1}80%{transform:perspective(400px) rotateX(-5deg)}to{transform:perspective(400px)}}.flipInX{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;animation-name:flipInX}@keyframes flipInY{0%{transform:perspective(400px) rotateY(90deg);animation-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotateY(-20deg);animation-timing-function:ease-in}60%{transform:perspective(400px) rotateY(10deg);opacity:1}80%{transform:perspective(400px) rotateY(-5deg)}to{transform:perspective(400px)}}.flipInY{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;animation-name:flipInY}@keyframes flipOutX{0%{transform:perspective(400px)}30%{transform:perspective(400px) rotateX(-20deg);opacity:1}to{transform:perspective(400px) rotateX(90deg);opacity:0}}.flipOutX{animation-name:flipOutX;-webkit-backface-visibility:visible!important;backface-visibility:visible!important}@keyframes flipOutY{0%{transform:perspective(400px)}30%{transform:perspective(400px) rotateY(-15deg);opacity:1}to{transform:perspective(400px) rotateY(90deg);opacity:0}}.flipOutY{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;animation-name:flipOutY}@keyframes lightSpeedIn{0%{transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{transform:skewX(20deg);opacity:1}80%{transform:skewX(-5deg);opacity:1}to{transform:none;opacity:1}}.lightSpeedIn{animation-name:lightSpeedIn;animation-timing-function:ease-out}@keyframes lightSpeedOut{0%{opacity:1}to{transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}.lightSpeedOut{animation-name:lightSpeedOut;animation-timing-function:ease-in}@keyframes rotateIn{0%{transform-origin:center;transform:rotate(-200deg);opacity:0}to{transform-origin:center;transform:none;opacity:1}}.rotateIn{animation-name:rotateIn}@keyframes rotateInDownLeft{0%{transform-origin:left bottom;transform:rotate(-45deg);opacity:0}to{transform-origin:left bottom;transform:none;opacity:1}}.rotateInDownLeft{animation-name:rotateInDownLeft}@keyframes rotateInDownRight{0%{transform-origin:right bottom;transform:rotate(45deg);opacity:0}to{transform-origin:right bottom;transform:none;opacity:1}}.rotateInDownRight{animation-name:rotateInDownRight}@keyframes rotateInUpLeft{0%{transform-origin:left bottom;transform:rotate(45deg);opacity:0}to{transform-origin:left bottom;transform:none;opacity:1}}.rotateInUpLeft{animation-name:rotateInUpLeft}@keyframes rotateInUpRight{0%{transform-origin:right bottom;transform:rotate(-90deg);opacity:0}to{transform-origin:right bottom;transform:none;opacity:1}}.rotateInUpRight{animation-name:rotateInUpRight}@keyframes rotateOut{0%{transform-origin:center;opacity:1}to{transform-origin:center;transform:rotate(200deg);opacity:0}}.rotateOut{animation-name:rotateOut}@keyframes rotateOutDownLeft{0%{transform-origin:left bottom;opacity:1}to{transform-origin:left bottom;transform:rotate(45deg);opacity:0}}.rotateOutDownLeft{animation-name:rotateOutDownLeft}@keyframes rotateOutDownRight{0%{transform-origin:right bottom;opacity:1}to{transform-origin:right bottom;transform:rotate(-45deg);opacity:0}}.rotateOutDownRight{animation-name:rotateOutDownRight}@keyframes rotateOutUpLeft{0%{transform-origin:left bottom;opacity:1}to{transform-origin:left bottom;transform:rotate(-45deg);opacity:0}}.rotateOutUpLeft{animation-name:rotateOutUpLeft}@keyframes rotateOutUpRight{0%{transform-origin:right bottom;opacity:1}to{transform-origin:right bottom;transform:rotate(90deg);opacity:0}}.rotateOutUpRight{animation-name:rotateOutUpRight}@keyframes hinge{0%{transform-origin:top left;animation-timing-function:ease-in-out}20%,60%{transform:rotate(80deg);transform-origin:top left;animation-timing-function:ease-in-out}40%,80%{transform:rotate(60deg);transform-origin:top left;animation-timing-function:ease-in-out;opacity:1}to{transform:translate3d(0,700px,0);opacity:0}}.hinge{animation-name:hinge}@keyframes jackInTheBox{0%{opacity:0;transform:scale(.1) rotate(30deg);transform-origin:center bottom}50%{transform:rotate(-10deg)}70%{transform:rotate(3deg)}to{opacity:1;transform:scale(1)}}.jackInTheBox{animation-name:jackInTheBox}@keyframes rollIn{0%{opacity:0;transform:translate3d(-100%,0,0) rotate(-120deg)}to{opacity:1;transform:none}}.rollIn{animation-name:rollIn}@keyframes rollOut{0%{opacity:1}to{opacity:0;transform:translate3d(100%,0,0) rotate(120deg)}}.rollOut{animation-name:rollOut}@keyframes zoomIn{0%{opacity:0;transform:scale3d(.3,.3,.3)}50%{opacity:1}}.zoomIn{animation-name:zoomIn}@keyframes zoomInDown{0%{opacity:0;transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(0,60px,0);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomInDown{animation-name:zoomInDown}@keyframes zoomInLeft{0%{opacity:0;transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(10px,0,0);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomInLeft{animation-name:zoomInLeft}@keyframes zoomInRight{0%{opacity:0;transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomInRight{animation-name:zoomInRight}@keyframes zoomInUp{0%{opacity:0;transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomInUp{animation-name:zoomInUp}@keyframes zoomOut{0%{opacity:1}50%{opacity:0;transform:scale3d(.3,.3,.3)}to{opacity:0}}.zoomOut{animation-name:zoomOut}@keyframes zoomOutDown{40%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}to{opacity:0;transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform-origin:center bottom;animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomOutDown{animation-name:zoomOutDown}@keyframes zoomOutLeft{40%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}to{opacity:0;transform:scale(.1) translate3d(-2000px,0,0);transform-origin:left center}}.zoomOutLeft{animation-name:zoomOutLeft}@keyframes zoomOutRight{40%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}to{opacity:0;transform:scale(.1) translate3d(2000px,0,0);transform-origin:right center}}.zoomOutRight{animation-name:zoomOutRight}@keyframes zoomOutUp{40%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(0,60px,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}to{opacity:0;transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform-origin:center bottom;animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomOutUp{animation-name:zoomOutUp}@keyframes slideInDown{0%{transform:translate3d(0,-100%,0);visibility:visible}to{transform:translateZ(0)}}.slideInDown{animation-name:slideInDown}@keyframes slideInLeft{0%{transform:translate3d(-100%,0,0);visibility:visible}to{transform:translateZ(0)}}.slideInLeft{animation-name:slideInLeft}@keyframes slideInRight{0%{transform:translate3d(100%,0,0);visibility:visible}to{transform:translateZ(0)}}.slideInRight{animation-name:slideInRight}@keyframes slideInUp{0%{transform:translate3d(0,100%,0);visibility:visible}to{transform:translateZ(0)}}.slideInUp{animation-name:slideInUp}@keyframes slideOutDown{0%{transform:translateZ(0)}to{visibility:hidden;transform:translate3d(0,100%,0)}}.slideOutDown{animation-name:slideOutDown}@keyframes slideOutLeft{0%{transform:translateZ(0)}to{visibility:hidden;transform:translate3d(-100%,0,0)}}.slideOutLeft{animation-name:slideOutLeft}@keyframes slideOutRight{0%{transform:translateZ(0)}to{visibility:hidden;transform:translate3d(100%,0,0)}}.slideOutRight{animation-name:slideOutRight}@keyframes slideOutUp{0%{transform:translateZ(0)}to{visibility:hidden;transform:translate3d(0,-100%,0)}}.slideOutUp{animation-name:slideOutUp} diff --git a/su-do-coders/core/home/static/lib/easing/easing.js b/su-do-coders/core/home/static/lib/easing/easing.js new file mode 100644 index 0000000..3b9c776 --- /dev/null +++ b/su-do-coders/core/home/static/lib/easing/easing.js @@ -0,0 +1,168 @@ +/* + * jQuery Easing v1.4.1 - http://gsgd.co.uk/sandbox/jquery/easing/ + * Open source under the BSD License. + * Copyright © 2008 George McGinley Smith + * All rights reserved. + * https://raw.github.com/gdsmith/jquery-easing/master/LICENSE +*/ + +(function (factory) { + if (typeof define === "function" && define.amd) { + define(['jquery'], function ($) { + return factory($); + }); + } else if (typeof module === "object" && typeof module.exports === "object") { + exports = factory(require('jquery')); + } else { + factory(jQuery); + } +})(function($){ + +// Preserve the original jQuery "swing" easing as "jswing" +if (typeof $.easing !== 'undefined') { + $.easing['jswing'] = $.easing['swing']; +} + +var pow = Math.pow, + sqrt = Math.sqrt, + sin = Math.sin, + cos = Math.cos, + PI = Math.PI, + c1 = 1.70158, + c2 = c1 * 1.525, + c3 = c1 + 1, + c4 = ( 2 * PI ) / 3, + c5 = ( 2 * PI ) / 4.5; + +// x is the fraction of animation progress, in the range 0..1 +function bounceOut(x) { + var n1 = 7.5625, + d1 = 2.75; + if ( x < 1/d1 ) { + return n1*x*x; + } else if ( x < 2/d1 ) { + return n1*(x-=(1.5/d1))*x + .75; + } else if ( x < 2.5/d1 ) { + return n1*(x-=(2.25/d1))*x + .9375; + } else { + return n1*(x-=(2.625/d1))*x + .984375; + } +} + +$.extend( $.easing, +{ + def: 'easeOutQuad', + swing: function (x) { + return $.easing[$.easing.def](x); + }, + easeInQuad: function (x) { + return x * x; + }, + easeOutQuad: function (x) { + return 1 - ( 1 - x ) * ( 1 - x ); + }, + easeInOutQuad: function (x) { + return x < 0.5 ? + 2 * x * x : + 1 - pow( -2 * x + 2, 2 ) / 2; + }, + easeInCubic: function (x) { + return x * x * x; + }, + easeOutCubic: function (x) { + return 1 - pow( 1 - x, 3 ); + }, + easeInOutCubic: function (x) { + return x < 0.5 ? + 4 * x * x * x : + 1 - pow( -2 * x + 2, 3 ) / 2; + }, + easeInQuart: function (x) { + return x * x * x * x; + }, + easeOutQuart: function (x) { + return 1 - pow( 1 - x, 4 ); + }, + easeInOutQuart: function (x) { + return x < 0.5 ? + 8 * x * x * x * x : + 1 - pow( -2 * x + 2, 4 ) / 2; + }, + easeInQuint: function (x) { + return x * x * x * x * x; + }, + easeOutQuint: function (x) { + return 1 - pow( 1 - x, 5 ); + }, + easeInOutQuint: function (x) { + return x < 0.5 ? + 16 * x * x * x * x * x : + 1 - pow( -2 * x + 2, 5 ) / 2; + }, + easeInSine: function (x) { + return 1 - cos( x * PI/2 ); + }, + easeOutSine: function (x) { + return sin( x * PI/2 ); + }, + easeInOutSine: function (x) { + return -( cos( PI * x ) - 1 ) / 2; + }, + easeInExpo: function (x) { + return x === 0 ? 0 : pow( 2, 10 * x - 10 ); + }, + easeOutExpo: function (x) { + return x === 1 ? 1 : 1 - pow( 2, -10 * x ); + }, + easeInOutExpo: function (x) { + return x === 0 ? 0 : x === 1 ? 1 : x < 0.5 ? + pow( 2, 20 * x - 10 ) / 2 : + ( 2 - pow( 2, -20 * x + 10 ) ) / 2; + }, + easeInCirc: function (x) { + return 1 - sqrt( 1 - pow( x, 2 ) ); + }, + easeOutCirc: function (x) { + return sqrt( 1 - pow( x - 1, 2 ) ); + }, + easeInOutCirc: function (x) { + return x < 0.5 ? + ( 1 - sqrt( 1 - pow( 2 * x, 2 ) ) ) / 2 : + ( sqrt( 1 - pow( -2 * x + 2, 2 ) ) + 1 ) / 2; + }, + easeInElastic: function (x) { + return x === 0 ? 0 : x === 1 ? 1 : + -pow( 2, 10 * x - 10 ) * sin( ( x * 10 - 10.75 ) * c4 ); + }, + easeOutElastic: function (x) { + return x === 0 ? 0 : x === 1 ? 1 : + pow( 2, -10 * x ) * sin( ( x * 10 - 0.75 ) * c4 ) + 1; + }, + easeInOutElastic: function (x) { + return x === 0 ? 0 : x === 1 ? 1 : x < 0.5 ? + -( pow( 2, 20 * x - 10 ) * sin( ( 20 * x - 11.125 ) * c5 )) / 2 : + pow( 2, -20 * x + 10 ) * sin( ( 20 * x - 11.125 ) * c5 ) / 2 + 1; + }, + easeInBack: function (x) { + return c3 * x * x * x - c1 * x * x; + }, + easeOutBack: function (x) { + return 1 + c3 * pow( x - 1, 3 ) + c1 * pow( x - 1, 2 ); + }, + easeInOutBack: function (x) { + return x < 0.5 ? + ( pow( 2 * x, 2 ) * ( ( c2 + 1 ) * 2 * x - c2 ) ) / 2 : + ( pow( 2 * x - 2, 2 ) *( ( c2 + 1 ) * ( x * 2 - 2 ) + c2 ) + 2 ) / 2; + }, + easeInBounce: function (x) { + return 1 - bounceOut( 1 - x ); + }, + easeOutBounce: bounceOut, + easeInOutBounce: function (x) { + return x < 0.5 ? + ( 1 - bounceOut( 1 - 2 * x ) ) / 2 : + ( 1 + bounceOut( 2 * x - 1 ) ) / 2; + } +}); + +}); diff --git a/su-do-coders/core/home/static/lib/easing/easing.min.js b/su-do-coders/core/home/static/lib/easing/easing.min.js new file mode 100644 index 0000000..fc7dae4 --- /dev/null +++ b/su-do-coders/core/home/static/lib/easing/easing.min.js @@ -0,0 +1 @@ +!function(n){"function"==typeof define&&define.amd?define(["jquery"],function(e){return n(e)}):"object"==typeof module&&"object"==typeof module.exports?exports=n(require("jquery")):n(jQuery)}(function(n){function e(n){var e=7.5625,t=2.75;return n<1/t?e*n*n:n<2/t?e*(n-=1.5/t)*n+.75:n<2.5/t?e*(n-=2.25/t)*n+.9375:e*(n-=2.625/t)*n+.984375}void 0!==n.easing&&(n.easing.jswing=n.easing.swing);var t=Math.pow,u=Math.sqrt,r=Math.sin,i=Math.cos,a=Math.PI,c=1.70158,o=1.525*c,s=2*a/3,f=2*a/4.5;n.extend(n.easing,{def:"easeOutQuad",swing:function(e){return n.easing[n.easing.def](e)},easeInQuad:function(n){return n*n},easeOutQuad:function(n){return 1-(1-n)*(1-n)},easeInOutQuad:function(n){return n<.5?2*n*n:1-t(-2*n+2,2)/2},easeInCubic:function(n){return n*n*n},easeOutCubic:function(n){return 1-t(1-n,3)},easeInOutCubic:function(n){return n<.5?4*n*n*n:1-t(-2*n+2,3)/2},easeInQuart:function(n){return n*n*n*n},easeOutQuart:function(n){return 1-t(1-n,4)},easeInOutQuart:function(n){return n<.5?8*n*n*n*n:1-t(-2*n+2,4)/2},easeInQuint:function(n){return n*n*n*n*n},easeOutQuint:function(n){return 1-t(1-n,5)},easeInOutQuint:function(n){return n<.5?16*n*n*n*n*n:1-t(-2*n+2,5)/2},easeInSine:function(n){return 1-i(n*a/2)},easeOutSine:function(n){return r(n*a/2)},easeInOutSine:function(n){return-(i(a*n)-1)/2},easeInExpo:function(n){return 0===n?0:t(2,10*n-10)},easeOutExpo:function(n){return 1===n?1:1-t(2,-10*n)},easeInOutExpo:function(n){return 0===n?0:1===n?1:n<.5?t(2,20*n-10)/2:(2-t(2,-20*n+10))/2},easeInCirc:function(n){return 1-u(1-t(n,2))},easeOutCirc:function(n){return u(1-t(n-1,2))},easeInOutCirc:function(n){return n<.5?(1-u(1-t(2*n,2)))/2:(u(1-t(-2*n+2,2))+1)/2},easeInElastic:function(n){return 0===n?0:1===n?1:-t(2,10*n-10)*r((10*n-10.75)*s)},easeOutElastic:function(n){return 0===n?0:1===n?1:t(2,-10*n)*r((10*n-.75)*s)+1},easeInOutElastic:function(n){return 0===n?0:1===n?1:n<.5?-(t(2,20*n-10)*r((20*n-11.125)*f))/2:t(2,-20*n+10)*r((20*n-11.125)*f)/2+1},easeInBack:function(n){return(c+1)*n*n*n-c*n*n},easeOutBack:function(n){return 1+(c+1)*t(n-1,3)+c*t(n-1,2)},easeInOutBack:function(n){return n<.5?t(2*n,2)*(7.189819*n-o)/2:(t(2*n-2,2)*((o+1)*(2*n-2)+o)+2)/2},easeInBounce:function(n){return 1-e(1-n)},easeOutBounce:e,easeInOutBounce:function(n){return n<.5?(1-e(1-2*n))/2:(1+e(2*n-1))/2}})}); diff --git a/su-do-coders/core/home/static/lib/isotope/isotope.pkgd.js b/su-do-coders/core/home/static/lib/isotope/isotope.pkgd.js new file mode 100644 index 0000000..f409085 --- /dev/null +++ b/su-do-coders/core/home/static/lib/isotope/isotope.pkgd.js @@ -0,0 +1,3561 @@ +/*! + * Isotope PACKAGED v3.0.5 + * + * Licensed GPLv3 for open source use + * or Isotope Commercial License for commercial use + * + * https://isotope.metafizzy.co + * Copyright 2017 Metafizzy + */ + +/** + * Bridget makes jQuery widgets + * v2.0.1 + * MIT license + */ + +/* jshint browser: true, strict: true, undef: true, unused: true */ + +( function( window, factory ) { + // universal module definition + /*jshint strict: false */ /* globals define, module, require */ + if ( typeof define == 'function' && define.amd ) { + // AMD + define( 'jquery-bridget/jquery-bridget',[ 'jquery' ], function( jQuery ) { + return factory( window, jQuery ); + }); + } else if ( typeof module == 'object' && module.exports ) { + // CommonJS + module.exports = factory( + window, + require('jquery') + ); + } else { + // browser global + window.jQueryBridget = factory( + window, + window.jQuery + ); + } + +}( window, function factory( window, jQuery ) { +'use strict'; + +// ----- utils ----- // + +var arraySlice = Array.prototype.slice; + +// helper function for logging errors +// $.error breaks jQuery chaining +var console = window.console; +var logError = typeof console == 'undefined' ? function() {} : + function( message ) { + console.error( message ); + }; + +// ----- jQueryBridget ----- // + +function jQueryBridget( namespace, PluginClass, $ ) { + $ = $ || jQuery || window.jQuery; + if ( !$ ) { + return; + } + + // add option method -> $().plugin('option', {...}) + if ( !PluginClass.prototype.option ) { + // option setter + PluginClass.prototype.option = function( opts ) { + // bail out if not an object + if ( !$.isPlainObject( opts ) ){ + return; + } + this.options = $.extend( true, this.options, opts ); + }; + } + + // make jQuery plugin + $.fn[ namespace ] = function( arg0 /*, arg1 */ ) { + if ( typeof arg0 == 'string' ) { + // method call $().plugin( 'methodName', { options } ) + // shift arguments by 1 + var args = arraySlice.call( arguments, 1 ); + return methodCall( this, arg0, args ); + } + // just $().plugin({ options }) + plainCall( this, arg0 ); + return this; + }; + + // $().plugin('methodName') + function methodCall( $elems, methodName, args ) { + var returnValue; + var pluginMethodStr = '$().' + namespace + '("' + methodName + '")'; + + $elems.each( function( i, elem ) { + // get instance + var instance = $.data( elem, namespace ); + if ( !instance ) { + logError( namespace + ' not initialized. Cannot call methods, i.e. ' + + pluginMethodStr ); + return; + } + + var method = instance[ methodName ]; + if ( !method || methodName.charAt(0) == '_' ) { + logError( pluginMethodStr + ' is not a valid method' ); + return; + } + + // apply method, get return value + var value = method.apply( instance, args ); + // set return value if value is returned, use only first value + returnValue = returnValue === undefined ? value : returnValue; + }); + + return returnValue !== undefined ? returnValue : $elems; + } + + function plainCall( $elems, options ) { + $elems.each( function( i, elem ) { + var instance = $.data( elem, namespace ); + if ( instance ) { + // set options & init + instance.option( options ); + instance._init(); + } else { + // initialize new instance + instance = new PluginClass( elem, options ); + $.data( elem, namespace, instance ); + } + }); + } + + updateJQuery( $ ); + +} + +// ----- updateJQuery ----- // + +// set $.bridget for v1 backwards compatibility +function updateJQuery( $ ) { + if ( !$ || ( $ && $.bridget ) ) { + return; + } + $.bridget = jQueryBridget; +} + +updateJQuery( jQuery || window.jQuery ); + +// ----- ----- // + +return jQueryBridget; + +})); + +/** + * EvEmitter v1.1.0 + * Lil' event emitter + * MIT License + */ + +/* jshint unused: true, undef: true, strict: true */ + +( function( global, factory ) { + // universal module definition + /* jshint strict: false */ /* globals define, module, window */ + if ( typeof define == 'function' && define.amd ) { + // AMD - RequireJS + define( 'ev-emitter/ev-emitter',factory ); + } else if ( typeof module == 'object' && module.exports ) { + // CommonJS - Browserify, Webpack + module.exports = factory(); + } else { + // Browser globals + global.EvEmitter = factory(); + } + +}( typeof window != 'undefined' ? window : this, function() { + + + +function EvEmitter() {} + +var proto = EvEmitter.prototype; + +proto.on = function( eventName, listener ) { + if ( !eventName || !listener ) { + return; + } + // set events hash + var events = this._events = this._events || {}; + // set listeners array + var listeners = events[ eventName ] = events[ eventName ] || []; + // only add once + if ( listeners.indexOf( listener ) == -1 ) { + listeners.push( listener ); + } + + return this; +}; + +proto.once = function( eventName, listener ) { + if ( !eventName || !listener ) { + return; + } + // add event + this.on( eventName, listener ); + // set once flag + // set onceEvents hash + var onceEvents = this._onceEvents = this._onceEvents || {}; + // set onceListeners object + var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {}; + // set flag + onceListeners[ listener ] = true; + + return this; +}; + +proto.off = function( eventName, listener ) { + var listeners = this._events && this._events[ eventName ]; + if ( !listeners || !listeners.length ) { + return; + } + var index = listeners.indexOf( listener ); + if ( index != -1 ) { + listeners.splice( index, 1 ); + } + + return this; +}; + +proto.emitEvent = function( eventName, args ) { + var listeners = this._events && this._events[ eventName ]; + if ( !listeners || !listeners.length ) { + return; + } + // copy over to avoid interference if .off() in listener + listeners = listeners.slice(0); + args = args || []; + // once stuff + var onceListeners = this._onceEvents && this._onceEvents[ eventName ]; + + for ( var i=0; i < listeners.length; i++ ) { + var listener = listeners[i] + var isOnce = onceListeners && onceListeners[ listener ]; + if ( isOnce ) { + // remove listener + // remove before trigger to prevent recursion + this.off( eventName, listener ); + // unset once flag + delete onceListeners[ listener ]; + } + // trigger listener + listener.apply( this, args ); + } + + return this; +}; + +proto.allOff = function() { + delete this._events; + delete this._onceEvents; +}; + +return EvEmitter; + +})); + +/*! + * getSize v2.0.2 + * measure size of elements + * MIT license + */ + +/*jshint browser: true, strict: true, undef: true, unused: true */ +/*global define: false, module: false, console: false */ + +( function( window, factory ) { + 'use strict'; + + if ( typeof define == 'function' && define.amd ) { + // AMD + define( 'get-size/get-size',[],function() { + return factory(); + }); + } else if ( typeof module == 'object' && module.exports ) { + // CommonJS + module.exports = factory(); + } else { + // browser global + window.getSize = factory(); + } + +})( window, function factory() { +'use strict'; + +// -------------------------- helpers -------------------------- // + +// get a number from a string, not a percentage +function getStyleSize( value ) { + var num = parseFloat( value ); + // not a percent like '100%', and a number + var isValid = value.indexOf('%') == -1 && !isNaN( num ); + return isValid && num; +} + +function noop() {} + +var logError = typeof console == 'undefined' ? noop : + function( message ) { + console.error( message ); + }; + +// -------------------------- measurements -------------------------- // + +var measurements = [ + 'paddingLeft', + 'paddingRight', + 'paddingTop', + 'paddingBottom', + 'marginLeft', + 'marginRight', + 'marginTop', + 'marginBottom', + 'borderLeftWidth', + 'borderRightWidth', + 'borderTopWidth', + 'borderBottomWidth' +]; + +var measurementsLength = measurements.length; + +function getZeroSize() { + var size = { + width: 0, + height: 0, + innerWidth: 0, + innerHeight: 0, + outerWidth: 0, + outerHeight: 0 + }; + for ( var i=0; i < measurementsLength; i++ ) { + var measurement = measurements[i]; + size[ measurement ] = 0; + } + return size; +} + +// -------------------------- getStyle -------------------------- // + +/** + * getStyle, get style of element, check for Firefox bug + * https://bugzilla.mozilla.org/show_bug.cgi?id=548397 + */ +function getStyle( elem ) { + var style = getComputedStyle( elem ); + if ( !style ) { + logError( 'Style returned ' + style + + '. Are you running this code in a hidden iframe on Firefox? ' + + 'See http://bit.ly/getsizebug1' ); + } + return style; +} + +// -------------------------- setup -------------------------- // + +var isSetup = false; + +var isBoxSizeOuter; + +/** + * setup + * check isBoxSizerOuter + * do on first getSize() rather than on page load for Firefox bug + */ +function setup() { + // setup once + if ( isSetup ) { + return; + } + isSetup = true; + + // -------------------------- box sizing -------------------------- // + + /** + * WebKit measures the outer-width on style.width on border-box elems + * IE & Firefox<29 measures the inner-width + */ + var div = document.createElement('div'); + div.style.width = '200px'; + div.style.padding = '1px 2px 3px 4px'; + div.style.borderStyle = 'solid'; + div.style.borderWidth = '1px 2px 3px 4px'; + div.style.boxSizing = 'border-box'; + + var body = document.body || document.documentElement; + body.appendChild( div ); + var style = getStyle( div ); + + getSize.isBoxSizeOuter = isBoxSizeOuter = getStyleSize( style.width ) == 200; + body.removeChild( div ); + +} + +// -------------------------- getSize -------------------------- // + +function getSize( elem ) { + setup(); + + // use querySeletor if elem is string + if ( typeof elem == 'string' ) { + elem = document.querySelector( elem ); + } + + // do not proceed on non-objects + if ( !elem || typeof elem != 'object' || !elem.nodeType ) { + return; + } + + var style = getStyle( elem ); + + // if hidden, everything is 0 + if ( style.display == 'none' ) { + return getZeroSize(); + } + + var size = {}; + size.width = elem.offsetWidth; + size.height = elem.offsetHeight; + + var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box'; + + // get all measurements + for ( var i=0; i < measurementsLength; i++ ) { + var measurement = measurements[i]; + var value = style[ measurement ]; + var num = parseFloat( value ); + // any 'auto', 'medium' value will be 0 + size[ measurement ] = !isNaN( num ) ? num : 0; + } + + var paddingWidth = size.paddingLeft + size.paddingRight; + var paddingHeight = size.paddingTop + size.paddingBottom; + var marginWidth = size.marginLeft + size.marginRight; + var marginHeight = size.marginTop + size.marginBottom; + var borderWidth = size.borderLeftWidth + size.borderRightWidth; + var borderHeight = size.borderTopWidth + size.borderBottomWidth; + + var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter; + + // overwrite width and height if we can get it from style + var styleWidth = getStyleSize( style.width ); + if ( styleWidth !== false ) { + size.width = styleWidth + + // add padding and border unless it's already including it + ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth ); + } + + var styleHeight = getStyleSize( style.height ); + if ( styleHeight !== false ) { + size.height = styleHeight + + // add padding and border unless it's already including it + ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight ); + } + + size.innerWidth = size.width - ( paddingWidth + borderWidth ); + size.innerHeight = size.height - ( paddingHeight + borderHeight ); + + size.outerWidth = size.width + marginWidth; + size.outerHeight = size.height + marginHeight; + + return size; +} + +return getSize; + +}); + +/** + * matchesSelector v2.0.2 + * matchesSelector( element, '.selector' ) + * MIT license + */ + +/*jshint browser: true, strict: true, undef: true, unused: true */ + +( function( window, factory ) { + /*global define: false, module: false */ + 'use strict'; + // universal module definition + if ( typeof define == 'function' && define.amd ) { + // AMD + define( 'desandro-matches-selector/matches-selector',factory ); + } else if ( typeof module == 'object' && module.exports ) { + // CommonJS + module.exports = factory(); + } else { + // browser global + window.matchesSelector = factory(); + } + +}( window, function factory() { + 'use strict'; + + var matchesMethod = ( function() { + var ElemProto = window.Element.prototype; + // check for the standard method name first + if ( ElemProto.matches ) { + return 'matches'; + } + // check un-prefixed + if ( ElemProto.matchesSelector ) { + return 'matchesSelector'; + } + // check vendor prefixes + var prefixes = [ 'webkit', 'moz', 'ms', 'o' ]; + + for ( var i=0; i < prefixes.length; i++ ) { + var prefix = prefixes[i]; + var method = prefix + 'MatchesSelector'; + if ( ElemProto[ method ] ) { + return method; + } + } + })(); + + return function matchesSelector( elem, selector ) { + return elem[ matchesMethod ]( selector ); + }; + +})); + +/** + * Fizzy UI utils v2.0.5 + * MIT license + */ + +/*jshint browser: true, undef: true, unused: true, strict: true */ + +( function( window, factory ) { + // universal module definition + /*jshint strict: false */ /*globals define, module, require */ + + if ( typeof define == 'function' && define.amd ) { + // AMD + define( 'fizzy-ui-utils/utils',[ + 'desandro-matches-selector/matches-selector' + ], function( matchesSelector ) { + return factory( window, matchesSelector ); + }); + } else if ( typeof module == 'object' && module.exports ) { + // CommonJS + module.exports = factory( + window, + require('desandro-matches-selector') + ); + } else { + // browser global + window.fizzyUIUtils = factory( + window, + window.matchesSelector + ); + } + +}( window, function factory( window, matchesSelector ) { + + + +var utils = {}; + +// ----- extend ----- // + +// extends objects +utils.extend = function( a, b ) { + for ( var prop in b ) { + a[ prop ] = b[ prop ]; + } + return a; +}; + +// ----- modulo ----- // + +utils.modulo = function( num, div ) { + return ( ( num % div ) + div ) % div; +}; + +// ----- makeArray ----- // + +// turn element or nodeList into an array +utils.makeArray = function( obj ) { + var ary = []; + if ( Array.isArray( obj ) ) { + // use object if already an array + ary = obj; + } else if ( obj && typeof obj == 'object' && + typeof obj.length == 'number' ) { + // convert nodeList to array + for ( var i=0; i < obj.length; i++ ) { + ary.push( obj[i] ); + } + } else { + // array of single index + ary.push( obj ); + } + return ary; +}; + +// ----- removeFrom ----- // + +utils.removeFrom = function( ary, obj ) { + var index = ary.indexOf( obj ); + if ( index != -1 ) { + ary.splice( index, 1 ); + } +}; + +// ----- getParent ----- // + +utils.getParent = function( elem, selector ) { + while ( elem.parentNode && elem != document.body ) { + elem = elem.parentNode; + if ( matchesSelector( elem, selector ) ) { + return elem; + } + } +}; + +// ----- getQueryElement ----- // + +// use element as selector string +utils.getQueryElement = function( elem ) { + if ( typeof elem == 'string' ) { + return document.querySelector( elem ); + } + return elem; +}; + +// ----- handleEvent ----- // + +// enable .ontype to trigger from .addEventListener( elem, 'type' ) +utils.handleEvent = function( event ) { + var method = 'on' + event.type; + if ( this[ method ] ) { + this[ method ]( event ); + } +}; + +// ----- filterFindElements ----- // + +utils.filterFindElements = function( elems, selector ) { + // make array of elems + elems = utils.makeArray( elems ); + var ffElems = []; + + elems.forEach( function( elem ) { + // check that elem is an actual element + if ( !( elem instanceof HTMLElement ) ) { + return; + } + // add elem if no selector + if ( !selector ) { + ffElems.push( elem ); + return; + } + // filter & find items if we have a selector + // filter + if ( matchesSelector( elem, selector ) ) { + ffElems.push( elem ); + } + // find children + var childElems = elem.querySelectorAll( selector ); + // concat childElems to filterFound array + for ( var i=0; i < childElems.length; i++ ) { + ffElems.push( childElems[i] ); + } + }); + + return ffElems; +}; + +// ----- debounceMethod ----- // + +utils.debounceMethod = function( _class, methodName, threshold ) { + // original method + var method = _class.prototype[ methodName ]; + var timeoutName = methodName + 'Timeout'; + + _class.prototype[ methodName ] = function() { + var timeout = this[ timeoutName ]; + if ( timeout ) { + clearTimeout( timeout ); + } + var args = arguments; + + var _this = this; + this[ timeoutName ] = setTimeout( function() { + method.apply( _this, args ); + delete _this[ timeoutName ]; + }, threshold || 100 ); + }; +}; + +// ----- docReady ----- // + +utils.docReady = function( callback ) { + var readyState = document.readyState; + if ( readyState == 'complete' || readyState == 'interactive' ) { + // do async to allow for other scripts to run. metafizzy/flickity#441 + setTimeout( callback ); + } else { + document.addEventListener( 'DOMContentLoaded', callback ); + } +}; + +// ----- htmlInit ----- // + +// http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/ +utils.toDashed = function( str ) { + return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) { + return $1 + '-' + $2; + }).toLowerCase(); +}; + +var console = window.console; +/** + * allow user to initialize classes via [data-namespace] or .js-namespace class + * htmlInit( Widget, 'widgetName' ) + * options are parsed from data-namespace-options + */ +utils.htmlInit = function( WidgetClass, namespace ) { + utils.docReady( function() { + var dashedNamespace = utils.toDashed( namespace ); + var dataAttr = 'data-' + dashedNamespace; + var dataAttrElems = document.querySelectorAll( '[' + dataAttr + ']' ); + var jsDashElems = document.querySelectorAll( '.js-' + dashedNamespace ); + var elems = utils.makeArray( dataAttrElems ) + .concat( utils.makeArray( jsDashElems ) ); + var dataOptionsAttr = dataAttr + '-options'; + var jQuery = window.jQuery; + + elems.forEach( function( elem ) { + var attr = elem.getAttribute( dataAttr ) || + elem.getAttribute( dataOptionsAttr ); + var options; + try { + options = attr && JSON.parse( attr ); + } catch ( error ) { + // log error, do not initialize + if ( console ) { + console.error( 'Error parsing ' + dataAttr + ' on ' + elem.className + + ': ' + error ); + } + return; + } + // initialize + var instance = new WidgetClass( elem, options ); + // make available via $().data('namespace') + if ( jQuery ) { + jQuery.data( elem, namespace, instance ); + } + }); + + }); +}; + +// ----- ----- // + +return utils; + +})); + +/** + * Outlayer Item + */ + +( function( window, factory ) { + // universal module definition + /* jshint strict: false */ /* globals define, module, require */ + if ( typeof define == 'function' && define.amd ) { + // AMD - RequireJS + define( 'outlayer/item',[ + 'ev-emitter/ev-emitter', + 'get-size/get-size' + ], + factory + ); + } else if ( typeof module == 'object' && module.exports ) { + // CommonJS - Browserify, Webpack + module.exports = factory( + require('ev-emitter'), + require('get-size') + ); + } else { + // browser global + window.Outlayer = {}; + window.Outlayer.Item = factory( + window.EvEmitter, + window.getSize + ); + } + +}( window, function factory( EvEmitter, getSize ) { +'use strict'; + +// ----- helpers ----- // + +function isEmptyObj( obj ) { + for ( var prop in obj ) { + return false; + } + prop = null; + return true; +} + +// -------------------------- CSS3 support -------------------------- // + + +var docElemStyle = document.documentElement.style; + +var transitionProperty = typeof docElemStyle.transition == 'string' ? + 'transition' : 'WebkitTransition'; +var transformProperty = typeof docElemStyle.transform == 'string' ? + 'transform' : 'WebkitTransform'; + +var transitionEndEvent = { + WebkitTransition: 'webkitTransitionEnd', + transition: 'transitionend' +}[ transitionProperty ]; + +// cache all vendor properties that could have vendor prefix +var vendorProperties = { + transform: transformProperty, + transition: transitionProperty, + transitionDuration: transitionProperty + 'Duration', + transitionProperty: transitionProperty + 'Property', + transitionDelay: transitionProperty + 'Delay' +}; + +// -------------------------- Item -------------------------- // + +function Item( element, layout ) { + if ( !element ) { + return; + } + + this.element = element; + // parent layout class, i.e. Masonry, Isotope, or Packery + this.layout = layout; + this.position = { + x: 0, + y: 0 + }; + + this._create(); +} + +// inherit EvEmitter +var proto = Item.prototype = Object.create( EvEmitter.prototype ); +proto.constructor = Item; + +proto._create = function() { + // transition objects + this._transn = { + ingProperties: {}, + clean: {}, + onEnd: {} + }; + + this.css({ + position: 'absolute' + }); +}; + +// trigger specified handler for event type +proto.handleEvent = function( event ) { + var method = 'on' + event.type; + if ( this[ method ] ) { + this[ method ]( event ); + } +}; + +proto.getSize = function() { + this.size = getSize( this.element ); +}; + +/** + * apply CSS styles to element + * @param {Object} style + */ +proto.css = function( style ) { + var elemStyle = this.element.style; + + for ( var prop in style ) { + // use vendor property if available + var supportedProp = vendorProperties[ prop ] || prop; + elemStyle[ supportedProp ] = style[ prop ]; + } +}; + + // measure position, and sets it +proto.getPosition = function() { + var style = getComputedStyle( this.element ); + var isOriginLeft = this.layout._getOption('originLeft'); + var isOriginTop = this.layout._getOption('originTop'); + var xValue = style[ isOriginLeft ? 'left' : 'right' ]; + var yValue = style[ isOriginTop ? 'top' : 'bottom' ]; + // convert percent to pixels + var layoutSize = this.layout.size; + var x = xValue.indexOf('%') != -1 ? + ( parseFloat( xValue ) / 100 ) * layoutSize.width : parseInt( xValue, 10 ); + var y = yValue.indexOf('%') != -1 ? + ( parseFloat( yValue ) / 100 ) * layoutSize.height : parseInt( yValue, 10 ); + + // clean up 'auto' or other non-integer values + x = isNaN( x ) ? 0 : x; + y = isNaN( y ) ? 0 : y; + // remove padding from measurement + x -= isOriginLeft ? layoutSize.paddingLeft : layoutSize.paddingRight; + y -= isOriginTop ? layoutSize.paddingTop : layoutSize.paddingBottom; + + this.position.x = x; + this.position.y = y; +}; + +// set settled position, apply padding +proto.layoutPosition = function() { + var layoutSize = this.layout.size; + var style = {}; + var isOriginLeft = this.layout._getOption('originLeft'); + var isOriginTop = this.layout._getOption('originTop'); + + // x + var xPadding = isOriginLeft ? 'paddingLeft' : 'paddingRight'; + var xProperty = isOriginLeft ? 'left' : 'right'; + var xResetProperty = isOriginLeft ? 'right' : 'left'; + + var x = this.position.x + layoutSize[ xPadding ]; + // set in percentage or pixels + style[ xProperty ] = this.getXValue( x ); + // reset other property + style[ xResetProperty ] = ''; + + // y + var yPadding = isOriginTop ? 'paddingTop' : 'paddingBottom'; + var yProperty = isOriginTop ? 'top' : 'bottom'; + var yResetProperty = isOriginTop ? 'bottom' : 'top'; + + var y = this.position.y + layoutSize[ yPadding ]; + // set in percentage or pixels + style[ yProperty ] = this.getYValue( y ); + // reset other property + style[ yResetProperty ] = ''; + + this.css( style ); + this.emitEvent( 'layout', [ this ] ); +}; + +proto.getXValue = function( x ) { + var isHorizontal = this.layout._getOption('horizontal'); + return this.layout.options.percentPosition && !isHorizontal ? + ( ( x / this.layout.size.width ) * 100 ) + '%' : x + 'px'; +}; + +proto.getYValue = function( y ) { + var isHorizontal = this.layout._getOption('horizontal'); + return this.layout.options.percentPosition && isHorizontal ? + ( ( y / this.layout.size.height ) * 100 ) + '%' : y + 'px'; +}; + +proto._transitionTo = function( x, y ) { + this.getPosition(); + // get current x & y from top/left + var curX = this.position.x; + var curY = this.position.y; + + var compareX = parseInt( x, 10 ); + var compareY = parseInt( y, 10 ); + var didNotMove = compareX === this.position.x && compareY === this.position.y; + + // save end position + this.setPosition( x, y ); + + // if did not move and not transitioning, just go to layout + if ( didNotMove && !this.isTransitioning ) { + this.layoutPosition(); + return; + } + + var transX = x - curX; + var transY = y - curY; + var transitionStyle = {}; + transitionStyle.transform = this.getTranslate( transX, transY ); + + this.transition({ + to: transitionStyle, + onTransitionEnd: { + transform: this.layoutPosition + }, + isCleaning: true + }); +}; + +proto.getTranslate = function( x, y ) { + // flip cooridinates if origin on right or bottom + var isOriginLeft = this.layout._getOption('originLeft'); + var isOriginTop = this.layout._getOption('originTop'); + x = isOriginLeft ? x : -x; + y = isOriginTop ? y : -y; + return 'translate3d(' + x + 'px, ' + y + 'px, 0)'; +}; + +// non transition + transform support +proto.goTo = function( x, y ) { + this.setPosition( x, y ); + this.layoutPosition(); +}; + +proto.moveTo = proto._transitionTo; + +proto.setPosition = function( x, y ) { + this.position.x = parseInt( x, 10 ); + this.position.y = parseInt( y, 10 ); +}; + +// ----- transition ----- // + +/** + * @param {Object} style - CSS + * @param {Function} onTransitionEnd + */ + +// non transition, just trigger callback +proto._nonTransition = function( args ) { + this.css( args.to ); + if ( args.isCleaning ) { + this._removeStyles( args.to ); + } + for ( var prop in args.onTransitionEnd ) { + args.onTransitionEnd[ prop ].call( this ); + } +}; + +/** + * proper transition + * @param {Object} args - arguments + * @param {Object} to - style to transition to + * @param {Object} from - style to start transition from + * @param {Boolean} isCleaning - removes transition styles after transition + * @param {Function} onTransitionEnd - callback + */ +proto.transition = function( args ) { + // redirect to nonTransition if no transition duration + if ( !parseFloat( this.layout.options.transitionDuration ) ) { + this._nonTransition( args ); + return; + } + + var _transition = this._transn; + // keep track of onTransitionEnd callback by css property + for ( var prop in args.onTransitionEnd ) { + _transition.onEnd[ prop ] = args.onTransitionEnd[ prop ]; + } + // keep track of properties that are transitioning + for ( prop in args.to ) { + _transition.ingProperties[ prop ] = true; + // keep track of properties to clean up when transition is done + if ( args.isCleaning ) { + _transition.clean[ prop ] = true; + } + } + + // set from styles + if ( args.from ) { + this.css( args.from ); + // force redraw. http://blog.alexmaccaw.com/css-transitions + var h = this.element.offsetHeight; + // hack for JSHint to hush about unused var + h = null; + } + // enable transition + this.enableTransition( args.to ); + // set styles that are transitioning + this.css( args.to ); + + this.isTransitioning = true; + +}; + +// dash before all cap letters, including first for +// WebkitTransform => -webkit-transform +function toDashedAll( str ) { + return str.replace( /([A-Z])/g, function( $1 ) { + return '-' + $1.toLowerCase(); + }); +} + +var transitionProps = 'opacity,' + toDashedAll( transformProperty ); + +proto.enableTransition = function(/* style */) { + // HACK changing transitionProperty during a transition + // will cause transition to jump + if ( this.isTransitioning ) { + return; + } + + // make `transition: foo, bar, baz` from style object + // HACK un-comment this when enableTransition can work + // while a transition is happening + // var transitionValues = []; + // for ( var prop in style ) { + // // dash-ify camelCased properties like WebkitTransition + // prop = vendorProperties[ prop ] || prop; + // transitionValues.push( toDashedAll( prop ) ); + // } + // munge number to millisecond, to match stagger + var duration = this.layout.options.transitionDuration; + duration = typeof duration == 'number' ? duration + 'ms' : duration; + // enable transition styles + this.css({ + transitionProperty: transitionProps, + transitionDuration: duration, + transitionDelay: this.staggerDelay || 0 + }); + // listen for transition end event + this.element.addEventListener( transitionEndEvent, this, false ); +}; + +// ----- events ----- // + +proto.onwebkitTransitionEnd = function( event ) { + this.ontransitionend( event ); +}; + +proto.onotransitionend = function( event ) { + this.ontransitionend( event ); +}; + +// properties that I munge to make my life easier +var dashedVendorProperties = { + '-webkit-transform': 'transform' +}; + +proto.ontransitionend = function( event ) { + // disregard bubbled events from children + if ( event.target !== this.element ) { + return; + } + var _transition = this._transn; + // get property name of transitioned property, convert to prefix-free + var propertyName = dashedVendorProperties[ event.propertyName ] || event.propertyName; + + // remove property that has completed transitioning + delete _transition.ingProperties[ propertyName ]; + // check if any properties are still transitioning + if ( isEmptyObj( _transition.ingProperties ) ) { + // all properties have completed transitioning + this.disableTransition(); + } + // clean style + if ( propertyName in _transition.clean ) { + // clean up style + this.element.style[ event.propertyName ] = ''; + delete _transition.clean[ propertyName ]; + } + // trigger onTransitionEnd callback + if ( propertyName in _transition.onEnd ) { + var onTransitionEnd = _transition.onEnd[ propertyName ]; + onTransitionEnd.call( this ); + delete _transition.onEnd[ propertyName ]; + } + + this.emitEvent( 'transitionEnd', [ this ] ); +}; + +proto.disableTransition = function() { + this.removeTransitionStyles(); + this.element.removeEventListener( transitionEndEvent, this, false ); + this.isTransitioning = false; +}; + +/** + * removes style property from element + * @param {Object} style +**/ +proto._removeStyles = function( style ) { + // clean up transition styles + var cleanStyle = {}; + for ( var prop in style ) { + cleanStyle[ prop ] = ''; + } + this.css( cleanStyle ); +}; + +var cleanTransitionStyle = { + transitionProperty: '', + transitionDuration: '', + transitionDelay: '' +}; + +proto.removeTransitionStyles = function() { + // remove transition + this.css( cleanTransitionStyle ); +}; + +// ----- stagger ----- // + +proto.stagger = function( delay ) { + delay = isNaN( delay ) ? 0 : delay; + this.staggerDelay = delay + 'ms'; +}; + +// ----- show/hide/remove ----- // + +// remove element from DOM +proto.removeElem = function() { + this.element.parentNode.removeChild( this.element ); + // remove display: none + this.css({ display: '' }); + this.emitEvent( 'remove', [ this ] ); +}; + +proto.remove = function() { + // just remove element if no transition support or no transition + if ( !transitionProperty || !parseFloat( this.layout.options.transitionDuration ) ) { + this.removeElem(); + return; + } + + // start transition + this.once( 'transitionEnd', function() { + this.removeElem(); + }); + this.hide(); +}; + +proto.reveal = function() { + delete this.isHidden; + // remove display: none + this.css({ display: '' }); + + var options = this.layout.options; + + var onTransitionEnd = {}; + var transitionEndProperty = this.getHideRevealTransitionEndProperty('visibleStyle'); + onTransitionEnd[ transitionEndProperty ] = this.onRevealTransitionEnd; + + this.transition({ + from: options.hiddenStyle, + to: options.visibleStyle, + isCleaning: true, + onTransitionEnd: onTransitionEnd + }); +}; + +proto.onRevealTransitionEnd = function() { + // check if still visible + // during transition, item may have been hidden + if ( !this.isHidden ) { + this.emitEvent('reveal'); + } +}; + +/** + * get style property use for hide/reveal transition end + * @param {String} styleProperty - hiddenStyle/visibleStyle + * @returns {String} + */ +proto.getHideRevealTransitionEndProperty = function( styleProperty ) { + var optionStyle = this.layout.options[ styleProperty ]; + // use opacity + if ( optionStyle.opacity ) { + return 'opacity'; + } + // get first property + for ( var prop in optionStyle ) { + return prop; + } +}; + +proto.hide = function() { + // set flag + this.isHidden = true; + // remove display: none + this.css({ display: '' }); + + var options = this.layout.options; + + var onTransitionEnd = {}; + var transitionEndProperty = this.getHideRevealTransitionEndProperty('hiddenStyle'); + onTransitionEnd[ transitionEndProperty ] = this.onHideTransitionEnd; + + this.transition({ + from: options.visibleStyle, + to: options.hiddenStyle, + // keep hidden stuff hidden + isCleaning: true, + onTransitionEnd: onTransitionEnd + }); +}; + +proto.onHideTransitionEnd = function() { + // check if still hidden + // during transition, item may have been un-hidden + if ( this.isHidden ) { + this.css({ display: 'none' }); + this.emitEvent('hide'); + } +}; + +proto.destroy = function() { + this.css({ + position: '', + left: '', + right: '', + top: '', + bottom: '', + transition: '', + transform: '' + }); +}; + +return Item; + +})); + +/*! + * Outlayer v2.1.0 + * the brains and guts of a layout library + * MIT license + */ + +( function( window, factory ) { + 'use strict'; + // universal module definition + /* jshint strict: false */ /* globals define, module, require */ + if ( typeof define == 'function' && define.amd ) { + // AMD - RequireJS + define( 'outlayer/outlayer',[ + 'ev-emitter/ev-emitter', + 'get-size/get-size', + 'fizzy-ui-utils/utils', + './item' + ], + function( EvEmitter, getSize, utils, Item ) { + return factory( window, EvEmitter, getSize, utils, Item); + } + ); + } else if ( typeof module == 'object' && module.exports ) { + // CommonJS - Browserify, Webpack + module.exports = factory( + window, + require('ev-emitter'), + require('get-size'), + require('fizzy-ui-utils'), + require('./item') + ); + } else { + // browser global + window.Outlayer = factory( + window, + window.EvEmitter, + window.getSize, + window.fizzyUIUtils, + window.Outlayer.Item + ); + } + +}( window, function factory( window, EvEmitter, getSize, utils, Item ) { +'use strict'; + +// ----- vars ----- // + +var console = window.console; +var jQuery = window.jQuery; +var noop = function() {}; + +// -------------------------- Outlayer -------------------------- // + +// globally unique identifiers +var GUID = 0; +// internal store of all Outlayer intances +var instances = {}; + + +/** + * @param {Element, String} element + * @param {Object} options + * @constructor + */ +function Outlayer( element, options ) { + var queryElement = utils.getQueryElement( element ); + if ( !queryElement ) { + if ( console ) { + console.error( 'Bad element for ' + this.constructor.namespace + + ': ' + ( queryElement || element ) ); + } + return; + } + this.element = queryElement; + // add jQuery + if ( jQuery ) { + this.$element = jQuery( this.element ); + } + + // options + this.options = utils.extend( {}, this.constructor.defaults ); + this.option( options ); + + // add id for Outlayer.getFromElement + var id = ++GUID; + this.element.outlayerGUID = id; // expando + instances[ id ] = this; // associate via id + + // kick it off + this._create(); + + var isInitLayout = this._getOption('initLayout'); + if ( isInitLayout ) { + this.layout(); + } +} + +// settings are for internal use only +Outlayer.namespace = 'outlayer'; +Outlayer.Item = Item; + +// default options +Outlayer.defaults = { + containerStyle: { + position: 'relative' + }, + initLayout: true, + originLeft: true, + originTop: true, + resize: true, + resizeContainer: true, + // item options + transitionDuration: '0.4s', + hiddenStyle: { + opacity: 0, + transform: 'scale(0.001)' + }, + visibleStyle: { + opacity: 1, + transform: 'scale(1)' + } +}; + +var proto = Outlayer.prototype; +// inherit EvEmitter +utils.extend( proto, EvEmitter.prototype ); + +/** + * set options + * @param {Object} opts + */ +proto.option = function( opts ) { + utils.extend( this.options, opts ); +}; + +/** + * get backwards compatible option value, check old name + */ +proto._getOption = function( option ) { + var oldOption = this.constructor.compatOptions[ option ]; + return oldOption && this.options[ oldOption ] !== undefined ? + this.options[ oldOption ] : this.options[ option ]; +}; + +Outlayer.compatOptions = { + // currentName: oldName + initLayout: 'isInitLayout', + horizontal: 'isHorizontal', + layoutInstant: 'isLayoutInstant', + originLeft: 'isOriginLeft', + originTop: 'isOriginTop', + resize: 'isResizeBound', + resizeContainer: 'isResizingContainer' +}; + +proto._create = function() { + // get items from children + this.reloadItems(); + // elements that affect layout, but are not laid out + this.stamps = []; + this.stamp( this.options.stamp ); + // set container style + utils.extend( this.element.style, this.options.containerStyle ); + + // bind resize method + var canBindResize = this._getOption('resize'); + if ( canBindResize ) { + this.bindResize(); + } +}; + +// goes through all children again and gets bricks in proper order +proto.reloadItems = function() { + // collection of item elements + this.items = this._itemize( this.element.children ); +}; + + +/** + * turn elements into Outlayer.Items to be used in layout + * @param {Array or NodeList or HTMLElement} elems + * @returns {Array} items - collection of new Outlayer Items + */ +proto._itemize = function( elems ) { + + var itemElems = this._filterFindItemElements( elems ); + var Item = this.constructor.Item; + + // create new Outlayer Items for collection + var items = []; + for ( var i=0; i < itemElems.length; i++ ) { + var elem = itemElems[i]; + var item = new Item( elem, this ); + items.push( item ); + } + + return items; +}; + +/** + * get item elements to be used in layout + * @param {Array or NodeList or HTMLElement} elems + * @returns {Array} items - item elements + */ +proto._filterFindItemElements = function( elems ) { + return utils.filterFindElements( elems, this.options.itemSelector ); +}; + +/** + * getter method for getting item elements + * @returns {Array} elems - collection of item elements + */ +proto.getItemElements = function() { + return this.items.map( function( item ) { + return item.element; + }); +}; + +// ----- init & layout ----- // + +/** + * lays out all items + */ +proto.layout = function() { + this._resetLayout(); + this._manageStamps(); + + // don't animate first layout + var layoutInstant = this._getOption('layoutInstant'); + var isInstant = layoutInstant !== undefined ? + layoutInstant : !this._isLayoutInited; + this.layoutItems( this.items, isInstant ); + + // flag for initalized + this._isLayoutInited = true; +}; + +// _init is alias for layout +proto._init = proto.layout; + +/** + * logic before any new layout + */ +proto._resetLayout = function() { + this.getSize(); +}; + + +proto.getSize = function() { + this.size = getSize( this.element ); +}; + +/** + * get measurement from option, for columnWidth, rowHeight, gutter + * if option is String -> get element from selector string, & get size of element + * if option is Element -> get size of element + * else use option as a number + * + * @param {String} measurement + * @param {String} size - width or height + * @private + */ +proto._getMeasurement = function( measurement, size ) { + var option = this.options[ measurement ]; + var elem; + if ( !option ) { + // default to 0 + this[ measurement ] = 0; + } else { + // use option as an element + if ( typeof option == 'string' ) { + elem = this.element.querySelector( option ); + } else if ( option instanceof HTMLElement ) { + elem = option; + } + // use size of element, if element + this[ measurement ] = elem ? getSize( elem )[ size ] : option; + } +}; + +/** + * layout a collection of item elements + * @api public + */ +proto.layoutItems = function( items, isInstant ) { + items = this._getItemsForLayout( items ); + + this._layoutItems( items, isInstant ); + + this._postLayout(); +}; + +/** + * get the items to be laid out + * you may want to skip over some items + * @param {Array} items + * @returns {Array} items + */ +proto._getItemsForLayout = function( items ) { + return items.filter( function( item ) { + return !item.isIgnored; + }); +}; + +/** + * layout items + * @param {Array} items + * @param {Boolean} isInstant + */ +proto._layoutItems = function( items, isInstant ) { + this._emitCompleteOnItems( 'layout', items ); + + if ( !items || !items.length ) { + // no items, emit event with empty array + return; + } + + var queue = []; + + items.forEach( function( item ) { + // get x/y object from method + var position = this._getItemLayoutPosition( item ); + // enqueue + position.item = item; + position.isInstant = isInstant || item.isLayoutInstant; + queue.push( position ); + }, this ); + + this._processLayoutQueue( queue ); +}; + +/** + * get item layout position + * @param {Outlayer.Item} item + * @returns {Object} x and y position + */ +proto._getItemLayoutPosition = function( /* item */ ) { + return { + x: 0, + y: 0 + }; +}; + +/** + * iterate over array and position each item + * Reason being - separating this logic prevents 'layout invalidation' + * thx @paul_irish + * @param {Array} queue + */ +proto._processLayoutQueue = function( queue ) { + this.updateStagger(); + queue.forEach( function( obj, i ) { + this._positionItem( obj.item, obj.x, obj.y, obj.isInstant, i ); + }, this ); +}; + +// set stagger from option in milliseconds number +proto.updateStagger = function() { + var stagger = this.options.stagger; + if ( stagger === null || stagger === undefined ) { + this.stagger = 0; + return; + } + this.stagger = getMilliseconds( stagger ); + return this.stagger; +}; + +/** + * Sets position of item in DOM + * @param {Outlayer.Item} item + * @param {Number} x - horizontal position + * @param {Number} y - vertical position + * @param {Boolean} isInstant - disables transitions + */ +proto._positionItem = function( item, x, y, isInstant, i ) { + if ( isInstant ) { + // if not transition, just set CSS + item.goTo( x, y ); + } else { + item.stagger( i * this.stagger ); + item.moveTo( x, y ); + } +}; + +/** + * Any logic you want to do after each layout, + * i.e. size the container + */ +proto._postLayout = function() { + this.resizeContainer(); +}; + +proto.resizeContainer = function() { + var isResizingContainer = this._getOption('resizeContainer'); + if ( !isResizingContainer ) { + return; + } + var size = this._getContainerSize(); + if ( size ) { + this._setContainerMeasure( size.width, true ); + this._setContainerMeasure( size.height, false ); + } +}; + +/** + * Sets width or height of container if returned + * @returns {Object} size + * @param {Number} width + * @param {Number} height + */ +proto._getContainerSize = noop; + +/** + * @param {Number} measure - size of width or height + * @param {Boolean} isWidth + */ +proto._setContainerMeasure = function( measure, isWidth ) { + if ( measure === undefined ) { + return; + } + + var elemSize = this.size; + // add padding and border width if border box + if ( elemSize.isBorderBox ) { + measure += isWidth ? elemSize.paddingLeft + elemSize.paddingRight + + elemSize.borderLeftWidth + elemSize.borderRightWidth : + elemSize.paddingBottom + elemSize.paddingTop + + elemSize.borderTopWidth + elemSize.borderBottomWidth; + } + + measure = Math.max( measure, 0 ); + this.element.style[ isWidth ? 'width' : 'height' ] = measure + 'px'; +}; + +/** + * emit eventComplete on a collection of items events + * @param {String} eventName + * @param {Array} items - Outlayer.Items + */ +proto._emitCompleteOnItems = function( eventName, items ) { + var _this = this; + function onComplete() { + _this.dispatchEvent( eventName + 'Complete', null, [ items ] ); + } + + var count = items.length; + if ( !items || !count ) { + onComplete(); + return; + } + + var doneCount = 0; + function tick() { + doneCount++; + if ( doneCount == count ) { + onComplete(); + } + } + + // bind callback + items.forEach( function( item ) { + item.once( eventName, tick ); + }); +}; + +/** + * emits events via EvEmitter and jQuery events + * @param {String} type - name of event + * @param {Event} event - original event + * @param {Array} args - extra arguments + */ +proto.dispatchEvent = function( type, event, args ) { + // add original event to arguments + var emitArgs = event ? [ event ].concat( args ) : args; + this.emitEvent( type, emitArgs ); + + if ( jQuery ) { + // set this.$element + this.$element = this.$element || jQuery( this.element ); + if ( event ) { + // create jQuery event + var $event = jQuery.Event( event ); + $event.type = type; + this.$element.trigger( $event, args ); + } else { + // just trigger with type if no event available + this.$element.trigger( type, args ); + } + } +}; + +// -------------------------- ignore & stamps -------------------------- // + + +/** + * keep item in collection, but do not lay it out + * ignored items do not get skipped in layout + * @param {Element} elem + */ +proto.ignore = function( elem ) { + var item = this.getItem( elem ); + if ( item ) { + item.isIgnored = true; + } +}; + +/** + * return item to layout collection + * @param {Element} elem + */ +proto.unignore = function( elem ) { + var item = this.getItem( elem ); + if ( item ) { + delete item.isIgnored; + } +}; + +/** + * adds elements to stamps + * @param {NodeList, Array, Element, or String} elems + */ +proto.stamp = function( elems ) { + elems = this._find( elems ); + if ( !elems ) { + return; + } + + this.stamps = this.stamps.concat( elems ); + // ignore + elems.forEach( this.ignore, this ); +}; + +/** + * removes elements to stamps + * @param {NodeList, Array, or Element} elems + */ +proto.unstamp = function( elems ) { + elems = this._find( elems ); + if ( !elems ){ + return; + } + + elems.forEach( function( elem ) { + // filter out removed stamp elements + utils.removeFrom( this.stamps, elem ); + this.unignore( elem ); + }, this ); +}; + +/** + * finds child elements + * @param {NodeList, Array, Element, or String} elems + * @returns {Array} elems + */ +proto._find = function( elems ) { + if ( !elems ) { + return; + } + // if string, use argument as selector string + if ( typeof elems == 'string' ) { + elems = this.element.querySelectorAll( elems ); + } + elems = utils.makeArray( elems ); + return elems; +}; + +proto._manageStamps = function() { + if ( !this.stamps || !this.stamps.length ) { + return; + } + + this._getBoundingRect(); + + this.stamps.forEach( this._manageStamp, this ); +}; + +// update boundingLeft / Top +proto._getBoundingRect = function() { + // get bounding rect for container element + var boundingRect = this.element.getBoundingClientRect(); + var size = this.size; + this._boundingRect = { + left: boundingRect.left + size.paddingLeft + size.borderLeftWidth, + top: boundingRect.top + size.paddingTop + size.borderTopWidth, + right: boundingRect.right - ( size.paddingRight + size.borderRightWidth ), + bottom: boundingRect.bottom - ( size.paddingBottom + size.borderBottomWidth ) + }; +}; + +/** + * @param {Element} stamp +**/ +proto._manageStamp = noop; + +/** + * get x/y position of element relative to container element + * @param {Element} elem + * @returns {Object} offset - has left, top, right, bottom + */ +proto._getElementOffset = function( elem ) { + var boundingRect = elem.getBoundingClientRect(); + var thisRect = this._boundingRect; + var size = getSize( elem ); + var offset = { + left: boundingRect.left - thisRect.left - size.marginLeft, + top: boundingRect.top - thisRect.top - size.marginTop, + right: thisRect.right - boundingRect.right - size.marginRight, + bottom: thisRect.bottom - boundingRect.bottom - size.marginBottom + }; + return offset; +}; + +// -------------------------- resize -------------------------- // + +// enable event handlers for listeners +// i.e. resize -> onresize +proto.handleEvent = utils.handleEvent; + +/** + * Bind layout to window resizing + */ +proto.bindResize = function() { + window.addEventListener( 'resize', this ); + this.isResizeBound = true; +}; + +/** + * Unbind layout to window resizing + */ +proto.unbindResize = function() { + window.removeEventListener( 'resize', this ); + this.isResizeBound = false; +}; + +proto.onresize = function() { + this.resize(); +}; + +utils.debounceMethod( Outlayer, 'onresize', 100 ); + +proto.resize = function() { + // don't trigger if size did not change + // or if resize was unbound. See #9 + if ( !this.isResizeBound || !this.needsResizeLayout() ) { + return; + } + + this.layout(); +}; + +/** + * check if layout is needed post layout + * @returns Boolean + */ +proto.needsResizeLayout = function() { + var size = getSize( this.element ); + // check that this.size and size are there + // IE8 triggers resize on body size change, so they might not be + var hasSizes = this.size && size; + return hasSizes && size.innerWidth !== this.size.innerWidth; +}; + +// -------------------------- methods -------------------------- // + +/** + * add items to Outlayer instance + * @param {Array or NodeList or Element} elems + * @returns {Array} items - Outlayer.Items +**/ +proto.addItems = function( elems ) { + var items = this._itemize( elems ); + // add items to collection + if ( items.length ) { + this.items = this.items.concat( items ); + } + return items; +}; + +/** + * Layout newly-appended item elements + * @param {Array or NodeList or Element} elems + */ +proto.appended = function( elems ) { + var items = this.addItems( elems ); + if ( !items.length ) { + return; + } + // layout and reveal just the new items + this.layoutItems( items, true ); + this.reveal( items ); +}; + +/** + * Layout prepended elements + * @param {Array or NodeList or Element} elems + */ +proto.prepended = function( elems ) { + var items = this._itemize( elems ); + if ( !items.length ) { + return; + } + // add items to beginning of collection + var previousItems = this.items.slice(0); + this.items = items.concat( previousItems ); + // start new layout + this._resetLayout(); + this._manageStamps(); + // layout new stuff without transition + this.layoutItems( items, true ); + this.reveal( items ); + // layout previous items + this.layoutItems( previousItems ); +}; + +/** + * reveal a collection of items + * @param {Array of Outlayer.Items} items + */ +proto.reveal = function( items ) { + this._emitCompleteOnItems( 'reveal', items ); + if ( !items || !items.length ) { + return; + } + var stagger = this.updateStagger(); + items.forEach( function( item, i ) { + item.stagger( i * stagger ); + item.reveal(); + }); +}; + +/** + * hide a collection of items + * @param {Array of Outlayer.Items} items + */ +proto.hide = function( items ) { + this._emitCompleteOnItems( 'hide', items ); + if ( !items || !items.length ) { + return; + } + var stagger = this.updateStagger(); + items.forEach( function( item, i ) { + item.stagger( i * stagger ); + item.hide(); + }); +}; + +/** + * reveal item elements + * @param {Array}, {Element}, {NodeList} items + */ +proto.revealItemElements = function( elems ) { + var items = this.getItems( elems ); + this.reveal( items ); +}; + +/** + * hide item elements + * @param {Array}, {Element}, {NodeList} items + */ +proto.hideItemElements = function( elems ) { + var items = this.getItems( elems ); + this.hide( items ); +}; + +/** + * get Outlayer.Item, given an Element + * @param {Element} elem + * @param {Function} callback + * @returns {Outlayer.Item} item + */ +proto.getItem = function( elem ) { + // loop through items to get the one that matches + for ( var i=0; i < this.items.length; i++ ) { + var item = this.items[i]; + if ( item.element == elem ) { + // return item + return item; + } + } +}; + +/** + * get collection of Outlayer.Items, given Elements + * @param {Array} elems + * @returns {Array} items - Outlayer.Items + */ +proto.getItems = function( elems ) { + elems = utils.makeArray( elems ); + var items = []; + elems.forEach( function( elem ) { + var item = this.getItem( elem ); + if ( item ) { + items.push( item ); + } + }, this ); + + return items; +}; + +/** + * remove element(s) from instance and DOM + * @param {Array or NodeList or Element} elems + */ +proto.remove = function( elems ) { + var removeItems = this.getItems( elems ); + + this._emitCompleteOnItems( 'remove', removeItems ); + + // bail if no items to remove + if ( !removeItems || !removeItems.length ) { + return; + } + + removeItems.forEach( function( item ) { + item.remove(); + // remove item from collection + utils.removeFrom( this.items, item ); + }, this ); +}; + +// ----- destroy ----- // + +// remove and disable Outlayer instance +proto.destroy = function() { + // clean up dynamic styles + var style = this.element.style; + style.height = ''; + style.position = ''; + style.width = ''; + // destroy items + this.items.forEach( function( item ) { + item.destroy(); + }); + + this.unbindResize(); + + var id = this.element.outlayerGUID; + delete instances[ id ]; // remove reference to instance by id + delete this.element.outlayerGUID; + // remove data for jQuery + if ( jQuery ) { + jQuery.removeData( this.element, this.constructor.namespace ); + } + +}; + +// -------------------------- data -------------------------- // + +/** + * get Outlayer instance from element + * @param {Element} elem + * @returns {Outlayer} + */ +Outlayer.data = function( elem ) { + elem = utils.getQueryElement( elem ); + var id = elem && elem.outlayerGUID; + return id && instances[ id ]; +}; + + +// -------------------------- create Outlayer class -------------------------- // + +/** + * create a layout class + * @param {String} namespace + */ +Outlayer.create = function( namespace, options ) { + // sub-class Outlayer + var Layout = subclass( Outlayer ); + // apply new options and compatOptions + Layout.defaults = utils.extend( {}, Outlayer.defaults ); + utils.extend( Layout.defaults, options ); + Layout.compatOptions = utils.extend( {}, Outlayer.compatOptions ); + + Layout.namespace = namespace; + + Layout.data = Outlayer.data; + + // sub-class Item + Layout.Item = subclass( Item ); + + // -------------------------- declarative -------------------------- // + + utils.htmlInit( Layout, namespace ); + + // -------------------------- jQuery bridge -------------------------- // + + // make into jQuery plugin + if ( jQuery && jQuery.bridget ) { + jQuery.bridget( namespace, Layout ); + } + + return Layout; +}; + +function subclass( Parent ) { + function SubClass() { + Parent.apply( this, arguments ); + } + + SubClass.prototype = Object.create( Parent.prototype ); + SubClass.prototype.constructor = SubClass; + + return SubClass; +} + +// ----- helpers ----- // + +// how many milliseconds are in each unit +var msUnits = { + ms: 1, + s: 1000 +}; + +// munge time-like parameter into millisecond number +// '0.4s' -> 40 +function getMilliseconds( time ) { + if ( typeof time == 'number' ) { + return time; + } + var matches = time.match( /(^\d*\.?\d*)(\w*)/ ); + var num = matches && matches[1]; + var unit = matches && matches[2]; + if ( !num.length ) { + return 0; + } + num = parseFloat( num ); + var mult = msUnits[ unit ] || 1; + return num * mult; +} + +// ----- fin ----- // + +// back in global +Outlayer.Item = Item; + +return Outlayer; + +})); + +/** + * Isotope Item +**/ + +( function( window, factory ) { + // universal module definition + /* jshint strict: false */ /*globals define, module, require */ + if ( typeof define == 'function' && define.amd ) { + // AMD + define( 'isotope-layout/js/item',[ + 'outlayer/outlayer' + ], + factory ); + } else if ( typeof module == 'object' && module.exports ) { + // CommonJS + module.exports = factory( + require('outlayer') + ); + } else { + // browser global + window.Isotope = window.Isotope || {}; + window.Isotope.Item = factory( + window.Outlayer + ); + } + +}( window, function factory( Outlayer ) { +'use strict'; + +// -------------------------- Item -------------------------- // + +// sub-class Outlayer Item +function Item() { + Outlayer.Item.apply( this, arguments ); +} + +var proto = Item.prototype = Object.create( Outlayer.Item.prototype ); + +var _create = proto._create; +proto._create = function() { + // assign id, used for original-order sorting + this.id = this.layout.itemGUID++; + _create.call( this ); + this.sortData = {}; +}; + +proto.updateSortData = function() { + if ( this.isIgnored ) { + return; + } + // default sorters + this.sortData.id = this.id; + // for backward compatibility + this.sortData['original-order'] = this.id; + this.sortData.random = Math.random(); + // go thru getSortData obj and apply the sorters + var getSortData = this.layout.options.getSortData; + var sorters = this.layout._sorters; + for ( var key in getSortData ) { + var sorter = sorters[ key ]; + this.sortData[ key ] = sorter( this.element, this ); + } +}; + +var _destroy = proto.destroy; +proto.destroy = function() { + // call super + _destroy.apply( this, arguments ); + // reset display, #741 + this.css({ + display: '' + }); +}; + +return Item; + +})); + +/** + * Isotope LayoutMode + */ + +( function( window, factory ) { + // universal module definition + /* jshint strict: false */ /*globals define, module, require */ + if ( typeof define == 'function' && define.amd ) { + // AMD + define( 'isotope-layout/js/layout-mode',[ + 'get-size/get-size', + 'outlayer/outlayer' + ], + factory ); + } else if ( typeof module == 'object' && module.exports ) { + // CommonJS + module.exports = factory( + require('get-size'), + require('outlayer') + ); + } else { + // browser global + window.Isotope = window.Isotope || {}; + window.Isotope.LayoutMode = factory( + window.getSize, + window.Outlayer + ); + } + +}( window, function factory( getSize, Outlayer ) { + 'use strict'; + + // layout mode class + function LayoutMode( isotope ) { + this.isotope = isotope; + // link properties + if ( isotope ) { + this.options = isotope.options[ this.namespace ]; + this.element = isotope.element; + this.items = isotope.filteredItems; + this.size = isotope.size; + } + } + + var proto = LayoutMode.prototype; + + /** + * some methods should just defer to default Outlayer method + * and reference the Isotope instance as `this` + **/ + var facadeMethods = [ + '_resetLayout', + '_getItemLayoutPosition', + '_manageStamp', + '_getContainerSize', + '_getElementOffset', + 'needsResizeLayout', + '_getOption' + ]; + + facadeMethods.forEach( function( methodName ) { + proto[ methodName ] = function() { + return Outlayer.prototype[ methodName ].apply( this.isotope, arguments ); + }; + }); + + // ----- ----- // + + // for horizontal layout modes, check vertical size + proto.needsVerticalResizeLayout = function() { + // don't trigger if size did not change + var size = getSize( this.isotope.element ); + // check that this.size and size are there + // IE8 triggers resize on body size change, so they might not be + var hasSizes = this.isotope.size && size; + return hasSizes && size.innerHeight != this.isotope.size.innerHeight; + }; + + // ----- measurements ----- // + + proto._getMeasurement = function() { + this.isotope._getMeasurement.apply( this, arguments ); + }; + + proto.getColumnWidth = function() { + this.getSegmentSize( 'column', 'Width' ); + }; + + proto.getRowHeight = function() { + this.getSegmentSize( 'row', 'Height' ); + }; + + /** + * get columnWidth or rowHeight + * segment: 'column' or 'row' + * size 'Width' or 'Height' + **/ + proto.getSegmentSize = function( segment, size ) { + var segmentName = segment + size; + var outerSize = 'outer' + size; + // columnWidth / outerWidth // rowHeight / outerHeight + this._getMeasurement( segmentName, outerSize ); + // got rowHeight or columnWidth, we can chill + if ( this[ segmentName ] ) { + return; + } + // fall back to item of first element + var firstItemSize = this.getFirstItemSize(); + this[ segmentName ] = firstItemSize && firstItemSize[ outerSize ] || + // or size of container + this.isotope.size[ 'inner' + size ]; + }; + + proto.getFirstItemSize = function() { + var firstItem = this.isotope.filteredItems[0]; + return firstItem && firstItem.element && getSize( firstItem.element ); + }; + + // ----- methods that should reference isotope ----- // + + proto.layout = function() { + this.isotope.layout.apply( this.isotope, arguments ); + }; + + proto.getSize = function() { + this.isotope.getSize(); + this.size = this.isotope.size; + }; + + // -------------------------- create -------------------------- // + + LayoutMode.modes = {}; + + LayoutMode.create = function( namespace, options ) { + + function Mode() { + LayoutMode.apply( this, arguments ); + } + + Mode.prototype = Object.create( proto ); + Mode.prototype.constructor = Mode; + + // default options + if ( options ) { + Mode.options = options; + } + + Mode.prototype.namespace = namespace; + // register in Isotope + LayoutMode.modes[ namespace ] = Mode; + + return Mode; + }; + + return LayoutMode; + +})); + +/*! + * Masonry v4.2.1 + * Cascading grid layout library + * https://masonry.desandro.com + * MIT License + * by David DeSandro + */ + +( function( window, factory ) { + // universal module definition + /* jshint strict: false */ /*globals define, module, require */ + if ( typeof define == 'function' && define.amd ) { + // AMD + define( 'masonry-layout/masonry',[ + 'outlayer/outlayer', + 'get-size/get-size' + ], + factory ); + } else if ( typeof module == 'object' && module.exports ) { + // CommonJS + module.exports = factory( + require('outlayer'), + require('get-size') + ); + } else { + // browser global + window.Masonry = factory( + window.Outlayer, + window.getSize + ); + } + +}( window, function factory( Outlayer, getSize ) { + + + +// -------------------------- masonryDefinition -------------------------- // + + // create an Outlayer layout class + var Masonry = Outlayer.create('masonry'); + // isFitWidth -> fitWidth + Masonry.compatOptions.fitWidth = 'isFitWidth'; + + var proto = Masonry.prototype; + + proto._resetLayout = function() { + this.getSize(); + this._getMeasurement( 'columnWidth', 'outerWidth' ); + this._getMeasurement( 'gutter', 'outerWidth' ); + this.measureColumns(); + + // reset column Y + this.colYs = []; + for ( var i=0; i < this.cols; i++ ) { + this.colYs.push( 0 ); + } + + this.maxY = 0; + this.horizontalColIndex = 0; + }; + + proto.measureColumns = function() { + this.getContainerWidth(); + // if columnWidth is 0, default to outerWidth of first item + if ( !this.columnWidth ) { + var firstItem = this.items[0]; + var firstItemElem = firstItem && firstItem.element; + // columnWidth fall back to item of first element + this.columnWidth = firstItemElem && getSize( firstItemElem ).outerWidth || + // if first elem has no width, default to size of container + this.containerWidth; + } + + var columnWidth = this.columnWidth += this.gutter; + + // calculate columns + var containerWidth = this.containerWidth + this.gutter; + var cols = containerWidth / columnWidth; + // fix rounding errors, typically with gutters + var excess = columnWidth - containerWidth % columnWidth; + // if overshoot is less than a pixel, round up, otherwise floor it + var mathMethod = excess && excess < 1 ? 'round' : 'floor'; + cols = Math[ mathMethod ]( cols ); + this.cols = Math.max( cols, 1 ); + }; + + proto.getContainerWidth = function() { + // container is parent if fit width + var isFitWidth = this._getOption('fitWidth'); + var container = isFitWidth ? this.element.parentNode : this.element; + // check that this.size and size are there + // IE8 triggers resize on body size change, so they might not be + var size = getSize( container ); + this.containerWidth = size && size.innerWidth; + }; + + proto._getItemLayoutPosition = function( item ) { + item.getSize(); + // how many columns does this brick span + var remainder = item.size.outerWidth % this.columnWidth; + var mathMethod = remainder && remainder < 1 ? 'round' : 'ceil'; + // round if off by 1 pixel, otherwise use ceil + var colSpan = Math[ mathMethod ]( item.size.outerWidth / this.columnWidth ); + colSpan = Math.min( colSpan, this.cols ); + // use horizontal or top column position + var colPosMethod = this.options.horizontalOrder ? + '_getHorizontalColPosition' : '_getTopColPosition'; + var colPosition = this[ colPosMethod ]( colSpan, item ); + // position the brick + var position = { + x: this.columnWidth * colPosition.col, + y: colPosition.y + }; + // apply setHeight to necessary columns + var setHeight = colPosition.y + item.size.outerHeight; + var setMax = colSpan + colPosition.col; + for ( var i = colPosition.col; i < setMax; i++ ) { + this.colYs[i] = setHeight; + } + + return position; + }; + + proto._getTopColPosition = function( colSpan ) { + var colGroup = this._getTopColGroup( colSpan ); + // get the minimum Y value from the columns + var minimumY = Math.min.apply( Math, colGroup ); + + return { + col: colGroup.indexOf( minimumY ), + y: minimumY, + }; + }; + + /** + * @param {Number} colSpan - number of columns the element spans + * @returns {Array} colGroup + */ + proto._getTopColGroup = function( colSpan ) { + if ( colSpan < 2 ) { + // if brick spans only one column, use all the column Ys + return this.colYs; + } + + var colGroup = []; + // how many different places could this brick fit horizontally + var groupCount = this.cols + 1 - colSpan; + // for each group potential horizontal position + for ( var i = 0; i < groupCount; i++ ) { + colGroup[i] = this._getColGroupY( i, colSpan ); + } + return colGroup; + }; + + proto._getColGroupY = function( col, colSpan ) { + if ( colSpan < 2 ) { + return this.colYs[ col ]; + } + // make an array of colY values for that one group + var groupColYs = this.colYs.slice( col, col + colSpan ); + // and get the max value of the array + return Math.max.apply( Math, groupColYs ); + }; + + // get column position based on horizontal index. #873 + proto._getHorizontalColPosition = function( colSpan, item ) { + var col = this.horizontalColIndex % this.cols; + var isOver = colSpan > 1 && col + colSpan > this.cols; + // shift to next row if item can't fit on current row + col = isOver ? 0 : col; + // don't let zero-size items take up space + var hasSize = item.size.outerWidth && item.size.outerHeight; + this.horizontalColIndex = hasSize ? col + colSpan : this.horizontalColIndex; + + return { + col: col, + y: this._getColGroupY( col, colSpan ), + }; + }; + + proto._manageStamp = function( stamp ) { + var stampSize = getSize( stamp ); + var offset = this._getElementOffset( stamp ); + // get the columns that this stamp affects + var isOriginLeft = this._getOption('originLeft'); + var firstX = isOriginLeft ? offset.left : offset.right; + var lastX = firstX + stampSize.outerWidth; + var firstCol = Math.floor( firstX / this.columnWidth ); + firstCol = Math.max( 0, firstCol ); + var lastCol = Math.floor( lastX / this.columnWidth ); + // lastCol should not go over if multiple of columnWidth #425 + lastCol -= lastX % this.columnWidth ? 0 : 1; + lastCol = Math.min( this.cols - 1, lastCol ); + // set colYs to bottom of the stamp + + var isOriginTop = this._getOption('originTop'); + var stampMaxY = ( isOriginTop ? offset.top : offset.bottom ) + + stampSize.outerHeight; + for ( var i = firstCol; i <= lastCol; i++ ) { + this.colYs[i] = Math.max( stampMaxY, this.colYs[i] ); + } + }; + + proto._getContainerSize = function() { + this.maxY = Math.max.apply( Math, this.colYs ); + var size = { + height: this.maxY + }; + + if ( this._getOption('fitWidth') ) { + size.width = this._getContainerFitWidth(); + } + + return size; + }; + + proto._getContainerFitWidth = function() { + var unusedCols = 0; + // count unused columns + var i = this.cols; + while ( --i ) { + if ( this.colYs[i] !== 0 ) { + break; + } + unusedCols++; + } + // fit container to columns that have been used + return ( this.cols - unusedCols ) * this.columnWidth - this.gutter; + }; + + proto.needsResizeLayout = function() { + var previousWidth = this.containerWidth; + this.getContainerWidth(); + return previousWidth != this.containerWidth; + }; + + return Masonry; + +})); + +/*! + * Masonry layout mode + * sub-classes Masonry + * https://masonry.desandro.com + */ + +( function( window, factory ) { + // universal module definition + /* jshint strict: false */ /*globals define, module, require */ + if ( typeof define == 'function' && define.amd ) { + // AMD + define( 'isotope-layout/js/layout-modes/masonry',[ + '../layout-mode', + 'masonry-layout/masonry' + ], + factory ); + } else if ( typeof module == 'object' && module.exports ) { + // CommonJS + module.exports = factory( + require('../layout-mode'), + require('masonry-layout') + ); + } else { + // browser global + factory( + window.Isotope.LayoutMode, + window.Masonry + ); + } + +}( window, function factory( LayoutMode, Masonry ) { +'use strict'; + +// -------------------------- masonryDefinition -------------------------- // + + // create an Outlayer layout class + var MasonryMode = LayoutMode.create('masonry'); + + var proto = MasonryMode.prototype; + + var keepModeMethods = { + _getElementOffset: true, + layout: true, + _getMeasurement: true + }; + + // inherit Masonry prototype + for ( var method in Masonry.prototype ) { + // do not inherit mode methods + if ( !keepModeMethods[ method ] ) { + proto[ method ] = Masonry.prototype[ method ]; + } + } + + var measureColumns = proto.measureColumns; + proto.measureColumns = function() { + // set items, used if measuring first item + this.items = this.isotope.filteredItems; + measureColumns.call( this ); + }; + + // point to mode options for fitWidth + var _getOption = proto._getOption; + proto._getOption = function( option ) { + if ( option == 'fitWidth' ) { + return this.options.isFitWidth !== undefined ? + this.options.isFitWidth : this.options.fitWidth; + } + return _getOption.apply( this.isotope, arguments ); + }; + + return MasonryMode; + +})); + +/** + * fitRows layout mode + */ + +( function( window, factory ) { + // universal module definition + /* jshint strict: false */ /*globals define, module, require */ + if ( typeof define == 'function' && define.amd ) { + // AMD + define( 'isotope-layout/js/layout-modes/fit-rows',[ + '../layout-mode' + ], + factory ); + } else if ( typeof exports == 'object' ) { + // CommonJS + module.exports = factory( + require('../layout-mode') + ); + } else { + // browser global + factory( + window.Isotope.LayoutMode + ); + } + +}( window, function factory( LayoutMode ) { +'use strict'; + +var FitRows = LayoutMode.create('fitRows'); + +var proto = FitRows.prototype; + +proto._resetLayout = function() { + this.x = 0; + this.y = 0; + this.maxY = 0; + this._getMeasurement( 'gutter', 'outerWidth' ); +}; + +proto._getItemLayoutPosition = function( item ) { + item.getSize(); + + var itemWidth = item.size.outerWidth + this.gutter; + // if this element cannot fit in the current row + var containerWidth = this.isotope.size.innerWidth + this.gutter; + if ( this.x !== 0 && itemWidth + this.x > containerWidth ) { + this.x = 0; + this.y = this.maxY; + } + + var position = { + x: this.x, + y: this.y + }; + + this.maxY = Math.max( this.maxY, this.y + item.size.outerHeight ); + this.x += itemWidth; + + return position; +}; + +proto._getContainerSize = function() { + return { height: this.maxY }; +}; + +return FitRows; + +})); + +/** + * vertical layout mode + */ + +( function( window, factory ) { + // universal module definition + /* jshint strict: false */ /*globals define, module, require */ + if ( typeof define == 'function' && define.amd ) { + // AMD + define( 'isotope-layout/js/layout-modes/vertical',[ + '../layout-mode' + ], + factory ); + } else if ( typeof module == 'object' && module.exports ) { + // CommonJS + module.exports = factory( + require('../layout-mode') + ); + } else { + // browser global + factory( + window.Isotope.LayoutMode + ); + } + +}( window, function factory( LayoutMode ) { +'use strict'; + +var Vertical = LayoutMode.create( 'vertical', { + horizontalAlignment: 0 +}); + +var proto = Vertical.prototype; + +proto._resetLayout = function() { + this.y = 0; +}; + +proto._getItemLayoutPosition = function( item ) { + item.getSize(); + var x = ( this.isotope.size.innerWidth - item.size.outerWidth ) * + this.options.horizontalAlignment; + var y = this.y; + this.y += item.size.outerHeight; + return { x: x, y: y }; +}; + +proto._getContainerSize = function() { + return { height: this.y }; +}; + +return Vertical; + +})); + +/*! + * Isotope v3.0.5 + * + * Licensed GPLv3 for open source use + * or Isotope Commercial License for commercial use + * + * https://isotope.metafizzy.co + * Copyright 2017 Metafizzy + */ + +( function( window, factory ) { + // universal module definition + /* jshint strict: false */ /*globals define, module, require */ + if ( typeof define == 'function' && define.amd ) { + // AMD + define( [ + 'outlayer/outlayer', + 'get-size/get-size', + 'desandro-matches-selector/matches-selector', + 'fizzy-ui-utils/utils', + 'isotope-layout/js/item', + 'isotope-layout/js/layout-mode', + // include default layout modes + 'isotope-layout/js/layout-modes/masonry', + 'isotope-layout/js/layout-modes/fit-rows', + 'isotope-layout/js/layout-modes/vertical' + ], + function( Outlayer, getSize, matchesSelector, utils, Item, LayoutMode ) { + return factory( window, Outlayer, getSize, matchesSelector, utils, Item, LayoutMode ); + }); + } else if ( typeof module == 'object' && module.exports ) { + // CommonJS + module.exports = factory( + window, + require('outlayer'), + require('get-size'), + require('desandro-matches-selector'), + require('fizzy-ui-utils'), + require('isotope-layout/js/item'), + require('isotope-layout/js/layout-mode'), + // include default layout modes + require('isotope-layout/js/layout-modes/masonry'), + require('isotope-layout/js/layout-modes/fit-rows'), + require('isotope-layout/js/layout-modes/vertical') + ); + } else { + // browser global + window.Isotope = factory( + window, + window.Outlayer, + window.getSize, + window.matchesSelector, + window.fizzyUIUtils, + window.Isotope.Item, + window.Isotope.LayoutMode + ); + } + +}( window, function factory( window, Outlayer, getSize, matchesSelector, utils, + Item, LayoutMode ) { + + + +// -------------------------- vars -------------------------- // + +var jQuery = window.jQuery; + +// -------------------------- helpers -------------------------- // + +var trim = String.prototype.trim ? + function( str ) { + return str.trim(); + } : + function( str ) { + return str.replace( /^\s+|\s+$/g, '' ); + }; + +// -------------------------- isotopeDefinition -------------------------- // + + // create an Outlayer layout class + var Isotope = Outlayer.create( 'isotope', { + layoutMode: 'masonry', + isJQueryFiltering: true, + sortAscending: true + }); + + Isotope.Item = Item; + Isotope.LayoutMode = LayoutMode; + + var proto = Isotope.prototype; + + proto._create = function() { + this.itemGUID = 0; + // functions that sort items + this._sorters = {}; + this._getSorters(); + // call super + Outlayer.prototype._create.call( this ); + + // create layout modes + this.modes = {}; + // start filteredItems with all items + this.filteredItems = this.items; + // keep of track of sortBys + this.sortHistory = [ 'original-order' ]; + // create from registered layout modes + for ( var name in LayoutMode.modes ) { + this._initLayoutMode( name ); + } + }; + + proto.reloadItems = function() { + // reset item ID counter + this.itemGUID = 0; + // call super + Outlayer.prototype.reloadItems.call( this ); + }; + + proto._itemize = function() { + var items = Outlayer.prototype._itemize.apply( this, arguments ); + // assign ID for original-order + for ( var i=0; i < items.length; i++ ) { + var item = items[i]; + item.id = this.itemGUID++; + } + this._updateItemsSortData( items ); + return items; + }; + + + // -------------------------- layout -------------------------- // + + proto._initLayoutMode = function( name ) { + var Mode = LayoutMode.modes[ name ]; + // set mode options + // HACK extend initial options, back-fill in default options + var initialOpts = this.options[ name ] || {}; + this.options[ name ] = Mode.options ? + utils.extend( Mode.options, initialOpts ) : initialOpts; + // init layout mode instance + this.modes[ name ] = new Mode( this ); + }; + + + proto.layout = function() { + // if first time doing layout, do all magic + if ( !this._isLayoutInited && this._getOption('initLayout') ) { + this.arrange(); + return; + } + this._layout(); + }; + + // private method to be used in layout() & magic() + proto._layout = function() { + // don't animate first layout + var isInstant = this._getIsInstant(); + // layout flow + this._resetLayout(); + this._manageStamps(); + this.layoutItems( this.filteredItems, isInstant ); + + // flag for initalized + this._isLayoutInited = true; + }; + + // filter + sort + layout + proto.arrange = function( opts ) { + // set any options pass + this.option( opts ); + this._getIsInstant(); + // filter, sort, and layout + + // filter + var filtered = this._filter( this.items ); + this.filteredItems = filtered.matches; + + this._bindArrangeComplete(); + + if ( this._isInstant ) { + this._noTransition( this._hideReveal, [ filtered ] ); + } else { + this._hideReveal( filtered ); + } + + this._sort(); + this._layout(); + }; + // alias to _init for main plugin method + proto._init = proto.arrange; + + proto._hideReveal = function( filtered ) { + this.reveal( filtered.needReveal ); + this.hide( filtered.needHide ); + }; + + // HACK + // Don't animate/transition first layout + // Or don't animate/transition other layouts + proto._getIsInstant = function() { + var isLayoutInstant = this._getOption('layoutInstant'); + var isInstant = isLayoutInstant !== undefined ? isLayoutInstant : + !this._isLayoutInited; + this._isInstant = isInstant; + return isInstant; + }; + + // listen for layoutComplete, hideComplete and revealComplete + // to trigger arrangeComplete + proto._bindArrangeComplete = function() { + // listen for 3 events to trigger arrangeComplete + var isLayoutComplete, isHideComplete, isRevealComplete; + var _this = this; + function arrangeParallelCallback() { + if ( isLayoutComplete && isHideComplete && isRevealComplete ) { + _this.dispatchEvent( 'arrangeComplete', null, [ _this.filteredItems ] ); + } + } + this.once( 'layoutComplete', function() { + isLayoutComplete = true; + arrangeParallelCallback(); + }); + this.once( 'hideComplete', function() { + isHideComplete = true; + arrangeParallelCallback(); + }); + this.once( 'revealComplete', function() { + isRevealComplete = true; + arrangeParallelCallback(); + }); + }; + + // -------------------------- filter -------------------------- // + + proto._filter = function( items ) { + var filter = this.options.filter; + filter = filter || '*'; + var matches = []; + var hiddenMatched = []; + var visibleUnmatched = []; + + var test = this._getFilterTest( filter ); + + // test each item + for ( var i=0; i < items.length; i++ ) { + var item = items[i]; + if ( item.isIgnored ) { + continue; + } + // add item to either matched or unmatched group + var isMatched = test( item ); + // item.isFilterMatched = isMatched; + // add to matches if its a match + if ( isMatched ) { + matches.push( item ); + } + // add to additional group if item needs to be hidden or revealed + if ( isMatched && item.isHidden ) { + hiddenMatched.push( item ); + } else if ( !isMatched && !item.isHidden ) { + visibleUnmatched.push( item ); + } + } + + // return collections of items to be manipulated + return { + matches: matches, + needReveal: hiddenMatched, + needHide: visibleUnmatched + }; + }; + + // get a jQuery, function, or a matchesSelector test given the filter + proto._getFilterTest = function( filter ) { + if ( jQuery && this.options.isJQueryFiltering ) { + // use jQuery + return function( item ) { + return jQuery( item.element ).is( filter ); + }; + } + if ( typeof filter == 'function' ) { + // use filter as function + return function( item ) { + return filter( item.element ); + }; + } + // default, use filter as selector string + return function( item ) { + return matchesSelector( item.element, filter ); + }; + }; + + // -------------------------- sorting -------------------------- // + + /** + * @params {Array} elems + * @public + */ + proto.updateSortData = function( elems ) { + // get items + var items; + if ( elems ) { + elems = utils.makeArray( elems ); + items = this.getItems( elems ); + } else { + // update all items if no elems provided + items = this.items; + } + + this._getSorters(); + this._updateItemsSortData( items ); + }; + + proto._getSorters = function() { + var getSortData = this.options.getSortData; + for ( var key in getSortData ) { + var sorter = getSortData[ key ]; + this._sorters[ key ] = mungeSorter( sorter ); + } + }; + + /** + * @params {Array} items - of Isotope.Items + * @private + */ + proto._updateItemsSortData = function( items ) { + // do not update if no items + var len = items && items.length; + + for ( var i=0; len && i < len; i++ ) { + var item = items[i]; + item.updateSortData(); + } + }; + + // ----- munge sorter ----- // + + // encapsulate this, as we just need mungeSorter + // other functions in here are just for munging + var mungeSorter = ( function() { + // add a magic layer to sorters for convienent shorthands + // `.foo-bar` will use the text of .foo-bar querySelector + // `[foo-bar]` will use attribute + // you can also add parser + // `.foo-bar parseInt` will parse that as a number + function mungeSorter( sorter ) { + // if not a string, return function or whatever it is + if ( typeof sorter != 'string' ) { + return sorter; + } + // parse the sorter string + var args = trim( sorter ).split(' '); + var query = args[0]; + // check if query looks like [an-attribute] + var attrMatch = query.match( /^\[(.+)\]$/ ); + var attr = attrMatch && attrMatch[1]; + var getValue = getValueGetter( attr, query ); + // use second argument as a parser + var parser = Isotope.sortDataParsers[ args[1] ]; + // parse the value, if there was a parser + sorter = parser ? function( elem ) { + return elem && parser( getValue( elem ) ); + } : + // otherwise just return value + function( elem ) { + return elem && getValue( elem ); + }; + + return sorter; + } + + // get an attribute getter, or get text of the querySelector + function getValueGetter( attr, query ) { + // if query looks like [foo-bar], get attribute + if ( attr ) { + return function getAttribute( elem ) { + return elem.getAttribute( attr ); + }; + } + + // otherwise, assume its a querySelector, and get its text + return function getChildText( elem ) { + var child = elem.querySelector( query ); + return child && child.textContent; + }; + } + + return mungeSorter; + })(); + + // parsers used in getSortData shortcut strings + Isotope.sortDataParsers = { + 'parseInt': function( val ) { + return parseInt( val, 10 ); + }, + 'parseFloat': function( val ) { + return parseFloat( val ); + } + }; + + // ----- sort method ----- // + + // sort filteredItem order + proto._sort = function() { + if ( !this.options.sortBy ) { + return; + } + // keep track of sortBy History + var sortBys = utils.makeArray( this.options.sortBy ); + if ( !this._getIsSameSortBy( sortBys ) ) { + // concat all sortBy and sortHistory, add to front, oldest goes in last + this.sortHistory = sortBys.concat( this.sortHistory ); + } + // sort magic + var itemSorter = getItemSorter( this.sortHistory, this.options.sortAscending ); + this.filteredItems.sort( itemSorter ); + }; + + // check if sortBys is same as start of sortHistory + proto._getIsSameSortBy = function( sortBys ) { + for ( var i=0; i < sortBys.length; i++ ) { + if ( sortBys[i] != this.sortHistory[i] ) { + return false; + } + } + return true; + }; + + // returns a function used for sorting + function getItemSorter( sortBys, sortAsc ) { + return function sorter( itemA, itemB ) { + // cycle through all sortKeys + for ( var i = 0; i < sortBys.length; i++ ) { + var sortBy = sortBys[i]; + var a = itemA.sortData[ sortBy ]; + var b = itemB.sortData[ sortBy ]; + if ( a > b || a < b ) { + // if sortAsc is an object, use the value given the sortBy key + var isAscending = sortAsc[ sortBy ] !== undefined ? sortAsc[ sortBy ] : sortAsc; + var direction = isAscending ? 1 : -1; + return ( a > b ? 1 : -1 ) * direction; + } + } + return 0; + }; + } + + // -------------------------- methods -------------------------- // + + // get layout mode + proto._mode = function() { + var layoutMode = this.options.layoutMode; + var mode = this.modes[ layoutMode ]; + if ( !mode ) { + // TODO console.error + throw new Error( 'No layout mode: ' + layoutMode ); + } + // HACK sync mode's options + // any options set after init for layout mode need to be synced + mode.options = this.options[ layoutMode ]; + return mode; + }; + + proto._resetLayout = function() { + // trigger original reset layout + Outlayer.prototype._resetLayout.call( this ); + this._mode()._resetLayout(); + }; + + proto._getItemLayoutPosition = function( item ) { + return this._mode()._getItemLayoutPosition( item ); + }; + + proto._manageStamp = function( stamp ) { + this._mode()._manageStamp( stamp ); + }; + + proto._getContainerSize = function() { + return this._mode()._getContainerSize(); + }; + + proto.needsResizeLayout = function() { + return this._mode().needsResizeLayout(); + }; + + // -------------------------- adding & removing -------------------------- // + + // HEADS UP overwrites default Outlayer appended + proto.appended = function( elems ) { + var items = this.addItems( elems ); + if ( !items.length ) { + return; + } + // filter, layout, reveal new items + var filteredItems = this._filterRevealAdded( items ); + // add to filteredItems + this.filteredItems = this.filteredItems.concat( filteredItems ); + }; + + // HEADS UP overwrites default Outlayer prepended + proto.prepended = function( elems ) { + var items = this._itemize( elems ); + if ( !items.length ) { + return; + } + // start new layout + this._resetLayout(); + this._manageStamps(); + // filter, layout, reveal new items + var filteredItems = this._filterRevealAdded( items ); + // layout previous items + this.layoutItems( this.filteredItems ); + // add to items and filteredItems + this.filteredItems = filteredItems.concat( this.filteredItems ); + this.items = items.concat( this.items ); + }; + + proto._filterRevealAdded = function( items ) { + var filtered = this._filter( items ); + this.hide( filtered.needHide ); + // reveal all new items + this.reveal( filtered.matches ); + // layout new items, no transition + this.layoutItems( filtered.matches, true ); + return filtered.matches; + }; + + /** + * Filter, sort, and layout newly-appended item elements + * @param {Array or NodeList or Element} elems + */ + proto.insert = function( elems ) { + var items = this.addItems( elems ); + if ( !items.length ) { + return; + } + // append item elements + var i, item; + var len = items.length; + for ( i=0; i < len; i++ ) { + item = items[i]; + this.element.appendChild( item.element ); + } + // filter new stuff + var filteredInsertItems = this._filter( items ).matches; + // set flag + for ( i=0; i < len; i++ ) { + items[i].isLayoutInstant = true; + } + this.arrange(); + // reset flag + for ( i=0; i < len; i++ ) { + delete items[i].isLayoutInstant; + } + this.reveal( filteredInsertItems ); + }; + + var _remove = proto.remove; + proto.remove = function( elems ) { + elems = utils.makeArray( elems ); + var removeItems = this.getItems( elems ); + // do regular thing + _remove.call( this, elems ); + // bail if no items to remove + var len = removeItems && removeItems.length; + // remove elems from filteredItems + for ( var i=0; len && i < len; i++ ) { + var item = removeItems[i]; + // remove item from collection + utils.removeFrom( this.filteredItems, item ); + } + }; + + proto.shuffle = function() { + // update random sortData + for ( var i=0; i < this.items.length; i++ ) { + var item = this.items[i]; + item.sortData.random = Math.random(); + } + this.options.sortBy = 'random'; + this._sort(); + this._layout(); + }; + + /** + * trigger fn without transition + * kind of hacky to have this in the first place + * @param {Function} fn + * @param {Array} args + * @returns ret + * @private + */ + proto._noTransition = function( fn, args ) { + // save transitionDuration before disabling + var transitionDuration = this.options.transitionDuration; + // disable transition + this.options.transitionDuration = 0; + // do it + var returnValue = fn.apply( this, args ); + // re-enable transition for reveal + this.options.transitionDuration = transitionDuration; + return returnValue; + }; + + // ----- helper methods ----- // + + /** + * getter method for getting filtered item elements + * @returns {Array} elems - collection of item elements + */ + proto.getFilteredItemElements = function() { + return this.filteredItems.map( function( item ) { + return item.element; + }); + }; + + // ----- ----- // + + return Isotope; + +})); + diff --git a/su-do-coders/core/home/static/lib/isotope/isotope.pkgd.min.js b/su-do-coders/core/home/static/lib/isotope/isotope.pkgd.min.js new file mode 100644 index 0000000..f6361b9 --- /dev/null +++ b/su-do-coders/core/home/static/lib/isotope/isotope.pkgd.min.js @@ -0,0 +1,12 @@ +/*! + * Isotope PACKAGED v3.0.5 + * + * Licensed GPLv3 for open source use + * or Isotope Commercial License for commercial use + * + * https://isotope.metafizzy.co + * Copyright 2017 Metafizzy + */ + +!function(t,e){"function"==typeof define&&define.amd?define("jquery-bridget/jquery-bridget",["jquery"],function(i){return e(t,i)}):"object"==typeof module&&module.exports?module.exports=e(t,require("jquery")):t.jQueryBridget=e(t,t.jQuery)}(window,function(t,e){"use strict";function i(i,s,a){function u(t,e,o){var n,s="$()."+i+'("'+e+'")';return t.each(function(t,u){var h=a.data(u,i);if(!h)return void r(i+" not initialized. Cannot call methods, i.e. "+s);var d=h[e];if(!d||"_"==e.charAt(0))return void r(s+" is not a valid method");var l=d.apply(h,o);n=void 0===n?l:n}),void 0!==n?n:t}function h(t,e){t.each(function(t,o){var n=a.data(o,i);n?(n.option(e),n._init()):(n=new s(o,e),a.data(o,i,n))})}a=a||e||t.jQuery,a&&(s.prototype.option||(s.prototype.option=function(t){a.isPlainObject(t)&&(this.options=a.extend(!0,this.options,t))}),a.fn[i]=function(t){if("string"==typeof t){var e=n.call(arguments,1);return u(this,t,e)}return h(this,t),this},o(a))}function o(t){!t||t&&t.bridget||(t.bridget=i)}var n=Array.prototype.slice,s=t.console,r="undefined"==typeof s?function(){}:function(t){s.error(t)};return o(e||t.jQuery),i}),function(t,e){"function"==typeof define&&define.amd?define("ev-emitter/ev-emitter",e):"object"==typeof module&&module.exports?module.exports=e():t.EvEmitter=e()}("undefined"!=typeof window?window:this,function(){function t(){}var e=t.prototype;return e.on=function(t,e){if(t&&e){var i=this._events=this._events||{},o=i[t]=i[t]||[];return o.indexOf(e)==-1&&o.push(e),this}},e.once=function(t,e){if(t&&e){this.on(t,e);var i=this._onceEvents=this._onceEvents||{},o=i[t]=i[t]||{};return o[e]=!0,this}},e.off=function(t,e){var i=this._events&&this._events[t];if(i&&i.length){var o=i.indexOf(e);return o!=-1&&i.splice(o,1),this}},e.emitEvent=function(t,e){var i=this._events&&this._events[t];if(i&&i.length){i=i.slice(0),e=e||[];for(var o=this._onceEvents&&this._onceEvents[t],n=0;n