diff --git a/.DS_Store b/.DS_Store index dc718ec..67bcaa0 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/ras/.DS_Store b/ras/.DS_Store index c74d528..69e0236 100644 Binary files a/ras/.DS_Store and b/ras/.DS_Store differ diff --git a/ras/api/modules/auth.py b/ras/api/modules/auth.py new file mode 100644 index 0000000..33abf85 --- /dev/null +++ b/ras/api/modules/auth.py @@ -0,0 +1,32 @@ +from rest_framework.decorators import api_view +from django.contrib.auth import get_user_model +from django.http import JsonResponse +import jwt + +@api_view(['POST']) +def login(request): + username = request.POST.get('username') + password = request.POST.get('password') + + User = get_user_model() + + try: + user = User.objects.get(username=username) + + if user.check_password(password): + payload = { + 'id': user.id, + 'name': user.first_name + ' ' + user.last_name, + 'username': user.username, + 'email': user.email + } + token = jwt.encode(payload, 'secret', algorithm='HS256') + + return JsonResponse({ + "user": payload, + "token": token + }) + else: + return JsonResponse({'error': 'Wrong credentials'}) + except User.DoesNotExist: + return JsonResponse({'error': 'User does not exist'}) \ No newline at end of file diff --git a/ras/api/modules/crud.py b/ras/api/modules/crud.py new file mode 100644 index 0000000..518b914 --- /dev/null +++ b/ras/api/modules/crud.py @@ -0,0 +1,113 @@ +import jwt, json +from django.contrib.auth import get_user_model +from rest_framework.decorators import api_view +import ras.settings +from sqlalchemy import create_engine +from sqlalchemy.sql import text +from django.http import JsonResponse +import pandas as pd +from rest_framework.response import Response + +def getBooksData(): + engine = create_engine('mysql+mysqldb://' + ras.settings.DATABASES['default']['USER'] + ':' + ras.settings.DATABASES['default']['PASSWORD'] + '@' + ras.settings.DATABASES['default']['HOST'] + ':3306/' + ras.settings.DATABASES['default']['NAME']) + df = pd.read_sql('SELECT * FROM api_books ORDER BY readed', engine, parse_dates={'readed': {'format': '%m-%Y'}}) + + return df + +@api_view(['GET']) +def getAllBooks(request): + + data = [] + books = getBooksData() + + for index, row in books.iterrows(): + data.append({ + "id": row['id'], + "name": row['name'], + "author": row['author'], + "genre": row['genre'], + "author": row['author'], + "country": row['country'], + "country_code": row['country_code'], + "pages": row['pages'], + "readed": row['readed'], + "rating": row['rating'], + }) + + return Response(data) + +@api_view(['POST']) +def addBook(request): + if(request.headers.get('Authorization')): + token = request.headers.get('Authorization').split(' ')[1] + book = request.POST.get('book') + book = json.loads(book) + + try: + User = get_user_model() + payload = jwt.decode(token, 'secret', algorithms=['HS256']) + user = User.objects.get(id=payload['id']) + + if(user): + engine = create_engine('mysql+mysqldb://' + ras.settings.DATABASES['default']['USER'] + ':' + ras.settings.DATABASES['default']['PASSWORD'] + '@' + ras.settings.DATABASES['default']['HOST'] + ':3306/' + ras.settings.DATABASES['default']['NAME']) + conn = engine.connect() + conn.execute(text("INSERT INTO api_books (name, author, genre, country, country_code, pages, readed, rating) VALUES ('" + str(book['name']) + "', '" + str(book['author']) + "', '" + str(book['genre']) + "', '" + str(book['country']) + "', '" + str(book['country_code']) + "', " + str(book['pages']) + ", '" + str(book['readed']) + "', " + str(book['rating']) + ")")) + return JsonResponse("OK", safe=False) + else: + return JsonResponse({'error': 'No user detected'}, safe=False) + + except (jwt.DecodeError, User.DoesNotExist): + return JsonResponse({'error': 'Token invalid'}, safe=False) + else: + return JsonResponse({'error': 'testing'}, safe=False) + +@api_view(['PUT']) +def updateBook(request): + if(request.headers.get('Authorization')): + token = request.headers.get('Authorization').split(' ')[1] + book = request.POST.get('book') + book = json.loads(book) + bookid = request.headers.get('bookid') + + try: + User = get_user_model() + payload = jwt.decode(token, 'secret', algorithms=['HS256']) + user = User.objects.get(id=payload['id']) + + if(user): + engine = create_engine('mysql+mysqldb://' + ras.settings.DATABASES['default']['USER'] + ':' + ras.settings.DATABASES['default']['PASSWORD'] + '@' + ras.settings.DATABASES['default']['HOST'] + ':3306/' + ras.settings.DATABASES['default']['NAME']) + conn = engine.connect() + conn.execute(text("UPDATE api_books set name='" + str(book['name']) + "', author='" + str(book['author']) + "', genre='" + str(book['genre']) + "', country='" + str(book['country']) + "', country_code='" + str(book['country_code']) + "', pages='" + str(book['pages']) + "', readed='" + str(book['readed']) + "', rating='" + str(book['rating']) + "' WHERE id=" + str(bookid))) + + return JsonResponse("OK", safe=False) + else: + return JsonResponse({'error': 'No user detected'}, safe=False) + + except (jwt.DecodeError, User.DoesNotExist): + return JsonResponse({'error': 'Token invalid'}, safe=False) + else: + return JsonResponse({'error': 'No Token'}, safe=False) + +@api_view(['DELETE']) +def deleteBook(request): + if(request.headers.get('Authorization')): + token = request.headers.get('Authorization').split(' ')[1] + bookid = request.headers.get('bookid') + + try: + User = get_user_model() + payload = jwt.decode(token, 'secret', algorithms=['HS256']) + user = User.objects.get(id=payload['id']) + + if(user): + engine = create_engine('mysql+mysqldb://' + ras.settings.DATABASES['default']['USER'] + ':' + ras.settings.DATABASES['default']['PASSWORD'] + '@' + ras.settings.DATABASES['default']['HOST'] + ':3306/' + ras.settings.DATABASES['default']['NAME']) + conn = engine.connect() + conn.execute(text("DELETE FROM api_books WHERE id = " + str(bookid))) + return JsonResponse("OK", safe=False) + else: + return JsonResponse({'error': 'No user detected'}, safe=False) + + except (jwt.DecodeError, User.DoesNotExist): + return JsonResponse({'error': 'Token invalid'}, safe=False) + else: + return JsonResponse({'error': 'No Token'}, safe=False) \ No newline at end of file diff --git a/ras/api/modules/pandas.py b/ras/api/modules/pandas.py new file mode 100644 index 0000000..75376b6 --- /dev/null +++ b/ras/api/modules/pandas.py @@ -0,0 +1,191 @@ +from rest_framework.decorators import api_view +from sqlalchemy import create_engine +import ras.settings +import pandas as pd +from rest_framework.response import Response + +def getBooksData(): + engine = create_engine('mysql+mysqldb://' + ras.settings.DATABASES['default']['USER'] + ':' + ras.settings.DATABASES['default']['PASSWORD'] + '@' + ras.settings.DATABASES['default']['HOST'] + ':3306/' + ras.settings.DATABASES['default']['NAME']) + df = pd.read_sql('SELECT * FROM api_books ORDER BY readed', engine, parse_dates={'readed': {'format': '%m-%Y'}}) + + return df + +def filterData(df, datayear = None): + df['readed'] = pd.to_datetime(df['readed'], format='%Y-%m-%d') + df['readed'] = df['readed'].dt.strftime('%m-%Y') + + # Filter data on year + if datayear and datayear is not None: + df = df.where(df['readed'].str.contains(datayear)) + + return df + +@api_view(['GET']) +def getYears(request): + df = filterData(getBooksData()) + + df['readed'] = pd.to_datetime(df['readed'], errors='coerce') + df['year']= df['readed'].dt.year + + years = df.groupby('year')['year'].count().reset_index(name="count") + + return Response(years['year']) + +@api_view(['GET']) +def getBooksByYear(request): + if request.META.get('HTTP_YEAR'): + data = [] + df = getBooksData() + df['readed'] = pd.to_datetime(df['readed'], format='%Y-%m-%d') + df['readed'] = df['readed'].dt.strftime('%Y-%m-%d') + df = df.where(df['readed'].str.contains(request.META.get('HTTP_YEAR'))) + df = df.fillna('') + + for index, row in df.iterrows(): + if row['id'] and row['id'] != '': + data.append({ + "id": row['id'], + "name": row['name'], + "author": row['author'], + "genre": row['genre'], + "author": row['author'], + "country": row['country'], + "country_code": row['country_code'], + "pages": row['pages'], + "readed": row['readed'], + "rating": row['rating'], + }) + + return Response(data) + +@api_view(['GET']) +def books_per_genre_per_month(request): + if request.META.get('HTTP_YEAR'): + + data = [] + df = filterData(getBooksData(), request.META.get('HTTP_YEAR')) + + # Filter array on genre and date + booksPerMonth = df.groupby(['genre','readed'])['genre'].count().reset_index(name="count") + booksPerMonth = booksPerMonth.sort_values(by=['genre', 'readed', 'count'], ascending=False) + + for index, row in booksPerMonth.iterrows(): + data.append({ + "genre": row['genre'], + "readed": row['readed'], + "count": row['count'] + }) + + return Response(data) + else: + return Response("No year header included") + +@api_view(['GET']) +def countGenres(request): + if request.META.get('HTTP_YEAR'): + + data = [] + df = filterData(getBooksData(), request.META.get('HTTP_YEAR')) + + genres = df.groupby('genre')['genre'].count().reset_index(name="count") + genres = genres.sort_values(by='count', ascending=False) + + for index, row in genres.iterrows(): + + data.append({ + "genre": row['genre'], + "count": int(row['count']) + }) + + return Response(data) + else: + return Response("No year header included") + +@api_view(['GET']) +def getStats(request): + if request.META.get('HTTP_YEAR'): + data = [] + df = filterData(getBooksData(), request.META.get('HTTP_YEAR')) + df = df.dropna() + + statsTotalBooks = df['name'].count() + statsTotalGenres = df['genre'].nunique() + + + data.append({ + 'totalbooks': statsTotalBooks, + 'totalgenres': statsTotalGenres + }) + + + return Response(data[0]) + else: + return Response("No year header included") + +@api_view(['GET']) +def books_per_country(request): + if request.META.get('HTTP_YEAR'): + data = [] + df = filterData(getBooksData(), request.META.get('HTTP_YEAR')) + + countries = df.groupby(['country_code', 'country'])['country'].count().reset_index(name="count") + countries = countries.sort_values(by='count', ascending=False) + + for index, row in countries.iterrows(): + + data.append({ + "code": row['country_code'], + "country": row['country'], + "count": int(row['count']) + }) + + return Response(data) + else: + return Response("No year header included") + +@api_view(['GET']) +def avg_ratings_per_month(request): + datayear = request.META.get('HTTP_YEAR') + + if datayear: + data = [] + + # Get CSV file with book data + df = filterData(getBooksData(), request.META.get('HTTP_YEAR')) + + avgratingspermonth = df.groupby('readed')['rating'].mean().reset_index(name="rating") + + for index, row in avgratingspermonth.iterrows(): + + data.append({ + "date": row['readed'], + "rating": int(row['rating']) + }) + + return Response(data) + else: + return Response("No year header included") + +@api_view(['GET']) +def countRatings(request): + datayear = request.META.get('HTTP_YEAR') + + if datayear: + data = [] + + # Get CSV file with book data + df = filterData(getBooksData(), request.META.get('HTTP_YEAR')) + + countratings = df.groupby('rating')['rating'].count().reset_index(name="count") + countratings = countratings.sort_values(by='rating', ascending=False) + + for index, row in countratings.iterrows(): + + data.append({ + "rating": int(row['rating']), + "count": int(row['count']) + }) + + return Response(data) + else: + return Response("No year header included") \ No newline at end of file diff --git a/ras/api/urls.py b/ras/api/urls.py index 540aff4..ca14b22 100644 --- a/ras/api/urls.py +++ b/ras/api/urls.py @@ -1,33 +1,22 @@ from django.urls import path, include from django.views.decorators.csrf import csrf_exempt from .views import * -from .login import * +from .modules.auth import * +from .modules.crud import * +from .modules.pandas import * urlpatterns = [ path('books/all', getAllBooks), path('books', getBooksByYear), - path('books/challenge', getChallengeOfYear), - path('books/challenges', getAllChallenges), - path('books/challenges/insert', addChallenge), - path('books/challenges//delete', deleteChallenge), path('books/years', getYears), path('books/stats', getStats), - path('books/predict', predictAmountBooks), - path('books/insert', addBook), path('books/delete', deleteBook), path('books/update', updateBook), - - path('books/pages/stats', getStatsPages), - path('books/pages', pages_per_month), - path('books/genres', books_per_genre_per_month), path('books/genres/count', countGenres), path('books/ratings', avg_ratings_per_month), path('books/ratings/count', countRatings), - path('books/authors', books_per_author), path('books/countries', books_per_country), - path('auth/login', csrf_exempt(login)), - ] \ No newline at end of file diff --git a/ras/api/views.py b/ras/api/views.py index 3e9fae1..eeea395 100644 --- a/ras/api/views.py +++ b/ras/api/views.py @@ -40,177 +40,6 @@ def filterData(df, datayear = None): return df -@api_view(['GET']) -def getAllBooks(request): - - data = [] - books = getBooksData() - - for index, row in books.iterrows(): - data.append({ - "id": row['id'], - "name": row['name'], - "author": row['author'], - "genre": row['genre'], - "author": row['author'], - "country": row['country'], - "country_code": row['country_code'], - "pages": row['pages'], - "readed": row['readed'], - "rating": row['rating'], - }) - - return Response(data) - -@api_view(['GET']) -def getBooksByYear(request): - if request.META.get('HTTP_YEAR'): - data = [] - df = getBooksData() - df['readed'] = pd.to_datetime(df['readed'], format='%Y-%m-%d') - df['readed'] = df['readed'].dt.strftime('%Y-%m-%d') - df = df.where(df['readed'].str.contains(request.META.get('HTTP_YEAR'))) - df = df.fillna('') - - for index, row in df.iterrows(): - if row['id'] and row['id'] != '': - data.append({ - "id": row['id'], - "name": row['name'], - "author": row['author'], - "genre": row['genre'], - "author": row['author'], - "country": row['country'], - "country_code": row['country_code'], - "pages": row['pages'], - "readed": row['readed'], - "rating": row['rating'], - }) - - return Response(data) - - -@api_view(['GET']) -def getAllChallenges(request): - data = [] - df = getBookChallenge() - - for index, row in df.iterrows(): - - books = filterData(getBooksData(), str(row['year'])) - books = books.dropna() - - totalBooksRead = books['name'].count() - - data.append({ - "id": row['id'], - "year": row['year'], - "nrofbooks": row['nrofbooks'], - "booksread": totalBooksRead - }) - - return Response(data) - -@api_view(['GET']) -def getChallengeOfYear(request): - if request.META.get('HTTP_YEAR'): - data = [] - df = getBookChallenge(request.META.get('HTTP_YEAR')) - - for index, row in df.iterrows(): - data.append({ - "year": row['year'], - "nrofbooks": row['nrofbooks'] - }) - - return Response(data) - else: - return Response("No year header included") - -@api_view(['GET']) -def books_per_genre_per_month(request): - if request.META.get('HTTP_YEAR'): - - data = [] - df = filterData(getBooksData(), request.META.get('HTTP_YEAR')) - - # Filter array on genre and date - booksPerMonth = df.groupby(['genre','readed'])['genre'].count().reset_index(name="count") - booksPerMonth = booksPerMonth.sort_values(by=['genre', 'readed', 'count'], ascending=False) - - for index, row in booksPerMonth.iterrows(): - data.append({ - "genre": row['genre'], - "readed": row['readed'], - "count": row['count'] - }) - - return Response(data) - else: - return Response("No year header included") - -@api_view(['GET']) -def countGenres(request): - if request.META.get('HTTP_YEAR'): - - data = [] - df = filterData(getBooksData(), request.META.get('HTTP_YEAR')) - - genres = df.groupby('genre')['genre'].count().reset_index(name="count") - genres = genres.sort_values(by='count', ascending=False) - - for index, row in genres.iterrows(): - - data.append({ - "genre": row['genre'], - "count": int(row['count']) - }) - - return Response(data) - else: - return Response("No year header included") - -@api_view(['GET']) -def books_per_country(request): - if request.META.get('HTTP_YEAR'): - data = [] - df = filterData(getBooksData(), request.META.get('HTTP_YEAR')) - - countries = df.groupby(['country_code', 'country'])['country'].count().reset_index(name="count") - countries = countries.sort_values(by='count', ascending=False) - - for index, row in countries.iterrows(): - - data.append({ - "code": row['country_code'], - "country": row['country'], - "count": int(row['count']) - }) - - return Response(data) - else: - return Response("No year header included") - -@api_view(['GET']) -def books_per_author(request): - if request.META.get('HTTP_YEAR'): - data = [] - df = filterData(getBooksData(), request.META.get('HTTP_YEAR')) - - countries = df.groupby(['author'])['author'].count().reset_index(name="count") - countries = countries.sort_values(by='count', ascending=False) - - for index, row in countries.iterrows(): - - data.append({ - "author": row['author'], - "count": int(row['count']) - }) - - return Response(data) - else: - return Response("No year header included") - @api_view(['GET']) def getStats(request): if request.META.get('HTTP_YEAR'): @@ -219,17 +48,11 @@ def getStats(request): df = df.dropna() statsTotalBooks = df['name'].count() - statsTotalPages = df['pages'].astype(int).sum() - statsTotalWriters = df['author'].nunique() - statsTotalCountries = df['country'].nunique() statsTotalGenres = df['genre'].nunique() data.append({ 'totalbooks': statsTotalBooks, - 'totalpages': statsTotalPages, - 'totalauthors': statsTotalWriters, - 'totalcountries': statsTotalCountries, 'totalgenres': statsTotalGenres }) @@ -238,74 +61,6 @@ def getStats(request): else: return Response("No year header included") -@api_view(['GET']) -def getStatsPages(request): - data = [] - df = filterData(getBooksData(), request.META.get('HTTP_YEAR')) - df = df.dropna() - - df['pages'] = df['pages'].astype(int) - - pages = df.groupby(['pages', 'name', 'author', 'rating'])['pages'].count().reset_index(name="count") - pages = pages.sort_values(by='pages', ascending=True) - - shortestbook = pages.iloc[0] - longestbook = pages.iloc[-1] - avgPages = df["pages"].mean().astype(int) - - shortestbook = { - "name": shortestbook["name"], - "author": shortestbook['author'], - "pages": shortestbook['pages'], - "rating": shortestbook['rating'].astype(int) - } - - longestbook = { - "name": longestbook["name"], - "author": longestbook['author'], - "pages": longestbook['pages'], - "rating": longestbook['rating'].astype(int) - } - - data = { - "longestbook": longestbook, - "shortestbook": shortestbook, - "avgbook": avgPages - } - - return Response(data) - -@api_view(['GET']) -def pages_per_month(request): - if request.META.get('HTTP_YEAR'): - - data = [] - df = filterData(getBooksData(), request.META.get('HTTP_YEAR')) - - # Filter array on genre and date - booksPerMonth = df.groupby(['pages', 'readed'])['pages'].count().reset_index(name="count") - booksPerMonth = booksPerMonth.sort_values(by=['readed', 'count'], ascending=True) - - for index, row in booksPerMonth.iterrows(): - data.append({ - "pages": row['pages'], - "readed": row['readed'] - }) - - return Response(data) - else: - return Response("No year header included") - -@api_view(['GET']) -def getYears(request): - df = filterData(getBooksData()) - - df['readed'] = pd.to_datetime(df['readed'], errors='coerce') - df['year']= df['readed'].dt.year - - years = df.groupby('year')['year'].count().reset_index(name="count") - - return Response(years['year']) @api_view(['GET']) def predictAmountBooks(request): @@ -325,52 +80,4 @@ def predictAmountBooks(request): return Response({ "year": current_year, "amount": math.floor(predict_books[0]) - }) - # return Response(f"The amount of books i'm gonna read in {current_year} is {math.floor(predict_books[0])}") - -@api_view(['GET']) -def avg_ratings_per_month(request): - datayear = request.META.get('HTTP_YEAR') - - if datayear: - data = [] - - # Get CSV file with book data - df = filterData(getBooksData(), request.META.get('HTTP_YEAR')) - - avgratingspermonth = df.groupby('readed')['rating'].mean().reset_index(name="rating") - - for index, row in avgratingspermonth.iterrows(): - - data.append({ - "date": row['readed'], - "rating": int(row['rating']) - }) - - return Response(data) - else: - return Response("No year header included") - -@api_view(['GET']) -def countRatings(request): - datayear = request.META.get('HTTP_YEAR') - - if datayear: - data = [] - - # Get CSV file with book data - df = filterData(getBooksData(), request.META.get('HTTP_YEAR')) - - countratings = df.groupby('rating')['rating'].count().reset_index(name="count") - countratings = countratings.sort_values(by='rating', ascending=False) - - for index, row in countratings.iterrows(): - - data.append({ - "rating": int(row['rating']), - "count": int(row['count']) - }) - - return Response(data) - else: - return Response("No year header included") \ No newline at end of file + }) \ No newline at end of file diff --git a/ras/frontend/.DS_Store b/ras/frontend/.DS_Store index ca51f15..aa2bf4b 100644 Binary files a/ras/frontend/.DS_Store and b/ras/frontend/.DS_Store differ diff --git a/ras/frontend/package-lock.json b/ras/frontend/package-lock.json index 25f3c61..8123d62 100644 --- a/ras/frontend/package-lock.json +++ b/ras/frontend/package-lock.json @@ -18,6 +18,7 @@ "css-loader": "^6.7.3", "datatables.net": "^1.13.1", "datatables.net-dt": "^1.13.1", + "flag-icon-css": "^4.1.7", "jquery": "^3.6.1", "moment": "^2.29.4", "react-loader-spinner": "^5.3.4", @@ -1966,6 +1967,145 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, + "node_modules/@material-ui/core": { + "version": "4.12.4", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.4.tgz", + "integrity": "sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ==", + "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.4.4", + "@material-ui/styles": "^4.11.5", + "@material-ui/system": "^4.12.2", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.3", + "@types/react-transition-group": "^4.2.0", + "clsx": "^1.0.4", + "hoist-non-react-statics": "^3.3.2", + "popper.js": "1.16.1-lts", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0", + "react-transition-group": "^4.4.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/core/node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", + "peer": true + }, + "node_modules/@material-ui/core/node_modules/@material-ui/styles": { + "version": "4.11.5", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.5.tgz", + "integrity": "sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA==", + "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.4.4", + "@emotion/hash": "^0.8.0", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.3", + "clsx": "^1.0.4", + "csstype": "^2.5.2", + "hoist-non-react-statics": "^3.3.2", + "jss": "^10.5.1", + "jss-plugin-camel-case": "^10.5.1", + "jss-plugin-default-unit": "^10.5.1", + "jss-plugin-global": "^10.5.1", + "jss-plugin-nested": "^10.5.1", + "jss-plugin-props-sort": "^10.5.1", + "jss-plugin-rule-value-function": "^10.5.1", + "jss-plugin-vendor-prefixer": "^10.5.1", + "prop-types": "^15.7.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/core/node_modules/@material-ui/system": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.2.tgz", + "integrity": "sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.11.3", + "csstype": "^2.5.2", + "prop-types": "^15.7.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/core/node_modules/@material-ui/utils": { + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", + "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.4.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + } + }, + "node_modules/@material-ui/core/node_modules/csstype": { + "version": "2.6.21", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==", + "peer": true + }, "node_modules/@material-ui/icons": { "version": "4.11.3", "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.3.tgz", @@ -1988,6 +2128,20 @@ } } }, + "node_modules/@material-ui/types": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz", + "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==", + "peer": true, + "peerDependencies": { + "@types/react": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@mui/base": { "version": "5.0.0-alpha.119", "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.119.tgz", @@ -2280,9 +2434,9 @@ "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" }, "node_modules/@types/react": { - "version": "18.0.28", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.28.tgz", - "integrity": "sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==", + "version": "17.0.69", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.69.tgz", + "integrity": "sha512-klEeru//GhiQvXUBayz0Q4l3rKHWsBR/EUOhOeow6hK2jV7MlO44+8yEk6+OtPeOlRfnpUnrLXzGK+iGph5aeg==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -2910,6 +3064,16 @@ "postcss-value-parser": "^4.0.2" } }, + "node_modules/css-vendor": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz", + "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.8.3", + "is-in-browser": "^1.0.2" + } + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -3145,6 +3309,12 @@ "node": ">=8" } }, + "node_modules/flag-icon-css": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/flag-icon-css/-/flag-icon-css-4.1.7.tgz", + "integrity": "sha512-AFjSU+fv98XbU0vnTQ32vcLj89UEr1MhwDFcooQv14qWJCjg9fGZzfh9BVyDhAhIOZW/pGmJmq38RqpgPaeybQ==", + "deprecated": "The project has been renamed to flag-icons" + }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -3203,6 +3373,12 @@ "react-is": "^16.7.0" } }, + "node_modules/hyphenate-style-name": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", + "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==", + "peer": true + }, "node_modules/icss-utils": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", @@ -3273,6 +3449,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-in-browser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", + "integrity": "sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==", + "peer": true + }, "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -3377,6 +3559,96 @@ "node": ">=6" } }, + "node_modules/jss": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss/-/jss-10.10.0.tgz", + "integrity": "sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.3.1", + "csstype": "^3.0.2", + "is-in-browser": "^1.1.3", + "tiny-warning": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/jss" + } + }, + "node_modules/jss-plugin-camel-case": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.10.0.tgz", + "integrity": "sha512-z+HETfj5IYgFxh1wJnUAU8jByI48ED+v0fuTuhKrPR+pRBYS2EDwbusU8aFOpCdYhtRc9zhN+PJ7iNE8pAWyPw==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.3.1", + "hyphenate-style-name": "^1.0.3", + "jss": "10.10.0" + } + }, + "node_modules/jss-plugin-default-unit": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.10.0.tgz", + "integrity": "sha512-SvpajxIECi4JDUbGLefvNckmI+c2VWmP43qnEy/0eiwzRUsafg5DVSIWSzZe4d2vFX1u9nRDP46WCFV/PXVBGQ==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.10.0" + } + }, + "node_modules/jss-plugin-global": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.10.0.tgz", + "integrity": "sha512-icXEYbMufiNuWfuazLeN+BNJO16Ge88OcXU5ZDC2vLqElmMybA31Wi7lZ3lf+vgufRocvPj8443irhYRgWxP+A==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.10.0" + } + }, + "node_modules/jss-plugin-nested": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.10.0.tgz", + "integrity": "sha512-9R4JHxxGgiZhurDo3q7LdIiDEgtA1bTGzAbhSPyIOWb7ZubrjQe8acwhEQ6OEKydzpl8XHMtTnEwHXCARLYqYA==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.10.0", + "tiny-warning": "^1.0.2" + } + }, + "node_modules/jss-plugin-props-sort": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.10.0.tgz", + "integrity": "sha512-5VNJvQJbnq/vRfje6uZLe/FyaOpzP/IH1LP+0fr88QamVrGJa0hpRRyAa0ea4U/3LcorJfBFVyC4yN2QC73lJg==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.10.0" + } + }, + "node_modules/jss-plugin-rule-value-function": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.10.0.tgz", + "integrity": "sha512-uEFJFgaCtkXeIPgki8ICw3Y7VMkL9GEan6SqmT9tqpwM+/t+hxfMUdU4wQ0MtOiMNWhwnckBV0IebrKcZM9C0g==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.10.0", + "tiny-warning": "^1.0.2" + } + }, + "node_modules/jss-plugin-vendor-prefixer": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.10.0.tgz", + "integrity": "sha512-UY/41WumgjW8r1qMCO8l1ARg7NHnfRVWRhZ2E2m0DMYsr2DD91qIXLyNhiX83hHswR7Wm4D+oDYNC1zWCJWtqg==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.3.1", + "css-vendor": "^2.0.8", + "jss": "10.10.0" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -3671,6 +3943,12 @@ "node": ">=8" } }, + "node_modules/popper.js": { + "version": "1.16.1-lts", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz", + "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==", + "peer": true + }, "node_modules/postcss": { "version": "8.4.21", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", @@ -4305,6 +4583,12 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", + "peer": true + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", diff --git a/ras/frontend/package.json b/ras/frontend/package.json index 5511585..ecf3d8a 100644 --- a/ras/frontend/package.json +++ b/ras/frontend/package.json @@ -30,6 +30,7 @@ "css-loader": "^6.7.3", "datatables.net": "^1.13.1", "datatables.net-dt": "^1.13.1", + "flag-icon-css": "^4.1.7", "jquery": "^3.6.1", "moment": "^2.29.4", "react-loader-spinner": "^5.3.4", diff --git a/ras/frontend/src/.DS_Store b/ras/frontend/src/.DS_Store index db2e5e2..e17ca05 100644 Binary files a/ras/frontend/src/.DS_Store and b/ras/frontend/src/.DS_Store differ diff --git a/ras/frontend/src/App.js b/ras/frontend/src/App.js index 33fc0e6..3bfc06b 100644 --- a/ras/frontend/src/App.js +++ b/ras/frontend/src/App.js @@ -1,9 +1,9 @@ import React, { Component, lazy, Suspense } from "react"; import { Route, Routes, BrowserRouter as Router } from 'react-router-dom'; import { ColorRing } from 'react-loader-spinner' +import Login from "./views/login"; const Dashboard = lazy(() => import("./views/dashboard")); -const Booklist = lazy(() => import("./views/booklist")); function App() { return ( @@ -24,7 +24,8 @@ function App() { }> - } /> + : } /> + {/* } /> */} diff --git a/ras/frontend/src/components/Books.js b/ras/frontend/src/components/Books.js index 5c884a4..eca6977 100644 --- a/ras/frontend/src/components/Books.js +++ b/ras/frontend/src/components/Books.js @@ -1,47 +1,32 @@ -import React, { Component } from 'react'; -import { getAvgRatings, getBooksPerYearPerGenres } from "./Data.js"; -import { initChart } from "./Charts.js"; +import React, { useEffect } from 'react'; -export default class Books extends Component { - constructor(props) { - super(props); - this.state = { - books: [] +const Books = (props) => { + const getData = async () => { + const [data, charts] = await Promise.all([ + import("./Data.js"), + import("./Charts.js") + ]); + + const yearbooks = await data.getBooksPerYearPerGenres(props.year); + + if(yearbooks){ + const ratings = await data.getAvgRatings(props.year); + charts.initChart(yearbooks, ratings, props.year); } } - getComponentData() { - getBooksPerYearPerGenres(this.props.year).then(books => { - this.setState({ - books: books - }) + useEffect(() => { + getData(); + }, [props.year]); - getAvgRatings(this.props.year).then(ratings => { - initChart(books, ratings, this.props.year); - }) + return ( + +
+ Boeken per maand per genre + +
+
+ ) +} - - }) - } - - componentDidMount() { - this.getComponentData(); - } - - componentDidUpdate(prevProps, prevState) { - if (prevProps.year !== this.props.year) { - this.getComponentData(); - } - } - - render() { - return ( - -
- Boeken per maand per genre - -
-
- ) - } -} \ No newline at end of file +export default Books; \ No newline at end of file diff --git a/ras/frontend/src/components/Charts.js b/ras/frontend/src/components/Charts.js index eeef703..e583c5a 100644 --- a/ras/frontend/src/components/Charts.js +++ b/ras/frontend/src/components/Charts.js @@ -131,21 +131,27 @@ export const initChart = (data, ratings, year) => { }, scales: { x: { + grid:{ + display: false, + }, ticks: { beginAtZero: true, color: "#333", - size: 12, - fontFamily: "Source Sans Pro", + size: 11, + fontFamily: "Poppins", }, stacked: true, }, y: { + grid:{ + display: false, + }, ticks: { beginAtZero: true, stepSize: 1, color: "#333", - size: 12, - fontFamily: "Source Sans Pro", + size: 11, + fontFamily: "Poppins", }, stacked: true } @@ -158,15 +164,15 @@ export const initChart = (data, ratings, year) => { color: "#333", padding: 20, font: { - size: 12, - weight: 400, - family: 'Source Sans Pro', + size: 11, + weight: 300, + family: 'Poppins', } } } }, tooltips: { - bodyFont: 'Source Sans Pro' + bodyFont: 'Poppins' } }, plugins: [legendMargin], @@ -239,6 +245,7 @@ export const initDoughnut = (data) => { }] }, options: { + showAllTooltips: true, cutout: '80%', responsive: true, plugins: { @@ -250,8 +257,9 @@ export const initDoughnut = (data) => { // This more specific font property overrides the global property color: "#333", font: { - size: 12, - family: 'Source Sans Pro' + size: 11, + weight: 300, + family: 'Poppins' } } } diff --git a/ras/frontend/src/components/Countries.js b/ras/frontend/src/components/Countries.js index e6f5223..8e14ed5 100644 --- a/ras/frontend/src/components/Countries.js +++ b/ras/frontend/src/components/Countries.js @@ -1,58 +1,49 @@ -import React, { Component } from 'react'; +import React, { Component, useEffect, useState } from 'react'; +import 'flag-icon-css/css/flag-icons.min.css'; import { getCountries } from "./Data.js"; -export default class Countries extends Component { - constructor(props) { - super(props); - this.state = { - countries: [] +const Countries = (props) => { + const [countries, setCountries] = useState([]); + + const getData = async () => { + const data = await import("./Data.js"); + const yearcountries = await data.getCountries(props.year); + + if(yearcountries){ + setCountries(yearcountries); } } - getComponentData() { - getCountries(this.props.year).then(countries => { - this.setState({ - countries: countries - }) - }) - } + useEffect(() => { + getData(); + }, [props.year]); - componentDidMount() { - this.getComponentData(); - } + return ( + +
+ Landen + + + + + + + + + {countries.map((country, i) => { + var code = country.code.toLowerCase(); + return ( + + + + + ) + })} + +
LandBoeken
{country.country}{country.count}
+
+
+ ) +} - componentDidUpdate(prevProps, prevState) { - if (prevProps.year !== this.props.year) { - this.getComponentData(); - } - } - - render() { - return ( - -
- Landen - - - - - - - - - {this.state.countries.map((country, i) => { - var code = country.code.toLowerCase(); - return ( - - - - - ) - })} - -
LandBoeken
{country.country}{country.count}
-
-
- ) - } -} \ No newline at end of file +export default Countries; \ No newline at end of file diff --git a/ras/frontend/src/components/DataTables.css b/ras/frontend/src/components/DataTables.css index 6dcd116..17d989c 100644 --- a/ras/frontend/src/components/DataTables.css +++ b/ras/frontend/src/components/DataTables.css @@ -8,11 +8,11 @@ #DataTable td { color: #333; - font-size: 14px; + font-size: 13px; height: 40px; - font-weight: 400; + font-weight: 300; vertical-align: middle; - letter-spacing: .3px; + letter-spacing: 0px; } .DataTable_Container { @@ -21,7 +21,7 @@ } #DataTable{ - margin-bottom:0; + margin-bottom:0 !important; box-shadow: 0 2px 0 1px rgb(0 0 0/3%); } @@ -94,9 +94,7 @@ #DataTable td{ padding:10px; color: #000000; - font-size: 14px; height: 0px; - font-weight: 400; vertical-align: middle; border-top: none; border-bottom: none; diff --git a/ras/frontend/src/components/Genres.js b/ras/frontend/src/components/Genres.js index b7bc4be..883371f 100644 --- a/ras/frontend/src/components/Genres.js +++ b/ras/frontend/src/components/Genres.js @@ -1,43 +1,31 @@ -import React, { Component } from 'react'; -import { getGenresCount } from "./Data.js"; -import { initDoughnut } from "./Charts.js"; +import React, { useEffect } from 'react'; -export default class Genres extends Component { - constructor(props) { - super(props); - this.state = { - genres: [] +const Genres = (props) => { + const getData = async () => { + const [data, charts] = await Promise.all([ + await import("./Data.js"), + await import("./Charts.js") + ]); + + const yeargenres = await data.getGenresCount(props.year); + + if(yeargenres){ + charts.initDoughnut(yeargenres, props.year); } } - getComponentData() { - getGenresCount(this.props.year).then(genres => { - this.setState({ - genres: genres - }) + useEffect(() => { + getData(); + }, [props.year]); - initDoughnut(genres, this.props.year); - }) - } + return ( + +
+ Genres + +
+
+ ) +} - componentDidMount() { - this.getComponentData(); - } - - componentDidUpdate(prevProps, prevState) { - if (prevProps.year !== this.props.year) { - this.getComponentData(); - } - } - - render() { - return ( - -
- Genres - -
-
- ) - } -} \ No newline at end of file +export default Genres; \ No newline at end of file diff --git a/ras/frontend/src/components/Ratings.js b/ras/frontend/src/components/Ratings.js index cd6c3ec..430e52d 100644 --- a/ras/frontend/src/components/Ratings.js +++ b/ras/frontend/src/components/Ratings.js @@ -1,22 +1,17 @@ -import React, { Component } from 'react'; -import { getGenresCount, getRatingsCount } from "./Data.js"; -import { initDoughnut } from "./Charts.js"; +import React, { useEffect, useState } from 'react'; -export default class Ratings extends Component { - constructor(props) { - super(props); - this.state = { - ratings: [], - totalRatings: 0 - } - } +const Ratings = (props) => { + const [ratings, setRatings] = useState([]); + const [totalRatings, setTotalRatings] = useState(0); - getComponentData() { - getRatingsCount(this.props.year).then(ratings => { + const getData = async () => { + const data = await import("./Data.js"); + const yearratings = await data.getRatingsCount(props.year); + if(yearratings){ var total = 0; - ratings.forEach(rating => { + yearratings.forEach(rating => { total += rating.count; }) @@ -29,76 +24,64 @@ export default class Ratings extends Component { } for(var i = 5; i > 0; i--){ - ratings.forEach(rating => { + yearratings.forEach(rating => { if(rating.rating === i){ ratingsArray[i] = rating.count } }); } - console.log(Object.entries(ratingsArray)); - - this.setState({ - ratings: Object.entries(ratingsArray), - totalRatings: total - }) - }) - } - - componentDidMount() { - this.getComponentData(); - } - - componentDidUpdate(prevProps, prevState) { - if (prevProps.year !== this.props.year) { - this.getComponentData(); + setRatings(Object.entries(ratingsArray)); + setTotalRatings(total); } } - render() { - return ( - -
- Ratings - - - - - - - - - - {this.state.ratings.map((rating) => { - var ratingstars = ''; - var rating_percentage = rating[1] / this.state.totalRatings * 100; + useEffect(() => { + getData(); + }, [props.year]) - console.log(rating[1], this.state.totalRatings); + return ( + +
+ Ratings +
#percentageaantal
+ + + + + + + + + {ratings.map((rating) => { + var ratingstars = ''; + var rating_percentage = rating[1] / totalRatings * 100; - if (rating[0]) { - for (var i = 0; i < rating[0]; i++) { - ratingstars += ""; - } + console.log(rating[1], totalRatings); + + if (rating[0]) { + for (var i = 0; i < rating[0]; i++) { + ratingstars += ""; } + } - return( - - - - - - ) - })} - -
#percentageaantal
-
-
- {/*
{rating_percentage}%
*/} -
-
-
{rating[1]}
-
-
- ) - } -} \ No newline at end of file + return( + + + +
+
+
+ + {rating[1]} + + ) + })} + + + + + ) +} + +export default Ratings; \ No newline at end of file diff --git a/ras/frontend/src/components/Readed.js b/ras/frontend/src/components/Readed.js index edf7d03..2148d0c 100644 --- a/ras/frontend/src/components/Readed.js +++ b/ras/frontend/src/components/Readed.js @@ -1,80 +1,66 @@ -import React, { Component } from 'react'; +import React, { useEffect, useState } from 'react'; import '../components/DataTables.css'; -import * as moment from 'moment'; -import { getBooksByYear } from "./Data.js"; -const $ = require('jquery'); -$.DataTable = require('datatables.net'); +import 'flag-icon-css/css/flag-icons.min.css'; +import DataTable from 'datatables.net-dt'; -export default class Readed extends Component { - constructor(props) { - super(props); - this.state = { - books: [] +const Readed = (props) => { + const [books, setBooks] = useState([]); + + const getData = async () => { + const data = await import("./Data.js"); + const yearbooks = await data.getBooksByYear(props.year); + + if(yearbooks){ + setBooks(yearbooks); } + setTimeout(() => { + let table = new DataTable('#DataTable'); + table.destroy(); + + table = new DataTable('#DataTable', { + language: { + url: 'https://cdn.datatables.net/plug-ins/9dcbecd42ad/i18n/Dutch.json' + }, + dom: 'rt<"bottom"p><"clear">', + order: [] + }); + }, 1000) } - getComponentData(init) { - getBooksByYear(this.props.year).then(readed => { - console.log(readed); - this.setState({ - books: readed - }) + useEffect(() => { + getData(); + }, [props.year]) - if(init === true){ - setTimeout(() => { - $('#DataTable').DataTable({ - language: { - url: 'https://cdn.datatables.net/plug-ins/9dcbecd42ad/i18n/Dutch.json' - }, - dom: 'rt<"bottom"p><"clear">', - order: [] - }); - }, 1000) - } - - }) - } + return ( + +
+ Gelezen boeken + + + + + + + + + + + {books.map((book, i) => { + var code = book.country_code.toLowerCase(); + return ( + + + + + + + ) + })} + +
BookAuthorGenreRatings
{book.name}{book.author} {book.genre}{book.rating}
+
+
+ ) +} - componentDidMount() { - this.getComponentData(true); - } - - componentDidUpdate(prevProps, prevState) { - if (prevProps.year !== this.props.year) { - this.getComponentData(false); - } - } - - render() { - return ( - -
- Gelezen boeken - - - - - - - - - - - {this.state.books.map((book, i) => { - var code = book.country_code.toLowerCase(); - return ( - - - - - - - ) - })} - -
BookAuthorGenreRatings
{book.name}{book.author} {book.genre}{book.rating}
-
-
- ) - } -} \ No newline at end of file +export default Readed; \ No newline at end of file diff --git a/ras/frontend/src/components/Sidebar.js b/ras/frontend/src/components/Sidebar.js new file mode 100644 index 0000000..5fdb6d7 --- /dev/null +++ b/ras/frontend/src/components/Sidebar.js @@ -0,0 +1,24 @@ +import React from "react"; +import { NavLink } from "react-router-dom"; + +const Sidebar = () => { + return( +
+ + +
+ ) +} + +export default Sidebar; \ No newline at end of file diff --git a/ras/frontend/src/components/Stats.js b/ras/frontend/src/components/Stats.js index 9f47f8c..ad4a404 100644 --- a/ras/frontend/src/components/Stats.js +++ b/ras/frontend/src/components/Stats.js @@ -1,88 +1,52 @@ -import React, { Component } from 'react'; -import { getStats, getReadingYears } from "./Data.js"; +import React, { useEffect, useState } from 'react'; -export default class BookStats extends Component { - constructor(props) { - super(props); - this.state = { - readingYears: [], - totalbooks: 0, - totalpages: 0, - totalauthors: 0, - totalcountries: 0, - totalgenres: 0, - } +const BookStats = (props) =>{ + const [totalbooks, setTotalbooks] = useState(0); + const [totalgenres, setTotalgenres] = useState(0); + + const getData = async () => { + const data = await import("./Data.js"); + const stats = await data.getStats(props.year); + + setTotalbooks(stats.totalbooks); + setTotalgenres(stats.totalgenres); } - getComponentData(){ - var $this = this; + useEffect(() => { + getData(); + }, [props.year]) - getStats(this.props.year).then(data => { - $this.setState({ - totalbooks: data.totalbooks, - totalpages: data.totalpages, - totalauthors: data.totalauthors, - totalcountries: data.totalcountries, - totalgenres: data.totalgenres - }) - }); - - getReadingYears().then(data => { - this.setState({ - readingYears: data - }) - }); - } - - componentDidMount() { - this.getComponentData(); - } - - componentDidUpdate(prevProps, prevState) { - if (prevProps.year !== this.props.year) { - this.getComponentData(); - } - } - - render() { - return ( - -
+ return ( + +
+
- - {this.state.totalbooks} - Boeken + + Gelezen boeken: + {totalbooks} +
-
+ +
- - {this.state.totalpages} - Bladzijdes + + Genres: + {totalgenres} +
-
+ +
- - {this.state.totalauthors} - Schrijvers + + Jaarbeoordeling: + 7
-
-
- - {this.state.totalgenres} - Genres -
-
-
-
- - {this.state.totalcountries} - Landen -
-
- - ) - } -} \ No newline at end of file +
+ + ) +} + +export default BookStats; \ No newline at end of file diff --git a/ras/frontend/src/views/dashboard.js b/ras/frontend/src/views/dashboard.js index a853f38..a65b444 100644 --- a/ras/frontend/src/views/dashboard.js +++ b/ras/frontend/src/views/dashboard.js @@ -1,75 +1,58 @@ -import React, { Component } from "react"; -import Challenge from "../components/Challenge"; -import Countries from "../components/Countries"; +import React, { useEffect, useState } from "react"; import Genres from "../components/Genres"; import Books from "../components/Books"; -import { getRatingsCount, getReadingYears } from "../components/Data.js"; import Ratings from "../components/Ratings"; -import Readed from "../components/Readed"; +import Stats from "../components/Stats"; +import Sidebar from "../components/Sidebar"; -export default class Dashboard extends Component { +const Dashboard = (props) => { + const [year, setYear] = useState(new Date().getFullYear()); + const [readingYears, setReadingYears] = useState([]); - constructor(props) { - super(props); - this.state = { - year: new Date().getFullYear(), - readingYears: [], - } + const getData = async () => { + const data = await import("../components/Data.js"); + const getYears = await data.getReadingYears(); + setReadingYears(getYears); } - changeYear(event) { - this.setState({ - year: event.target.value - }) - } + useEffect(() => { + getData(); + }, [year]); - componentDidMount() { - getReadingYears().then(data => { - this.setState({ - readingYears: data - }) - }) - - getRatingsCount(this.state.year).then(data => { - console.log(data); - }) - } - - render() { - var url = window.location.href.split("/"); - - return ( - -
-
+ return ( + +
+
+ Selecteer jaar - setYear(event.target.value)}> + {readingYears.map((year, i) => { return () })}
-
-
-
- - - {/* */} - -
+
+ +
+
+
+
+ + +
-
- - - - -
+
+ + +
- - ) - } -} \ No newline at end of file +
+ + ) +} + +export default Dashboard; \ No newline at end of file diff --git a/ras/frontend/src/views/login.js b/ras/frontend/src/views/login.js new file mode 100644 index 0000000..4f02ec5 --- /dev/null +++ b/ras/frontend/src/views/login.js @@ -0,0 +1,125 @@ +import React, { useState } from "react"; + +const Login = (props) => { + const [username, setUsername] = useState(''); + const [password, setPassword] = useState(''); + const [loggedin, setLoggedin] = useState(false); + + const getToken = (idToken) => { + localStorage.getItem('token'); + } + + const setToken = (idToken) => { + localStorage.setItem('token', idToken) + } + + const isTokenExpired = (token) => { + try { + const decoded = decode(token); + if (decoded.exp < Date.now() / 1000) { + return true; + } + else + return false; + } + catch (err) { + return false; + } + } + + const login = async (username, password) => { + const formData = new FormData(); + formData.append('username', username); + formData.append('password', password); + + return authFetch(`http://localhost:8000/api/auth/login?username=${username}&password=${password}`, { + method: 'POST', + body: formData + }).then(res => { + console.log(res.user); + if(res.user){ + localStorage.setItem('id', res.user.id); + localStorage.setItem('name', res.user.name); + localStorage.setItem('username', res.user.username); + localStorage.setItem('email', res.user.email); + + setToken(res.token); + return Promise.resolve(res); + } + }) + } + + const handleFormSubmit = async (event) => { + event.preventDefault(); + const res = await login(username, password); + console.log(res); + + if(res.user.id){ + setLoggedin(true); + window.location.href = "/"; + }else{ + alert("Inlogegevens zijn onjuist. Probeer het opnieuw"); + } + } + + const handleChange = (event) => { + if(event.target.name === 'username'){ + setUsername(event.target.value); + }else{ + setPassword(event.target.value); + } + } + + const loggedIn = () => { + const token = getToken() + return !!token && !isTokenExpired(token) + } + + const authFetch = (url, options) => { + if (loggedIn()) { + headers['Authorization'] = 'Bearer ' + this.getToken() + } + + return fetch(url, options) + .then(_checkStatus) + .then(response => response.json()) + } + + const _checkStatus = (response) => { + if (response.status >= 200 && response.status < 300) { + return response + } else { + var error = new Error(response.statusText) + error.response = response + throw error + } + } + + return ( + +
+
+ + +
handleFormSubmit(event)}> +
+ + + + +
+
+ + + + +
+ +
+
+
+
+ ); +} + +export default Login; \ No newline at end of file diff --git a/ras/frontend/static/.DS_Store b/ras/frontend/static/.DS_Store index dd32beb..0dcca6f 100644 Binary files a/ras/frontend/static/.DS_Store and b/ras/frontend/static/.DS_Store differ diff --git a/ras/frontend/static/css/style.css b/ras/frontend/static/css/style.css index e5c312f..09411bb 100644 --- a/ras/frontend/static/css/style.css +++ b/ras/frontend/static/css/style.css @@ -1,8 +1,11 @@ +@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@100;200;300;400;500;600;700&display=swap'); + html, body{ background:#f8f8fa; margin:0; padding:0; - font-family: 'Source Sans Pro', sans-serif; + /* font-family: 'Source Sans Pro', sans-serif; */ + font-family: 'Poppins', sans-serif; letter-spacing: .3px; font-weight: 400; color:#333; @@ -34,6 +37,8 @@ html, body{ .content{ padding: 30px; + padding-top: 90px; + padding-left: 230px; } .content-manage{ @@ -73,19 +78,15 @@ html, body{ padding: 20px 0; } - .books-per-month{ - height:700px; - } - .books-per-month canvas{ - height:600px !important; + height:500px !important; } .books-per-month, .genresPercent, .books-per-country, .book, .ratings, .readed{ background: #ffffff; padding: 20px; - -webkit-box-shadow: 0 1px 20px 0 rgba(69,90,100,.08); - box-shadow: 0 1px 20px 0 rgba(69,90,100,.08); + -webkit-box-shadow: 0px 1px 1px 1px #eee; + box-shadow: 0px 1px 1px 1px #eee; margin-bottom: 20px; } @@ -116,82 +117,16 @@ html, body{ color: #808080; } - .sidebar-manage{ - padding: 15px 10px; - background: #363a53; + .sidebar{ + background: #343d50; + z-index:1; width: 200px; height: 100vh; position: fixed; padding-top: 10px; } - .sidebar-manage .menu-item{ - text-align: center; - padding: 15px 0; - } - - .sidebar-manage .menu-item i{ - font-size: 25px; - color: #727794; - } - - .sidebar-manage .menu-item.selected i{ - color:#fff; - } - - .sidebar-manage svg{ - color:#ffffff; - } - - .sidebar-manage ul { - padding: 0; - margin:0; - } - - .sidebar-manage ul li { - list-style-type: none; - font-size: 14px; - font-weight: 400; - display: block; - } - - .sidebar-manage ul li a { - color: #a9b7d0; - text-decoration: none; - padding: 12px 15px; - display:block; - width:100%; - border-radius: 10px; - } - - .sidebar-manage ul li a.active { - color: #ffffff; - background: rgba(0,0,0,0.3) !important; - } - - .sidebar-manage ul li a.active i { - color: #8066ee; - } - - .sidebar-manage i { - color: #a9b7d0; - font-size: 13px; - width: 10px; - display: inline-block; - text-align: center; - line-height: 1; - margin-right: 12px; - } - - /* -------------------------------- */ - - .sidebar{ - background: #363a53; - width: 100%; - padding: 15px 10px; - } - - .sidebar .menu-item{ + /* .sidebar .menu-item{ text-align: center; padding: 15px 0; } @@ -218,7 +153,7 @@ html, body{ list-style-type: none; font-size: 14px; font-weight: 400; - display: inline-block; + display: block; } .sidebar ul li a { @@ -247,7 +182,51 @@ html, body{ text-align: center; line-height: 1; margin-right: 12px; - } + } */ + + .sidebar h3{ + color: rgba(255,255,255,0.3); + font-size:12px; + padding-bottom:5px; +} + +.sidebar ul{ + padding:0; + margin:0; + margin-top:10px; +} + +.sidebar ul li{ + color:rgba(255,255,255,0.5); + list-style-type: none; + font-weight: 300; + cursor: pointer; + font-size: 12px; + padding: 15px 25px; +} + +.sidebar ul .active li{ + background:rgba(0,0,0,0.3); +} + +.sidebar ul li i{ + margin-right:5px; + color: rgba(255,255,255,0.5); + width:15px; +} + +.sidebar ul a{ + text-decoration: none; +} + +.sidebar ul .active li { + color: #ffffff; + background: rgba(0,0,0,0.3) !important; +} + +.sidebar ul .active li i { + color: #48a5a9; +} .books-stats{ margin:20px 0; @@ -260,30 +239,36 @@ html, body{ .books-stats .stat-block, .stat-block{ background: #ffffff; - -webkit-box-shadow: 0 1px 20px 0 rgba(69,90,100,.08); - box-shadow: 0 1px 20px 0 rgba(69,90,100,.08); + -webkit-box-shadow: 0px 1px 1px 1px #eee; + box-shadow: 0px 1px 1px 1px #eee; padding: 15px 5px; color: #333; text-align: center; + margin-bottom: 20px; } .chooseYear{ - position: fixed; - bottom: 10px; - right: 10px; - background: #404e67; padding: 10px; - text-align: center; + color:#333; + } + + .chooseYear span{ + display: inline-block; + color:#333; } .chooseYear i{ - color: #a9b7d0; + color: #333; + font-size:13px; + margin-right: 10px; } .chooseYear select{ - font-size:16px; + font-size:13px; background: none; - color:#ffffff; + color:#333; + border: solid 1px #eee; + padding: 5px; } .chooseYear select:focus-visible{ @@ -311,7 +296,7 @@ html, body{ color: #8066ee; } */ - .books-stats .stat-block i{ + .stat-block i{ font-weight: 900; font-size: 22px; border-radius: 50%; @@ -320,15 +305,26 @@ html, body{ height: 50px; line-height: 30px; text-align: center; - background: #696ffc; + background: #343d50; + color:#ffffff; + float:left; + margin-left:15px; /* box-shadow: 2px 2px 0px 0px rgba(0, 0, 0, 0.3); */ } + .col-md-4:nth-child(2) .stat-block i{ + background:#01a9ac; + } + + .col-md-4:nth-child(3) .stat-block i{ + background:#ffbe0e; + } + .books-stats .stat-block .stats-number, .stats-number{ - font-weight: 400; + font-weight: 600; display: inline-block; margin-left: 10px; - font-size: 16px; + font-size: 20px; margin-right: 10px; color: #333; } @@ -336,7 +332,8 @@ html, body{ .books-stats .stat-block .stats-label, .stats-label{ color: #a7adbd; font-weight: 400; - font-size: 16px; + font-size: 12px; + display: block; } .yearselector{ @@ -354,12 +351,15 @@ html, body{ .table{ border-bottom: none !important; + margin-bottom: 0; } .table td{ color: #101010; border-bottom:none !important; padding: 10px 10px !important; + font-size: 13px; + font-weight: 300; } .table td img{ @@ -379,13 +379,14 @@ html, body{ span.block_name{ color: #333; - font-weight: 400; + font-weight: 500; border-bottom: solid 1px #f5f6fa; width: 100%; display: block; padding-bottom: 10px; margin-bottom: 10px; - letter-spacing: .3px; + letter-spacing: 0px; + font-size: 13px; } .stat-block .progress{ @@ -497,4 +498,98 @@ html, body{ font-size: 14px; background: #363a53; border: none; - } \ No newline at end of file + } + + .flag-icon{ + margin-right: 5px !important; + } + + /* Login screen */ + + .login_overlay{ + background: #eee; + position: absolute; + width:100%; + height:100%; + } + + .login{ + width:350px; + min-height:300px; + position: absolute; + top: 50%; + left:50%; + -ms-transform: translateX(-50%) translateY(-50%); + transform: translateX(-50%) translateY(-50%); + border-radius: 5px; + +} + +.login form{ + background:#ffffff; + box-shadow: 1px 1px 1px rgba(0,0,0,.05); + padding: 30px; +} + +.login img{ + display: block; + width: 200px; + margin:auto; + margin-bottom:30px; +} + + .login .login_logo{ + width: 120px; + margin: auto; + margin-top: -65px; + background: #ffffff; + border-radius: 50%; +} + +.login .login_logo img{ + width:100%; +} + +.login form input{ + background:#f9f9f9; + border:none; + border-radius: 5px; + padding: 10px 15px; + font-size:13px; +} + +.login form .icon{ + position: absolute; + right: 44px; + margin-top: 7px; +} + +.login form .icon i{ + color:#aaa; + font-size:13px; +} + +.login form button{ + background:#364c67; + width:100%; + border: none; + padding: 10px 15px; + font-size: 13px; +} + +.login form button:hover{ + background:#122235; +} + +.topbar{ + background: #ffffff; + width: 100%; + min-height: 50px; + position: absolute; + box-shadow: 0px 1px 1px 1px #eee; + padding-left:230px; +} + +.stats{ + margin-bottom:20px; +} \ No newline at end of file diff --git a/ras/frontend/static/images/logo.png b/ras/frontend/static/images/logo.png new file mode 100644 index 0000000..b2aaf35 Binary files /dev/null and b/ras/frontend/static/images/logo.png differ diff --git a/ras/frontend/static/images/logo_white.png b/ras/frontend/static/images/logo_white.png new file mode 100644 index 0000000..b60d8df Binary files /dev/null and b/ras/frontend/static/images/logo_white.png differ diff --git a/ras/frontend/static/js/00ae4e73cc902efd834c.svg b/ras/frontend/static/js/00ae4e73cc902efd834c.svg new file mode 100644 index 0000000..8905f90 --- /dev/null +++ b/ras/frontend/static/js/00ae4e73cc902efd834c.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/0159b1bd857af9ed65b8.svg b/ras/frontend/static/js/0159b1bd857af9ed65b8.svg new file mode 100644 index 0000000..113aae5 --- /dev/null +++ b/ras/frontend/static/js/0159b1bd857af9ed65b8.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/ras/frontend/static/js/015c67e78d7c8cb05d7f.svg b/ras/frontend/static/js/015c67e78d7c8cb05d7f.svg new file mode 100644 index 0000000..ebf2fc6 --- /dev/null +++ b/ras/frontend/static/js/015c67e78d7c8cb05d7f.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/01ec3194a89e6a0c5676.svg b/ras/frontend/static/js/01ec3194a89e6a0c5676.svg new file mode 100644 index 0000000..8720921 --- /dev/null +++ b/ras/frontend/static/js/01ec3194a89e6a0c5676.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/023b75b96409f72a6a30.svg b/ras/frontend/static/js/023b75b96409f72a6a30.svg new file mode 100644 index 0000000..3ab0ba9 --- /dev/null +++ b/ras/frontend/static/js/023b75b96409f72a6a30.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/025c12105396b6e6b3b8.svg b/ras/frontend/static/js/025c12105396b6e6b3b8.svg new file mode 100644 index 0000000..563277f --- /dev/null +++ b/ras/frontend/static/js/025c12105396b6e6b3b8.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ras/frontend/static/js/031f7d1211a3a7f59010.svg b/ras/frontend/static/js/031f7d1211a3a7f59010.svg new file mode 100644 index 0000000..a1953fa --- /dev/null +++ b/ras/frontend/static/js/031f7d1211a3a7f59010.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ras/frontend/static/js/0420e634b15c416fbdc1.svg b/ras/frontend/static/js/0420e634b15c416fbdc1.svg new file mode 100644 index 0000000..1bb04ec --- /dev/null +++ b/ras/frontend/static/js/0420e634b15c416fbdc1.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/04ca6698f051e72cf774.svg b/ras/frontend/static/js/04ca6698f051e72cf774.svg new file mode 100644 index 0000000..0e6bc76 --- /dev/null +++ b/ras/frontend/static/js/04ca6698f051e72cf774.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ras/frontend/static/js/04eb8444d01a184fbd1d.svg b/ras/frontend/static/js/04eb8444d01a184fbd1d.svg new file mode 100644 index 0000000..9ff92dd --- /dev/null +++ b/ras/frontend/static/js/04eb8444d01a184fbd1d.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/0542b94612db83a2f550.svg b/ras/frontend/static/js/0542b94612db83a2f550.svg new file mode 100644 index 0000000..049be14 --- /dev/null +++ b/ras/frontend/static/js/0542b94612db83a2f550.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/0551427e6aedc9625596.svg b/ras/frontend/static/js/0551427e6aedc9625596.svg new file mode 100644 index 0000000..3cafc1d --- /dev/null +++ b/ras/frontend/static/js/0551427e6aedc9625596.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ras/frontend/static/js/05e95e537bcdc02a69a7.svg b/ras/frontend/static/js/05e95e537bcdc02a69a7.svg new file mode 100644 index 0000000..9128715 --- /dev/null +++ b/ras/frontend/static/js/05e95e537bcdc02a69a7.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/ras/frontend/static/js/065714bdfc57feaef68f.svg b/ras/frontend/static/js/065714bdfc57feaef68f.svg new file mode 100644 index 0000000..6991413 --- /dev/null +++ b/ras/frontend/static/js/065714bdfc57feaef68f.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/06ff301ff0dc8369a202.svg b/ras/frontend/static/js/06ff301ff0dc8369a202.svg new file mode 100644 index 0000000..e6a6332 --- /dev/null +++ b/ras/frontend/static/js/06ff301ff0dc8369a202.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/0717abbc6df210a43c5d.svg b/ras/frontend/static/js/0717abbc6df210a43c5d.svg new file mode 100644 index 0000000..16fe7e0 --- /dev/null +++ b/ras/frontend/static/js/0717abbc6df210a43c5d.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/07ec7ccbea282d9458ad.svg b/ras/frontend/static/js/07ec7ccbea282d9458ad.svg new file mode 100644 index 0000000..ff9cf2e --- /dev/null +++ b/ras/frontend/static/js/07ec7ccbea282d9458ad.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/ras/frontend/static/js/082e7027de2c30bf3596.svg b/ras/frontend/static/js/082e7027de2c30bf3596.svg new file mode 100644 index 0000000..fb7f090 --- /dev/null +++ b/ras/frontend/static/js/082e7027de2c30bf3596.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/089aab7a533a120abe27.svg b/ras/frontend/static/js/089aab7a533a120abe27.svg new file mode 100644 index 0000000..5663b0a --- /dev/null +++ b/ras/frontend/static/js/089aab7a533a120abe27.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/ras/frontend/static/js/08db2cd122d5f99494dd.svg b/ras/frontend/static/js/08db2cd122d5f99494dd.svg new file mode 100644 index 0000000..20a8bfd --- /dev/null +++ b/ras/frontend/static/js/08db2cd122d5f99494dd.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/0924dc178a2cf893e78d.svg b/ras/frontend/static/js/0924dc178a2cf893e78d.svg new file mode 100644 index 0000000..6a49b7f --- /dev/null +++ b/ras/frontend/static/js/0924dc178a2cf893e78d.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/096c0ee26081bc0c577a.svg b/ras/frontend/static/js/096c0ee26081bc0c577a.svg new file mode 100644 index 0000000..83fa02b --- /dev/null +++ b/ras/frontend/static/js/096c0ee26081bc0c577a.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ras/frontend/static/js/09c49693fc10e5bd02ed.svg b/ras/frontend/static/js/09c49693fc10e5bd02ed.svg new file mode 100644 index 0000000..984e84e --- /dev/null +++ b/ras/frontend/static/js/09c49693fc10e5bd02ed.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/0ac9ef7170a22c190290.svg b/ras/frontend/static/js/0ac9ef7170a22c190290.svg new file mode 100644 index 0000000..51ed0d9 --- /dev/null +++ b/ras/frontend/static/js/0ac9ef7170a22c190290.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/0ad8c443ef4d47ea0497.svg b/ras/frontend/static/js/0ad8c443ef4d47ea0497.svg new file mode 100644 index 0000000..16b794d --- /dev/null +++ b/ras/frontend/static/js/0ad8c443ef4d47ea0497.svg @@ -0,0 +1,4 @@ + + + + diff --git a/ras/frontend/static/js/0aff28faa2b3abc8e49a.svg b/ras/frontend/static/js/0aff28faa2b3abc8e49a.svg new file mode 100644 index 0000000..a4d9a20 --- /dev/null +++ b/ras/frontend/static/js/0aff28faa2b3abc8e49a.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ras/frontend/static/js/0b7434ecd0bfcce77f8a.svg b/ras/frontend/static/js/0b7434ecd0bfcce77f8a.svg new file mode 100644 index 0000000..a138f43 --- /dev/null +++ b/ras/frontend/static/js/0b7434ecd0bfcce77f8a.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ras/frontend/static/js/0b9773700de5d03d896d.svg b/ras/frontend/static/js/0b9773700de5d03d896d.svg new file mode 100644 index 0000000..6e75539 --- /dev/null +++ b/ras/frontend/static/js/0b9773700de5d03d896d.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/0bc23418cf7a453885cf.svg b/ras/frontend/static/js/0bc23418cf7a453885cf.svg new file mode 100644 index 0000000..16730e0 --- /dev/null +++ b/ras/frontend/static/js/0bc23418cf7a453885cf.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/0c03b01f0a036dd1e720.svg b/ras/frontend/static/js/0c03b01f0a036dd1e720.svg new file mode 100644 index 0000000..b56cce0 --- /dev/null +++ b/ras/frontend/static/js/0c03b01f0a036dd1e720.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/0c0db89dc3b203a23f73.svg b/ras/frontend/static/js/0c0db89dc3b203a23f73.svg new file mode 100644 index 0000000..2675022 --- /dev/null +++ b/ras/frontend/static/js/0c0db89dc3b203a23f73.svg @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/0c209b8adf548d40535e.svg b/ras/frontend/static/js/0c209b8adf548d40535e.svg new file mode 100644 index 0000000..a8d12b8 --- /dev/null +++ b/ras/frontend/static/js/0c209b8adf548d40535e.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/0daff5bf1376fa8759b9.svg b/ras/frontend/static/js/0daff5bf1376fa8759b9.svg new file mode 100644 index 0000000..58f1e01 --- /dev/null +++ b/ras/frontend/static/js/0daff5bf1376fa8759b9.svg @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/0dcf8cf746e1d65a4528.svg b/ras/frontend/static/js/0dcf8cf746e1d65a4528.svg new file mode 100644 index 0000000..1b62d1e --- /dev/null +++ b/ras/frontend/static/js/0dcf8cf746e1d65a4528.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/0df90608875d9e335553.svg b/ras/frontend/static/js/0df90608875d9e335553.svg new file mode 100644 index 0000000..d386a2b --- /dev/null +++ b/ras/frontend/static/js/0df90608875d9e335553.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/ras/frontend/static/js/0f0875827805c6719abb.svg b/ras/frontend/static/js/0f0875827805c6719abb.svg new file mode 100644 index 0000000..5ff29a7 --- /dev/null +++ b/ras/frontend/static/js/0f0875827805c6719abb.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ras/frontend/static/js/107ef3fb7d1ea271cc2e.svg b/ras/frontend/static/js/107ef3fb7d1ea271cc2e.svg new file mode 100644 index 0000000..01766fe --- /dev/null +++ b/ras/frontend/static/js/107ef3fb7d1ea271cc2e.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/12116067e3566ce346e3.svg b/ras/frontend/static/js/12116067e3566ce346e3.svg new file mode 100644 index 0000000..260c8f6 --- /dev/null +++ b/ras/frontend/static/js/12116067e3566ce346e3.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/12b93537c4398ab123fb.svg b/ras/frontend/static/js/12b93537c4398ab123fb.svg new file mode 100644 index 0000000..aed967d --- /dev/null +++ b/ras/frontend/static/js/12b93537c4398ab123fb.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/12e9e2f28f79474f8cae.svg b/ras/frontend/static/js/12e9e2f28f79474f8cae.svg new file mode 100644 index 0000000..44532c5 --- /dev/null +++ b/ras/frontend/static/js/12e9e2f28f79474f8cae.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/ras/frontend/static/js/133adff8acf564df5728.svg b/ras/frontend/static/js/133adff8acf564df5728.svg new file mode 100644 index 0000000..2abf641 --- /dev/null +++ b/ras/frontend/static/js/133adff8acf564df5728.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/1392d24855dd708a0ee9.svg b/ras/frontend/static/js/1392d24855dd708a0ee9.svg new file mode 100644 index 0000000..ae582f1 --- /dev/null +++ b/ras/frontend/static/js/1392d24855dd708a0ee9.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/ras/frontend/static/js/1434165acf97a8c1a31a.svg b/ras/frontend/static/js/1434165acf97a8c1a31a.svg new file mode 100644 index 0000000..53c29b3 --- /dev/null +++ b/ras/frontend/static/js/1434165acf97a8c1a31a.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/1471ac6032ffd8766943.svg b/ras/frontend/static/js/1471ac6032ffd8766943.svg new file mode 100644 index 0000000..3d597a1 --- /dev/null +++ b/ras/frontend/static/js/1471ac6032ffd8766943.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/148d6a2535c91c0c7922.svg b/ras/frontend/static/js/148d6a2535c91c0c7922.svg new file mode 100644 index 0000000..8305300 --- /dev/null +++ b/ras/frontend/static/js/148d6a2535c91c0c7922.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/149bbf5e3a1e55db7588.svg b/ras/frontend/static/js/149bbf5e3a1e55db7588.svg new file mode 100644 index 0000000..ba71031 --- /dev/null +++ b/ras/frontend/static/js/149bbf5e3a1e55db7588.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/1656b1dc3d7ad3685ca4.svg b/ras/frontend/static/js/1656b1dc3d7ad3685ca4.svg new file mode 100644 index 0000000..e701650 --- /dev/null +++ b/ras/frontend/static/js/1656b1dc3d7ad3685ca4.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/ras/frontend/static/js/1698f2886a1c56881806.svg b/ras/frontend/static/js/1698f2886a1c56881806.svg new file mode 100644 index 0000000..4b9168e --- /dev/null +++ b/ras/frontend/static/js/1698f2886a1c56881806.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ras/frontend/static/js/17279211d42d3c798e85.svg b/ras/frontend/static/js/17279211d42d3c798e85.svg new file mode 100644 index 0000000..2955284 --- /dev/null +++ b/ras/frontend/static/js/17279211d42d3c798e85.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/1768da183b71efa68561.svg b/ras/frontend/static/js/1768da183b71efa68561.svg new file mode 100644 index 0000000..e8af888 --- /dev/null +++ b/ras/frontend/static/js/1768da183b71efa68561.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/18850d25a0a36c933c5c.svg b/ras/frontend/static/js/18850d25a0a36c933c5c.svg new file mode 100644 index 0000000..85ea096 --- /dev/null +++ b/ras/frontend/static/js/18850d25a0a36c933c5c.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ras/frontend/static/js/197c13c37e6fb1e34e2f.svg b/ras/frontend/static/js/197c13c37e6fb1e34e2f.svg new file mode 100644 index 0000000..86304c9 --- /dev/null +++ b/ras/frontend/static/js/197c13c37e6fb1e34e2f.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/1a109fa73fffdfd33b11.svg b/ras/frontend/static/js/1a109fa73fffdfd33b11.svg new file mode 100644 index 0000000..9a882a2 --- /dev/null +++ b/ras/frontend/static/js/1a109fa73fffdfd33b11.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/ras/frontend/static/js/1a39713c7071f91c422b.svg b/ras/frontend/static/js/1a39713c7071f91c422b.svg new file mode 100644 index 0000000..420a688 --- /dev/null +++ b/ras/frontend/static/js/1a39713c7071f91c422b.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ras/frontend/static/js/1ac81961aeb84840db2f.svg b/ras/frontend/static/js/1ac81961aeb84840db2f.svg new file mode 100644 index 0000000..7ff91a8 --- /dev/null +++ b/ras/frontend/static/js/1ac81961aeb84840db2f.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/1ace29c02ffbda05c917.svg b/ras/frontend/static/js/1ace29c02ffbda05c917.svg new file mode 100644 index 0000000..e37e086 --- /dev/null +++ b/ras/frontend/static/js/1ace29c02ffbda05c917.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/ras/frontend/static/js/1b98819eb371ab888962.svg b/ras/frontend/static/js/1b98819eb371ab888962.svg new file mode 100644 index 0000000..62813e8 --- /dev/null +++ b/ras/frontend/static/js/1b98819eb371ab888962.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ras/frontend/static/js/1d07a8b84f27401d15e2.svg b/ras/frontend/static/js/1d07a8b84f27401d15e2.svg new file mode 100644 index 0000000..52ada94 --- /dev/null +++ b/ras/frontend/static/js/1d07a8b84f27401d15e2.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/1de57f2a9396a1bb3325.svg b/ras/frontend/static/js/1de57f2a9396a1bb3325.svg new file mode 100644 index 0000000..5c0d6da --- /dev/null +++ b/ras/frontend/static/js/1de57f2a9396a1bb3325.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ras/frontend/static/js/1f599a0e4a95880eabf1.svg b/ras/frontend/static/js/1f599a0e4a95880eabf1.svg new file mode 100644 index 0000000..3cee707 --- /dev/null +++ b/ras/frontend/static/js/1f599a0e4a95880eabf1.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/ras/frontend/static/js/2035da4efa474be5bb4b.svg b/ras/frontend/static/js/2035da4efa474be5bb4b.svg new file mode 100644 index 0000000..ebd0a0f --- /dev/null +++ b/ras/frontend/static/js/2035da4efa474be5bb4b.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/212ed2a57a9492cf4337.svg b/ras/frontend/static/js/212ed2a57a9492cf4337.svg new file mode 100644 index 0000000..3bffbe1 --- /dev/null +++ b/ras/frontend/static/js/212ed2a57a9492cf4337.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/21f385d1c90452e35d21.svg b/ras/frontend/static/js/21f385d1c90452e35d21.svg new file mode 100644 index 0000000..04173a4 --- /dev/null +++ b/ras/frontend/static/js/21f385d1c90452e35d21.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ras/frontend/static/js/224b126cfd53d8219971.svg b/ras/frontend/static/js/224b126cfd53d8219971.svg new file mode 100644 index 0000000..853f4e7 --- /dev/null +++ b/ras/frontend/static/js/224b126cfd53d8219971.svg @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/227190d1fe778a97104c.svg b/ras/frontend/static/js/227190d1fe778a97104c.svg new file mode 100644 index 0000000..f992981 --- /dev/null +++ b/ras/frontend/static/js/227190d1fe778a97104c.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/22cb086638f1a52c4e49.svg b/ras/frontend/static/js/22cb086638f1a52c4e49.svg new file mode 100644 index 0000000..eb02005 --- /dev/null +++ b/ras/frontend/static/js/22cb086638f1a52c4e49.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/22db1d8d93210e4b195e.svg b/ras/frontend/static/js/22db1d8d93210e4b195e.svg new file mode 100644 index 0000000..6696fdb --- /dev/null +++ b/ras/frontend/static/js/22db1d8d93210e4b195e.svg @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/2394a011069c69dcda82.svg b/ras/frontend/static/js/2394a011069c69dcda82.svg new file mode 100644 index 0000000..8a0941f --- /dev/null +++ b/ras/frontend/static/js/2394a011069c69dcda82.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/2405e38d3ce9174eee60.svg b/ras/frontend/static/js/2405e38d3ce9174eee60.svg new file mode 100644 index 0000000..53840cc --- /dev/null +++ b/ras/frontend/static/js/2405e38d3ce9174eee60.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ras/frontend/static/js/241b5816ff0ffd6b7707.svg b/ras/frontend/static/js/241b5816ff0ffd6b7707.svg new file mode 100644 index 0000000..968f915 --- /dev/null +++ b/ras/frontend/static/js/241b5816ff0ffd6b7707.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ras/frontend/static/js/2466f7b0c1cdbbc5bce5.svg b/ras/frontend/static/js/2466f7b0c1cdbbc5bce5.svg new file mode 100644 index 0000000..eaa817b --- /dev/null +++ b/ras/frontend/static/js/2466f7b0c1cdbbc5bce5.svg @@ -0,0 +1,4 @@ + + + + diff --git a/ras/frontend/static/js/24e4280338bb1256957b.svg b/ras/frontend/static/js/24e4280338bb1256957b.svg new file mode 100644 index 0000000..c74e4dd --- /dev/null +++ b/ras/frontend/static/js/24e4280338bb1256957b.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/251f80c01a359e203199.svg b/ras/frontend/static/js/251f80c01a359e203199.svg new file mode 100644 index 0000000..327f28f --- /dev/null +++ b/ras/frontend/static/js/251f80c01a359e203199.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/252b833eee63afee120b.svg b/ras/frontend/static/js/252b833eee63afee120b.svg new file mode 100644 index 0000000..e950241 --- /dev/null +++ b/ras/frontend/static/js/252b833eee63afee120b.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/ras/frontend/static/js/25692a40953691400c99.svg b/ras/frontend/static/js/25692a40953691400c99.svg new file mode 100644 index 0000000..3fc4f4d --- /dev/null +++ b/ras/frontend/static/js/25692a40953691400c99.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/259baa445256a0bc926e.svg b/ras/frontend/static/js/259baa445256a0bc926e.svg new file mode 100644 index 0000000..e2c0e54 --- /dev/null +++ b/ras/frontend/static/js/259baa445256a0bc926e.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/ras/frontend/static/js/2619557b557f9684e1c0.svg b/ras/frontend/static/js/2619557b557f9684e1c0.svg new file mode 100644 index 0000000..e9f5b42 --- /dev/null +++ b/ras/frontend/static/js/2619557b557f9684e1c0.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ras/frontend/static/js/26619234555a923eb7b3.svg b/ras/frontend/static/js/26619234555a923eb7b3.svg new file mode 100644 index 0000000..46bbc6c --- /dev/null +++ b/ras/frontend/static/js/26619234555a923eb7b3.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/ras/frontend/static/js/26d188e88a801ef36f64.svg b/ras/frontend/static/js/26d188e88a801ef36f64.svg new file mode 100644 index 0000000..84f4bab --- /dev/null +++ b/ras/frontend/static/js/26d188e88a801ef36f64.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ras/frontend/static/js/271f0bb9f5b8a452e245.svg b/ras/frontend/static/js/271f0bb9f5b8a452e245.svg new file mode 100644 index 0000000..bc6ddf5 --- /dev/null +++ b/ras/frontend/static/js/271f0bb9f5b8a452e245.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/274e9865978ac60476fd.svg b/ras/frontend/static/js/274e9865978ac60476fd.svg new file mode 100644 index 0000000..a31377f --- /dev/null +++ b/ras/frontend/static/js/274e9865978ac60476fd.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/27a5988ed15ca88d9ca7.svg b/ras/frontend/static/js/27a5988ed15ca88d9ca7.svg new file mode 100644 index 0000000..9b3090f --- /dev/null +++ b/ras/frontend/static/js/27a5988ed15ca88d9ca7.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/28042690b69f4c26b9fb.svg b/ras/frontend/static/js/28042690b69f4c26b9fb.svg new file mode 100644 index 0000000..eedd9e6 --- /dev/null +++ b/ras/frontend/static/js/28042690b69f4c26b9fb.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/ras/frontend/static/js/29ab7a295b800ac8cdee.svg b/ras/frontend/static/js/29ab7a295b800ac8cdee.svg new file mode 100644 index 0000000..de460c8 --- /dev/null +++ b/ras/frontend/static/js/29ab7a295b800ac8cdee.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/2a4ff395d3b91e6a8d73.svg b/ras/frontend/static/js/2a4ff395d3b91e6a8d73.svg new file mode 100644 index 0000000..1634d71 --- /dev/null +++ b/ras/frontend/static/js/2a4ff395d3b91e6a8d73.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/2b1d5aa34ddb2dc385c3.svg b/ras/frontend/static/js/2b1d5aa34ddb2dc385c3.svg new file mode 100644 index 0000000..df9212f --- /dev/null +++ b/ras/frontend/static/js/2b1d5aa34ddb2dc385c3.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/2b5541c54505328dbc1b.svg b/ras/frontend/static/js/2b5541c54505328dbc1b.svg new file mode 100644 index 0000000..0fa5145 --- /dev/null +++ b/ras/frontend/static/js/2b5541c54505328dbc1b.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ras/frontend/static/js/2b96179241e072f75ba9.svg b/ras/frontend/static/js/2b96179241e072f75ba9.svg new file mode 100644 index 0000000..360a20d --- /dev/null +++ b/ras/frontend/static/js/2b96179241e072f75ba9.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/ras/frontend/static/js/2b995d455aa93dcba0cf.svg b/ras/frontend/static/js/2b995d455aa93dcba0cf.svg new file mode 100644 index 0000000..752dd3d --- /dev/null +++ b/ras/frontend/static/js/2b995d455aa93dcba0cf.svg @@ -0,0 +1,594 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/2ba81a95ae7bbc2ef182.svg b/ras/frontend/static/js/2ba81a95ae7bbc2ef182.svg new file mode 100644 index 0000000..fcb757e --- /dev/null +++ b/ras/frontend/static/js/2ba81a95ae7bbc2ef182.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/ras/frontend/static/js/2bb2ff50cd3adc1d0cd8.svg b/ras/frontend/static/js/2bb2ff50cd3adc1d0cd8.svg new file mode 100644 index 0000000..ec762f8 --- /dev/null +++ b/ras/frontend/static/js/2bb2ff50cd3adc1d0cd8.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/2c6b3e41da7cf401967e.svg b/ras/frontend/static/js/2c6b3e41da7cf401967e.svg new file mode 100644 index 0000000..39bd32a --- /dev/null +++ b/ras/frontend/static/js/2c6b3e41da7cf401967e.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/2cb4df0a0e3875c3c113.svg b/ras/frontend/static/js/2cb4df0a0e3875c3c113.svg new file mode 100644 index 0000000..3f1b600 --- /dev/null +++ b/ras/frontend/static/js/2cb4df0a0e3875c3c113.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/ras/frontend/static/js/2d66184ba6da6528b7b8.svg b/ras/frontend/static/js/2d66184ba6da6528b7b8.svg new file mode 100644 index 0000000..77bb549 --- /dev/null +++ b/ras/frontend/static/js/2d66184ba6da6528b7b8.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/2ee2d8bebdf1602ce3a1.svg b/ras/frontend/static/js/2ee2d8bebdf1602ce3a1.svg new file mode 100644 index 0000000..a231a19 --- /dev/null +++ b/ras/frontend/static/js/2ee2d8bebdf1602ce3a1.svg @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/3050433e2767fb821c5d.svg b/ras/frontend/static/js/3050433e2767fb821c5d.svg new file mode 100644 index 0000000..b8e4b97 --- /dev/null +++ b/ras/frontend/static/js/3050433e2767fb821c5d.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/314e33c2a444698f4bce.svg b/ras/frontend/static/js/314e33c2a444698f4bce.svg new file mode 100644 index 0000000..0e758a7 --- /dev/null +++ b/ras/frontend/static/js/314e33c2a444698f4bce.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/33069ab84c09c8db0b08.svg b/ras/frontend/static/js/33069ab84c09c8db0b08.svg new file mode 100644 index 0000000..14adbe0 --- /dev/null +++ b/ras/frontend/static/js/33069ab84c09c8db0b08.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ras/frontend/static/js/3328e1660d877378c782.svg b/ras/frontend/static/js/3328e1660d877378c782.svg new file mode 100644 index 0000000..ad2ec34 --- /dev/null +++ b/ras/frontend/static/js/3328e1660d877378c782.svg @@ -0,0 +1,547 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/33482fcd4344b097d6d7.svg b/ras/frontend/static/js/33482fcd4344b097d6d7.svg new file mode 100644 index 0000000..fda0f7b --- /dev/null +++ b/ras/frontend/static/js/33482fcd4344b097d6d7.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/339d25434ca1eaf0ed78.svg b/ras/frontend/static/js/339d25434ca1eaf0ed78.svg new file mode 100644 index 0000000..1697ffe --- /dev/null +++ b/ras/frontend/static/js/339d25434ca1eaf0ed78.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/33b38c329c8eb7d5a366.svg b/ras/frontend/static/js/33b38c329c8eb7d5a366.svg new file mode 100644 index 0000000..354a701 --- /dev/null +++ b/ras/frontend/static/js/33b38c329c8eb7d5a366.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/33cb6bd3598af69a5a6d.svg b/ras/frontend/static/js/33cb6bd3598af69a5a6d.svg new file mode 100644 index 0000000..6d8c64f --- /dev/null +++ b/ras/frontend/static/js/33cb6bd3598af69a5a6d.svg @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/33ce56273543deb46e2c.svg b/ras/frontend/static/js/33ce56273543deb46e2c.svg new file mode 100644 index 0000000..06495b9 --- /dev/null +++ b/ras/frontend/static/js/33ce56273543deb46e2c.svg @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/347b60cf985684d7ea4f.svg b/ras/frontend/static/js/347b60cf985684d7ea4f.svg new file mode 100644 index 0000000..ae81f9d --- /dev/null +++ b/ras/frontend/static/js/347b60cf985684d7ea4f.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/353f8e647a29592d02b3.svg b/ras/frontend/static/js/353f8e647a29592d02b3.svg new file mode 100644 index 0000000..f0977b5 --- /dev/null +++ b/ras/frontend/static/js/353f8e647a29592d02b3.svg @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/35575a14235408993f8d.svg b/ras/frontend/static/js/35575a14235408993f8d.svg new file mode 100644 index 0000000..a9f58e1 --- /dev/null +++ b/ras/frontend/static/js/35575a14235408993f8d.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/363fa0a518e3142cf3d6.svg b/ras/frontend/static/js/363fa0a518e3142cf3d6.svg new file mode 100644 index 0000000..45599e0 --- /dev/null +++ b/ras/frontend/static/js/363fa0a518e3142cf3d6.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/ras/frontend/static/js/3697157a23bdcf5b8c7a.svg b/ras/frontend/static/js/3697157a23bdcf5b8c7a.svg new file mode 100644 index 0000000..d276018 --- /dev/null +++ b/ras/frontend/static/js/3697157a23bdcf5b8c7a.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/36cdd00d34fa3ab9d98a.svg b/ras/frontend/static/js/36cdd00d34fa3ab9d98a.svg new file mode 100644 index 0000000..8060591 --- /dev/null +++ b/ras/frontend/static/js/36cdd00d34fa3ab9d98a.svg @@ -0,0 +1,544 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/37214364557e2b16b8d3.svg b/ras/frontend/static/js/37214364557e2b16b8d3.svg new file mode 100644 index 0000000..84844e0 --- /dev/null +++ b/ras/frontend/static/js/37214364557e2b16b8d3.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/37218829b3a988811a6c.svg b/ras/frontend/static/js/37218829b3a988811a6c.svg new file mode 100644 index 0000000..48d62e3 --- /dev/null +++ b/ras/frontend/static/js/37218829b3a988811a6c.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/3760646934de10679959.svg b/ras/frontend/static/js/3760646934de10679959.svg new file mode 100644 index 0000000..44d3757 --- /dev/null +++ b/ras/frontend/static/js/3760646934de10679959.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/385ac1bdebf6347dcdfe.svg b/ras/frontend/static/js/385ac1bdebf6347dcdfe.svg new file mode 100644 index 0000000..8203148 --- /dev/null +++ b/ras/frontend/static/js/385ac1bdebf6347dcdfe.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/38abe80e0cb9775bea8c.svg b/ras/frontend/static/js/38abe80e0cb9775bea8c.svg new file mode 100644 index 0000000..bbb8f78 --- /dev/null +++ b/ras/frontend/static/js/38abe80e0cb9775bea8c.svg @@ -0,0 +1,244 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/39110f8b63c8b1d373b1.svg b/ras/frontend/static/js/39110f8b63c8b1d373b1.svg new file mode 100644 index 0000000..4dc39f6 --- /dev/null +++ b/ras/frontend/static/js/39110f8b63c8b1d373b1.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/39308d8769d9190bd1aa.svg b/ras/frontend/static/js/39308d8769d9190bd1aa.svg new file mode 100644 index 0000000..57fd98b --- /dev/null +++ b/ras/frontend/static/js/39308d8769d9190bd1aa.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/39b2d063adce92402a54.svg b/ras/frontend/static/js/39b2d063adce92402a54.svg new file mode 100644 index 0000000..6fb2410 --- /dev/null +++ b/ras/frontend/static/js/39b2d063adce92402a54.svg @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + L + + + I + + + B + + + E + + + R + + + T + + + A + + + S + + + + diff --git a/ras/frontend/static/js/3a3eb0f2bf0ffd8f5201.svg b/ras/frontend/static/js/3a3eb0f2bf0ffd8f5201.svg new file mode 100644 index 0000000..92f69e9 --- /dev/null +++ b/ras/frontend/static/js/3a3eb0f2bf0ffd8f5201.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/3a98e97dfe3d47689a4f.svg b/ras/frontend/static/js/3a98e97dfe3d47689a4f.svg new file mode 100644 index 0000000..5ee2c60 --- /dev/null +++ b/ras/frontend/static/js/3a98e97dfe3d47689a4f.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/3aa9ef95cc4630428b29.svg b/ras/frontend/static/js/3aa9ef95cc4630428b29.svg new file mode 100644 index 0000000..4375490 --- /dev/null +++ b/ras/frontend/static/js/3aa9ef95cc4630428b29.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/3af44a6e434c403b3fdd.svg b/ras/frontend/static/js/3af44a6e434c403b3fdd.svg new file mode 100644 index 0000000..069a585 --- /dev/null +++ b/ras/frontend/static/js/3af44a6e434c403b3fdd.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/3af6cc411f5ef6c15c2c.svg b/ras/frontend/static/js/3af6cc411f5ef6c15c2c.svg new file mode 100644 index 0000000..a27c39d --- /dev/null +++ b/ras/frontend/static/js/3af6cc411f5ef6c15c2c.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/3b04534742f8cc2f32bb.svg b/ras/frontend/static/js/3b04534742f8cc2f32bb.svg new file mode 100644 index 0000000..a6497de --- /dev/null +++ b/ras/frontend/static/js/3b04534742f8cc2f32bb.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ras/frontend/static/js/3b3316c4ce37e2097103.svg b/ras/frontend/static/js/3b3316c4ce37e2097103.svg new file mode 100644 index 0000000..6d63ee1 --- /dev/null +++ b/ras/frontend/static/js/3b3316c4ce37e2097103.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/3b8260d491f0ed64b1ad.svg b/ras/frontend/static/js/3b8260d491f0ed64b1ad.svg new file mode 100644 index 0000000..fbd8b86 --- /dev/null +++ b/ras/frontend/static/js/3b8260d491f0ed64b1ad.svg @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/3b9ec59891d962581ef8.svg b/ras/frontend/static/js/3b9ec59891d962581ef8.svg new file mode 100644 index 0000000..5f1c3b7 --- /dev/null +++ b/ras/frontend/static/js/3b9ec59891d962581ef8.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/3ba10c54812d768dc48e.svg b/ras/frontend/static/js/3ba10c54812d768dc48e.svg new file mode 100644 index 0000000..f236724 --- /dev/null +++ b/ras/frontend/static/js/3ba10c54812d768dc48e.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/3c4b4181458260fed9fc.svg b/ras/frontend/static/js/3c4b4181458260fed9fc.svg new file mode 100644 index 0000000..56cc977 --- /dev/null +++ b/ras/frontend/static/js/3c4b4181458260fed9fc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/ras/frontend/static/js/3cb867c4401d5caa5bcf.svg b/ras/frontend/static/js/3cb867c4401d5caa5bcf.svg new file mode 100644 index 0000000..416c0f0 --- /dev/null +++ b/ras/frontend/static/js/3cb867c4401d5caa5bcf.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/3d8e6f49fad8459575e1.svg b/ras/frontend/static/js/3d8e6f49fad8459575e1.svg new file mode 100644 index 0000000..40e16d9 --- /dev/null +++ b/ras/frontend/static/js/3d8e6f49fad8459575e1.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/3ecb625b75ec64be4376.svg b/ras/frontend/static/js/3ecb625b75ec64be4376.svg new file mode 100644 index 0000000..0ae03b7 --- /dev/null +++ b/ras/frontend/static/js/3ecb625b75ec64be4376.svg @@ -0,0 +1,6745 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/3fac313f5a20d93d24be.svg b/ras/frontend/static/js/3fac313f5a20d93d24be.svg new file mode 100644 index 0000000..ddf5330 --- /dev/null +++ b/ras/frontend/static/js/3fac313f5a20d93d24be.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/40be1a31ef7b848a1be7.svg b/ras/frontend/static/js/40be1a31ef7b848a1be7.svg new file mode 100644 index 0000000..51ae9ab --- /dev/null +++ b/ras/frontend/static/js/40be1a31ef7b848a1be7.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ras/frontend/static/js/41929500e241af7a7838.svg b/ras/frontend/static/js/41929500e241af7a7838.svg new file mode 100644 index 0000000..df9a25c --- /dev/null +++ b/ras/frontend/static/js/41929500e241af7a7838.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/41a32059e9a8eb6f1ceb.svg b/ras/frontend/static/js/41a32059e9a8eb6f1ceb.svg new file mode 100644 index 0000000..a98ec2a --- /dev/null +++ b/ras/frontend/static/js/41a32059e9a8eb6f1ceb.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ras/frontend/static/js/41d4956b765a5197a2a7.svg b/ras/frontend/static/js/41d4956b765a5197a2a7.svg new file mode 100644 index 0000000..405d687 --- /dev/null +++ b/ras/frontend/static/js/41d4956b765a5197a2a7.svg @@ -0,0 +1,678 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/42ec1dd14b99f59fe0f2.svg b/ras/frontend/static/js/42ec1dd14b99f59fe0f2.svg new file mode 100644 index 0000000..751c167 --- /dev/null +++ b/ras/frontend/static/js/42ec1dd14b99f59fe0f2.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/43662bddde0a9fad49d9.svg b/ras/frontend/static/js/43662bddde0a9fad49d9.svg new file mode 100644 index 0000000..97d87f4 --- /dev/null +++ b/ras/frontend/static/js/43662bddde0a9fad49d9.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/4388dfb01646ff8dc71d.svg b/ras/frontend/static/js/4388dfb01646ff8dc71d.svg new file mode 100644 index 0000000..b04c3c4 --- /dev/null +++ b/ras/frontend/static/js/4388dfb01646ff8dc71d.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/43b14205fd72b01599c7.svg b/ras/frontend/static/js/43b14205fd72b01599c7.svg new file mode 100644 index 0000000..36783b0 --- /dev/null +++ b/ras/frontend/static/js/43b14205fd72b01599c7.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + G + + + U + + + A + + + M + + + + + + + + G + + + U + + + A + + + M + + diff --git a/ras/frontend/static/js/442e700de324c517fda8.svg b/ras/frontend/static/js/442e700de324c517fda8.svg new file mode 100644 index 0000000..9e0aeeb --- /dev/null +++ b/ras/frontend/static/js/442e700de324c517fda8.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/45463ee6f9675e59c293.svg b/ras/frontend/static/js/45463ee6f9675e59c293.svg new file mode 100644 index 0000000..0ca3596 --- /dev/null +++ b/ras/frontend/static/js/45463ee6f9675e59c293.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ras/frontend/static/js/4549a2d2d66577e077c9.svg b/ras/frontend/static/js/4549a2d2d66577e077c9.svg new file mode 100644 index 0000000..6b8e344 --- /dev/null +++ b/ras/frontend/static/js/4549a2d2d66577e077c9.svg @@ -0,0 +1,4 @@ + + + + diff --git a/ras/frontend/static/js/45854c457a1d150934b5.svg b/ras/frontend/static/js/45854c457a1d150934b5.svg new file mode 100644 index 0000000..e71cd92 --- /dev/null +++ b/ras/frontend/static/js/45854c457a1d150934b5.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/468d5464b2219b1bb922.svg b/ras/frontend/static/js/468d5464b2219b1bb922.svg new file mode 100644 index 0000000..82d7a3b --- /dev/null +++ b/ras/frontend/static/js/468d5464b2219b1bb922.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/ras/frontend/static/js/468d80d14bc0084d5c04.svg b/ras/frontend/static/js/468d80d14bc0084d5c04.svg new file mode 100644 index 0000000..c16b641 --- /dev/null +++ b/ras/frontend/static/js/468d80d14bc0084d5c04.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/471093dd27006e1affb7.svg b/ras/frontend/static/js/471093dd27006e1affb7.svg new file mode 100644 index 0000000..35c3db7 --- /dev/null +++ b/ras/frontend/static/js/471093dd27006e1affb7.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ras/frontend/static/js/479622e6f02e13aaf235.svg b/ras/frontend/static/js/479622e6f02e13aaf235.svg new file mode 100644 index 0000000..4219195 --- /dev/null +++ b/ras/frontend/static/js/479622e6f02e13aaf235.svg @@ -0,0 +1,382 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/4917cb53c94d712037f8.svg b/ras/frontend/static/js/4917cb53c94d712037f8.svg new file mode 100644 index 0000000..5aa6ccf --- /dev/null +++ b/ras/frontend/static/js/4917cb53c94d712037f8.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/4abd7bc95cbecde943cc.svg b/ras/frontend/static/js/4abd7bc95cbecde943cc.svg new file mode 100644 index 0000000..6e15fd0 --- /dev/null +++ b/ras/frontend/static/js/4abd7bc95cbecde943cc.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ras/frontend/static/js/4b2b84595a3a317f733a.svg b/ras/frontend/static/js/4b2b84595a3a317f733a.svg new file mode 100644 index 0000000..ae0f57a --- /dev/null +++ b/ras/frontend/static/js/4b2b84595a3a317f733a.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/4b82821f4a615f2d8c26.svg b/ras/frontend/static/js/4b82821f4a615f2d8c26.svg new file mode 100644 index 0000000..e106ddd --- /dev/null +++ b/ras/frontend/static/js/4b82821f4a615f2d8c26.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ras/frontend/static/js/4c009c916e4eafb0debd.svg b/ras/frontend/static/js/4c009c916e4eafb0debd.svg new file mode 100644 index 0000000..563c97b --- /dev/null +++ b/ras/frontend/static/js/4c009c916e4eafb0debd.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/4c57e6cbe13c574dcede.svg b/ras/frontend/static/js/4c57e6cbe13c574dcede.svg new file mode 100644 index 0000000..8d25ee3 --- /dev/null +++ b/ras/frontend/static/js/4c57e6cbe13c574dcede.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/4caa210d7c5288e95062.svg b/ras/frontend/static/js/4caa210d7c5288e95062.svg new file mode 100644 index 0000000..3a1e55b --- /dev/null +++ b/ras/frontend/static/js/4caa210d7c5288e95062.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/4d3a6f5c2bd6a436e6a1.svg b/ras/frontend/static/js/4d3a6f5c2bd6a436e6a1.svg new file mode 100644 index 0000000..8041667 --- /dev/null +++ b/ras/frontend/static/js/4d3a6f5c2bd6a436e6a1.svg @@ -0,0 +1,4 @@ + + + + diff --git a/ras/frontend/static/js/4ded667616cee76fc78c.svg b/ras/frontend/static/js/4ded667616cee76fc78c.svg new file mode 100644 index 0000000..0a9dfeb --- /dev/null +++ b/ras/frontend/static/js/4ded667616cee76fc78c.svg @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/4e42399a0ba45809df5b.svg b/ras/frontend/static/js/4e42399a0ba45809df5b.svg new file mode 100644 index 0000000..a688ab9 --- /dev/null +++ b/ras/frontend/static/js/4e42399a0ba45809df5b.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/4e8d72f968ec26604a65.svg b/ras/frontend/static/js/4e8d72f968ec26604a65.svg new file mode 100644 index 0000000..2705295 --- /dev/null +++ b/ras/frontend/static/js/4e8d72f968ec26604a65.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/ras/frontend/static/js/4e99cb8a463bcacc8f91.svg b/ras/frontend/static/js/4e99cb8a463bcacc8f91.svg new file mode 100644 index 0000000..91c9659 --- /dev/null +++ b/ras/frontend/static/js/4e99cb8a463bcacc8f91.svg @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/4f2a386915b0a53e269f.svg b/ras/frontend/static/js/4f2a386915b0a53e269f.svg new file mode 100644 index 0000000..73906f3 --- /dev/null +++ b/ras/frontend/static/js/4f2a386915b0a53e269f.svg @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/4fde2ed612a6a2f9ff03.svg b/ras/frontend/static/js/4fde2ed612a6a2f9ff03.svg new file mode 100644 index 0000000..0c2ff9f --- /dev/null +++ b/ras/frontend/static/js/4fde2ed612a6a2f9ff03.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/ras/frontend/static/js/500d420982feb8a67cbc.svg b/ras/frontend/static/js/500d420982feb8a67cbc.svg new file mode 100644 index 0000000..81e6ee2 --- /dev/null +++ b/ras/frontend/static/js/500d420982feb8a67cbc.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/510d0a3c130d94bfd139.svg b/ras/frontend/static/js/510d0a3c130d94bfd139.svg new file mode 100644 index 0000000..94bc8e1 --- /dev/null +++ b/ras/frontend/static/js/510d0a3c130d94bfd139.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/513d1e4632edd7b884c6.svg b/ras/frontend/static/js/513d1e4632edd7b884c6.svg new file mode 100644 index 0000000..19f15fa --- /dev/null +++ b/ras/frontend/static/js/513d1e4632edd7b884c6.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/516897fd3988e35032b7.svg b/ras/frontend/static/js/516897fd3988e35032b7.svg new file mode 100644 index 0000000..dbac25e --- /dev/null +++ b/ras/frontend/static/js/516897fd3988e35032b7.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/519dcaf5e34eb209bc59.svg b/ras/frontend/static/js/519dcaf5e34eb209bc59.svg new file mode 100644 index 0000000..e019ab8 --- /dev/null +++ b/ras/frontend/static/js/519dcaf5e34eb209bc59.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/51a82d50a7e3633fe39c.svg b/ras/frontend/static/js/51a82d50a7e3633fe39c.svg new file mode 100644 index 0000000..c4f9d7b --- /dev/null +++ b/ras/frontend/static/js/51a82d50a7e3633fe39c.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/5217cbc3b14b1f23840f.svg b/ras/frontend/static/js/5217cbc3b14b1f23840f.svg new file mode 100644 index 0000000..096603d --- /dev/null +++ b/ras/frontend/static/js/5217cbc3b14b1f23840f.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/525b13720883d5b9fdd2.svg b/ras/frontend/static/js/525b13720883d5b9fdd2.svg new file mode 100644 index 0000000..279f639 --- /dev/null +++ b/ras/frontend/static/js/525b13720883d5b9fdd2.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/527af4b76be5bd7e890a.svg b/ras/frontend/static/js/527af4b76be5bd7e890a.svg new file mode 100644 index 0000000..5080291 --- /dev/null +++ b/ras/frontend/static/js/527af4b76be5bd7e890a.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/527eff5cdc00fa23f06f.svg b/ras/frontend/static/js/527eff5cdc00fa23f06f.svg new file mode 100644 index 0000000..513be43 --- /dev/null +++ b/ras/frontend/static/js/527eff5cdc00fa23f06f.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/52e1a836ab19668f7052.svg b/ras/frontend/static/js/52e1a836ab19668f7052.svg new file mode 100644 index 0000000..85bee56 --- /dev/null +++ b/ras/frontend/static/js/52e1a836ab19668f7052.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/52e5fa9d44c086c8bca4.svg b/ras/frontend/static/js/52e5fa9d44c086c8bca4.svg new file mode 100644 index 0000000..281d738 --- /dev/null +++ b/ras/frontend/static/js/52e5fa9d44c086c8bca4.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/54426acb27779ea944ea.svg b/ras/frontend/static/js/54426acb27779ea944ea.svg new file mode 100644 index 0000000..d7d85b0 --- /dev/null +++ b/ras/frontend/static/js/54426acb27779ea944ea.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/ras/frontend/static/js/56f55773ec3ffb245496.svg b/ras/frontend/static/js/56f55773ec3ffb245496.svg new file mode 100644 index 0000000..27bc318 --- /dev/null +++ b/ras/frontend/static/js/56f55773ec3ffb245496.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/5744860e2b32d35e322c.svg b/ras/frontend/static/js/5744860e2b32d35e322c.svg new file mode 100644 index 0000000..3660d80 --- /dev/null +++ b/ras/frontend/static/js/5744860e2b32d35e322c.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/ras/frontend/static/js/57c6d2b86e5206f4847a.svg b/ras/frontend/static/js/57c6d2b86e5206f4847a.svg new file mode 100644 index 0000000..9bb0ce6 --- /dev/null +++ b/ras/frontend/static/js/57c6d2b86e5206f4847a.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/5833f1365defb17730fc.svg b/ras/frontend/static/js/5833f1365defb17730fc.svg new file mode 100644 index 0000000..32cabd5 --- /dev/null +++ b/ras/frontend/static/js/5833f1365defb17730fc.svg @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/593507644b4be0c259ff.svg b/ras/frontend/static/js/593507644b4be0c259ff.svg new file mode 100644 index 0000000..965dd03 --- /dev/null +++ b/ras/frontend/static/js/593507644b4be0c259ff.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/59939c4b1077f359a254.svg b/ras/frontend/static/js/59939c4b1077f359a254.svg new file mode 100644 index 0000000..258cb01 --- /dev/null +++ b/ras/frontend/static/js/59939c4b1077f359a254.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/59ba382068ede80f9cb0.svg b/ras/frontend/static/js/59ba382068ede80f9cb0.svg new file mode 100644 index 0000000..dee203d --- /dev/null +++ b/ras/frontend/static/js/59ba382068ede80f9cb0.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ras/frontend/static/js/5a24757d105fbe7a4e81.svg b/ras/frontend/static/js/5a24757d105fbe7a4e81.svg new file mode 100644 index 0000000..7913de3 --- /dev/null +++ b/ras/frontend/static/js/5a24757d105fbe7a4e81.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ras/frontend/static/js/5a79810b09a06d579ead.svg b/ras/frontend/static/js/5a79810b09a06d579ead.svg new file mode 100644 index 0000000..c3c9bbe --- /dev/null +++ b/ras/frontend/static/js/5a79810b09a06d579ead.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ras/frontend/static/js/5b3a82a296b071e1440a.svg b/ras/frontend/static/js/5b3a82a296b071e1440a.svg new file mode 100644 index 0000000..31b9723 --- /dev/null +++ b/ras/frontend/static/js/5b3a82a296b071e1440a.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/5c7cbb32d630f7d2f658.svg b/ras/frontend/static/js/5c7cbb32d630f7d2f658.svg new file mode 100644 index 0000000..65bab13 --- /dev/null +++ b/ras/frontend/static/js/5c7cbb32d630f7d2f658.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ras/frontend/static/js/5cc309bf03b8035d8bdb.svg b/ras/frontend/static/js/5cc309bf03b8035d8bdb.svg new file mode 100644 index 0000000..c4457de --- /dev/null +++ b/ras/frontend/static/js/5cc309bf03b8035d8bdb.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/5d2dde7343ab4f202890.svg b/ras/frontend/static/js/5d2dde7343ab4f202890.svg new file mode 100644 index 0000000..7c0673d --- /dev/null +++ b/ras/frontend/static/js/5d2dde7343ab4f202890.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/ras/frontend/static/js/5e19099caf3daa730ce5.svg b/ras/frontend/static/js/5e19099caf3daa730ce5.svg new file mode 100644 index 0000000..e531e23 --- /dev/null +++ b/ras/frontend/static/js/5e19099caf3daa730ce5.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/5e8518f9c48a90941d02.svg b/ras/frontend/static/js/5e8518f9c48a90941d02.svg new file mode 100644 index 0000000..44d38cc --- /dev/null +++ b/ras/frontend/static/js/5e8518f9c48a90941d02.svg @@ -0,0 +1,4 @@ + + + + diff --git a/ras/frontend/static/js/5edc6d75a73111158da1.svg b/ras/frontend/static/js/5edc6d75a73111158da1.svg new file mode 100644 index 0000000..f50cd32 --- /dev/null +++ b/ras/frontend/static/js/5edc6d75a73111158da1.svg @@ -0,0 +1,4 @@ + + + + diff --git a/ras/frontend/static/js/5ef17b2e2f89d5d559b9.svg b/ras/frontend/static/js/5ef17b2e2f89d5d559b9.svg new file mode 100644 index 0000000..01bf251 --- /dev/null +++ b/ras/frontend/static/js/5ef17b2e2f89d5d559b9.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/5ffa25ce96dad1a8c4dc.svg b/ras/frontend/static/js/5ffa25ce96dad1a8c4dc.svg new file mode 100644 index 0000000..4736319 --- /dev/null +++ b/ras/frontend/static/js/5ffa25ce96dad1a8c4dc.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ras/frontend/static/js/605c7dc7517a1cb0511d.svg b/ras/frontend/static/js/605c7dc7517a1cb0511d.svg new file mode 100644 index 0000000..d170120 --- /dev/null +++ b/ras/frontend/static/js/605c7dc7517a1cb0511d.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/60eab759c4bdba38ab46.svg b/ras/frontend/static/js/60eab759c4bdba38ab46.svg new file mode 100644 index 0000000..16374f3 --- /dev/null +++ b/ras/frontend/static/js/60eab759c4bdba38ab46.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/61157f3ae7c4ea089986.svg b/ras/frontend/static/js/61157f3ae7c4ea089986.svg new file mode 100644 index 0000000..ba16c34 --- /dev/null +++ b/ras/frontend/static/js/61157f3ae7c4ea089986.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/61822620fbdca0ced26f.svg b/ras/frontend/static/js/61822620fbdca0ced26f.svg new file mode 100644 index 0000000..046399b --- /dev/null +++ b/ras/frontend/static/js/61822620fbdca0ced26f.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/61ac9a09d717c6899190.svg b/ras/frontend/static/js/61ac9a09d717c6899190.svg new file mode 100644 index 0000000..d6c2ab4 --- /dev/null +++ b/ras/frontend/static/js/61ac9a09d717c6899190.svg @@ -0,0 +1,203 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/621c3ad6350a59e282ba.svg b/ras/frontend/static/js/621c3ad6350a59e282ba.svg new file mode 100644 index 0000000..f18731d --- /dev/null +++ b/ras/frontend/static/js/621c3ad6350a59e282ba.svg @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/62c94980596e2af8b861.svg b/ras/frontend/static/js/62c94980596e2af8b861.svg new file mode 100644 index 0000000..8413969 --- /dev/null +++ b/ras/frontend/static/js/62c94980596e2af8b861.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/633d308e7df9c5abcb89.svg b/ras/frontend/static/js/633d308e7df9c5abcb89.svg new file mode 100644 index 0000000..eb5a52e --- /dev/null +++ b/ras/frontend/static/js/633d308e7df9c5abcb89.svg @@ -0,0 +1,4 @@ + + + + diff --git a/ras/frontend/static/js/636e9ed727bb8f644964.svg b/ras/frontend/static/js/636e9ed727bb8f644964.svg new file mode 100644 index 0000000..56d62c3 --- /dev/null +++ b/ras/frontend/static/js/636e9ed727bb8f644964.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/637cad1d9f490bd27b72.svg b/ras/frontend/static/js/637cad1d9f490bd27b72.svg new file mode 100644 index 0000000..d557d31 --- /dev/null +++ b/ras/frontend/static/js/637cad1d9f490bd27b72.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/6435bf24d148ca7248e7.svg b/ras/frontend/static/js/6435bf24d148ca7248e7.svg new file mode 100644 index 0000000..b08334b --- /dev/null +++ b/ras/frontend/static/js/6435bf24d148ca7248e7.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ras/frontend/static/js/644f2f1af4cc82620b9c.svg b/ras/frontend/static/js/644f2f1af4cc82620b9c.svg new file mode 100644 index 0000000..9723a78 --- /dev/null +++ b/ras/frontend/static/js/644f2f1af4cc82620b9c.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/ras/frontend/static/js/64f19246b47680747fcb.svg b/ras/frontend/static/js/64f19246b47680747fcb.svg new file mode 100644 index 0000000..9eb9e06 --- /dev/null +++ b/ras/frontend/static/js/64f19246b47680747fcb.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/650be7bf6524161dd3fb.svg b/ras/frontend/static/js/650be7bf6524161dd3fb.svg new file mode 100644 index 0000000..5804bfe --- /dev/null +++ b/ras/frontend/static/js/650be7bf6524161dd3fb.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/650f6d2f12e900e69c10.svg b/ras/frontend/static/js/650f6d2f12e900e69c10.svg new file mode 100644 index 0000000..a420928 --- /dev/null +++ b/ras/frontend/static/js/650f6d2f12e900e69c10.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/6569311e37bb6e956315.svg b/ras/frontend/static/js/6569311e37bb6e956315.svg new file mode 100644 index 0000000..85fcad2 --- /dev/null +++ b/ras/frontend/static/js/6569311e37bb6e956315.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/65edeaef7dabb0abc834.svg b/ras/frontend/static/js/65edeaef7dabb0abc834.svg new file mode 100644 index 0000000..40d6ad4 --- /dev/null +++ b/ras/frontend/static/js/65edeaef7dabb0abc834.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/65f6eee5fd80394c659f.svg b/ras/frontend/static/js/65f6eee5fd80394c659f.svg new file mode 100644 index 0000000..73804d8 --- /dev/null +++ b/ras/frontend/static/js/65f6eee5fd80394c659f.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/ras/frontend/static/js/65fecda00937aa8b6917.svg b/ras/frontend/static/js/65fecda00937aa8b6917.svg new file mode 100644 index 0000000..41d87d9 --- /dev/null +++ b/ras/frontend/static/js/65fecda00937aa8b6917.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/669fb6af01d040686c75.svg b/ras/frontend/static/js/669fb6af01d040686c75.svg new file mode 100644 index 0000000..6cbe9b7 --- /dev/null +++ b/ras/frontend/static/js/669fb6af01d040686c75.svg @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/66cb0cd9e54d34e883f1.svg b/ras/frontend/static/js/66cb0cd9e54d34e883f1.svg new file mode 100644 index 0000000..a96b027 --- /dev/null +++ b/ras/frontend/static/js/66cb0cd9e54d34e883f1.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ras/frontend/static/js/66cdc56cf5c323535418.svg b/ras/frontend/static/js/66cdc56cf5c323535418.svg new file mode 100644 index 0000000..65550d9 --- /dev/null +++ b/ras/frontend/static/js/66cdc56cf5c323535418.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/6734a27a2f2a54332a4c.svg b/ras/frontend/static/js/6734a27a2f2a54332a4c.svg new file mode 100644 index 0000000..aa33c93 --- /dev/null +++ b/ras/frontend/static/js/6734a27a2f2a54332a4c.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ras/frontend/static/js/676246527fe04242f0f7.svg b/ras/frontend/static/js/676246527fe04242f0f7.svg new file mode 100644 index 0000000..8abcd25 --- /dev/null +++ b/ras/frontend/static/js/676246527fe04242f0f7.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ras/frontend/static/js/67bb215c4226cd5a32aa.svg b/ras/frontend/static/js/67bb215c4226cd5a32aa.svg new file mode 100644 index 0000000..61f0ed6 --- /dev/null +++ b/ras/frontend/static/js/67bb215c4226cd5a32aa.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/67ef6063455e2ea7d8b4.svg b/ras/frontend/static/js/67ef6063455e2ea7d8b4.svg new file mode 100644 index 0000000..64d2b79 --- /dev/null +++ b/ras/frontend/static/js/67ef6063455e2ea7d8b4.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/68092d4110fca98beb03.svg b/ras/frontend/static/js/68092d4110fca98beb03.svg new file mode 100644 index 0000000..9af57ea --- /dev/null +++ b/ras/frontend/static/js/68092d4110fca98beb03.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/6a0212390ef38b81c19a.svg b/ras/frontend/static/js/6a0212390ef38b81c19a.svg new file mode 100644 index 0000000..43cdb97 --- /dev/null +++ b/ras/frontend/static/js/6a0212390ef38b81c19a.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/6bd5eda73cbc171baedb.svg b/ras/frontend/static/js/6bd5eda73cbc171baedb.svg new file mode 100644 index 0000000..6674373 --- /dev/null +++ b/ras/frontend/static/js/6bd5eda73cbc171baedb.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/6c7f20b675f0fa8025dc.svg b/ras/frontend/static/js/6c7f20b675f0fa8025dc.svg new file mode 100644 index 0000000..3fb086e --- /dev/null +++ b/ras/frontend/static/js/6c7f20b675f0fa8025dc.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/6d757067ccc276327b1b.svg b/ras/frontend/static/js/6d757067ccc276327b1b.svg new file mode 100644 index 0000000..e6cf0f6 --- /dev/null +++ b/ras/frontend/static/js/6d757067ccc276327b1b.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/6e4caca46e637e40175f.svg b/ras/frontend/static/js/6e4caca46e637e40175f.svg new file mode 100644 index 0000000..8fe9d66 --- /dev/null +++ b/ras/frontend/static/js/6e4caca46e637e40175f.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/6fde2eb438bcef1efc2d.svg b/ras/frontend/static/js/6fde2eb438bcef1efc2d.svg new file mode 100644 index 0000000..28feeba --- /dev/null +++ b/ras/frontend/static/js/6fde2eb438bcef1efc2d.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/6fe6e076d9928ca834ff.svg b/ras/frontend/static/js/6fe6e076d9928ca834ff.svg new file mode 100644 index 0000000..5fdb276 --- /dev/null +++ b/ras/frontend/static/js/6fe6e076d9928ca834ff.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/705b1348460b1291d937.svg b/ras/frontend/static/js/705b1348460b1291d937.svg new file mode 100644 index 0000000..66be6b1 --- /dev/null +++ b/ras/frontend/static/js/705b1348460b1291d937.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/ras/frontend/static/js/70cddc03fbf97161a7da.svg b/ras/frontend/static/js/70cddc03fbf97161a7da.svg new file mode 100644 index 0000000..e6ead0c --- /dev/null +++ b/ras/frontend/static/js/70cddc03fbf97161a7da.svg @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/7111b15215671c0cabae.svg b/ras/frontend/static/js/7111b15215671c0cabae.svg new file mode 100644 index 0000000..ecb9c79 --- /dev/null +++ b/ras/frontend/static/js/7111b15215671c0cabae.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/714032582a0c72e2f954.svg b/ras/frontend/static/js/714032582a0c72e2f954.svg new file mode 100644 index 0000000..d584def --- /dev/null +++ b/ras/frontend/static/js/714032582a0c72e2f954.svg @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/7248ade59c2b54a0a348.svg b/ras/frontend/static/js/7248ade59c2b54a0a348.svg new file mode 100644 index 0000000..1080add --- /dev/null +++ b/ras/frontend/static/js/7248ade59c2b54a0a348.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ras/frontend/static/js/728fd219af713f367b10.svg b/ras/frontend/static/js/728fd219af713f367b10.svg new file mode 100644 index 0000000..8b66486 --- /dev/null +++ b/ras/frontend/static/js/728fd219af713f367b10.svg @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/751c8f87270b925c26c4.svg b/ras/frontend/static/js/751c8f87270b925c26c4.svg new file mode 100644 index 0000000..78b6dba --- /dev/null +++ b/ras/frontend/static/js/751c8f87270b925c26c4.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/7548e5caee7b970d0859.svg b/ras/frontend/static/js/7548e5caee7b970d0859.svg new file mode 100644 index 0000000..b2590d9 --- /dev/null +++ b/ras/frontend/static/js/7548e5caee7b970d0859.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/75ec39aa6b6ab11f8440.svg b/ras/frontend/static/js/75ec39aa6b6ab11f8440.svg new file mode 100644 index 0000000..ece63ea --- /dev/null +++ b/ras/frontend/static/js/75ec39aa6b6ab11f8440.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/75fc073be5d2be7053e2.svg b/ras/frontend/static/js/75fc073be5d2be7053e2.svg new file mode 100644 index 0000000..114995e --- /dev/null +++ b/ras/frontend/static/js/75fc073be5d2be7053e2.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/76481cf550e4750b105c.svg b/ras/frontend/static/js/76481cf550e4750b105c.svg new file mode 100644 index 0000000..c3a9225 --- /dev/null +++ b/ras/frontend/static/js/76481cf550e4750b105c.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/ras/frontend/static/js/76e9c18194c0d37b56c0.svg b/ras/frontend/static/js/76e9c18194c0d37b56c0.svg new file mode 100644 index 0000000..ecb2fa7 --- /dev/null +++ b/ras/frontend/static/js/76e9c18194c0d37b56c0.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ras/frontend/static/js/77f4eddb484b8f32d38a.svg b/ras/frontend/static/js/77f4eddb484b8f32d38a.svg new file mode 100644 index 0000000..d4e878f --- /dev/null +++ b/ras/frontend/static/js/77f4eddb484b8f32d38a.svg @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/785c24b7349ff3963bf9.svg b/ras/frontend/static/js/785c24b7349ff3963bf9.svg new file mode 100644 index 0000000..ad190f5 --- /dev/null +++ b/ras/frontend/static/js/785c24b7349ff3963bf9.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/795bcfa73f67bb1c7448.svg b/ras/frontend/static/js/795bcfa73f67bb1c7448.svg new file mode 100644 index 0000000..d6a35d0 --- /dev/null +++ b/ras/frontend/static/js/795bcfa73f67bb1c7448.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + G + + + U + + + A + + + M + + + + + + + + G + + + U + + + A + + + M + + diff --git a/ras/frontend/static/js/7979dcf65e35682bcb8c.svg b/ras/frontend/static/js/7979dcf65e35682bcb8c.svg new file mode 100644 index 0000000..9cddb29 --- /dev/null +++ b/ras/frontend/static/js/7979dcf65e35682bcb8c.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/7988830715c23c9d75b8.svg b/ras/frontend/static/js/7988830715c23c9d75b8.svg new file mode 100644 index 0000000..e47b4cd --- /dev/null +++ b/ras/frontend/static/js/7988830715c23c9d75b8.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/ras/frontend/static/js/7a8858e71522f3d9d56e.svg b/ras/frontend/static/js/7a8858e71522f3d9d56e.svg new file mode 100644 index 0000000..6891785 --- /dev/null +++ b/ras/frontend/static/js/7a8858e71522f3d9d56e.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/ras/frontend/static/js/7ac7d1c95113e30046c9.svg b/ras/frontend/static/js/7ac7d1c95113e30046c9.svg new file mode 100644 index 0000000..d39c7f6 --- /dev/null +++ b/ras/frontend/static/js/7ac7d1c95113e30046c9.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/ras/frontend/static/js/7ad1635f6a2e05857a9f.svg b/ras/frontend/static/js/7ad1635f6a2e05857a9f.svg new file mode 100644 index 0000000..f347db9 --- /dev/null +++ b/ras/frontend/static/js/7ad1635f6a2e05857a9f.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/ras/frontend/static/js/7b249f565cc9aa70b36b.svg b/ras/frontend/static/js/7b249f565cc9aa70b36b.svg new file mode 100644 index 0000000..ee48fed --- /dev/null +++ b/ras/frontend/static/js/7b249f565cc9aa70b36b.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ras/frontend/static/js/7bce3122dd358a8489b5.svg b/ras/frontend/static/js/7bce3122dd358a8489b5.svg new file mode 100644 index 0000000..7146041 --- /dev/null +++ b/ras/frontend/static/js/7bce3122dd358a8489b5.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/7c11a8ad56937ca0487c.svg b/ras/frontend/static/js/7c11a8ad56937ca0487c.svg new file mode 100644 index 0000000..717ee20 --- /dev/null +++ b/ras/frontend/static/js/7c11a8ad56937ca0487c.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/ras/frontend/static/js/7d1693275c588cea2fe8.svg b/ras/frontend/static/js/7d1693275c588cea2fe8.svg new file mode 100644 index 0000000..65b7885 --- /dev/null +++ b/ras/frontend/static/js/7d1693275c588cea2fe8.svg @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/7d7825c9680bf4c7a1cd.svg b/ras/frontend/static/js/7d7825c9680bf4c7a1cd.svg new file mode 100644 index 0000000..31ad046 --- /dev/null +++ b/ras/frontend/static/js/7d7825c9680bf4c7a1cd.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/7e04b988972d41f5c369.svg b/ras/frontend/static/js/7e04b988972d41f5c369.svg new file mode 100644 index 0000000..f4d27ef --- /dev/null +++ b/ras/frontend/static/js/7e04b988972d41f5c369.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/7e46f9f6fb3767adf481.svg b/ras/frontend/static/js/7e46f9f6fb3767adf481.svg new file mode 100644 index 0000000..799702e --- /dev/null +++ b/ras/frontend/static/js/7e46f9f6fb3767adf481.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/7fdcd500420537104db1.svg b/ras/frontend/static/js/7fdcd500420537104db1.svg new file mode 100644 index 0000000..418da77 --- /dev/null +++ b/ras/frontend/static/js/7fdcd500420537104db1.svg @@ -0,0 +1,219 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/801b5ef1f9bb57d51f68.svg b/ras/frontend/static/js/801b5ef1f9bb57d51f68.svg new file mode 100644 index 0000000..eee8d71 --- /dev/null +++ b/ras/frontend/static/js/801b5ef1f9bb57d51f68.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ras/frontend/static/js/80b47cd2f50d288d53b6.svg b/ras/frontend/static/js/80b47cd2f50d288d53b6.svg new file mode 100644 index 0000000..f4d9b8a --- /dev/null +++ b/ras/frontend/static/js/80b47cd2f50d288d53b6.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ras/frontend/static/js/80c6f8ab84839cdf4618.svg b/ras/frontend/static/js/80c6f8ab84839cdf4618.svg new file mode 100644 index 0000000..371c8d9 --- /dev/null +++ b/ras/frontend/static/js/80c6f8ab84839cdf4618.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/820198475abf3ac224f3.svg b/ras/frontend/static/js/820198475abf3ac224f3.svg new file mode 100644 index 0000000..3d77716 --- /dev/null +++ b/ras/frontend/static/js/820198475abf3ac224f3.svg @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/82c3626f7a2a329d1397.svg b/ras/frontend/static/js/82c3626f7a2a329d1397.svg new file mode 100644 index 0000000..39a82b8 --- /dev/null +++ b/ras/frontend/static/js/82c3626f7a2a329d1397.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ras/frontend/static/js/83395f32486800ebce5e.svg b/ras/frontend/static/js/83395f32486800ebce5e.svg new file mode 100644 index 0000000..24bfd45 --- /dev/null +++ b/ras/frontend/static/js/83395f32486800ebce5e.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ras/frontend/static/js/837e64d2a14911c7380d.svg b/ras/frontend/static/js/837e64d2a14911c7380d.svg new file mode 100644 index 0000000..f14bede --- /dev/null +++ b/ras/frontend/static/js/837e64d2a14911c7380d.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + L + + + I + + + B + + + E + + + R + + + T + + + A + + + S + + + + diff --git a/ras/frontend/static/js/83c32d57b8256fb3a1fe.svg b/ras/frontend/static/js/83c32d57b8256fb3a1fe.svg new file mode 100644 index 0000000..84c77b4 --- /dev/null +++ b/ras/frontend/static/js/83c32d57b8256fb3a1fe.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/83f603448a9e984610b0.svg b/ras/frontend/static/js/83f603448a9e984610b0.svg new file mode 100644 index 0000000..fcd1891 --- /dev/null +++ b/ras/frontend/static/js/83f603448a9e984610b0.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/ras/frontend/static/js/8406691444ff98ee33d4.svg b/ras/frontend/static/js/8406691444ff98ee33d4.svg new file mode 100644 index 0000000..ccb5ff1 --- /dev/null +++ b/ras/frontend/static/js/8406691444ff98ee33d4.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ras/frontend/static/js/840cd355c0fbd02b11c7.svg b/ras/frontend/static/js/840cd355c0fbd02b11c7.svg new file mode 100644 index 0000000..a1c8db0 --- /dev/null +++ b/ras/frontend/static/js/840cd355c0fbd02b11c7.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/85e3a69fb3e37092626f.svg b/ras/frontend/static/js/85e3a69fb3e37092626f.svg new file mode 100644 index 0000000..5c46846 --- /dev/null +++ b/ras/frontend/static/js/85e3a69fb3e37092626f.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ras/frontend/static/js/85eb7e0d4ea914241924.svg b/ras/frontend/static/js/85eb7e0d4ea914241924.svg new file mode 100644 index 0000000..8e98781 --- /dev/null +++ b/ras/frontend/static/js/85eb7e0d4ea914241924.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/864bd087d50f237db5ce.svg b/ras/frontend/static/js/864bd087d50f237db5ce.svg new file mode 100644 index 0000000..b8fdd63 --- /dev/null +++ b/ras/frontend/static/js/864bd087d50f237db5ce.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/8659812291825552ed13.svg b/ras/frontend/static/js/8659812291825552ed13.svg new file mode 100644 index 0000000..8dc03bc --- /dev/null +++ b/ras/frontend/static/js/8659812291825552ed13.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/867207fe83a99a3b9b95.svg b/ras/frontend/static/js/867207fe83a99a3b9b95.svg new file mode 100644 index 0000000..5f2822d --- /dev/null +++ b/ras/frontend/static/js/867207fe83a99a3b9b95.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/86eec27b4d685f067ab5.svg b/ras/frontend/static/js/86eec27b4d685f067ab5.svg new file mode 100644 index 0000000..14abcb2 --- /dev/null +++ b/ras/frontend/static/js/86eec27b4d685f067ab5.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/8752853c28f0a87ccefb.svg b/ras/frontend/static/js/8752853c28f0a87ccefb.svg new file mode 100644 index 0000000..09204dc --- /dev/null +++ b/ras/frontend/static/js/8752853c28f0a87ccefb.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ras/frontend/static/js/877b33447e5924f4f246.svg b/ras/frontend/static/js/877b33447e5924f4f246.svg new file mode 100644 index 0000000..7d82ddf --- /dev/null +++ b/ras/frontend/static/js/877b33447e5924f4f246.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ras/frontend/static/js/884e7f97a321e3dda410.svg b/ras/frontend/static/js/884e7f97a321e3dda410.svg new file mode 100644 index 0000000..5af883c --- /dev/null +++ b/ras/frontend/static/js/884e7f97a321e3dda410.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ras/frontend/static/js/88ba0b0a7e48ec71eca8.svg b/ras/frontend/static/js/88ba0b0a7e48ec71eca8.svg new file mode 100644 index 0000000..bc55bc3 --- /dev/null +++ b/ras/frontend/static/js/88ba0b0a7e48ec71eca8.svg @@ -0,0 +1,676 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/89adf2b0737e6987f658.svg b/ras/frontend/static/js/89adf2b0737e6987f658.svg new file mode 100644 index 0000000..ded225d --- /dev/null +++ b/ras/frontend/static/js/89adf2b0737e6987f658.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/89b8c8af46eef412f1cd.svg b/ras/frontend/static/js/89b8c8af46eef412f1cd.svg new file mode 100644 index 0000000..70115ae --- /dev/null +++ b/ras/frontend/static/js/89b8c8af46eef412f1cd.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/89cefa3814d2f748b377.svg b/ras/frontend/static/js/89cefa3814d2f748b377.svg new file mode 100644 index 0000000..63ed21c --- /dev/null +++ b/ras/frontend/static/js/89cefa3814d2f748b377.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/8a3f7e5746121293a7c1.svg b/ras/frontend/static/js/8a3f7e5746121293a7c1.svg new file mode 100644 index 0000000..58d87e7 --- /dev/null +++ b/ras/frontend/static/js/8a3f7e5746121293a7c1.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ras/frontend/static/js/8a405db0d230f726cb0c.svg b/ras/frontend/static/js/8a405db0d230f726cb0c.svg new file mode 100644 index 0000000..909ce19 --- /dev/null +++ b/ras/frontend/static/js/8a405db0d230f726cb0c.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/8a6f511c5d92ba7a258c.svg b/ras/frontend/static/js/8a6f511c5d92ba7a258c.svg new file mode 100644 index 0000000..50065c4 --- /dev/null +++ b/ras/frontend/static/js/8a6f511c5d92ba7a258c.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/8b629e7bf137abf1643b.svg b/ras/frontend/static/js/8b629e7bf137abf1643b.svg new file mode 100644 index 0000000..c4dd4ac --- /dev/null +++ b/ras/frontend/static/js/8b629e7bf137abf1643b.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/8cb05cc8693221f2eec1.svg b/ras/frontend/static/js/8cb05cc8693221f2eec1.svg new file mode 100644 index 0000000..c9a6c5b --- /dev/null +++ b/ras/frontend/static/js/8cb05cc8693221f2eec1.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ras/frontend/static/js/8d6871917dd571682b3c.svg b/ras/frontend/static/js/8d6871917dd571682b3c.svg new file mode 100644 index 0000000..ffa93fb --- /dev/null +++ b/ras/frontend/static/js/8d6871917dd571682b3c.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/8db1ed19f334e7b5ad26.svg b/ras/frontend/static/js/8db1ed19f334e7b5ad26.svg new file mode 100644 index 0000000..ff01b43 --- /dev/null +++ b/ras/frontend/static/js/8db1ed19f334e7b5ad26.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/8e060ebaca712d1fea76.svg b/ras/frontend/static/js/8e060ebaca712d1fea76.svg new file mode 100644 index 0000000..74a7957 --- /dev/null +++ b/ras/frontend/static/js/8e060ebaca712d1fea76.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/8e2aad287a0b3284d3b1.svg b/ras/frontend/static/js/8e2aad287a0b3284d3b1.svg new file mode 100644 index 0000000..d9b8cff --- /dev/null +++ b/ras/frontend/static/js/8e2aad287a0b3284d3b1.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/8ea0b61c9cced533d851.svg b/ras/frontend/static/js/8ea0b61c9cced533d851.svg new file mode 100644 index 0000000..83f4e44 --- /dev/null +++ b/ras/frontend/static/js/8ea0b61c9cced533d851.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/8eab019ab85837b171c2.svg b/ras/frontend/static/js/8eab019ab85837b171c2.svg new file mode 100644 index 0000000..dc6d067 --- /dev/null +++ b/ras/frontend/static/js/8eab019ab85837b171c2.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/8eb1e0e559b7fb35fed9.svg b/ras/frontend/static/js/8eb1e0e559b7fb35fed9.svg new file mode 100644 index 0000000..a9e686e --- /dev/null +++ b/ras/frontend/static/js/8eb1e0e559b7fb35fed9.svg @@ -0,0 +1,763 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/8ebdd96622429b4fe475.svg b/ras/frontend/static/js/8ebdd96622429b4fe475.svg new file mode 100644 index 0000000..3e4ff50 --- /dev/null +++ b/ras/frontend/static/js/8ebdd96622429b4fe475.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ras/frontend/static/js/901de8a417306b83d252.svg b/ras/frontend/static/js/901de8a417306b83d252.svg new file mode 100644 index 0000000..026bb0a --- /dev/null +++ b/ras/frontend/static/js/901de8a417306b83d252.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ras/frontend/static/js/90c38985532899f2b877.svg b/ras/frontend/static/js/90c38985532899f2b877.svg new file mode 100644 index 0000000..fe50f1c --- /dev/null +++ b/ras/frontend/static/js/90c38985532899f2b877.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/90c38a9f431cbad5c558.svg b/ras/frontend/static/js/90c38a9f431cbad5c558.svg new file mode 100644 index 0000000..8d85a2b --- /dev/null +++ b/ras/frontend/static/js/90c38a9f431cbad5c558.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/90f7d12042a18708f7ed.svg b/ras/frontend/static/js/90f7d12042a18708f7ed.svg new file mode 100644 index 0000000..5aaaa19 --- /dev/null +++ b/ras/frontend/static/js/90f7d12042a18708f7ed.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ras/frontend/static/js/910c0fb3440a800691cb.svg b/ras/frontend/static/js/910c0fb3440a800691cb.svg new file mode 100644 index 0000000..3126882 --- /dev/null +++ b/ras/frontend/static/js/910c0fb3440a800691cb.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ras/frontend/static/js/914210c79b1a6f434a16.svg b/ras/frontend/static/js/914210c79b1a6f434a16.svg new file mode 100644 index 0000000..f843041 --- /dev/null +++ b/ras/frontend/static/js/914210c79b1a6f434a16.svg @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/914456013336fcf29568.svg b/ras/frontend/static/js/914456013336fcf29568.svg new file mode 100644 index 0000000..f4e9756 --- /dev/null +++ b/ras/frontend/static/js/914456013336fcf29568.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/91c0cc951477ac7e6db3.svg b/ras/frontend/static/js/91c0cc951477ac7e6db3.svg new file mode 100644 index 0000000..afad727 --- /dev/null +++ b/ras/frontend/static/js/91c0cc951477ac7e6db3.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/91c9cf0cfcb88dceaa16.svg b/ras/frontend/static/js/91c9cf0cfcb88dceaa16.svg new file mode 100644 index 0000000..ec8a4e1 --- /dev/null +++ b/ras/frontend/static/js/91c9cf0cfcb88dceaa16.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ras/frontend/static/js/924ba78fe913a3dbd988.svg b/ras/frontend/static/js/924ba78fe913a3dbd988.svg new file mode 100644 index 0000000..01a3a0a --- /dev/null +++ b/ras/frontend/static/js/924ba78fe913a3dbd988.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/92ba1dfda8b64cee678f.svg b/ras/frontend/static/js/92ba1dfda8b64cee678f.svg new file mode 100644 index 0000000..123e067 --- /dev/null +++ b/ras/frontend/static/js/92ba1dfda8b64cee678f.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ras/frontend/static/js/9357b33dc4ff2614d2dd.svg b/ras/frontend/static/js/9357b33dc4ff2614d2dd.svg new file mode 100644 index 0000000..dad1107 --- /dev/null +++ b/ras/frontend/static/js/9357b33dc4ff2614d2dd.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/93a07daff68dea7336fd.svg b/ras/frontend/static/js/93a07daff68dea7336fd.svg new file mode 100644 index 0000000..90ec5d2 --- /dev/null +++ b/ras/frontend/static/js/93a07daff68dea7336fd.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/93b60ad98e05bc97b906.svg b/ras/frontend/static/js/93b60ad98e05bc97b906.svg new file mode 100644 index 0000000..27be8be --- /dev/null +++ b/ras/frontend/static/js/93b60ad98e05bc97b906.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/9408e6924b5f440610a0.svg b/ras/frontend/static/js/9408e6924b5f440610a0.svg new file mode 100644 index 0000000..1f497d9 --- /dev/null +++ b/ras/frontend/static/js/9408e6924b5f440610a0.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/9412c8bf3459213d3b45.svg b/ras/frontend/static/js/9412c8bf3459213d3b45.svg new file mode 100644 index 0000000..eeb29a3 --- /dev/null +++ b/ras/frontend/static/js/9412c8bf3459213d3b45.svg @@ -0,0 +1,244 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/942b6bfdf031d606c26a.svg b/ras/frontend/static/js/942b6bfdf031d606c26a.svg new file mode 100644 index 0000000..f009ae2 --- /dev/null +++ b/ras/frontend/static/js/942b6bfdf031d606c26a.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/ras/frontend/static/js/948ba6b5d63b61c2ae6e.svg b/ras/frontend/static/js/948ba6b5d63b61c2ae6e.svg new file mode 100644 index 0000000..f0af103 --- /dev/null +++ b/ras/frontend/static/js/948ba6b5d63b61c2ae6e.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ras/frontend/static/js/94f7307aad6675681fef.svg b/ras/frontend/static/js/94f7307aad6675681fef.svg new file mode 100644 index 0000000..e71ddcd --- /dev/null +++ b/ras/frontend/static/js/94f7307aad6675681fef.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/ras/frontend/static/js/95a4d32e20e010f63ae7.svg b/ras/frontend/static/js/95a4d32e20e010f63ae7.svg new file mode 100644 index 0000000..6d5a2f5 --- /dev/null +++ b/ras/frontend/static/js/95a4d32e20e010f63ae7.svg @@ -0,0 +1,219 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/95a616269fffa24b0779.svg b/ras/frontend/static/js/95a616269fffa24b0779.svg new file mode 100644 index 0000000..9050d54 --- /dev/null +++ b/ras/frontend/static/js/95a616269fffa24b0779.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/ras/frontend/static/js/95ec25640c911126b02b.svg b/ras/frontend/static/js/95ec25640c911126b02b.svg new file mode 100644 index 0000000..6c834b3 --- /dev/null +++ b/ras/frontend/static/js/95ec25640c911126b02b.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/96475126e7232ee3558e.svg b/ras/frontend/static/js/96475126e7232ee3558e.svg new file mode 100644 index 0000000..afd2e4a --- /dev/null +++ b/ras/frontend/static/js/96475126e7232ee3558e.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/96cca3298724eeac307f.svg b/ras/frontend/static/js/96cca3298724eeac307f.svg new file mode 100644 index 0000000..4e7889e --- /dev/null +++ b/ras/frontend/static/js/96cca3298724eeac307f.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/96d57c56bd4feba75b0e.svg b/ras/frontend/static/js/96d57c56bd4feba75b0e.svg new file mode 100644 index 0000000..ecdb4a3 --- /dev/null +++ b/ras/frontend/static/js/96d57c56bd4feba75b0e.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ras/frontend/static/js/9749373197a14f802651.svg b/ras/frontend/static/js/9749373197a14f802651.svg new file mode 100644 index 0000000..93bb4a8 --- /dev/null +++ b/ras/frontend/static/js/9749373197a14f802651.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/97520818c4ec402b4ba8.svg b/ras/frontend/static/js/97520818c4ec402b4ba8.svg new file mode 100644 index 0000000..3cb403b --- /dev/null +++ b/ras/frontend/static/js/97520818c4ec402b4ba8.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/976c853ae9062409996c.svg b/ras/frontend/static/js/976c853ae9062409996c.svg new file mode 100644 index 0000000..dcc6ad1 --- /dev/null +++ b/ras/frontend/static/js/976c853ae9062409996c.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/97abb7cd7189b26408f9.svg b/ras/frontend/static/js/97abb7cd7189b26408f9.svg new file mode 100644 index 0000000..79ff9a9 --- /dev/null +++ b/ras/frontend/static/js/97abb7cd7189b26408f9.svg @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/99b41311a509aca54f06.svg b/ras/frontend/static/js/99b41311a509aca54f06.svg new file mode 100644 index 0000000..e04146a --- /dev/null +++ b/ras/frontend/static/js/99b41311a509aca54f06.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/9aac5eefeebd80bdee3b.svg b/ras/frontend/static/js/9aac5eefeebd80bdee3b.svg new file mode 100644 index 0000000..64a69e8 --- /dev/null +++ b/ras/frontend/static/js/9aac5eefeebd80bdee3b.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/9b186a8be867d7cb136d.svg b/ras/frontend/static/js/9b186a8be867d7cb136d.svg new file mode 100644 index 0000000..4cac4a8 --- /dev/null +++ b/ras/frontend/static/js/9b186a8be867d7cb136d.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/9bbe130ed5385d0cd03a.svg b/ras/frontend/static/js/9bbe130ed5385d0cd03a.svg new file mode 100644 index 0000000..41fda79 --- /dev/null +++ b/ras/frontend/static/js/9bbe130ed5385d0cd03a.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/9c87ba43360f54e47b2f.svg b/ras/frontend/static/js/9c87ba43360f54e47b2f.svg new file mode 100644 index 0000000..b100dd0 --- /dev/null +++ b/ras/frontend/static/js/9c87ba43360f54e47b2f.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/9d52c0a552153cf88238.svg b/ras/frontend/static/js/9d52c0a552153cf88238.svg new file mode 100644 index 0000000..a06a2e3 --- /dev/null +++ b/ras/frontend/static/js/9d52c0a552153cf88238.svg @@ -0,0 +1,4 @@ + + + + diff --git a/ras/frontend/static/js/9e26c8f2269d749b4d2d.svg b/ras/frontend/static/js/9e26c8f2269d749b4d2d.svg new file mode 100644 index 0000000..688ea39 --- /dev/null +++ b/ras/frontend/static/js/9e26c8f2269d749b4d2d.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/9e3414e898f1a07d0bea.svg b/ras/frontend/static/js/9e3414e898f1a07d0bea.svg new file mode 100644 index 0000000..e13de22 --- /dev/null +++ b/ras/frontend/static/js/9e3414e898f1a07d0bea.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/9e8153a1022c0f4282f8.svg b/ras/frontend/static/js/9e8153a1022c0f4282f8.svg new file mode 100644 index 0000000..fbc6d7c --- /dev/null +++ b/ras/frontend/static/js/9e8153a1022c0f4282f8.svg @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/9ef5262cc695adcc613f.svg b/ras/frontend/static/js/9ef5262cc695adcc613f.svg new file mode 100644 index 0000000..65091a5 --- /dev/null +++ b/ras/frontend/static/js/9ef5262cc695adcc613f.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/9f00a7d8eafa6f593713.svg b/ras/frontend/static/js/9f00a7d8eafa6f593713.svg new file mode 100644 index 0000000..d65559a --- /dev/null +++ b/ras/frontend/static/js/9f00a7d8eafa6f593713.svg @@ -0,0 +1,296 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/9f0be4b0947f82e770ea.svg b/ras/frontend/static/js/9f0be4b0947f82e770ea.svg new file mode 100644 index 0000000..e40a838 --- /dev/null +++ b/ras/frontend/static/js/9f0be4b0947f82e770ea.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ras/frontend/static/js/9f9a1e16047b82cc7ebe.svg b/ras/frontend/static/js/9f9a1e16047b82cc7ebe.svg new file mode 100644 index 0000000..6da63db --- /dev/null +++ b/ras/frontend/static/js/9f9a1e16047b82cc7ebe.svg @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/a004f63d8cf851543b79.svg b/ras/frontend/static/js/a004f63d8cf851543b79.svg new file mode 100644 index 0000000..33fbdce --- /dev/null +++ b/ras/frontend/static/js/a004f63d8cf851543b79.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/ras/frontend/static/js/a17b7ad9eaa85411a1e1.svg b/ras/frontend/static/js/a17b7ad9eaa85411a1e1.svg new file mode 100644 index 0000000..43375fc --- /dev/null +++ b/ras/frontend/static/js/a17b7ad9eaa85411a1e1.svg @@ -0,0 +1,378 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/a1a28a5eb8eceaad90b3.svg b/ras/frontend/static/js/a1a28a5eb8eceaad90b3.svg new file mode 100644 index 0000000..a92804f --- /dev/null +++ b/ras/frontend/static/js/a1a28a5eb8eceaad90b3.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/ras/frontend/static/js/a1a39ca12f5354105b9b.svg b/ras/frontend/static/js/a1a39ca12f5354105b9b.svg new file mode 100644 index 0000000..450f6f0 --- /dev/null +++ b/ras/frontend/static/js/a1a39ca12f5354105b9b.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/ras/frontend/static/js/a27c290b1227336d0a32.svg b/ras/frontend/static/js/a27c290b1227336d0a32.svg new file mode 100644 index 0000000..cae163d --- /dev/null +++ b/ras/frontend/static/js/a27c290b1227336d0a32.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/a2a21809fce58fba7e9d.svg b/ras/frontend/static/js/a2a21809fce58fba7e9d.svg new file mode 100644 index 0000000..925245e --- /dev/null +++ b/ras/frontend/static/js/a2a21809fce58fba7e9d.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ras/frontend/static/js/a362d2b8e05b0981ba79.svg b/ras/frontend/static/js/a362d2b8e05b0981ba79.svg new file mode 100644 index 0000000..9abeff4 --- /dev/null +++ b/ras/frontend/static/js/a362d2b8e05b0981ba79.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ras/frontend/static/js/a3843e7991ac45d28eff.svg b/ras/frontend/static/js/a3843e7991ac45d28eff.svg new file mode 100644 index 0000000..a6cd367 --- /dev/null +++ b/ras/frontend/static/js/a3843e7991ac45d28eff.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/a39094a015bbe6ba3861.svg b/ras/frontend/static/js/a39094a015bbe6ba3861.svg new file mode 100644 index 0000000..676e801 --- /dev/null +++ b/ras/frontend/static/js/a39094a015bbe6ba3861.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/a3957b0a98236111e237.svg b/ras/frontend/static/js/a3957b0a98236111e237.svg new file mode 100644 index 0000000..4713822 --- /dev/null +++ b/ras/frontend/static/js/a3957b0a98236111e237.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/a3c286271bdb3ff7b16f.svg b/ras/frontend/static/js/a3c286271bdb3ff7b16f.svg new file mode 100644 index 0000000..04433b9 --- /dev/null +++ b/ras/frontend/static/js/a3c286271bdb3ff7b16f.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/ras/frontend/static/js/a4db87fe692cdaa6b40c.svg b/ras/frontend/static/js/a4db87fe692cdaa6b40c.svg new file mode 100644 index 0000000..667d5f6 --- /dev/null +++ b/ras/frontend/static/js/a4db87fe692cdaa6b40c.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/a4de118b4064c4b8dd54.svg b/ras/frontend/static/js/a4de118b4064c4b8dd54.svg new file mode 100644 index 0000000..8c6a532 --- /dev/null +++ b/ras/frontend/static/js/a4de118b4064c4b8dd54.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/a4f5c16c0a4ab4c14fdf.svg b/ras/frontend/static/js/a4f5c16c0a4ab4c14fdf.svg new file mode 100644 index 0000000..bd493c3 --- /dev/null +++ b/ras/frontend/static/js/a4f5c16c0a4ab4c14fdf.svg @@ -0,0 +1,4 @@ + + + + diff --git a/ras/frontend/static/js/a54fe773a9a6f8f7ae60.svg b/ras/frontend/static/js/a54fe773a9a6f8f7ae60.svg new file mode 100644 index 0000000..80cb09c --- /dev/null +++ b/ras/frontend/static/js/a54fe773a9a6f8f7ae60.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/a5fb3413ae797b940643.svg b/ras/frontend/static/js/a5fb3413ae797b940643.svg new file mode 100644 index 0000000..6a0a66b --- /dev/null +++ b/ras/frontend/static/js/a5fb3413ae797b940643.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ras/frontend/static/js/a62e330d249ff3f5bd27.svg b/ras/frontend/static/js/a62e330d249ff3f5bd27.svg new file mode 100644 index 0000000..86fcfba --- /dev/null +++ b/ras/frontend/static/js/a62e330d249ff3f5bd27.svg @@ -0,0 +1,4 @@ + + + + diff --git a/ras/frontend/static/js/a66e38d3051c95e23a7d.svg b/ras/frontend/static/js/a66e38d3051c95e23a7d.svg new file mode 100644 index 0000000..2259f31 --- /dev/null +++ b/ras/frontend/static/js/a66e38d3051c95e23a7d.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/a6a6e8ad28b3af63bd4e.svg b/ras/frontend/static/js/a6a6e8ad28b3af63bd4e.svg new file mode 100644 index 0000000..9ec80b8 --- /dev/null +++ b/ras/frontend/static/js/a6a6e8ad28b3af63bd4e.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ras/frontend/static/js/a7375d4d2ef32a2c8761.svg b/ras/frontend/static/js/a7375d4d2ef32a2c8761.svg new file mode 100644 index 0000000..d072337 --- /dev/null +++ b/ras/frontend/static/js/a7375d4d2ef32a2c8761.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/ras/frontend/static/js/a7c201eabf62f13fe1d8.svg b/ras/frontend/static/js/a7c201eabf62f13fe1d8.svg new file mode 100644 index 0000000..260f091 --- /dev/null +++ b/ras/frontend/static/js/a7c201eabf62f13fe1d8.svg @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/a8b035d61b54fec572a0.svg b/ras/frontend/static/js/a8b035d61b54fec572a0.svg new file mode 100644 index 0000000..7b79eeb --- /dev/null +++ b/ras/frontend/static/js/a8b035d61b54fec572a0.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/a9bdcd11c19fd20e90b8.svg b/ras/frontend/static/js/a9bdcd11c19fd20e90b8.svg new file mode 100644 index 0000000..871e4ee --- /dev/null +++ b/ras/frontend/static/js/a9bdcd11c19fd20e90b8.svg @@ -0,0 +1,206 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/aa31ee0af98d08407676.svg b/ras/frontend/static/js/aa31ee0af98d08407676.svg new file mode 100644 index 0000000..f1d7fde --- /dev/null +++ b/ras/frontend/static/js/aa31ee0af98d08407676.svg @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/aae9c7ff43e36d202a00.svg b/ras/frontend/static/js/aae9c7ff43e36d202a00.svg new file mode 100644 index 0000000..8e56ef5 --- /dev/null +++ b/ras/frontend/static/js/aae9c7ff43e36d202a00.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/ras/frontend/static/js/ab052b412792b9fadd8c.svg b/ras/frontend/static/js/ab052b412792b9fadd8c.svg new file mode 100644 index 0000000..7ce56ef --- /dev/null +++ b/ras/frontend/static/js/ab052b412792b9fadd8c.svg @@ -0,0 +1,4 @@ + + + + diff --git a/ras/frontend/static/js/ab57bf70f93a708e0107.svg b/ras/frontend/static/js/ab57bf70f93a708e0107.svg new file mode 100644 index 0000000..39ce18a --- /dev/null +++ b/ras/frontend/static/js/ab57bf70f93a708e0107.svg @@ -0,0 +1,547 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/abd95c9bbc3b8e14d05a.svg b/ras/frontend/static/js/abd95c9bbc3b8e14d05a.svg new file mode 100644 index 0000000..665d6b2 --- /dev/null +++ b/ras/frontend/static/js/abd95c9bbc3b8e14d05a.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/ac0f0d78f5f94572d57b.svg b/ras/frontend/static/js/ac0f0d78f5f94572d57b.svg new file mode 100644 index 0000000..78252a4 --- /dev/null +++ b/ras/frontend/static/js/ac0f0d78f5f94572d57b.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/ac6fa1a3ca93e95637cf.svg b/ras/frontend/static/js/ac6fa1a3ca93e95637cf.svg new file mode 100644 index 0000000..ec1929b --- /dev/null +++ b/ras/frontend/static/js/ac6fa1a3ca93e95637cf.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/aca3624e7e3a31be0d4b.svg b/ras/frontend/static/js/aca3624e7e3a31be0d4b.svg new file mode 100644 index 0000000..3151ad1 --- /dev/null +++ b/ras/frontend/static/js/aca3624e7e3a31be0d4b.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/acdf197a05336d8cdb11.svg b/ras/frontend/static/js/acdf197a05336d8cdb11.svg new file mode 100644 index 0000000..b4aa3c0 --- /dev/null +++ b/ras/frontend/static/js/acdf197a05336d8cdb11.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/ad05d8d10d2ef78fd2e2.svg b/ras/frontend/static/js/ad05d8d10d2ef78fd2e2.svg new file mode 100644 index 0000000..c61f79a --- /dev/null +++ b/ras/frontend/static/js/ad05d8d10d2ef78fd2e2.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ras/frontend/static/js/ad3aa4f8661cd353439d.svg b/ras/frontend/static/js/ad3aa4f8661cd353439d.svg new file mode 100644 index 0000000..b261273 --- /dev/null +++ b/ras/frontend/static/js/ad3aa4f8661cd353439d.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/ad7b28b8809b2680a778.svg b/ras/frontend/static/js/ad7b28b8809b2680a778.svg new file mode 100644 index 0000000..726f981 --- /dev/null +++ b/ras/frontend/static/js/ad7b28b8809b2680a778.svg @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/ae2d1ab93385b37fd124.svg b/ras/frontend/static/js/ae2d1ab93385b37fd124.svg new file mode 100644 index 0000000..4d85911 --- /dev/null +++ b/ras/frontend/static/js/ae2d1ab93385b37fd124.svg @@ -0,0 +1,4 @@ + + + + diff --git a/ras/frontend/static/js/ae395581590b44c50c40.svg b/ras/frontend/static/js/ae395581590b44c50c40.svg new file mode 100644 index 0000000..e20f40d --- /dev/null +++ b/ras/frontend/static/js/ae395581590b44c50c40.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/ae9767d4b8d6c2fc991c.svg b/ras/frontend/static/js/ae9767d4b8d6c2fc991c.svg new file mode 100644 index 0000000..ba77036 --- /dev/null +++ b/ras/frontend/static/js/ae9767d4b8d6c2fc991c.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/aec8ba24bb3b3183323a.svg b/ras/frontend/static/js/aec8ba24bb3b3183323a.svg new file mode 100644 index 0000000..4179e89 --- /dev/null +++ b/ras/frontend/static/js/aec8ba24bb3b3183323a.svg @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/af9d4fede28354a0b042.svg b/ras/frontend/static/js/af9d4fede28354a0b042.svg new file mode 100644 index 0000000..3a5b5de --- /dev/null +++ b/ras/frontend/static/js/af9d4fede28354a0b042.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ras/frontend/static/js/b04c72b67773f10058a8.svg b/ras/frontend/static/js/b04c72b67773f10058a8.svg new file mode 100644 index 0000000..0846724 --- /dev/null +++ b/ras/frontend/static/js/b04c72b67773f10058a8.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/b09bb372e446f5ca1acc.svg b/ras/frontend/static/js/b09bb372e446f5ca1acc.svg new file mode 100644 index 0000000..d06f656 --- /dev/null +++ b/ras/frontend/static/js/b09bb372e446f5ca1acc.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/b12459dbb66471a98754.svg b/ras/frontend/static/js/b12459dbb66471a98754.svg new file mode 100644 index 0000000..3114890 --- /dev/null +++ b/ras/frontend/static/js/b12459dbb66471a98754.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/b23bebbbe36225a7fea2.svg b/ras/frontend/static/js/b23bebbbe36225a7fea2.svg new file mode 100644 index 0000000..6643929 --- /dev/null +++ b/ras/frontend/static/js/b23bebbbe36225a7fea2.svg @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/b263220156c66d18fff2.svg b/ras/frontend/static/js/b263220156c66d18fff2.svg new file mode 100644 index 0000000..b7acdbd --- /dev/null +++ b/ras/frontend/static/js/b263220156c66d18fff2.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ras/frontend/static/js/b2c8d118c250fb103ddb.svg b/ras/frontend/static/js/b2c8d118c250fb103ddb.svg new file mode 100644 index 0000000..c08ccd9 --- /dev/null +++ b/ras/frontend/static/js/b2c8d118c250fb103ddb.svg @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/b326528d8d1f9c76ae82.svg b/ras/frontend/static/js/b326528d8d1f9c76ae82.svg new file mode 100644 index 0000000..355b9f1 --- /dev/null +++ b/ras/frontend/static/js/b326528d8d1f9c76ae82.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/b3fd5b17b2c1070ca61a.svg b/ras/frontend/static/js/b3fd5b17b2c1070ca61a.svg new file mode 100644 index 0000000..25ce7b2 --- /dev/null +++ b/ras/frontend/static/js/b3fd5b17b2c1070ca61a.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ras/frontend/static/js/b4262644824a028810ca.svg b/ras/frontend/static/js/b4262644824a028810ca.svg new file mode 100644 index 0000000..35141d3 --- /dev/null +++ b/ras/frontend/static/js/b4262644824a028810ca.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/b4f1de657b201640e4ec.svg b/ras/frontend/static/js/b4f1de657b201640e4ec.svg new file mode 100644 index 0000000..bfbf01f --- /dev/null +++ b/ras/frontend/static/js/b4f1de657b201640e4ec.svg @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/b511d36eecb8b5dc08f5.svg b/ras/frontend/static/js/b511d36eecb8b5dc08f5.svg new file mode 100644 index 0000000..c282508 --- /dev/null +++ b/ras/frontend/static/js/b511d36eecb8b5dc08f5.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ras/frontend/static/js/b51b6be960f624fb9814.svg b/ras/frontend/static/js/b51b6be960f624fb9814.svg new file mode 100644 index 0000000..a806572 --- /dev/null +++ b/ras/frontend/static/js/b51b6be960f624fb9814.svg @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/b51e57c22b21dd257744.svg b/ras/frontend/static/js/b51e57c22b21dd257744.svg new file mode 100644 index 0000000..bcfc161 --- /dev/null +++ b/ras/frontend/static/js/b51e57c22b21dd257744.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/b52f02c3eaacdccd3a78.svg b/ras/frontend/static/js/b52f02c3eaacdccd3a78.svg new file mode 100644 index 0000000..4572f4e --- /dev/null +++ b/ras/frontend/static/js/b52f02c3eaacdccd3a78.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/b54c9b3dd9d9bd0d450e.svg b/ras/frontend/static/js/b54c9b3dd9d9bd0d450e.svg new file mode 100644 index 0000000..e9cc291 --- /dev/null +++ b/ras/frontend/static/js/b54c9b3dd9d9bd0d450e.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ras/frontend/static/js/b56527824f3244165465.svg b/ras/frontend/static/js/b56527824f3244165465.svg new file mode 100644 index 0000000..533a70c --- /dev/null +++ b/ras/frontend/static/js/b56527824f3244165465.svg @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/b59320d866c2aeb135d9.svg b/ras/frontend/static/js/b59320d866c2aeb135d9.svg new file mode 100644 index 0000000..6ad7d0a --- /dev/null +++ b/ras/frontend/static/js/b59320d866c2aeb135d9.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/ras/frontend/static/js/b5abdd6ce0be2cb4d9b3.svg b/ras/frontend/static/js/b5abdd6ce0be2cb4d9b3.svg new file mode 100644 index 0000000..2848b6a --- /dev/null +++ b/ras/frontend/static/js/b5abdd6ce0be2cb4d9b3.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/b5eadefbb6da73c9d0cf.svg b/ras/frontend/static/js/b5eadefbb6da73c9d0cf.svg new file mode 100644 index 0000000..4f5cae7 --- /dev/null +++ b/ras/frontend/static/js/b5eadefbb6da73c9d0cf.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ras/frontend/static/js/b5edb75519037dcf483e.svg b/ras/frontend/static/js/b5edb75519037dcf483e.svg new file mode 100644 index 0000000..9cb6c9e --- /dev/null +++ b/ras/frontend/static/js/b5edb75519037dcf483e.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ras/frontend/static/js/b7e461d75f0be7e9609d.svg b/ras/frontend/static/js/b7e461d75f0be7e9609d.svg new file mode 100644 index 0000000..39fa9b0 --- /dev/null +++ b/ras/frontend/static/js/b7e461d75f0be7e9609d.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/b8cee6f6cd34c5dc4249.svg b/ras/frontend/static/js/b8cee6f6cd34c5dc4249.svg new file mode 100644 index 0000000..ddad7cb --- /dev/null +++ b/ras/frontend/static/js/b8cee6f6cd34c5dc4249.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ras/frontend/static/js/b99d016f9deaed66ab09.svg b/ras/frontend/static/js/b99d016f9deaed66ab09.svg new file mode 100644 index 0000000..9233b92 --- /dev/null +++ b/ras/frontend/static/js/b99d016f9deaed66ab09.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/b9cc4fcdf51eb234607e.svg b/ras/frontend/static/js/b9cc4fcdf51eb234607e.svg new file mode 100644 index 0000000..a5f2a15 --- /dev/null +++ b/ras/frontend/static/js/b9cc4fcdf51eb234607e.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/bb616c9ec60cde6806bb.svg b/ras/frontend/static/js/bb616c9ec60cde6806bb.svg new file mode 100644 index 0000000..a5078df --- /dev/null +++ b/ras/frontend/static/js/bb616c9ec60cde6806bb.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/bbb9c937317f682ba1f2.svg b/ras/frontend/static/js/bbb9c937317f682ba1f2.svg new file mode 100644 index 0000000..e63ab20 --- /dev/null +++ b/ras/frontend/static/js/bbb9c937317f682ba1f2.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/bbf9bcce8cefb8d15d88.svg b/ras/frontend/static/js/bbf9bcce8cefb8d15d88.svg new file mode 100644 index 0000000..e03a342 --- /dev/null +++ b/ras/frontend/static/js/bbf9bcce8cefb8d15d88.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/ras/frontend/static/js/bc057f7505830fd69f4b.svg b/ras/frontend/static/js/bc057f7505830fd69f4b.svg new file mode 100644 index 0000000..85f4f47 --- /dev/null +++ b/ras/frontend/static/js/bc057f7505830fd69f4b.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/ras/frontend/static/js/be30b559c3943a7e0703.svg b/ras/frontend/static/js/be30b559c3943a7e0703.svg new file mode 100644 index 0000000..44964cf --- /dev/null +++ b/ras/frontend/static/js/be30b559c3943a7e0703.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/be5f159137e399dca23b.svg b/ras/frontend/static/js/be5f159137e399dca23b.svg new file mode 100644 index 0000000..1050838 --- /dev/null +++ b/ras/frontend/static/js/be5f159137e399dca23b.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/be9b568247b778302b3f.svg b/ras/frontend/static/js/be9b568247b778302b3f.svg new file mode 100644 index 0000000..55c48e6 --- /dev/null +++ b/ras/frontend/static/js/be9b568247b778302b3f.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/bec727f47598d1d82a17.svg b/ras/frontend/static/js/bec727f47598d1d82a17.svg new file mode 100644 index 0000000..f3393e5 --- /dev/null +++ b/ras/frontend/static/js/bec727f47598d1d82a17.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/bee2207b45dc0b094dbd.svg b/ras/frontend/static/js/bee2207b45dc0b094dbd.svg new file mode 100644 index 0000000..839deed --- /dev/null +++ b/ras/frontend/static/js/bee2207b45dc0b094dbd.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/bf6f9b0191659c38159d.svg b/ras/frontend/static/js/bf6f9b0191659c38159d.svg new file mode 100644 index 0000000..b91a6f2 --- /dev/null +++ b/ras/frontend/static/js/bf6f9b0191659c38159d.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/ras/frontend/static/js/c0bc6c2f50955193f6d9.svg b/ras/frontend/static/js/c0bc6c2f50955193f6d9.svg new file mode 100644 index 0000000..24c5f33 --- /dev/null +++ b/ras/frontend/static/js/c0bc6c2f50955193f6d9.svg @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/c0bdb1a8a77eb133c4b7.svg b/ras/frontend/static/js/c0bdb1a8a77eb133c4b7.svg new file mode 100644 index 0000000..eb0e360 --- /dev/null +++ b/ras/frontend/static/js/c0bdb1a8a77eb133c4b7.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ras/frontend/static/js/c0ddd54bc36224674514.svg b/ras/frontend/static/js/c0ddd54bc36224674514.svg new file mode 100644 index 0000000..c705f87 --- /dev/null +++ b/ras/frontend/static/js/c0ddd54bc36224674514.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/c13a64ec70248ccc41d6.svg b/ras/frontend/static/js/c13a64ec70248ccc41d6.svg new file mode 100644 index 0000000..561745a --- /dev/null +++ b/ras/frontend/static/js/c13a64ec70248ccc41d6.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/c155a6845ad167cdad8c.svg b/ras/frontend/static/js/c155a6845ad167cdad8c.svg new file mode 100644 index 0000000..c31d2bf --- /dev/null +++ b/ras/frontend/static/js/c155a6845ad167cdad8c.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ras/frontend/static/js/c2672e369471d01fcd1c.svg b/ras/frontend/static/js/c2672e369471d01fcd1c.svg new file mode 100644 index 0000000..a011360 --- /dev/null +++ b/ras/frontend/static/js/c2672e369471d01fcd1c.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/c2a3c34c769194e219c3.svg b/ras/frontend/static/js/c2a3c34c769194e219c3.svg new file mode 100644 index 0000000..939920d --- /dev/null +++ b/ras/frontend/static/js/c2a3c34c769194e219c3.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/c3d2d75ff7299b68bf18.svg b/ras/frontend/static/js/c3d2d75ff7299b68bf18.svg new file mode 100644 index 0000000..a3378fd --- /dev/null +++ b/ras/frontend/static/js/c3d2d75ff7299b68bf18.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/c3e3382c50cdc9150344.svg b/ras/frontend/static/js/c3e3382c50cdc9150344.svg new file mode 100644 index 0000000..eb95231 --- /dev/null +++ b/ras/frontend/static/js/c3e3382c50cdc9150344.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/c4df14eee0b28bca07a3.svg b/ras/frontend/static/js/c4df14eee0b28bca07a3.svg new file mode 100644 index 0000000..1170cd7 --- /dev/null +++ b/ras/frontend/static/js/c4df14eee0b28bca07a3.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/c64c7cc55e86f803cf1a.svg b/ras/frontend/static/js/c64c7cc55e86f803cf1a.svg new file mode 100644 index 0000000..4edb827 --- /dev/null +++ b/ras/frontend/static/js/c64c7cc55e86f803cf1a.svg @@ -0,0 +1,4 @@ + + + + diff --git a/ras/frontend/static/js/c70195b6db5693f88251.svg b/ras/frontend/static/js/c70195b6db5693f88251.svg new file mode 100644 index 0000000..ad76b35 --- /dev/null +++ b/ras/frontend/static/js/c70195b6db5693f88251.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/c70ba2e26749882f79c7.svg b/ras/frontend/static/js/c70ba2e26749882f79c7.svg new file mode 100644 index 0000000..cb25112 --- /dev/null +++ b/ras/frontend/static/js/c70ba2e26749882f79c7.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/c7146bc39c724cd34b46.svg b/ras/frontend/static/js/c7146bc39c724cd34b46.svg new file mode 100644 index 0000000..e400f0c --- /dev/null +++ b/ras/frontend/static/js/c7146bc39c724cd34b46.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/c789ea20a0f569d9d6a9.svg b/ras/frontend/static/js/c789ea20a0f569d9d6a9.svg new file mode 100644 index 0000000..485c24e --- /dev/null +++ b/ras/frontend/static/js/c789ea20a0f569d9d6a9.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/c817f550f47380234387.svg b/ras/frontend/static/js/c817f550f47380234387.svg new file mode 100644 index 0000000..09cce7b --- /dev/null +++ b/ras/frontend/static/js/c817f550f47380234387.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/c956003b42baa905013c.svg b/ras/frontend/static/js/c956003b42baa905013c.svg new file mode 100644 index 0000000..b72473a --- /dev/null +++ b/ras/frontend/static/js/c956003b42baa905013c.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ras/frontend/static/js/c97ad6daf51758d0df79.svg b/ras/frontend/static/js/c97ad6daf51758d0df79.svg new file mode 100644 index 0000000..6c56aa4 --- /dev/null +++ b/ras/frontend/static/js/c97ad6daf51758d0df79.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/cb329e885950a7c05407.svg b/ras/frontend/static/js/cb329e885950a7c05407.svg new file mode 100644 index 0000000..088242d --- /dev/null +++ b/ras/frontend/static/js/cb329e885950a7c05407.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/cb3557fd707b978ef927.svg b/ras/frontend/static/js/cb3557fd707b978ef927.svg new file mode 100644 index 0000000..3189d8e --- /dev/null +++ b/ras/frontend/static/js/cb3557fd707b978ef927.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/ras/frontend/static/js/cc06b8c75e723221fb6f.svg b/ras/frontend/static/js/cc06b8c75e723221fb6f.svg new file mode 100644 index 0000000..cabef52 --- /dev/null +++ b/ras/frontend/static/js/cc06b8c75e723221fb6f.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/cc6a7545541b76339e38.svg b/ras/frontend/static/js/cc6a7545541b76339e38.svg new file mode 100644 index 0000000..9bedb08 --- /dev/null +++ b/ras/frontend/static/js/cc6a7545541b76339e38.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/ccf7eecbecdd26d2403c.svg b/ras/frontend/static/js/ccf7eecbecdd26d2403c.svg new file mode 100644 index 0000000..76edab4 --- /dev/null +++ b/ras/frontend/static/js/ccf7eecbecdd26d2403c.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/cd37458b29efc0063ff6.svg b/ras/frontend/static/js/cd37458b29efc0063ff6.svg new file mode 100644 index 0000000..5bfd7df --- /dev/null +++ b/ras/frontend/static/js/cd37458b29efc0063ff6.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/cd835d05865e496ff6b8.svg b/ras/frontend/static/js/cd835d05865e496ff6b8.svg new file mode 100644 index 0000000..8c43577 --- /dev/null +++ b/ras/frontend/static/js/cd835d05865e496ff6b8.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ras/frontend/static/js/cddfccfb8735e7bb6cda.svg b/ras/frontend/static/js/cddfccfb8735e7bb6cda.svg new file mode 100644 index 0000000..4080e86 --- /dev/null +++ b/ras/frontend/static/js/cddfccfb8735e7bb6cda.svg @@ -0,0 +1,763 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/cf15a64943f6c7d24a2b.svg b/ras/frontend/static/js/cf15a64943f6c7d24a2b.svg new file mode 100644 index 0000000..5c8e878 --- /dev/null +++ b/ras/frontend/static/js/cf15a64943f6c7d24a2b.svg @@ -0,0 +1,479 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/cf6a492acafefcbefa10.svg b/ras/frontend/static/js/cf6a492acafefcbefa10.svg new file mode 100644 index 0000000..6a03dc4 --- /dev/null +++ b/ras/frontend/static/js/cf6a492acafefcbefa10.svg @@ -0,0 +1,479 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/cfce36343ac21f154298.svg b/ras/frontend/static/js/cfce36343ac21f154298.svg new file mode 100644 index 0000000..60457b7 --- /dev/null +++ b/ras/frontend/static/js/cfce36343ac21f154298.svg @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/cfcf99d22861d82c5658.svg b/ras/frontend/static/js/cfcf99d22861d82c5658.svg new file mode 100644 index 0000000..1e0b8b2 --- /dev/null +++ b/ras/frontend/static/js/cfcf99d22861d82c5658.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/cfe72ae0b3d6d8485234.svg b/ras/frontend/static/js/cfe72ae0b3d6d8485234.svg new file mode 100644 index 0000000..4faaf49 --- /dev/null +++ b/ras/frontend/static/js/cfe72ae0b3d6d8485234.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ras/frontend/static/js/d0a42f6b9252659b1625.svg b/ras/frontend/static/js/d0a42f6b9252659b1625.svg new file mode 100644 index 0000000..07e56a1 --- /dev/null +++ b/ras/frontend/static/js/d0a42f6b9252659b1625.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/d0a77d97960f20600dc6.svg b/ras/frontend/static/js/d0a77d97960f20600dc6.svg new file mode 100644 index 0000000..4bc03a2 --- /dev/null +++ b/ras/frontend/static/js/d0a77d97960f20600dc6.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/d20d3e0cf1bec347594d.svg b/ras/frontend/static/js/d20d3e0cf1bec347594d.svg new file mode 100644 index 0000000..d107bdc --- /dev/null +++ b/ras/frontend/static/js/d20d3e0cf1bec347594d.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/d2ac71bc08a7e11cd8df.svg b/ras/frontend/static/js/d2ac71bc08a7e11cd8df.svg new file mode 100644 index 0000000..3018468 --- /dev/null +++ b/ras/frontend/static/js/d2ac71bc08a7e11cd8df.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/d2ebfb8712f5375ce406.svg b/ras/frontend/static/js/d2ebfb8712f5375ce406.svg new file mode 100644 index 0000000..fdda432 --- /dev/null +++ b/ras/frontend/static/js/d2ebfb8712f5375ce406.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/ras/frontend/static/js/d335b1f7842c183f2626.svg b/ras/frontend/static/js/d335b1f7842c183f2626.svg new file mode 100644 index 0000000..0ee923a --- /dev/null +++ b/ras/frontend/static/js/d335b1f7842c183f2626.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ras/frontend/static/js/d338046f390d50e31f3c.svg b/ras/frontend/static/js/d338046f390d50e31f3c.svg new file mode 100644 index 0000000..ba2acf2 --- /dev/null +++ b/ras/frontend/static/js/d338046f390d50e31f3c.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/d33bfe612c008a01f156.svg b/ras/frontend/static/js/d33bfe612c008a01f156.svg new file mode 100644 index 0000000..113a5b5 --- /dev/null +++ b/ras/frontend/static/js/d33bfe612c008a01f156.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/d3854d0ef79845fd2197.svg b/ras/frontend/static/js/d3854d0ef79845fd2197.svg new file mode 100644 index 0000000..46351e5 --- /dev/null +++ b/ras/frontend/static/js/d3854d0ef79845fd2197.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/d3a8689930e65cbe0160.svg b/ras/frontend/static/js/d3a8689930e65cbe0160.svg new file mode 100644 index 0000000..f4a502f --- /dev/null +++ b/ras/frontend/static/js/d3a8689930e65cbe0160.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/d3dea0cee87c83e3a1e6.svg b/ras/frontend/static/js/d3dea0cee87c83e3a1e6.svg new file mode 100644 index 0000000..1e93a61 --- /dev/null +++ b/ras/frontend/static/js/d3dea0cee87c83e3a1e6.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/d478856bfb090d89128e.svg b/ras/frontend/static/js/d478856bfb090d89128e.svg new file mode 100644 index 0000000..9526568 --- /dev/null +++ b/ras/frontend/static/js/d478856bfb090d89128e.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/d4cd148ff94760097b5c.svg b/ras/frontend/static/js/d4cd148ff94760097b5c.svg new file mode 100644 index 0000000..a07baf7 --- /dev/null +++ b/ras/frontend/static/js/d4cd148ff94760097b5c.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/d54aa958aeb0115ca87c.svg b/ras/frontend/static/js/d54aa958aeb0115ca87c.svg new file mode 100644 index 0000000..3c76058 --- /dev/null +++ b/ras/frontend/static/js/d54aa958aeb0115ca87c.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/d7ff64ff596ec31992b4.svg b/ras/frontend/static/js/d7ff64ff596ec31992b4.svg new file mode 100644 index 0000000..a0a6791 --- /dev/null +++ b/ras/frontend/static/js/d7ff64ff596ec31992b4.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/ras/frontend/static/js/d8e3bbb05aa228ef7591.svg b/ras/frontend/static/js/d8e3bbb05aa228ef7591.svg new file mode 100644 index 0000000..c5e2906 --- /dev/null +++ b/ras/frontend/static/js/d8e3bbb05aa228ef7591.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/d93be02c73adbb0250bc.svg b/ras/frontend/static/js/d93be02c73adbb0250bc.svg new file mode 100644 index 0000000..fa02f6a --- /dev/null +++ b/ras/frontend/static/js/d93be02c73adbb0250bc.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/da55e778c0af59e1b7ba.svg b/ras/frontend/static/js/da55e778c0af59e1b7ba.svg new file mode 100644 index 0000000..5a52afd --- /dev/null +++ b/ras/frontend/static/js/da55e778c0af59e1b7ba.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/ras/frontend/static/js/da71ea0e0e43752f1f4a.svg b/ras/frontend/static/js/da71ea0e0e43752f1f4a.svg new file mode 100644 index 0000000..5a409ee --- /dev/null +++ b/ras/frontend/static/js/da71ea0e0e43752f1f4a.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/dd048088f167a2fc17f4.svg b/ras/frontend/static/js/dd048088f167a2fc17f4.svg new file mode 100644 index 0000000..0584d71 --- /dev/null +++ b/ras/frontend/static/js/dd048088f167a2fc17f4.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/dd3c991c109acb5525b1.svg b/ras/frontend/static/js/dd3c991c109acb5525b1.svg new file mode 100644 index 0000000..95f1da0 --- /dev/null +++ b/ras/frontend/static/js/dd3c991c109acb5525b1.svg @@ -0,0 +1,594 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/dd5003c60480d12f3c67.svg b/ras/frontend/static/js/dd5003c60480d12f3c67.svg new file mode 100644 index 0000000..d0fa435 --- /dev/null +++ b/ras/frontend/static/js/dd5003c60480d12f3c67.svg @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/de66162867f147fe1ca1.svg b/ras/frontend/static/js/de66162867f147fe1ca1.svg new file mode 100644 index 0000000..728538b --- /dev/null +++ b/ras/frontend/static/js/de66162867f147fe1ca1.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/df0d7ef139caab67f17c.svg b/ras/frontend/static/js/df0d7ef139caab67f17c.svg new file mode 100644 index 0000000..750b396 --- /dev/null +++ b/ras/frontend/static/js/df0d7ef139caab67f17c.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/dfd25b88d3660d236c00.svg b/ras/frontend/static/js/dfd25b88d3660d236c00.svg new file mode 100644 index 0000000..2a8f724 --- /dev/null +++ b/ras/frontend/static/js/dfd25b88d3660d236c00.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ras/frontend/static/js/e0516e5be772a548898b.svg b/ras/frontend/static/js/e0516e5be772a548898b.svg new file mode 100644 index 0000000..8f78548 --- /dev/null +++ b/ras/frontend/static/js/e0516e5be772a548898b.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/e0de0e96aded64134bcf.svg b/ras/frontend/static/js/e0de0e96aded64134bcf.svg new file mode 100644 index 0000000..f2aea01 --- /dev/null +++ b/ras/frontend/static/js/e0de0e96aded64134bcf.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/e104704cd04bb0cb7c72.svg b/ras/frontend/static/js/e104704cd04bb0cb7c72.svg new file mode 100644 index 0000000..28c594f --- /dev/null +++ b/ras/frontend/static/js/e104704cd04bb0cb7c72.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/e28d1b4b1a434168df63.svg b/ras/frontend/static/js/e28d1b4b1a434168df63.svg new file mode 100644 index 0000000..8188c44 --- /dev/null +++ b/ras/frontend/static/js/e28d1b4b1a434168df63.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ras/frontend/static/js/e2e89fb8727d254107da.svg b/ras/frontend/static/js/e2e89fb8727d254107da.svg new file mode 100644 index 0000000..b0625db --- /dev/null +++ b/ras/frontend/static/js/e2e89fb8727d254107da.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/e32ff9c35c4efac64638.svg b/ras/frontend/static/js/e32ff9c35c4efac64638.svg new file mode 100644 index 0000000..1c76217 --- /dev/null +++ b/ras/frontend/static/js/e32ff9c35c4efac64638.svg @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/e3dad1d36409c092e6a5.svg b/ras/frontend/static/js/e3dad1d36409c092e6a5.svg new file mode 100644 index 0000000..c869cf7 --- /dev/null +++ b/ras/frontend/static/js/e3dad1d36409c092e6a5.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/e3e8c5f4f4ab09759fd8.svg b/ras/frontend/static/js/e3e8c5f4f4ab09759fd8.svg new file mode 100644 index 0000000..fbe2106 --- /dev/null +++ b/ras/frontend/static/js/e3e8c5f4f4ab09759fd8.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/e404d718cffb5bd06467.svg b/ras/frontend/static/js/e404d718cffb5bd06467.svg new file mode 100644 index 0000000..baddf7f --- /dev/null +++ b/ras/frontend/static/js/e404d718cffb5bd06467.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/e4a214a98aad840d0881.svg b/ras/frontend/static/js/e4a214a98aad840d0881.svg new file mode 100644 index 0000000..2d0b4df --- /dev/null +++ b/ras/frontend/static/js/e4a214a98aad840d0881.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/e5b8ab73e47d055889b6.svg b/ras/frontend/static/js/e5b8ab73e47d055889b6.svg new file mode 100644 index 0000000..9070726 --- /dev/null +++ b/ras/frontend/static/js/e5b8ab73e47d055889b6.svg @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/e623a69c2c715916a8df.svg b/ras/frontend/static/js/e623a69c2c715916a8df.svg new file mode 100644 index 0000000..164aa79 --- /dev/null +++ b/ras/frontend/static/js/e623a69c2c715916a8df.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/e6ba1f5421701bbb2304.svg b/ras/frontend/static/js/e6ba1f5421701bbb2304.svg new file mode 100644 index 0000000..1687c11 --- /dev/null +++ b/ras/frontend/static/js/e6ba1f5421701bbb2304.svg @@ -0,0 +1,245 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/e700d833be637cc3507b.svg b/ras/frontend/static/js/e700d833be637cc3507b.svg new file mode 100644 index 0000000..ee59b83 --- /dev/null +++ b/ras/frontend/static/js/e700d833be637cc3507b.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/e7fb0dfc1a7ba25626b0.svg b/ras/frontend/static/js/e7fb0dfc1a7ba25626b0.svg new file mode 100644 index 0000000..adda387 --- /dev/null +++ b/ras/frontend/static/js/e7fb0dfc1a7ba25626b0.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/e833b599aaaaf371fa43.svg b/ras/frontend/static/js/e833b599aaaaf371fa43.svg new file mode 100644 index 0000000..496f1a1 --- /dev/null +++ b/ras/frontend/static/js/e833b599aaaaf371fa43.svg @@ -0,0 +1,4 @@ + + + + diff --git a/ras/frontend/static/js/e982ce1a46db65259241.svg b/ras/frontend/static/js/e982ce1a46db65259241.svg new file mode 100644 index 0000000..058c16e --- /dev/null +++ b/ras/frontend/static/js/e982ce1a46db65259241.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ras/frontend/static/js/e9b2f4ba095591e4e9c5.svg b/ras/frontend/static/js/e9b2f4ba095591e4e9c5.svg new file mode 100644 index 0000000..aa8810b --- /dev/null +++ b/ras/frontend/static/js/e9b2f4ba095591e4e9c5.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/ras/frontend/static/js/e9d7238c94cc4589ac0e.svg b/ras/frontend/static/js/e9d7238c94cc4589ac0e.svg new file mode 100644 index 0000000..23aca9e --- /dev/null +++ b/ras/frontend/static/js/e9d7238c94cc4589ac0e.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ras/frontend/static/js/eb884befd701cebde39f.svg b/ras/frontend/static/js/eb884befd701cebde39f.svg new file mode 100644 index 0000000..5493f78 --- /dev/null +++ b/ras/frontend/static/js/eb884befd701cebde39f.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ras/frontend/static/js/eb9cc6c51c5a51ef15f4.svg b/ras/frontend/static/js/eb9cc6c51c5a51ef15f4.svg new file mode 100644 index 0000000..6a86bbe --- /dev/null +++ b/ras/frontend/static/js/eb9cc6c51c5a51ef15f4.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/ec1ec422fd5ac1515437.svg b/ras/frontend/static/js/ec1ec422fd5ac1515437.svg new file mode 100644 index 0000000..b649f1b --- /dev/null +++ b/ras/frontend/static/js/ec1ec422fd5ac1515437.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/ras/frontend/static/js/ecae91f83076777898e1.svg b/ras/frontend/static/js/ecae91f83076777898e1.svg new file mode 100644 index 0000000..04d064a --- /dev/null +++ b/ras/frontend/static/js/ecae91f83076777898e1.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/ede15c2583ace31d8249.svg b/ras/frontend/static/js/ede15c2583ace31d8249.svg new file mode 100644 index 0000000..2d02c6a --- /dev/null +++ b/ras/frontend/static/js/ede15c2583ace31d8249.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/ede59c1723abcf425c23.svg b/ras/frontend/static/js/ede59c1723abcf425c23.svg new file mode 100644 index 0000000..2d05721 --- /dev/null +++ b/ras/frontend/static/js/ede59c1723abcf425c23.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/ee0d8635f3377e52c7f3.svg b/ras/frontend/static/js/ee0d8635f3377e52c7f3.svg new file mode 100644 index 0000000..15803ff --- /dev/null +++ b/ras/frontend/static/js/ee0d8635f3377e52c7f3.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/ee3571430d489c32deac.svg b/ras/frontend/static/js/ee3571430d489c32deac.svg new file mode 100644 index 0000000..12e3b67 --- /dev/null +++ b/ras/frontend/static/js/ee3571430d489c32deac.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ras/frontend/static/js/ef0b194fefa52dfa07ef.svg b/ras/frontend/static/js/ef0b194fefa52dfa07ef.svg new file mode 100644 index 0000000..208e4d2 --- /dev/null +++ b/ras/frontend/static/js/ef0b194fefa52dfa07ef.svg @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/ef80804e14eb159e3936.svg b/ras/frontend/static/js/ef80804e14eb159e3936.svg new file mode 100644 index 0000000..cea6006 --- /dev/null +++ b/ras/frontend/static/js/ef80804e14eb159e3936.svg @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/f06e3a3930f25859ac07.svg b/ras/frontend/static/js/f06e3a3930f25859ac07.svg new file mode 100644 index 0000000..ab08fdb --- /dev/null +++ b/ras/frontend/static/js/f06e3a3930f25859ac07.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/f07a34b8d0a9f8910177.svg b/ras/frontend/static/js/f07a34b8d0a9f8910177.svg new file mode 100644 index 0000000..c5b89cb --- /dev/null +++ b/ras/frontend/static/js/f07a34b8d0a9f8910177.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/f088588c0fce3d304cd2.svg b/ras/frontend/static/js/f088588c0fce3d304cd2.svg new file mode 100644 index 0000000..44a2fa8 --- /dev/null +++ b/ras/frontend/static/js/f088588c0fce3d304cd2.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/ras/frontend/static/js/f17f9b312e559bd63608.svg b/ras/frontend/static/js/f17f9b312e559bd63608.svg new file mode 100644 index 0000000..0299f9f --- /dev/null +++ b/ras/frontend/static/js/f17f9b312e559bd63608.svg @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/f1b8e364a7dd0a8f3fb5.svg b/ras/frontend/static/js/f1b8e364a7dd0a8f3fb5.svg new file mode 100644 index 0000000..6c854ac --- /dev/null +++ b/ras/frontend/static/js/f1b8e364a7dd0a8f3fb5.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/f1e55aacdee7ad81f5da.svg b/ras/frontend/static/js/f1e55aacdee7ad81f5da.svg new file mode 100644 index 0000000..cb3feb0 --- /dev/null +++ b/ras/frontend/static/js/f1e55aacdee7ad81f5da.svg @@ -0,0 +1,544 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/f252e4cb6189ffbeb1ed.svg b/ras/frontend/static/js/f252e4cb6189ffbeb1ed.svg new file mode 100644 index 0000000..10450f9 --- /dev/null +++ b/ras/frontend/static/js/f252e4cb6189ffbeb1ed.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ras/frontend/static/js/f281cc96dc94e9f2bcdf.svg b/ras/frontend/static/js/f281cc96dc94e9f2bcdf.svg new file mode 100644 index 0000000..5e71c40 --- /dev/null +++ b/ras/frontend/static/js/f281cc96dc94e9f2bcdf.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ras/frontend/static/js/f29450b9f8b2f04e96aa.svg b/ras/frontend/static/js/f29450b9f8b2f04e96aa.svg new file mode 100644 index 0000000..81eb35f --- /dev/null +++ b/ras/frontend/static/js/f29450b9f8b2f04e96aa.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ras/frontend/static/js/f4334b2e5d62cd297935.svg b/ras/frontend/static/js/f4334b2e5d62cd297935.svg new file mode 100644 index 0000000..8ff2256 --- /dev/null +++ b/ras/frontend/static/js/f4334b2e5d62cd297935.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/ras/frontend/static/js/f4b6713db5e5a4773e95.svg b/ras/frontend/static/js/f4b6713db5e5a4773e95.svg new file mode 100644 index 0000000..603ec22 --- /dev/null +++ b/ras/frontend/static/js/f4b6713db5e5a4773e95.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/f55d4352a21eeff37a90.svg b/ras/frontend/static/js/f55d4352a21eeff37a90.svg new file mode 100644 index 0000000..abd682c --- /dev/null +++ b/ras/frontend/static/js/f55d4352a21eeff37a90.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/f65c0891df42c24b23dc.svg b/ras/frontend/static/js/f65c0891df42c24b23dc.svg new file mode 100644 index 0000000..3af2bdf --- /dev/null +++ b/ras/frontend/static/js/f65c0891df42c24b23dc.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/f6a164349ff634cf585d.svg b/ras/frontend/static/js/f6a164349ff634cf585d.svg new file mode 100644 index 0000000..68f369a --- /dev/null +++ b/ras/frontend/static/js/f6a164349ff634cf585d.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/f6c172d9fdebca34a65f.svg b/ras/frontend/static/js/f6c172d9fdebca34a65f.svg new file mode 100644 index 0000000..9fadf85 --- /dev/null +++ b/ras/frontend/static/js/f6c172d9fdebca34a65f.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/f7c7739a330c16f18fcd.svg b/ras/frontend/static/js/f7c7739a330c16f18fcd.svg new file mode 100644 index 0000000..b179aad --- /dev/null +++ b/ras/frontend/static/js/f7c7739a330c16f18fcd.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/f7d5fa0258940e2c3ac9.svg b/ras/frontend/static/js/f7d5fa0258940e2c3ac9.svg new file mode 100644 index 0000000..dcd0a6b --- /dev/null +++ b/ras/frontend/static/js/f7d5fa0258940e2c3ac9.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ras/frontend/static/js/f8f9b21529bdc34df1b5.svg b/ras/frontend/static/js/f8f9b21529bdc34df1b5.svg new file mode 100644 index 0000000..bb2799c --- /dev/null +++ b/ras/frontend/static/js/f8f9b21529bdc34df1b5.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/f95e744f8dc1060e28c9.svg b/ras/frontend/static/js/f95e744f8dc1060e28c9.svg new file mode 100644 index 0000000..86ec718 --- /dev/null +++ b/ras/frontend/static/js/f95e744f8dc1060e28c9.svg @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/f9ea0367acd37580acec.svg b/ras/frontend/static/js/f9ea0367acd37580acec.svg new file mode 100644 index 0000000..089cbce --- /dev/null +++ b/ras/frontend/static/js/f9ea0367acd37580acec.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/ras/frontend/static/js/fa530666ce9e170dc6cd.svg b/ras/frontend/static/js/fa530666ce9e170dc6cd.svg new file mode 100644 index 0000000..6f6b716 --- /dev/null +++ b/ras/frontend/static/js/fa530666ce9e170dc6cd.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/fb29ad0e1dbf3e0eb0f0.svg b/ras/frontend/static/js/fb29ad0e1dbf3e0eb0f0.svg new file mode 100644 index 0000000..66f5ae7 --- /dev/null +++ b/ras/frontend/static/js/fb29ad0e1dbf3e0eb0f0.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/fb56b21728994fd6b18f.svg b/ras/frontend/static/js/fb56b21728994fd6b18f.svg new file mode 100644 index 0000000..48bd0b0 --- /dev/null +++ b/ras/frontend/static/js/fb56b21728994fd6b18f.svg @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/fbb7d374d6bc26a0991d.svg b/ras/frontend/static/js/fbb7d374d6bc26a0991d.svg new file mode 100644 index 0000000..2c6c5d9 --- /dev/null +++ b/ras/frontend/static/js/fbb7d374d6bc26a0991d.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/fc9c4dcd0fd855eb51a3.svg b/ras/frontend/static/js/fc9c4dcd0fd855eb51a3.svg new file mode 100644 index 0000000..453898b --- /dev/null +++ b/ras/frontend/static/js/fc9c4dcd0fd855eb51a3.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ras/frontend/static/js/fd1c498d09f3df7291e3.svg b/ras/frontend/static/js/fd1c498d09f3df7291e3.svg new file mode 100644 index 0000000..2afe1d3 --- /dev/null +++ b/ras/frontend/static/js/fd1c498d09f3df7291e3.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/ras/frontend/static/js/fd860b79f4945f3a533c.svg b/ras/frontend/static/js/fd860b79f4945f3a533c.svg new file mode 100644 index 0000000..900abc6 --- /dev/null +++ b/ras/frontend/static/js/fd860b79f4945f3a533c.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/fde48cca8a461cc55649.svg b/ras/frontend/static/js/fde48cca8a461cc55649.svg new file mode 100644 index 0000000..1daf9bb --- /dev/null +++ b/ras/frontend/static/js/fde48cca8a461cc55649.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/fe0c56194b4f20b42ab2.svg b/ras/frontend/static/js/fe0c56194b4f20b42ab2.svg new file mode 100644 index 0000000..5c251da --- /dev/null +++ b/ras/frontend/static/js/fe0c56194b4f20b42ab2.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/fe4d22ce233d1de3dbc1.svg b/ras/frontend/static/js/fe4d22ce233d1de3dbc1.svg new file mode 100644 index 0000000..b94dc75 --- /dev/null +++ b/ras/frontend/static/js/fe4d22ce233d1de3dbc1.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/fe67f0ec71b864386562.svg b/ras/frontend/static/js/fe67f0ec71b864386562.svg new file mode 100644 index 0000000..f571a89 --- /dev/null +++ b/ras/frontend/static/js/fe67f0ec71b864386562.svg @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/fe8ec4acc928625ae896.svg b/ras/frontend/static/js/fe8ec4acc928625ae896.svg new file mode 100644 index 0000000..7ff190b --- /dev/null +++ b/ras/frontend/static/js/fe8ec4acc928625ae896.svg @@ -0,0 +1,6745 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/feac46175cdeca2edc96.svg b/ras/frontend/static/js/feac46175cdeca2edc96.svg new file mode 100644 index 0000000..ad1a76a --- /dev/null +++ b/ras/frontend/static/js/feac46175cdeca2edc96.svg @@ -0,0 +1,292 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/febcc1b18059405d2a1b.svg b/ras/frontend/static/js/febcc1b18059405d2a1b.svg new file mode 100644 index 0000000..b9596d0 --- /dev/null +++ b/ras/frontend/static/js/febcc1b18059405d2a1b.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ras/frontend/static/js/ff6176a6bfeba64d0716.svg b/ras/frontend/static/js/ff6176a6bfeba64d0716.svg new file mode 100644 index 0000000..6a9e75e --- /dev/null +++ b/ras/frontend/static/js/ff6176a6bfeba64d0716.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/ras/frontend/static/js/ff919dfd6a29444f17e8.svg b/ras/frontend/static/js/ff919dfd6a29444f17e8.svg new file mode 100644 index 0000000..c1020ff --- /dev/null +++ b/ras/frontend/static/js/ff919dfd6a29444f17e8.svg @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ras/frontend/static/js/main.js b/ras/frontend/static/js/main.js index 29adf6d..b79f7b0 100644 --- a/ras/frontend/static/js/main.js +++ b/ras/frontend/static/js/main.js @@ -1,2 +1,2 @@ /*! For license information please see main.js.LICENSE.txt */ -(()=>{var __webpack_modules__={"./node_modules/@emotion/is-prop-valid/dist/emotion-is-prop-valid.esm.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _emotion_memoize__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @emotion/memoize */ "./node_modules/@emotion/memoize/dist/emotion-memoize.esm.js");\n\n\nvar reactPropsRegex = /^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|abbr|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|disablePictureInPicture|download|draggable|encType|enterKeyHint|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|translate|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|incremental|fallback|inert|itemProp|itemScope|itemType|itemID|itemRef|on|option|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/; // https://esbench.com/bench/5bfee68a4cd7e6009ef61d23\n\nvar isPropValid = /* #__PURE__ */(0,_emotion_memoize__WEBPACK_IMPORTED_MODULE_0__["default"])(function (prop) {\n return reactPropsRegex.test(prop) || prop.charCodeAt(0) === 111\n /* o */\n && prop.charCodeAt(1) === 110\n /* n */\n && prop.charCodeAt(2) < 91;\n}\n/* Z+1 */\n);\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (isPropValid);\n\n\n//# sourceURL=webpack://frontend/./node_modules/@emotion/is-prop-valid/dist/emotion-is-prop-valid.esm.js?')},"./node_modules/@emotion/memoize/dist/emotion-memoize.esm.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction memoize(fn) {\n var cache = Object.create(null);\n return function (arg) {\n if (cache[arg] === undefined) cache[arg] = fn(arg);\n return cache[arg];\n };\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (memoize);\n\n\n//# sourceURL=webpack://frontend/./node_modules/@emotion/memoize/dist/emotion-memoize.esm.js?')},"./node_modules/@emotion/stylis/dist/stylis.browser.esm.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction stylis_min (W) {\n function M(d, c, e, h, a) {\n for (var m = 0, b = 0, v = 0, n = 0, q, g, x = 0, K = 0, k, u = k = q = 0, l = 0, r = 0, I = 0, t = 0, B = e.length, J = B - 1, y, f = '', p = '', F = '', G = '', C; l < B;) {\n g = e.charCodeAt(l);\n l === J && 0 !== b + n + v + m && (0 !== b && (g = 47 === b ? 10 : 47), n = v = m = 0, B++, J++);\n\n if (0 === b + n + v + m) {\n if (l === J && (0 < r && (f = f.replace(N, '')), 0 < f.trim().length)) {\n switch (g) {\n case 32:\n case 9:\n case 59:\n case 13:\n case 10:\n break;\n\n default:\n f += e.charAt(l);\n }\n\n g = 59;\n }\n\n switch (g) {\n case 123:\n f = f.trim();\n q = f.charCodeAt(0);\n k = 1;\n\n for (t = ++l; l < B;) {\n switch (g = e.charCodeAt(l)) {\n case 123:\n k++;\n break;\n\n case 125:\n k--;\n break;\n\n case 47:\n switch (g = e.charCodeAt(l + 1)) {\n case 42:\n case 47:\n a: {\n for (u = l + 1; u < J; ++u) {\n switch (e.charCodeAt(u)) {\n case 47:\n if (42 === g && 42 === e.charCodeAt(u - 1) && l + 2 !== u) {\n l = u + 1;\n break a;\n }\n\n break;\n\n case 10:\n if (47 === g) {\n l = u + 1;\n break a;\n }\n\n }\n }\n\n l = u;\n }\n\n }\n\n break;\n\n case 91:\n g++;\n\n case 40:\n g++;\n\n case 34:\n case 39:\n for (; l++ < J && e.charCodeAt(l) !== g;) {\n }\n\n }\n\n if (0 === k) break;\n l++;\n }\n\n k = e.substring(t, l);\n 0 === q && (q = (f = f.replace(ca, '').trim()).charCodeAt(0));\n\n switch (q) {\n case 64:\n 0 < r && (f = f.replace(N, ''));\n g = f.charCodeAt(1);\n\n switch (g) {\n case 100:\n case 109:\n case 115:\n case 45:\n r = c;\n break;\n\n default:\n r = O;\n }\n\n k = M(c, r, k, g, a + 1);\n t = k.length;\n 0 < A && (r = X(O, f, I), C = H(3, k, r, c, D, z, t, g, a, h), f = r.join(''), void 0 !== C && 0 === (t = (k = C.trim()).length) && (g = 0, k = ''));\n if (0 < t) switch (g) {\n case 115:\n f = f.replace(da, ea);\n\n case 100:\n case 109:\n case 45:\n k = f + '{' + k + '}';\n break;\n\n case 107:\n f = f.replace(fa, '$1 $2');\n k = f + '{' + k + '}';\n k = 1 === w || 2 === w && L('@' + k, 3) ? '@-webkit-' + k + '@' + k : '@' + k;\n break;\n\n default:\n k = f + k, 112 === h && (k = (p += k, ''));\n } else k = '';\n break;\n\n default:\n k = M(c, X(c, f, I), k, h, a + 1);\n }\n\n F += k;\n k = I = r = u = q = 0;\n f = '';\n g = e.charCodeAt(++l);\n break;\n\n case 125:\n case 59:\n f = (0 < r ? f.replace(N, '') : f).trim();\n if (1 < (t = f.length)) switch (0 === u && (q = f.charCodeAt(0), 45 === q || 96 < q && 123 > q) && (t = (f = f.replace(' ', ':')).length), 0 < A && void 0 !== (C = H(1, f, c, d, D, z, p.length, h, a, h)) && 0 === (t = (f = C.trim()).length) && (f = '\\x00\\x00'), q = f.charCodeAt(0), g = f.charCodeAt(1), q) {\n case 0:\n break;\n\n case 64:\n if (105 === g || 99 === g) {\n G += f + e.charAt(l);\n break;\n }\n\n default:\n 58 !== f.charCodeAt(t - 1) && (p += P(f, q, g, f.charCodeAt(2)));\n }\n I = r = u = q = 0;\n f = '';\n g = e.charCodeAt(++l);\n }\n }\n\n switch (g) {\n case 13:\n case 10:\n 47 === b ? b = 0 : 0 === 1 + q && 107 !== h && 0 < f.length && (r = 1, f += '\\x00');\n 0 < A * Y && H(0, f, c, d, D, z, p.length, h, a, h);\n z = 1;\n D++;\n break;\n\n case 59:\n case 125:\n if (0 === b + n + v + m) {\n z++;\n break;\n }\n\n default:\n z++;\n y = e.charAt(l);\n\n switch (g) {\n case 9:\n case 32:\n if (0 === n + m + b) switch (x) {\n case 44:\n case 58:\n case 9:\n case 32:\n y = '';\n break;\n\n default:\n 32 !== g && (y = ' ');\n }\n break;\n\n case 0:\n y = '\\\\0';\n break;\n\n case 12:\n y = '\\\\f';\n break;\n\n case 11:\n y = '\\\\v';\n break;\n\n case 38:\n 0 === n + b + m && (r = I = 1, y = '\\f' + y);\n break;\n\n case 108:\n if (0 === n + b + m + E && 0 < u) switch (l - u) {\n case 2:\n 112 === x && 58 === e.charCodeAt(l - 3) && (E = x);\n\n case 8:\n 111 === K && (E = K);\n }\n break;\n\n case 58:\n 0 === n + b + m && (u = l);\n break;\n\n case 44:\n 0 === b + v + n + m && (r = 1, y += '\\r');\n break;\n\n case 34:\n case 39:\n 0 === b && (n = n === g ? 0 : 0 === n ? g : n);\n break;\n\n case 91:\n 0 === n + b + v && m++;\n break;\n\n case 93:\n 0 === n + b + v && m--;\n break;\n\n case 41:\n 0 === n + b + m && v--;\n break;\n\n case 40:\n if (0 === n + b + m) {\n if (0 === q) switch (2 * x + 3 * K) {\n case 533:\n break;\n\n default:\n q = 1;\n }\n v++;\n }\n\n break;\n\n case 64:\n 0 === b + v + n + m + u + k && (k = 1);\n break;\n\n case 42:\n case 47:\n if (!(0 < n + m + v)) switch (b) {\n case 0:\n switch (2 * g + 3 * e.charCodeAt(l + 1)) {\n case 235:\n b = 47;\n break;\n\n case 220:\n t = l, b = 42;\n }\n\n break;\n\n case 42:\n 47 === g && 42 === x && t + 2 !== l && (33 === e.charCodeAt(t + 2) && (p += e.substring(t, l + 1)), y = '', b = 0);\n }\n }\n\n 0 === b && (f += y);\n }\n\n K = x;\n x = g;\n l++;\n }\n\n t = p.length;\n\n if (0 < t) {\n r = c;\n if (0 < A && (C = H(2, p, r, d, D, z, t, h, a, h), void 0 !== C && 0 === (p = C).length)) return G + p + F;\n p = r.join(',') + '{' + p + '}';\n\n if (0 !== w * E) {\n 2 !== w || L(p, 2) || (E = 0);\n\n switch (E) {\n case 111:\n p = p.replace(ha, ':-moz-$1') + p;\n break;\n\n case 112:\n p = p.replace(Q, '::-webkit-input-$1') + p.replace(Q, '::-moz-$1') + p.replace(Q, ':-ms-input-$1') + p;\n }\n\n E = 0;\n }\n }\n\n return G + p + F;\n }\n\n function X(d, c, e) {\n var h = c.trim().split(ia);\n c = h;\n var a = h.length,\n m = d.length;\n\n switch (m) {\n case 0:\n case 1:\n var b = 0;\n\n for (d = 0 === m ? '' : d[0] + ' '; b < a; ++b) {\n c[b] = Z(d, c[b], e).trim();\n }\n\n break;\n\n default:\n var v = b = 0;\n\n for (c = []; b < a; ++b) {\n for (var n = 0; n < m; ++n) {\n c[v++] = Z(d[n] + ' ', h[b], e).trim();\n }\n }\n\n }\n\n return c;\n }\n\n function Z(d, c, e) {\n var h = c.charCodeAt(0);\n 33 > h && (h = (c = c.trim()).charCodeAt(0));\n\n switch (h) {\n case 38:\n return c.replace(F, '$1' + d.trim());\n\n case 58:\n return d.trim() + c.replace(F, '$1' + d.trim());\n\n default:\n if (0 < 1 * e && 0 < c.indexOf('\\f')) return c.replace(F, (58 === d.charCodeAt(0) ? '' : '$1') + d.trim());\n }\n\n return d + c;\n }\n\n function P(d, c, e, h) {\n var a = d + ';',\n m = 2 * c + 3 * e + 4 * h;\n\n if (944 === m) {\n d = a.indexOf(':', 9) + 1;\n var b = a.substring(d, a.length - 1).trim();\n b = a.substring(0, d).trim() + b + ';';\n return 1 === w || 2 === w && L(b, 1) ? '-webkit-' + b + b : b;\n }\n\n if (0 === w || 2 === w && !L(a, 1)) return a;\n\n switch (m) {\n case 1015:\n return 97 === a.charCodeAt(10) ? '-webkit-' + a + a : a;\n\n case 951:\n return 116 === a.charCodeAt(3) ? '-webkit-' + a + a : a;\n\n case 963:\n return 110 === a.charCodeAt(5) ? '-webkit-' + a + a : a;\n\n case 1009:\n if (100 !== a.charCodeAt(4)) break;\n\n case 969:\n case 942:\n return '-webkit-' + a + a;\n\n case 978:\n return '-webkit-' + a + '-moz-' + a + a;\n\n case 1019:\n case 983:\n return '-webkit-' + a + '-moz-' + a + '-ms-' + a + a;\n\n case 883:\n if (45 === a.charCodeAt(8)) return '-webkit-' + a + a;\n if (0 < a.indexOf('image-set(', 11)) return a.replace(ja, '$1-webkit-$2') + a;\n break;\n\n case 932:\n if (45 === a.charCodeAt(4)) switch (a.charCodeAt(5)) {\n case 103:\n return '-webkit-box-' + a.replace('-grow', '') + '-webkit-' + a + '-ms-' + a.replace('grow', 'positive') + a;\n\n case 115:\n return '-webkit-' + a + '-ms-' + a.replace('shrink', 'negative') + a;\n\n case 98:\n return '-webkit-' + a + '-ms-' + a.replace('basis', 'preferred-size') + a;\n }\n return '-webkit-' + a + '-ms-' + a + a;\n\n case 964:\n return '-webkit-' + a + '-ms-flex-' + a + a;\n\n case 1023:\n if (99 !== a.charCodeAt(8)) break;\n b = a.substring(a.indexOf(':', 15)).replace('flex-', '').replace('space-between', 'justify');\n return '-webkit-box-pack' + b + '-webkit-' + a + '-ms-flex-pack' + b + a;\n\n case 1005:\n return ka.test(a) ? a.replace(aa, ':-webkit-') + a.replace(aa, ':-moz-') + a : a;\n\n case 1e3:\n b = a.substring(13).trim();\n c = b.indexOf('-') + 1;\n\n switch (b.charCodeAt(0) + b.charCodeAt(c)) {\n case 226:\n b = a.replace(G, 'tb');\n break;\n\n case 232:\n b = a.replace(G, 'tb-rl');\n break;\n\n case 220:\n b = a.replace(G, 'lr');\n break;\n\n default:\n return a;\n }\n\n return '-webkit-' + a + '-ms-' + b + a;\n\n case 1017:\n if (-1 === a.indexOf('sticky', 9)) break;\n\n case 975:\n c = (a = d).length - 10;\n b = (33 === a.charCodeAt(c) ? a.substring(0, c) : a).substring(d.indexOf(':', 7) + 1).trim();\n\n switch (m = b.charCodeAt(0) + (b.charCodeAt(7) | 0)) {\n case 203:\n if (111 > b.charCodeAt(8)) break;\n\n case 115:\n a = a.replace(b, '-webkit-' + b) + ';' + a;\n break;\n\n case 207:\n case 102:\n a = a.replace(b, '-webkit-' + (102 < m ? 'inline-' : '') + 'box') + ';' + a.replace(b, '-webkit-' + b) + ';' + a.replace(b, '-ms-' + b + 'box') + ';' + a;\n }\n\n return a + ';';\n\n case 938:\n if (45 === a.charCodeAt(5)) switch (a.charCodeAt(6)) {\n case 105:\n return b = a.replace('-items', ''), '-webkit-' + a + '-webkit-box-' + b + '-ms-flex-' + b + a;\n\n case 115:\n return '-webkit-' + a + '-ms-flex-item-' + a.replace(ba, '') + a;\n\n default:\n return '-webkit-' + a + '-ms-flex-line-pack' + a.replace('align-content', '').replace(ba, '') + a;\n }\n break;\n\n case 973:\n case 989:\n if (45 !== a.charCodeAt(3) || 122 === a.charCodeAt(4)) break;\n\n case 931:\n case 953:\n if (!0 === la.test(d)) return 115 === (b = d.substring(d.indexOf(':') + 1)).charCodeAt(0) ? P(d.replace('stretch', 'fill-available'), c, e, h).replace(':fill-available', ':stretch') : a.replace(b, '-webkit-' + b) + a.replace(b, '-moz-' + b.replace('fill-', '')) + a;\n break;\n\n case 962:\n if (a = '-webkit-' + a + (102 === a.charCodeAt(5) ? '-ms-' + a : '') + a, 211 === e + h && 105 === a.charCodeAt(13) && 0 < a.indexOf('transform', 10)) return a.substring(0, a.indexOf(';', 27) + 1).replace(ma, '$1-webkit-$2') + a;\n }\n\n return a;\n }\n\n function L(d, c) {\n var e = d.indexOf(1 === c ? ':' : '{'),\n h = d.substring(0, 3 !== c ? e : 10);\n e = d.substring(e + 1, d.length - 1);\n return R(2 !== c ? h : h.replace(na, '$1'), e, c);\n }\n\n function ea(d, c) {\n var e = P(c, c.charCodeAt(0), c.charCodeAt(1), c.charCodeAt(2));\n return e !== c + ';' ? e.replace(oa, ' or ($1)').substring(4) : '(' + c + ')';\n }\n\n function H(d, c, e, h, a, m, b, v, n, q) {\n for (var g = 0, x = c, w; g < A; ++g) {\n switch (w = S[g].call(B, d, x, e, h, a, m, b, v, n, q)) {\n case void 0:\n case !1:\n case !0:\n case null:\n break;\n\n default:\n x = w;\n }\n }\n\n if (x !== c) return x;\n }\n\n function T(d) {\n switch (d) {\n case void 0:\n case null:\n A = S.length = 0;\n break;\n\n default:\n if ('function' === typeof d) S[A++] = d;else if ('object' === typeof d) for (var c = 0, e = d.length; c < e; ++c) {\n T(d[c]);\n } else Y = !!d | 0;\n }\n\n return T;\n }\n\n function U(d) {\n d = d.prefix;\n void 0 !== d && (R = null, d ? 'function' !== typeof d ? w = 1 : (w = 2, R = d) : w = 0);\n return U;\n }\n\n function B(d, c) {\n var e = d;\n 33 > e.charCodeAt(0) && (e = e.trim());\n V = e;\n e = [V];\n\n if (0 < A) {\n var h = H(-1, c, e, e, D, z, 0, 0, 0, 0);\n void 0 !== h && 'string' === typeof h && (c = h);\n }\n\n var a = M(O, e, c, 0, 0);\n 0 < A && (h = H(-2, a, e, e, D, z, a.length, 0, 0, 0), void 0 !== h && (a = h));\n V = '';\n E = 0;\n z = D = 1;\n return a;\n }\n\n var ca = /^\\0+/g,\n N = /[\\0\\r\\f]/g,\n aa = /: */g,\n ka = /zoo|gra/,\n ma = /([,: ])(transform)/g,\n ia = /,\\r+?/g,\n F = /([\\t\\r\\n ])*\\f?&/g,\n fa = /@(k\\w+)\\s*(\\S*)\\s*/,\n Q = /::(place)/g,\n ha = /:(read-only)/g,\n G = /[svh]\\w+-[tblr]{2}/,\n da = /\\(\\s*(.*)\\s*\\)/g,\n oa = /([\\s\\S]*?);/g,\n ba = /-self|flex-/g,\n na = /[^]*?(:[rp][el]a[\\w-]+)[^]*/,\n la = /stretch|:\\s*\\w+\\-(?:conte|avail)/,\n ja = /([^-])(image-set\\()/,\n z = 1,\n D = 1,\n E = 0,\n w = 1,\n O = [],\n S = [],\n A = 0,\n R = null,\n Y = 0,\n V = '';\n B.use = T;\n B.set = U;\n void 0 !== W && U(W);\n return B;\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (stylis_min);\n\n\n//# sourceURL=webpack://frontend/./node_modules/@emotion/stylis/dist/stylis.browser.esm.js?")},"./node_modules/@remix-run/router/dist/router.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "AbortedDeferredError": () => (/* binding */ AbortedDeferredError),\n/* harmony export */ "Action": () => (/* binding */ Action),\n/* harmony export */ "ErrorResponse": () => (/* binding */ ErrorResponse),\n/* harmony export */ "IDLE_BLOCKER": () => (/* binding */ IDLE_BLOCKER),\n/* harmony export */ "IDLE_FETCHER": () => (/* binding */ IDLE_FETCHER),\n/* harmony export */ "IDLE_NAVIGATION": () => (/* binding */ IDLE_NAVIGATION),\n/* harmony export */ "UNSAFE_DEFERRED_SYMBOL": () => (/* binding */ UNSAFE_DEFERRED_SYMBOL),\n/* harmony export */ "UNSAFE_DeferredData": () => (/* binding */ DeferredData),\n/* harmony export */ "UNSAFE_convertRoutesToDataRoutes": () => (/* binding */ convertRoutesToDataRoutes),\n/* harmony export */ "UNSAFE_getPathContributingMatches": () => (/* binding */ getPathContributingMatches),\n/* harmony export */ "UNSAFE_invariant": () => (/* binding */ invariant),\n/* harmony export */ "createBrowserHistory": () => (/* binding */ createBrowserHistory),\n/* harmony export */ "createHashHistory": () => (/* binding */ createHashHistory),\n/* harmony export */ "createMemoryHistory": () => (/* binding */ createMemoryHistory),\n/* harmony export */ "createPath": () => (/* binding */ createPath),\n/* harmony export */ "createRouter": () => (/* binding */ createRouter),\n/* harmony export */ "createStaticHandler": () => (/* binding */ createStaticHandler),\n/* harmony export */ "defer": () => (/* binding */ defer),\n/* harmony export */ "generatePath": () => (/* binding */ generatePath),\n/* harmony export */ "getStaticContextFromError": () => (/* binding */ getStaticContextFromError),\n/* harmony export */ "getToPathname": () => (/* binding */ getToPathname),\n/* harmony export */ "isRouteErrorResponse": () => (/* binding */ isRouteErrorResponse),\n/* harmony export */ "joinPaths": () => (/* binding */ joinPaths),\n/* harmony export */ "json": () => (/* binding */ json),\n/* harmony export */ "matchPath": () => (/* binding */ matchPath),\n/* harmony export */ "matchRoutes": () => (/* binding */ matchRoutes),\n/* harmony export */ "normalizePathname": () => (/* binding */ normalizePathname),\n/* harmony export */ "parsePath": () => (/* binding */ parsePath),\n/* harmony export */ "redirect": () => (/* binding */ redirect),\n/* harmony export */ "resolvePath": () => (/* binding */ resolvePath),\n/* harmony export */ "resolveTo": () => (/* binding */ resolveTo),\n/* harmony export */ "stripBasename": () => (/* binding */ stripBasename),\n/* harmony export */ "warning": () => (/* binding */ warning)\n/* harmony export */ });\n/**\n * @remix-run/router v1.3.3\n *\n * Copyright (c) Remix Software Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.md file in the root directory of this source tree.\n *\n * @license MIT\n */\nfunction _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n return _extends.apply(this, arguments);\n}\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Types and Constants\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Actions represent the type of change to a location value.\n */\nvar Action;\n\n(function (Action) {\n /**\n * A POP indicates a change to an arbitrary index in the history stack, such\n * as a back or forward navigation. It does not describe the direction of the\n * navigation, only that the current index changed.\n *\n * Note: This is the default action for newly created history objects.\n */\n Action["Pop"] = "POP";\n /**\n * A PUSH indicates a new entry being added to the history stack, such as when\n * a link is clicked and a new page loads. When this happens, all subsequent\n * entries in the stack are lost.\n */\n\n Action["Push"] = "PUSH";\n /**\n * A REPLACE indicates the entry at the current index in the history stack\n * being replaced by a new one.\n */\n\n Action["Replace"] = "REPLACE";\n})(Action || (Action = {}));\n\nconst PopStateEventType = "popstate";\n/**\n * Memory history stores the current location in memory. It is designed for use\n * in stateful non-browser environments like tests and React Native.\n */\n\nfunction createMemoryHistory(options) {\n if (options === void 0) {\n options = {};\n }\n\n let {\n initialEntries = ["/"],\n initialIndex,\n v5Compat = false\n } = options;\n let entries; // Declare so we can access from createMemoryLocation\n\n entries = initialEntries.map((entry, index) => createMemoryLocation(entry, typeof entry === "string" ? null : entry.state, index === 0 ? "default" : undefined));\n let index = clampIndex(initialIndex == null ? entries.length - 1 : initialIndex);\n let action = Action.Pop;\n let listener = null;\n\n function clampIndex(n) {\n return Math.min(Math.max(n, 0), entries.length - 1);\n }\n\n function getCurrentLocation() {\n return entries[index];\n }\n\n function createMemoryLocation(to, state, key) {\n if (state === void 0) {\n state = null;\n }\n\n let location = createLocation(entries ? getCurrentLocation().pathname : "/", to, state, key);\n warning$1(location.pathname.charAt(0) === "/", "relative pathnames are not supported in memory history: " + JSON.stringify(to));\n return location;\n }\n\n function createHref(to) {\n return typeof to === "string" ? to : createPath(to);\n }\n\n let history = {\n get index() {\n return index;\n },\n\n get action() {\n return action;\n },\n\n get location() {\n return getCurrentLocation();\n },\n\n createHref,\n\n createURL(to) {\n return new URL(createHref(to), "http://localhost");\n },\n\n encodeLocation(to) {\n let path = typeof to === "string" ? parsePath(to) : to;\n return {\n pathname: path.pathname || "",\n search: path.search || "",\n hash: path.hash || ""\n };\n },\n\n push(to, state) {\n action = Action.Push;\n let nextLocation = createMemoryLocation(to, state);\n index += 1;\n entries.splice(index, entries.length, nextLocation);\n\n if (v5Compat && listener) {\n listener({\n action,\n location: nextLocation,\n delta: 1\n });\n }\n },\n\n replace(to, state) {\n action = Action.Replace;\n let nextLocation = createMemoryLocation(to, state);\n entries[index] = nextLocation;\n\n if (v5Compat && listener) {\n listener({\n action,\n location: nextLocation,\n delta: 0\n });\n }\n },\n\n go(delta) {\n action = Action.Pop;\n let nextIndex = clampIndex(index + delta);\n let nextLocation = entries[nextIndex];\n index = nextIndex;\n\n if (listener) {\n listener({\n action,\n location: nextLocation,\n delta\n });\n }\n },\n\n listen(fn) {\n listener = fn;\n return () => {\n listener = null;\n };\n }\n\n };\n return history;\n}\n/**\n * Browser history stores the location in regular URLs. This is the standard for\n * most web apps, but it requires some configuration on the server to ensure you\n * serve the same app at multiple URLs.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#createbrowserhistory\n */\n\nfunction createBrowserHistory(options) {\n if (options === void 0) {\n options = {};\n }\n\n function createBrowserLocation(window, globalHistory) {\n let {\n pathname,\n search,\n hash\n } = window.location;\n return createLocation("", {\n pathname,\n search,\n hash\n }, // state defaults to `null` because `window.history.state` does\n globalHistory.state && globalHistory.state.usr || null, globalHistory.state && globalHistory.state.key || "default");\n }\n\n function createBrowserHref(window, to) {\n return typeof to === "string" ? to : createPath(to);\n }\n\n return getUrlBasedHistory(createBrowserLocation, createBrowserHref, null, options);\n}\n/**\n * Hash history stores the location in window.location.hash. This makes it ideal\n * for situations where you don\'t want to send the location to the server for\n * some reason, either because you do cannot configure it or the URL space is\n * reserved for something else.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#createhashhistory\n */\n\nfunction createHashHistory(options) {\n if (options === void 0) {\n options = {};\n }\n\n function createHashLocation(window, globalHistory) {\n let {\n pathname = "/",\n search = "",\n hash = ""\n } = parsePath(window.location.hash.substr(1));\n return createLocation("", {\n pathname,\n search,\n hash\n }, // state defaults to `null` because `window.history.state` does\n globalHistory.state && globalHistory.state.usr || null, globalHistory.state && globalHistory.state.key || "default");\n }\n\n function createHashHref(window, to) {\n let base = window.document.querySelector("base");\n let href = "";\n\n if (base && base.getAttribute("href")) {\n let url = window.location.href;\n let hashIndex = url.indexOf("#");\n href = hashIndex === -1 ? url : url.slice(0, hashIndex);\n }\n\n return href + "#" + (typeof to === "string" ? to : createPath(to));\n }\n\n function validateHashLocation(location, to) {\n warning$1(location.pathname.charAt(0) === "/", "relative pathnames are not supported in hash history.push(" + JSON.stringify(to) + ")");\n }\n\n return getUrlBasedHistory(createHashLocation, createHashHref, validateHashLocation, options);\n}\nfunction invariant(value, message) {\n if (value === false || value === null || typeof value === "undefined") {\n throw new Error(message);\n }\n}\n\nfunction warning$1(cond, message) {\n if (!cond) {\n // eslint-disable-next-line no-console\n if (typeof console !== "undefined") console.warn(message);\n\n try {\n // Welcome to debugging history!\n //\n // This error is thrown as a convenience so you can more easily\n // find the source for a warning that appears in the console by\n // enabling "pause on exceptions" in your JavaScript debugger.\n throw new Error(message); // eslint-disable-next-line no-empty\n } catch (e) {}\n }\n}\n\nfunction createKey() {\n return Math.random().toString(36).substr(2, 8);\n}\n/**\n * For browser-based histories, we combine the state and key into an object\n */\n\n\nfunction getHistoryState(location, index) {\n return {\n usr: location.state,\n key: location.key,\n idx: index\n };\n}\n/**\n * Creates a Location object with a unique key from the given Path\n */\n\n\nfunction createLocation(current, to, state, key) {\n if (state === void 0) {\n state = null;\n }\n\n let location = _extends({\n pathname: typeof current === "string" ? current : current.pathname,\n search: "",\n hash: ""\n }, typeof to === "string" ? parsePath(to) : to, {\n state,\n // TODO: This could be cleaned up. push/replace should probably just take\n // full Locations now and avoid the need to run through this flow at all\n // But that\'s a pretty big refactor to the current test suite so going to\n // keep as is for the time being and just let any incoming keys take precedence\n key: to && to.key || key || createKey()\n });\n\n return location;\n}\n/**\n * Creates a string URL path from the given pathname, search, and hash components.\n */\n\nfunction createPath(_ref) {\n let {\n pathname = "/",\n search = "",\n hash = ""\n } = _ref;\n if (search && search !== "?") pathname += search.charAt(0) === "?" ? search : "?" + search;\n if (hash && hash !== "#") pathname += hash.charAt(0) === "#" ? hash : "#" + hash;\n return pathname;\n}\n/**\n * Parses a string URL path into its separate pathname, search, and hash components.\n */\n\nfunction parsePath(path) {\n let parsedPath = {};\n\n if (path) {\n let hashIndex = path.indexOf("#");\n\n if (hashIndex >= 0) {\n parsedPath.hash = path.substr(hashIndex);\n path = path.substr(0, hashIndex);\n }\n\n let searchIndex = path.indexOf("?");\n\n if (searchIndex >= 0) {\n parsedPath.search = path.substr(searchIndex);\n path = path.substr(0, searchIndex);\n }\n\n if (path) {\n parsedPath.pathname = path;\n }\n }\n\n return parsedPath;\n}\n\nfunction getUrlBasedHistory(getLocation, createHref, validateLocation, options) {\n if (options === void 0) {\n options = {};\n }\n\n let {\n window = document.defaultView,\n v5Compat = false\n } = options;\n let globalHistory = window.history;\n let action = Action.Pop;\n let listener = null;\n let index = getIndex(); // Index should only be null when we initialize. If not, it\'s because the\n // user called history.pushState or history.replaceState directly, in which\n // case we should log a warning as it will result in bugs.\n\n if (index == null) {\n index = 0;\n globalHistory.replaceState(_extends({}, globalHistory.state, {\n idx: index\n }), "");\n }\n\n function getIndex() {\n let state = globalHistory.state || {\n idx: null\n };\n return state.idx;\n }\n\n function handlePop() {\n action = Action.Pop;\n let nextIndex = getIndex();\n let delta = nextIndex == null ? null : nextIndex - index;\n index = nextIndex;\n\n if (listener) {\n listener({\n action,\n location: history.location,\n delta\n });\n }\n }\n\n function push(to, state) {\n action = Action.Push;\n let location = createLocation(history.location, to, state);\n if (validateLocation) validateLocation(location, to);\n index = getIndex() + 1;\n let historyState = getHistoryState(location, index);\n let url = history.createHref(location); // try...catch because iOS limits us to 100 pushState calls :/\n\n try {\n globalHistory.pushState(historyState, "", url);\n } catch (error) {\n // They are going to lose state here, but there is no real\n // way to warn them about it since the page will refresh...\n window.location.assign(url);\n }\n\n if (v5Compat && listener) {\n listener({\n action,\n location: history.location,\n delta: 1\n });\n }\n }\n\n function replace(to, state) {\n action = Action.Replace;\n let location = createLocation(history.location, to, state);\n if (validateLocation) validateLocation(location, to);\n index = getIndex();\n let historyState = getHistoryState(location, index);\n let url = history.createHref(location);\n globalHistory.replaceState(historyState, "", url);\n\n if (v5Compat && listener) {\n listener({\n action,\n location: history.location,\n delta: 0\n });\n }\n }\n\n function createURL(to) {\n // window.location.origin is "null" (the literal string value) in Firefox\n // under certain conditions, notably when serving from a local HTML file\n // See https://bugzilla.mozilla.org/show_bug.cgi?id=878297\n let base = window.location.origin !== "null" ? window.location.origin : window.location.href;\n let href = typeof to === "string" ? to : createPath(to);\n invariant(base, "No window.location.(origin|href) available to create URL for href: " + href);\n return new URL(href, base);\n }\n\n let history = {\n get action() {\n return action;\n },\n\n get location() {\n return getLocation(window, globalHistory);\n },\n\n listen(fn) {\n if (listener) {\n throw new Error("A history only accepts one active listener");\n }\n\n window.addEventListener(PopStateEventType, handlePop);\n listener = fn;\n return () => {\n window.removeEventListener(PopStateEventType, handlePop);\n listener = null;\n };\n },\n\n createHref(to) {\n return createHref(window, to);\n },\n\n createURL,\n\n encodeLocation(to) {\n // Encode a Location the same way window.location would\n let url = createURL(to);\n return {\n pathname: url.pathname,\n search: url.search,\n hash: url.hash\n };\n },\n\n push,\n replace,\n\n go(n) {\n return globalHistory.go(n);\n }\n\n };\n return history;\n} //#endregion\n\nvar ResultType;\n\n(function (ResultType) {\n ResultType["data"] = "data";\n ResultType["deferred"] = "deferred";\n ResultType["redirect"] = "redirect";\n ResultType["error"] = "error";\n})(ResultType || (ResultType = {}));\n\nfunction isIndexRoute(route) {\n return route.index === true;\n} // Walk the route tree generating unique IDs where necessary so we are working\n// solely with AgnosticDataRouteObject\'s within the Router\n\n\nfunction convertRoutesToDataRoutes(routes, parentPath, allIds) {\n if (parentPath === void 0) {\n parentPath = [];\n }\n\n if (allIds === void 0) {\n allIds = new Set();\n }\n\n return routes.map((route, index) => {\n let treePath = [...parentPath, index];\n let id = typeof route.id === "string" ? route.id : treePath.join("-");\n invariant(route.index !== true || !route.children, "Cannot specify children on an index route");\n invariant(!allIds.has(id), "Found a route id collision on id \\"" + id + "\\". Route " + "id\'s must be globally unique within Data Router usages");\n allIds.add(id);\n\n if (isIndexRoute(route)) {\n let indexRoute = _extends({}, route, {\n id\n });\n\n return indexRoute;\n } else {\n let pathOrLayoutRoute = _extends({}, route, {\n id,\n children: route.children ? convertRoutesToDataRoutes(route.children, treePath, allIds) : undefined\n });\n\n return pathOrLayoutRoute;\n }\n });\n}\n/**\n * Matches the given routes to a location and returns the match data.\n *\n * @see https://reactrouter.com/utils/match-routes\n */\n\nfunction matchRoutes(routes, locationArg, basename) {\n if (basename === void 0) {\n basename = "/";\n }\n\n let location = typeof locationArg === "string" ? parsePath(locationArg) : locationArg;\n let pathname = stripBasename(location.pathname || "/", basename);\n\n if (pathname == null) {\n return null;\n }\n\n let branches = flattenRoutes(routes);\n rankRouteBranches(branches);\n let matches = null;\n\n for (let i = 0; matches == null && i < branches.length; ++i) {\n matches = matchRouteBranch(branches[i], // Incoming pathnames are generally encoded from either window.location\n // or from router.navigate, but we want to match against the unencoded\n // paths in the route definitions. Memory router locations won\'t be\n // encoded here but there also shouldn\'t be anything to decode so this\n // should be a safe operation. This avoids needing matchRoutes to be\n // history-aware.\n safelyDecodeURI(pathname));\n }\n\n return matches;\n}\n\nfunction flattenRoutes(routes, branches, parentsMeta, parentPath) {\n if (branches === void 0) {\n branches = [];\n }\n\n if (parentsMeta === void 0) {\n parentsMeta = [];\n }\n\n if (parentPath === void 0) {\n parentPath = "";\n }\n\n let flattenRoute = (route, index, relativePath) => {\n let meta = {\n relativePath: relativePath === undefined ? route.path || "" : relativePath,\n caseSensitive: route.caseSensitive === true,\n childrenIndex: index,\n route\n };\n\n if (meta.relativePath.startsWith("/")) {\n invariant(meta.relativePath.startsWith(parentPath), "Absolute route path \\"" + meta.relativePath + "\\" nested under path " + ("\\"" + parentPath + "\\" is not valid. An absolute child route path ") + "must start with the combined path of all its parent routes.");\n meta.relativePath = meta.relativePath.slice(parentPath.length);\n }\n\n let path = joinPaths([parentPath, meta.relativePath]);\n let routesMeta = parentsMeta.concat(meta); // Add the children before adding this route to the array so we traverse the\n // route tree depth-first and child routes appear before their parents in\n // the "flattened" version.\n\n if (route.children && route.children.length > 0) {\n invariant( // Our types know better, but runtime JS may not!\n // @ts-expect-error\n route.index !== true, "Index routes must not have child routes. Please remove " + ("all child routes from route path \\"" + path + "\\"."));\n flattenRoutes(route.children, branches, routesMeta, path);\n } // Routes without a path shouldn\'t ever match by themselves unless they are\n // index routes, so don\'t add them to the list of possible branches.\n\n\n if (route.path == null && !route.index) {\n return;\n }\n\n branches.push({\n path,\n score: computeScore(path, route.index),\n routesMeta\n });\n };\n\n routes.forEach((route, index) => {\n var _route$path;\n\n // coarse-grain check for optional params\n if (route.path === "" || !((_route$path = route.path) != null && _route$path.includes("?"))) {\n flattenRoute(route, index);\n } else {\n for (let exploded of explodeOptionalSegments(route.path)) {\n flattenRoute(route, index, exploded);\n }\n }\n });\n return branches;\n}\n/**\n * Computes all combinations of optional path segments for a given path,\n * excluding combinations that are ambiguous and of lower priority.\n *\n * For example, `/one/:two?/three/:four?/:five?` explodes to:\n * - `/one/three`\n * - `/one/:two/three`\n * - `/one/three/:four`\n * - `/one/three/:five`\n * - `/one/:two/three/:four`\n * - `/one/:two/three/:five`\n * - `/one/three/:four/:five`\n * - `/one/:two/three/:four/:five`\n */\n\n\nfunction explodeOptionalSegments(path) {\n let segments = path.split("/");\n if (segments.length === 0) return [];\n let [first, ...rest] = segments; // Optional path segments are denoted by a trailing `?`\n\n let isOptional = first.endsWith("?"); // Compute the corresponding required segment: `foo?` -> `foo`\n\n let required = first.replace(/\\?$/, "");\n\n if (rest.length === 0) {\n // Intepret empty string as omitting an optional segment\n // `["one", "", "three"]` corresponds to omitting `:two` from `/one/:two?/three` -> `/one/three`\n return isOptional ? [required, ""] : [required];\n }\n\n let restExploded = explodeOptionalSegments(rest.join("/"));\n let result = []; // All child paths with the prefix. Do this for all children before the\n // optional version for all children so we get consistent ordering where the\n // parent optional aspect is preferred as required. Otherwise, we can get\n // child sections interspersed where deeper optional segments are higher than\n // parent optional segments, where for example, /:two would explodes _earlier_\n // then /:one. By always including the parent as required _for all children_\n // first, we avoid this issue\n\n result.push(...restExploded.map(subpath => subpath === "" ? required : [required, subpath].join("/"))); // Then if this is an optional value, add all child versions without\n\n if (isOptional) {\n result.push(...restExploded);\n } // for absolute paths, ensure `/` instead of empty segment\n\n\n return result.map(exploded => path.startsWith("/") && exploded === "" ? "/" : exploded);\n}\n\nfunction rankRouteBranches(branches) {\n branches.sort((a, b) => a.score !== b.score ? b.score - a.score // Higher score first\n : compareIndexes(a.routesMeta.map(meta => meta.childrenIndex), b.routesMeta.map(meta => meta.childrenIndex)));\n}\n\nconst paramRe = /^:\\w+$/;\nconst dynamicSegmentValue = 3;\nconst indexRouteValue = 2;\nconst emptySegmentValue = 1;\nconst staticSegmentValue = 10;\nconst splatPenalty = -2;\n\nconst isSplat = s => s === "*";\n\nfunction computeScore(path, index) {\n let segments = path.split("/");\n let initialScore = segments.length;\n\n if (segments.some(isSplat)) {\n initialScore += splatPenalty;\n }\n\n if (index) {\n initialScore += indexRouteValue;\n }\n\n return segments.filter(s => !isSplat(s)).reduce((score, segment) => score + (paramRe.test(segment) ? dynamicSegmentValue : segment === "" ? emptySegmentValue : staticSegmentValue), initialScore);\n}\n\nfunction compareIndexes(a, b) {\n let siblings = a.length === b.length && a.slice(0, -1).every((n, i) => n === b[i]);\n return siblings ? // If two routes are siblings, we should try to match the earlier sibling\n // first. This allows people to have fine-grained control over the matching\n // behavior by simply putting routes with identical paths in the order they\n // want them tried.\n a[a.length - 1] - b[b.length - 1] : // Otherwise, it doesn\'t really make sense to rank non-siblings by index,\n // so they sort equally.\n 0;\n}\n\nfunction matchRouteBranch(branch, pathname) {\n let {\n routesMeta\n } = branch;\n let matchedParams = {};\n let matchedPathname = "/";\n let matches = [];\n\n for (let i = 0; i < routesMeta.length; ++i) {\n let meta = routesMeta[i];\n let end = i === routesMeta.length - 1;\n let remainingPathname = matchedPathname === "/" ? pathname : pathname.slice(matchedPathname.length) || "/";\n let match = matchPath({\n path: meta.relativePath,\n caseSensitive: meta.caseSensitive,\n end\n }, remainingPathname);\n if (!match) return null;\n Object.assign(matchedParams, match.params);\n let route = meta.route;\n matches.push({\n // TODO: Can this as be avoided?\n params: matchedParams,\n pathname: joinPaths([matchedPathname, match.pathname]),\n pathnameBase: normalizePathname(joinPaths([matchedPathname, match.pathnameBase])),\n route\n });\n\n if (match.pathnameBase !== "/") {\n matchedPathname = joinPaths([matchedPathname, match.pathnameBase]);\n }\n }\n\n return matches;\n}\n/**\n * Returns a path with params interpolated.\n *\n * @see https://reactrouter.com/utils/generate-path\n */\n\n\nfunction generatePath(originalPath, params) {\n if (params === void 0) {\n params = {};\n }\n\n let path = originalPath;\n\n if (path.endsWith("*") && path !== "*" && !path.endsWith("/*")) {\n warning(false, "Route path \\"" + path + "\\" will be treated as if it were " + ("\\"" + path.replace(/\\*$/, "/*") + "\\" because the `*` character must ") + "always follow a `/` in the pattern. To get rid of this warning, " + ("please change the route path to \\"" + path.replace(/\\*$/, "/*") + "\\"."));\n path = path.replace(/\\*$/, "/*");\n }\n\n return path.replace(/^:(\\w+)(\\??)/g, (_, key, optional) => {\n let param = params[key];\n\n if (optional === "?") {\n return param == null ? "" : param;\n }\n\n if (param == null) {\n invariant(false, "Missing \\":" + key + "\\" param");\n }\n\n return param;\n }).replace(/\\/:(\\w+)(\\??)/g, (_, key, optional) => {\n let param = params[key];\n\n if (optional === "?") {\n return param == null ? "" : "/" + param;\n }\n\n if (param == null) {\n invariant(false, "Missing \\":" + key + "\\" param");\n }\n\n return "/" + param;\n }) // Remove any optional markers from optional static segments\n .replace(/\\?/g, "").replace(/(\\/?)\\*/, (_, prefix, __, str) => {\n const star = "*";\n\n if (params[star] == null) {\n // If no splat was provided, trim the trailing slash _unless_ it\'s\n // the entire path\n return str === "/*" ? "/" : "";\n } // Apply the splat\n\n\n return "" + prefix + params[star];\n });\n}\n/**\n * Performs pattern matching on a URL pathname and returns information about\n * the match.\n *\n * @see https://reactrouter.com/utils/match-path\n */\n\nfunction matchPath(pattern, pathname) {\n if (typeof pattern === "string") {\n pattern = {\n path: pattern,\n caseSensitive: false,\n end: true\n };\n }\n\n let [matcher, paramNames] = compilePath(pattern.path, pattern.caseSensitive, pattern.end);\n let match = pathname.match(matcher);\n if (!match) return null;\n let matchedPathname = match[0];\n let pathnameBase = matchedPathname.replace(/(.)\\/+$/, "$1");\n let captureGroups = match.slice(1);\n let params = paramNames.reduce((memo, paramName, index) => {\n // We need to compute the pathnameBase here using the raw splat value\n // instead of using params["*"] later because it will be decoded then\n if (paramName === "*") {\n let splatValue = captureGroups[index] || "";\n pathnameBase = matchedPathname.slice(0, matchedPathname.length - splatValue.length).replace(/(.)\\/+$/, "$1");\n }\n\n memo[paramName] = safelyDecodeURIComponent(captureGroups[index] || "", paramName);\n return memo;\n }, {});\n return {\n params,\n pathname: matchedPathname,\n pathnameBase,\n pattern\n };\n}\n\nfunction compilePath(path, caseSensitive, end) {\n if (caseSensitive === void 0) {\n caseSensitive = false;\n }\n\n if (end === void 0) {\n end = true;\n }\n\n warning(path === "*" || !path.endsWith("*") || path.endsWith("/*"), "Route path \\"" + path + "\\" will be treated as if it were " + ("\\"" + path.replace(/\\*$/, "/*") + "\\" because the `*` character must ") + "always follow a `/` in the pattern. To get rid of this warning, " + ("please change the route path to \\"" + path.replace(/\\*$/, "/*") + "\\"."));\n let paramNames = [];\n let regexpSource = "^" + path.replace(/\\/*\\*?$/, "") // Ignore trailing / and /*, we\'ll handle it below\n .replace(/^\\/*/, "/") // Make sure it has a leading /\n .replace(/[\\\\.*+^$?{}|()[\\]]/g, "\\\\$&") // Escape special regex chars\n .replace(/\\/:(\\w+)/g, (_, paramName) => {\n paramNames.push(paramName);\n return "/([^\\\\/]+)";\n });\n\n if (path.endsWith("*")) {\n paramNames.push("*");\n regexpSource += path === "*" || path === "/*" ? "(.*)$" // Already matched the initial /, just match the rest\n : "(?:\\\\/(.+)|\\\\/*)$"; // Don\'t include the / in params["*"]\n } else if (end) {\n // When matching to the end, ignore trailing slashes\n regexpSource += "\\\\/*$";\n } else if (path !== "" && path !== "/") {\n // If our path is non-empty and contains anything beyond an initial slash,\n // then we have _some_ form of path in our regex so we should expect to\n // match only if we find the end of this path segment. Look for an optional\n // non-captured trailing slash (to match a portion of the URL) or the end\n // of the path (if we\'ve matched to the end). We used to do this with a\n // word boundary but that gives false positives on routes like\n // /user-preferences since `-` counts as a word boundary.\n regexpSource += "(?:(?=\\\\/|$))";\n } else ;\n\n let matcher = new RegExp(regexpSource, caseSensitive ? undefined : "i");\n return [matcher, paramNames];\n}\n\nfunction safelyDecodeURI(value) {\n try {\n return decodeURI(value);\n } catch (error) {\n warning(false, "The URL path \\"" + value + "\\" could not be decoded because it is is a " + "malformed URL segment. This is probably due to a bad percent " + ("encoding (" + error + ")."));\n return value;\n }\n}\n\nfunction safelyDecodeURIComponent(value, paramName) {\n try {\n return decodeURIComponent(value);\n } catch (error) {\n warning(false, "The value for the URL param \\"" + paramName + "\\" will not be decoded because" + (" the string \\"" + value + "\\" is a malformed URL segment. This is probably") + (" due to a bad percent encoding (" + error + ")."));\n return value;\n }\n}\n/**\n * @private\n */\n\n\nfunction stripBasename(pathname, basename) {\n if (basename === "/") return pathname;\n\n if (!pathname.toLowerCase().startsWith(basename.toLowerCase())) {\n return null;\n } // We want to leave trailing slash behavior in the user\'s control, so if they\n // specify a basename with a trailing slash, we should support it\n\n\n let startIndex = basename.endsWith("/") ? basename.length - 1 : basename.length;\n let nextChar = pathname.charAt(startIndex);\n\n if (nextChar && nextChar !== "/") {\n // pathname does not start with basename/\n return null;\n }\n\n return pathname.slice(startIndex) || "/";\n}\n/**\n * @private\n */\n\nfunction warning(cond, message) {\n if (!cond) {\n // eslint-disable-next-line no-console\n if (typeof console !== "undefined") console.warn(message);\n\n try {\n // Welcome to debugging @remix-run/router!\n //\n // This error is thrown as a convenience so you can more easily\n // find the source for a warning that appears in the console by\n // enabling "pause on exceptions" in your JavaScript debugger.\n throw new Error(message); // eslint-disable-next-line no-empty\n } catch (e) {}\n }\n}\n/**\n * Returns a resolved path object relative to the given pathname.\n *\n * @see https://reactrouter.com/utils/resolve-path\n */\n\nfunction resolvePath(to, fromPathname) {\n if (fromPathname === void 0) {\n fromPathname = "/";\n }\n\n let {\n pathname: toPathname,\n search = "",\n hash = ""\n } = typeof to === "string" ? parsePath(to) : to;\n let pathname = toPathname ? toPathname.startsWith("/") ? toPathname : resolvePathname(toPathname, fromPathname) : fromPathname;\n return {\n pathname,\n search: normalizeSearch(search),\n hash: normalizeHash(hash)\n };\n}\n\nfunction resolvePathname(relativePath, fromPathname) {\n let segments = fromPathname.replace(/\\/+$/, "").split("/");\n let relativeSegments = relativePath.split("/");\n relativeSegments.forEach(segment => {\n if (segment === "..") {\n // Keep the root "" segment so the pathname starts at /\n if (segments.length > 1) segments.pop();\n } else if (segment !== ".") {\n segments.push(segment);\n }\n });\n return segments.length > 1 ? segments.join("/") : "/";\n}\n\nfunction getInvalidPathError(char, field, dest, path) {\n return "Cannot include a \'" + char + "\' character in a manually specified " + ("`to." + field + "` field [" + JSON.stringify(path) + "]. Please separate it out to the ") + ("`to." + dest + "` field. Alternatively you may provide the full path as ") + "a string in and the router will parse it for you.";\n}\n/**\n * @private\n *\n * When processing relative navigation we want to ignore ancestor routes that\n * do not contribute to the path, such that index/pathless layout routes don\'t\n * interfere.\n *\n * For example, when moving a route element into an index route and/or a\n * pathless layout route, relative link behavior contained within should stay\n * the same. Both of the following examples should link back to the root:\n *\n * \n * \n * \n *\n * \n * \n * }> // <-- Does not contribute\n * // <-- Does not contribute\n * \n * \n */\n\n\nfunction getPathContributingMatches(matches) {\n return matches.filter((match, index) => index === 0 || match.route.path && match.route.path.length > 0);\n}\n/**\n * @private\n */\n\nfunction resolveTo(toArg, routePathnames, locationPathname, isPathRelative) {\n if (isPathRelative === void 0) {\n isPathRelative = false;\n }\n\n let to;\n\n if (typeof toArg === "string") {\n to = parsePath(toArg);\n } else {\n to = _extends({}, toArg);\n invariant(!to.pathname || !to.pathname.includes("?"), getInvalidPathError("?", "pathname", "search", to));\n invariant(!to.pathname || !to.pathname.includes("#"), getInvalidPathError("#", "pathname", "hash", to));\n invariant(!to.search || !to.search.includes("#"), getInvalidPathError("#", "search", "hash", to));\n }\n\n let isEmptyPath = toArg === "" || to.pathname === "";\n let toPathname = isEmptyPath ? "/" : to.pathname;\n let from; // Routing is relative to the current pathname if explicitly requested.\n //\n // If a pathname is explicitly provided in `to`, it should be relative to the\n // route context. This is explained in `Note on `` values` in our\n // migration guide from v5 as a means of disambiguation between `to` values\n // that begin with `/` and those that do not. However, this is problematic for\n // `to` values that do not provide a pathname. `to` can simply be a search or\n // hash string, in which case we should assume that the navigation is relative\n // to the current location\'s pathname and *not* the route pathname.\n\n if (isPathRelative || toPathname == null) {\n from = locationPathname;\n } else {\n let routePathnameIndex = routePathnames.length - 1;\n\n if (toPathname.startsWith("..")) {\n let toSegments = toPathname.split("/"); // Each leading .. segment means "go up one route" instead of "go up one\n // URL segment". This is a key difference from how works and a\n // major reason we call this a "to" value instead of a "href".\n\n while (toSegments[0] === "..") {\n toSegments.shift();\n routePathnameIndex -= 1;\n }\n\n to.pathname = toSegments.join("/");\n } // If there are more ".." segments than parent routes, resolve relative to\n // the root / URL.\n\n\n from = routePathnameIndex >= 0 ? routePathnames[routePathnameIndex] : "/";\n }\n\n let path = resolvePath(to, from); // Ensure the pathname has a trailing slash if the original "to" had one\n\n let hasExplicitTrailingSlash = toPathname && toPathname !== "/" && toPathname.endsWith("/"); // Or if this was a link to the current path which has a trailing slash\n\n let hasCurrentTrailingSlash = (isEmptyPath || toPathname === ".") && locationPathname.endsWith("/");\n\n if (!path.pathname.endsWith("/") && (hasExplicitTrailingSlash || hasCurrentTrailingSlash)) {\n path.pathname += "/";\n }\n\n return path;\n}\n/**\n * @private\n */\n\nfunction getToPathname(to) {\n // Empty strings should be treated the same as / paths\n return to === "" || to.pathname === "" ? "/" : typeof to === "string" ? parsePath(to).pathname : to.pathname;\n}\n/**\n * @private\n */\n\nconst joinPaths = paths => paths.join("/").replace(/\\/\\/+/g, "/");\n/**\n * @private\n */\n\nconst normalizePathname = pathname => pathname.replace(/\\/+$/, "").replace(/^\\/*/, "/");\n/**\n * @private\n */\n\nconst normalizeSearch = search => !search || search === "?" ? "" : search.startsWith("?") ? search : "?" + search;\n/**\n * @private\n */\n\nconst normalizeHash = hash => !hash || hash === "#" ? "" : hash.startsWith("#") ? hash : "#" + hash;\n/**\n * This is a shortcut for creating `application/json` responses. Converts `data`\n * to JSON and sets the `Content-Type` header.\n */\n\nconst json = function json(data, init) {\n if (init === void 0) {\n init = {};\n }\n\n let responseInit = typeof init === "number" ? {\n status: init\n } : init;\n let headers = new Headers(responseInit.headers);\n\n if (!headers.has("Content-Type")) {\n headers.set("Content-Type", "application/json; charset=utf-8");\n }\n\n return new Response(JSON.stringify(data), _extends({}, responseInit, {\n headers\n }));\n};\nclass AbortedDeferredError extends Error {}\nclass DeferredData {\n constructor(data, responseInit) {\n this.pendingKeysSet = new Set();\n this.subscribers = new Set();\n this.deferredKeys = [];\n invariant(data && typeof data === "object" && !Array.isArray(data), "defer() only accepts plain objects"); // Set up an AbortController + Promise we can race against to exit early\n // cancellation\n\n let reject;\n this.abortPromise = new Promise((_, r) => reject = r);\n this.controller = new AbortController();\n\n let onAbort = () => reject(new AbortedDeferredError("Deferred data aborted"));\n\n this.unlistenAbortSignal = () => this.controller.signal.removeEventListener("abort", onAbort);\n\n this.controller.signal.addEventListener("abort", onAbort);\n this.data = Object.entries(data).reduce((acc, _ref) => {\n let [key, value] = _ref;\n return Object.assign(acc, {\n [key]: this.trackPromise(key, value)\n });\n }, {});\n\n if (this.done) {\n // All incoming values were resolved\n this.unlistenAbortSignal();\n }\n\n this.init = responseInit;\n }\n\n trackPromise(key, value) {\n if (!(value instanceof Promise)) {\n return value;\n }\n\n this.deferredKeys.push(key);\n this.pendingKeysSet.add(key); // We store a little wrapper promise that will be extended with\n // _data/_error props upon resolve/reject\n\n let promise = Promise.race([value, this.abortPromise]).then(data => this.onSettle(promise, key, null, data), error => this.onSettle(promise, key, error)); // Register rejection listeners to avoid uncaught promise rejections on\n // errors or aborted deferred values\n\n promise.catch(() => {});\n Object.defineProperty(promise, "_tracked", {\n get: () => true\n });\n return promise;\n }\n\n onSettle(promise, key, error, data) {\n if (this.controller.signal.aborted && error instanceof AbortedDeferredError) {\n this.unlistenAbortSignal();\n Object.defineProperty(promise, "_error", {\n get: () => error\n });\n return Promise.reject(error);\n }\n\n this.pendingKeysSet.delete(key);\n\n if (this.done) {\n // Nothing left to abort!\n this.unlistenAbortSignal();\n }\n\n if (error) {\n Object.defineProperty(promise, "_error", {\n get: () => error\n });\n this.emit(false, key);\n return Promise.reject(error);\n }\n\n Object.defineProperty(promise, "_data", {\n get: () => data\n });\n this.emit(false, key);\n return data;\n }\n\n emit(aborted, settledKey) {\n this.subscribers.forEach(subscriber => subscriber(aborted, settledKey));\n }\n\n subscribe(fn) {\n this.subscribers.add(fn);\n return () => this.subscribers.delete(fn);\n }\n\n cancel() {\n this.controller.abort();\n this.pendingKeysSet.forEach((v, k) => this.pendingKeysSet.delete(k));\n this.emit(true);\n }\n\n async resolveData(signal) {\n let aborted = false;\n\n if (!this.done) {\n let onAbort = () => this.cancel();\n\n signal.addEventListener("abort", onAbort);\n aborted = await new Promise(resolve => {\n this.subscribe(aborted => {\n signal.removeEventListener("abort", onAbort);\n\n if (aborted || this.done) {\n resolve(aborted);\n }\n });\n });\n }\n\n return aborted;\n }\n\n get done() {\n return this.pendingKeysSet.size === 0;\n }\n\n get unwrappedData() {\n invariant(this.data !== null && this.done, "Can only unwrap data on initialized and settled deferreds");\n return Object.entries(this.data).reduce((acc, _ref2) => {\n let [key, value] = _ref2;\n return Object.assign(acc, {\n [key]: unwrapTrackedPromise(value)\n });\n }, {});\n }\n\n get pendingKeys() {\n return Array.from(this.pendingKeysSet);\n }\n\n}\n\nfunction isTrackedPromise(value) {\n return value instanceof Promise && value._tracked === true;\n}\n\nfunction unwrapTrackedPromise(value) {\n if (!isTrackedPromise(value)) {\n return value;\n }\n\n if (value._error) {\n throw value._error;\n }\n\n return value._data;\n}\n\nconst defer = function defer(data, init) {\n if (init === void 0) {\n init = {};\n }\n\n let responseInit = typeof init === "number" ? {\n status: init\n } : init;\n return new DeferredData(data, responseInit);\n};\n/**\n * A redirect response. Sets the status code and the `Location` header.\n * Defaults to "302 Found".\n */\n\nconst redirect = function redirect(url, init) {\n if (init === void 0) {\n init = 302;\n }\n\n let responseInit = init;\n\n if (typeof responseInit === "number") {\n responseInit = {\n status: responseInit\n };\n } else if (typeof responseInit.status === "undefined") {\n responseInit.status = 302;\n }\n\n let headers = new Headers(responseInit.headers);\n headers.set("Location", url);\n return new Response(null, _extends({}, responseInit, {\n headers\n }));\n};\n/**\n * @private\n * Utility class we use to hold auto-unwrapped 4xx/5xx Response bodies\n */\n\nclass ErrorResponse {\n constructor(status, statusText, data, internal) {\n if (internal === void 0) {\n internal = false;\n }\n\n this.status = status;\n this.statusText = statusText || "";\n this.internal = internal;\n\n if (data instanceof Error) {\n this.data = data.toString();\n this.error = data;\n } else {\n this.data = data;\n }\n }\n\n}\n/**\n * Check if the given error is an ErrorResponse generated from a 4xx/5xx\n * Response thrown from an action/loader\n */\n\nfunction isRouteErrorResponse(error) {\n return error != null && typeof error.status === "number" && typeof error.statusText === "string" && typeof error.internal === "boolean" && "data" in error;\n}\n\nconst validMutationMethodsArr = ["post", "put", "patch", "delete"];\nconst validMutationMethods = new Set(validMutationMethodsArr);\nconst validRequestMethodsArr = ["get", ...validMutationMethodsArr];\nconst validRequestMethods = new Set(validRequestMethodsArr);\nconst redirectStatusCodes = new Set([301, 302, 303, 307, 308]);\nconst redirectPreserveMethodStatusCodes = new Set([307, 308]);\nconst IDLE_NAVIGATION = {\n state: "idle",\n location: undefined,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined\n};\nconst IDLE_FETCHER = {\n state: "idle",\n data: undefined,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined\n};\nconst IDLE_BLOCKER = {\n state: "unblocked",\n proceed: undefined,\n reset: undefined,\n location: undefined\n};\nconst ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i;\nconst isBrowser = typeof window !== "undefined" && typeof window.document !== "undefined" && typeof window.document.createElement !== "undefined";\nconst isServer = !isBrowser; //#endregion\n////////////////////////////////////////////////////////////////////////////////\n//#region createRouter\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Create a router and listen to history POP navigations\n */\n\nfunction createRouter(init) {\n invariant(init.routes.length > 0, "You must provide a non-empty routes array to createRouter");\n let dataRoutes = convertRoutesToDataRoutes(init.routes);\n let inFlightDataRoutes; // Cleanup function for history\n\n let unlistenHistory = null; // Externally-provided functions to call on all state changes\n\n let subscribers = new Set(); // Externally-provided object to hold scroll restoration locations during routing\n\n let savedScrollPositions = null; // Externally-provided function to get scroll restoration keys\n\n let getScrollRestorationKey = null; // Externally-provided function to get current scroll position\n\n let getScrollPosition = null; // One-time flag to control the initial hydration scroll restoration. Because\n // we don\'t get the saved positions from until _after_\n // the initial render, we need to manually trigger a separate updateState to\n // send along the restoreScrollPosition\n // Set to true if we have `hydrationData` since we assume we were SSR\'d and that\n // SSR did the initial scroll restoration.\n\n let initialScrollRestored = init.hydrationData != null;\n let initialMatches = matchRoutes(dataRoutes, init.history.location, init.basename);\n let initialErrors = null;\n\n if (initialMatches == null) {\n // If we do not match a user-provided-route, fall back to the root\n // to allow the error boundary to take over\n let error = getInternalRouterError(404, {\n pathname: init.history.location.pathname\n });\n let {\n matches,\n route\n } = getShortCircuitMatches(dataRoutes);\n initialMatches = matches;\n initialErrors = {\n [route.id]: error\n };\n }\n\n let initialized = !initialMatches.some(m => m.route.loader) || init.hydrationData != null;\n let router;\n let state = {\n historyAction: init.history.action,\n location: init.history.location,\n matches: initialMatches,\n initialized,\n navigation: IDLE_NAVIGATION,\n // Don\'t restore on initial updateState() if we were SSR\'d\n restoreScrollPosition: init.hydrationData != null ? false : null,\n preventScrollReset: false,\n revalidation: "idle",\n loaderData: init.hydrationData && init.hydrationData.loaderData || {},\n actionData: init.hydrationData && init.hydrationData.actionData || null,\n errors: init.hydrationData && init.hydrationData.errors || initialErrors,\n fetchers: new Map(),\n blockers: new Map()\n }; // -- Stateful internal variables to manage navigations --\n // Current navigation in progress (to be committed in completeNavigation)\n\n let pendingAction = Action.Pop; // Should the current navigation prevent the scroll reset if scroll cannot\n // be restored?\n\n let pendingPreventScrollReset = false; // AbortController for the active navigation\n\n let pendingNavigationController; // We use this to avoid touching history in completeNavigation if a\n // revalidation is entirely uninterrupted\n\n let isUninterruptedRevalidation = false; // Use this internal flag to force revalidation of all loaders:\n // - submissions (completed or interrupted)\n // - useRevalidate()\n // - X-Remix-Revalidate (from redirect)\n\n let isRevalidationRequired = false; // Use this internal array to capture routes that require revalidation due\n // to a cancelled deferred on action submission\n\n let cancelledDeferredRoutes = []; // Use this internal array to capture fetcher loads that were cancelled by an\n // action navigation and require revalidation\n\n let cancelledFetcherLoads = []; // AbortControllers for any in-flight fetchers\n\n let fetchControllers = new Map(); // Track loads based on the order in which they started\n\n let incrementingLoadId = 0; // Track the outstanding pending navigation data load to be compared against\n // the globally incrementing load when a fetcher load lands after a completed\n // navigation\n\n let pendingNavigationLoadId = -1; // Fetchers that triggered data reloads as a result of their actions\n\n let fetchReloadIds = new Map(); // Fetchers that triggered redirect navigations from their actions\n\n let fetchRedirectIds = new Set(); // Most recent href/match for fetcher.load calls for fetchers\n\n let fetchLoadMatches = new Map(); // Store DeferredData instances for active route matches. When a\n // route loader returns defer() we stick one in here. Then, when a nested\n // promise resolves we update loaderData. If a new navigation starts we\n // cancel active deferreds for eliminated routes.\n\n let activeDeferreds = new Map(); // Store blocker functions in a separate Map outside of router state since\n // we don\'t need to update UI state if they change\n\n let blockerFunctions = new Map(); // Flag to ignore the next history update, so we can revert the URL change on\n // a POP navigation that was blocked by the user without touching router state\n\n let ignoreNextHistoryUpdate = false; // Initialize the router, all side effects should be kicked off from here.\n // Implemented as a Fluent API for ease of:\n // let router = createRouter(init).initialize();\n\n function initialize() {\n // If history informs us of a POP navigation, start the navigation but do not update\n // state. We\'ll update our own state once the navigation completes\n unlistenHistory = init.history.listen(_ref => {\n let {\n action: historyAction,\n location,\n delta\n } = _ref;\n\n // Ignore this event if it was just us resetting the URL from a\n // blocked POP navigation\n if (ignoreNextHistoryUpdate) {\n ignoreNextHistoryUpdate = false;\n return;\n }\n\n warning(blockerFunctions.size === 0 || delta != null, "You are trying to use a blocker on a POP navigation to a location " + "that was not created by @remix-run/router. This will fail silently in " + "production. This can happen if you are navigating outside the router " + "via `window.history.pushState`/`window.location.hash` instead of using " + "router navigation APIs. This can also happen if you are using " + "createHashRouter and the user manually changes the URL.");\n let blockerKey = shouldBlockNavigation({\n currentLocation: state.location,\n nextLocation: location,\n historyAction\n });\n\n if (blockerKey && delta != null) {\n // Restore the URL to match the current UI, but don\'t update router state\n ignoreNextHistoryUpdate = true;\n init.history.go(delta * -1); // Put the blocker into a blocked state\n\n updateBlocker(blockerKey, {\n state: "blocked",\n location,\n\n proceed() {\n updateBlocker(blockerKey, {\n state: "proceeding",\n proceed: undefined,\n reset: undefined,\n location\n }); // Re-do the same POP navigation we just blocked\n\n init.history.go(delta);\n },\n\n reset() {\n deleteBlocker(blockerKey);\n updateState({\n blockers: new Map(router.state.blockers)\n });\n }\n\n });\n return;\n }\n\n return startNavigation(historyAction, location);\n }); // Kick off initial data load if needed. Use Pop to avoid modifying history\n\n if (!state.initialized) {\n startNavigation(Action.Pop, state.location);\n }\n\n return router;\n } // Clean up a router and it\'s side effects\n\n\n function dispose() {\n if (unlistenHistory) {\n unlistenHistory();\n }\n\n subscribers.clear();\n pendingNavigationController && pendingNavigationController.abort();\n state.fetchers.forEach((_, key) => deleteFetcher(key));\n state.blockers.forEach((_, key) => deleteBlocker(key));\n } // Subscribe to state updates for the router\n\n\n function subscribe(fn) {\n subscribers.add(fn);\n return () => subscribers.delete(fn);\n } // Update our state and notify the calling context of the change\n\n\n function updateState(newState) {\n state = _extends({}, state, newState);\n subscribers.forEach(subscriber => subscriber(state));\n } // Complete a navigation returning the state.navigation back to the IDLE_NAVIGATION\n // and setting state.[historyAction/location/matches] to the new route.\n // - Location is a required param\n // - Navigation will always be set to IDLE_NAVIGATION\n // - Can pass any other state in newState\n\n\n function completeNavigation(location, newState) {\n var _location$state, _location$state2;\n\n // Deduce if we\'re in a loading/actionReload state:\n // - We have committed actionData in the store\n // - The current navigation was a mutation submission\n // - We\'re past the submitting state and into the loading state\n // - The location being loaded is not the result of a redirect\n let isActionReload = state.actionData != null && state.navigation.formMethod != null && isMutationMethod(state.navigation.formMethod) && state.navigation.state === "loading" && ((_location$state = location.state) == null ? void 0 : _location$state._isRedirect) !== true;\n let actionData;\n\n if (newState.actionData) {\n if (Object.keys(newState.actionData).length > 0) {\n actionData = newState.actionData;\n } else {\n // Empty actionData -> clear prior actionData due to an action error\n actionData = null;\n }\n } else if (isActionReload) {\n // Keep the current data if we\'re wrapping up the action reload\n actionData = state.actionData;\n } else {\n // Clear actionData on any other completed navigations\n actionData = null;\n } // Always preserve any existing loaderData from re-used routes\n\n\n let loaderData = newState.loaderData ? mergeLoaderData(state.loaderData, newState.loaderData, newState.matches || [], newState.errors) : state.loaderData; // On a successful navigation we can assume we got through all blockers\n // so we can start fresh\n\n for (let [key] of blockerFunctions) {\n deleteBlocker(key);\n } // Always respect the user flag. Otherwise don\'t reset on mutation\n // submission navigations unless they redirect\n\n\n let preventScrollReset = pendingPreventScrollReset === true || state.navigation.formMethod != null && isMutationMethod(state.navigation.formMethod) && ((_location$state2 = location.state) == null ? void 0 : _location$state2._isRedirect) !== true;\n\n if (inFlightDataRoutes) {\n dataRoutes = inFlightDataRoutes;\n inFlightDataRoutes = undefined;\n }\n\n updateState(_extends({}, newState, {\n actionData,\n loaderData,\n historyAction: pendingAction,\n location,\n initialized: true,\n navigation: IDLE_NAVIGATION,\n revalidation: "idle",\n restoreScrollPosition: getSavedScrollPosition(location, newState.matches || state.matches),\n preventScrollReset,\n blockers: new Map(state.blockers)\n }));\n\n if (isUninterruptedRevalidation) ; else if (pendingAction === Action.Pop) ; else if (pendingAction === Action.Push) {\n init.history.push(location, location.state);\n } else if (pendingAction === Action.Replace) {\n init.history.replace(location, location.state);\n } // Reset stateful navigation vars\n\n\n pendingAction = Action.Pop;\n pendingPreventScrollReset = false;\n isUninterruptedRevalidation = false;\n isRevalidationRequired = false;\n cancelledDeferredRoutes = [];\n cancelledFetcherLoads = [];\n } // Trigger a navigation event, which can either be a numerical POP or a PUSH\n // replace with an optional submission\n\n\n async function navigate(to, opts) {\n if (typeof to === "number") {\n init.history.go(to);\n return;\n }\n\n let {\n path,\n submission,\n error\n } = normalizeNavigateOptions(to, opts);\n let currentLocation = state.location;\n let nextLocation = createLocation(state.location, path, opts && opts.state); // When using navigate as a PUSH/REPLACE we aren\'t reading an already-encoded\n // URL from window.location, so we need to encode it here so the behavior\n // remains the same as POP and non-data-router usages. new URL() does all\n // the same encoding we\'d get from a history.pushState/window.location read\n // without having to touch history\n\n nextLocation = _extends({}, nextLocation, init.history.encodeLocation(nextLocation));\n let userReplace = opts && opts.replace != null ? opts.replace : undefined;\n let historyAction = Action.Push;\n\n if (userReplace === true) {\n historyAction = Action.Replace;\n } else if (userReplace === false) ; else if (submission != null && isMutationMethod(submission.formMethod) && submission.formAction === state.location.pathname + state.location.search) {\n // By default on submissions to the current location we REPLACE so that\n // users don\'t have to double-click the back button to get to the prior\n // location. If the user redirects to a different location from the\n // action/loader this will be ignored and the redirect will be a PUSH\n historyAction = Action.Replace;\n }\n\n let preventScrollReset = opts && "preventScrollReset" in opts ? opts.preventScrollReset === true : undefined;\n let blockerKey = shouldBlockNavigation({\n currentLocation,\n nextLocation,\n historyAction\n });\n\n if (blockerKey) {\n // Put the blocker into a blocked state\n updateBlocker(blockerKey, {\n state: "blocked",\n location: nextLocation,\n\n proceed() {\n updateBlocker(blockerKey, {\n state: "proceeding",\n proceed: undefined,\n reset: undefined,\n location: nextLocation\n }); // Send the same navigation through\n\n navigate(to, opts);\n },\n\n reset() {\n deleteBlocker(blockerKey);\n updateState({\n blockers: new Map(state.blockers)\n });\n }\n\n });\n return;\n }\n\n return await startNavigation(historyAction, nextLocation, {\n submission,\n // Send through the formData serialization error if we have one so we can\n // render at the right error boundary after we match routes\n pendingError: error,\n preventScrollReset,\n replace: opts && opts.replace\n });\n } // Revalidate all current loaders. If a navigation is in progress or if this\n // is interrupted by a navigation, allow this to "succeed" by calling all\n // loaders during the next loader round\n\n\n function revalidate() {\n interruptActiveLoads();\n updateState({\n revalidation: "loading"\n }); // If we\'re currently submitting an action, we don\'t need to start a new\n // navigation, we\'ll just let the follow up loader execution call all loaders\n\n if (state.navigation.state === "submitting") {\n return;\n } // If we\'re currently in an idle state, start a new navigation for the current\n // action/location and mark it as uninterrupted, which will skip the history\n // update in completeNavigation\n\n\n if (state.navigation.state === "idle") {\n startNavigation(state.historyAction, state.location, {\n startUninterruptedRevalidation: true\n });\n return;\n } // Otherwise, if we\'re currently in a loading state, just start a new\n // navigation to the navigation.location but do not trigger an uninterrupted\n // revalidation so that history correctly updates once the navigation completes\n\n\n startNavigation(pendingAction || state.historyAction, state.navigation.location, {\n overrideNavigation: state.navigation\n });\n } // Start a navigation to the given action/location. Can optionally provide a\n // overrideNavigation which will override the normalLoad in the case of a redirect\n // navigation\n\n\n async function startNavigation(historyAction, location, opts) {\n // Abort any in-progress navigations and start a new one. Unset any ongoing\n // uninterrupted revalidations unless told otherwise, since we want this\n // new navigation to update history normally\n pendingNavigationController && pendingNavigationController.abort();\n pendingNavigationController = null;\n pendingAction = historyAction;\n isUninterruptedRevalidation = (opts && opts.startUninterruptedRevalidation) === true; // Save the current scroll position every time we start a new navigation,\n // and track whether we should reset scroll on completion\n\n saveScrollPosition(state.location, state.matches);\n pendingPreventScrollReset = (opts && opts.preventScrollReset) === true;\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let loadingNavigation = opts && opts.overrideNavigation;\n let matches = matchRoutes(routesToUse, location, init.basename); // Short circuit with a 404 on the root error boundary if we match nothing\n\n if (!matches) {\n let error = getInternalRouterError(404, {\n pathname: location.pathname\n });\n let {\n matches: notFoundMatches,\n route\n } = getShortCircuitMatches(routesToUse); // Cancel all pending deferred on 404s since we don\'t keep any routes\n\n cancelActiveDeferreds();\n completeNavigation(location, {\n matches: notFoundMatches,\n loaderData: {},\n errors: {\n [route.id]: error\n }\n });\n return;\n } // Short circuit if it\'s only a hash change and not a mutation submission\n // For example, on /page#hash and submit a
which will\n // default to a navigation to /page\n\n\n if (isHashChangeOnly(state.location, location) && !(opts && opts.submission && isMutationMethod(opts.submission.formMethod))) {\n completeNavigation(location, {\n matches\n });\n return;\n } // Create a controller/Request for this navigation\n\n\n pendingNavigationController = new AbortController();\n let request = createClientSideRequest(init.history, location, pendingNavigationController.signal, opts && opts.submission);\n let pendingActionData;\n let pendingError;\n\n if (opts && opts.pendingError) {\n // If we have a pendingError, it means the user attempted a GET submission\n // with binary FormData so assign here and skip to handleLoaders. That\n // way we handle calling loaders above the boundary etc. It\'s not really\n // different from an actionError in that sense.\n pendingError = {\n [findNearestBoundary(matches).route.id]: opts.pendingError\n };\n } else if (opts && opts.submission && isMutationMethod(opts.submission.formMethod)) {\n // Call action if we received an action submission\n let actionOutput = await handleAction(request, location, opts.submission, matches, {\n replace: opts.replace\n });\n\n if (actionOutput.shortCircuited) {\n return;\n }\n\n pendingActionData = actionOutput.pendingActionData;\n pendingError = actionOutput.pendingActionError;\n\n let navigation = _extends({\n state: "loading",\n location\n }, opts.submission);\n\n loadingNavigation = navigation; // Create a GET request for the loaders\n\n request = new Request(request.url, {\n signal: request.signal\n });\n } // Call loaders\n\n\n let {\n shortCircuited,\n loaderData,\n errors\n } = await handleLoaders(request, location, matches, loadingNavigation, opts && opts.submission, opts && opts.replace, pendingActionData, pendingError);\n\n if (shortCircuited) {\n return;\n } // Clean up now that the action/loaders have completed. Don\'t clean up if\n // we short circuited because pendingNavigationController will have already\n // been assigned to a new controller for the next navigation\n\n\n pendingNavigationController = null;\n completeNavigation(location, _extends({\n matches\n }, pendingActionData ? {\n actionData: pendingActionData\n } : {}, {\n loaderData,\n errors\n }));\n } // Call the action matched by the leaf route for this navigation and handle\n // redirects/errors\n\n\n async function handleAction(request, location, submission, matches, opts) {\n interruptActiveLoads(); // Put us in a submitting state\n\n let navigation = _extends({\n state: "submitting",\n location\n }, submission);\n\n updateState({\n navigation\n }); // Call our action and get the result\n\n let result;\n let actionMatch = getTargetMatch(matches, location);\n\n if (!actionMatch.route.action) {\n result = {\n type: ResultType.error,\n error: getInternalRouterError(405, {\n method: request.method,\n pathname: location.pathname,\n routeId: actionMatch.route.id\n })\n };\n } else {\n result = await callLoaderOrAction("action", request, actionMatch, matches, router.basename);\n\n if (request.signal.aborted) {\n return {\n shortCircuited: true\n };\n }\n }\n\n if (isRedirectResult(result)) {\n let replace;\n\n if (opts && opts.replace != null) {\n replace = opts.replace;\n } else {\n // If the user didn\'t explicity indicate replace behavior, replace if\n // we redirected to the exact same location we\'re currently at to avoid\n // double back-buttons\n replace = result.location === state.location.pathname + state.location.search;\n }\n\n await startRedirectNavigation(state, result, {\n submission,\n replace\n });\n return {\n shortCircuited: true\n };\n }\n\n if (isErrorResult(result)) {\n // Store off the pending error - we use it to determine which loaders\n // to call and will commit it when we complete the navigation\n let boundaryMatch = findNearestBoundary(matches, actionMatch.route.id); // By default, all submissions are REPLACE navigations, but if the\n // action threw an error that\'ll be rendered in an errorElement, we fall\n // back to PUSH so that the user can use the back button to get back to\n // the pre-submission form location to try again\n\n if ((opts && opts.replace) !== true) {\n pendingAction = Action.Push;\n }\n\n return {\n // Send back an empty object we can use to clear out any prior actionData\n pendingActionData: {},\n pendingActionError: {\n [boundaryMatch.route.id]: result.error\n }\n };\n }\n\n if (isDeferredResult(result)) {\n throw getInternalRouterError(400, {\n type: "defer-action"\n });\n }\n\n return {\n pendingActionData: {\n [actionMatch.route.id]: result.data\n }\n };\n } // Call all applicable loaders for the given matches, handling redirects,\n // errors, etc.\n\n\n async function handleLoaders(request, location, matches, overrideNavigation, submission, replace, pendingActionData, pendingError) {\n // Figure out the right navigation we want to use for data loading\n let loadingNavigation = overrideNavigation;\n\n if (!loadingNavigation) {\n let navigation = _extends({\n state: "loading",\n location,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined\n }, submission);\n\n loadingNavigation = navigation;\n } // If this was a redirect from an action we don\'t have a "submission" but\n // we have it on the loading navigation so use that if available\n\n\n let activeSubmission = submission ? submission : loadingNavigation.formMethod && loadingNavigation.formAction && loadingNavigation.formData && loadingNavigation.formEncType ? {\n formMethod: loadingNavigation.formMethod,\n formAction: loadingNavigation.formAction,\n formData: loadingNavigation.formData,\n formEncType: loadingNavigation.formEncType\n } : undefined;\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let [matchesToLoad, revalidatingFetchers] = getMatchesToLoad(init.history, state, matches, activeSubmission, location, isRevalidationRequired, cancelledDeferredRoutes, cancelledFetcherLoads, fetchLoadMatches, routesToUse, init.basename, pendingActionData, pendingError); // Cancel pending deferreds for no-longer-matched routes or routes we\'re\n // about to reload. Note that if this is an action reload we would have\n // already cancelled all pending deferreds so this would be a no-op\n\n cancelActiveDeferreds(routeId => !(matches && matches.some(m => m.route.id === routeId)) || matchesToLoad && matchesToLoad.some(m => m.route.id === routeId)); // Short circuit if we have no loaders to run\n\n if (matchesToLoad.length === 0 && revalidatingFetchers.length === 0) {\n completeNavigation(location, _extends({\n matches,\n loaderData: {},\n // Commit pending error if we\'re short circuiting\n errors: pendingError || null\n }, pendingActionData ? {\n actionData: pendingActionData\n } : {}));\n return {\n shortCircuited: true\n };\n } // If this is an uninterrupted revalidation, we remain in our current idle\n // state. If not, we need to switch to our loading state and load data,\n // preserving any new action data or existing action data (in the case of\n // a revalidation interrupting an actionReload)\n\n\n if (!isUninterruptedRevalidation) {\n revalidatingFetchers.forEach(rf => {\n let fetcher = state.fetchers.get(rf.key);\n let revalidatingFetcher = {\n state: "loading",\n data: fetcher && fetcher.data,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n " _hasFetcherDoneAnything ": true\n };\n state.fetchers.set(rf.key, revalidatingFetcher);\n });\n let actionData = pendingActionData || state.actionData;\n updateState(_extends({\n navigation: loadingNavigation\n }, actionData ? Object.keys(actionData).length === 0 ? {\n actionData: null\n } : {\n actionData\n } : {}, revalidatingFetchers.length > 0 ? {\n fetchers: new Map(state.fetchers)\n } : {}));\n }\n\n pendingNavigationLoadId = ++incrementingLoadId;\n revalidatingFetchers.forEach(rf => fetchControllers.set(rf.key, pendingNavigationController));\n let {\n results,\n loaderResults,\n fetcherResults\n } = await callLoadersAndMaybeResolveData(state.matches, matches, matchesToLoad, revalidatingFetchers, request);\n\n if (request.signal.aborted) {\n return {\n shortCircuited: true\n };\n } // Clean up _after_ loaders have completed. Don\'t clean up if we short\n // circuited because fetchControllers would have been aborted and\n // reassigned to new controllers for the next navigation\n\n\n revalidatingFetchers.forEach(rf => fetchControllers.delete(rf.key)); // If any loaders returned a redirect Response, start a new REPLACE navigation\n\n let redirect = findRedirect(results);\n\n if (redirect) {\n await startRedirectNavigation(state, redirect, {\n replace\n });\n return {\n shortCircuited: true\n };\n } // Process and commit output from loaders\n\n\n let {\n loaderData,\n errors\n } = processLoaderData(state, matches, matchesToLoad, loaderResults, pendingError, revalidatingFetchers, fetcherResults, activeDeferreds); // Wire up subscribers to update loaderData as promises settle\n\n activeDeferreds.forEach((deferredData, routeId) => {\n deferredData.subscribe(aborted => {\n // Note: No need to updateState here since the TrackedPromise on\n // loaderData is stable across resolve/reject\n // Remove this instance if we were aborted or if promises have settled\n if (aborted || deferredData.done) {\n activeDeferreds.delete(routeId);\n }\n });\n });\n markFetchRedirectsDone();\n let didAbortFetchLoads = abortStaleFetchLoads(pendingNavigationLoadId);\n return _extends({\n loaderData,\n errors\n }, didAbortFetchLoads || revalidatingFetchers.length > 0 ? {\n fetchers: new Map(state.fetchers)\n } : {});\n }\n\n function getFetcher(key) {\n return state.fetchers.get(key) || IDLE_FETCHER;\n } // Trigger a fetcher load/submit for the given fetcher key\n\n\n function fetch(key, routeId, href, opts) {\n if (isServer) {\n throw new Error("router.fetch() was called during the server render, but it shouldn\'t be. " + "You are likely calling a useFetcher() method in the body of your component. " + "Try moving it to a useEffect or a callback.");\n }\n\n if (fetchControllers.has(key)) abortFetcher(key);\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let matches = matchRoutes(routesToUse, href, init.basename);\n\n if (!matches) {\n setFetcherError(key, routeId, getInternalRouterError(404, {\n pathname: href\n }));\n return;\n }\n\n let {\n path,\n submission\n } = normalizeNavigateOptions(href, opts, true);\n let match = getTargetMatch(matches, path);\n pendingPreventScrollReset = (opts && opts.preventScrollReset) === true;\n\n if (submission && isMutationMethod(submission.formMethod)) {\n handleFetcherAction(key, routeId, path, match, matches, submission);\n return;\n } // Store off the match so we can call it\'s shouldRevalidate on subsequent\n // revalidations\n\n\n fetchLoadMatches.set(key, {\n routeId,\n path\n });\n handleFetcherLoader(key, routeId, path, match, matches, submission);\n } // Call the action for the matched fetcher.submit(), and then handle redirects,\n // errors, and revalidation\n\n\n async function handleFetcherAction(key, routeId, path, match, requestMatches, submission) {\n interruptActiveLoads();\n fetchLoadMatches.delete(key);\n\n if (!match.route.action) {\n let error = getInternalRouterError(405, {\n method: submission.formMethod,\n pathname: path,\n routeId: routeId\n });\n setFetcherError(key, routeId, error);\n return;\n } // Put this fetcher into it\'s submitting state\n\n\n let existingFetcher = state.fetchers.get(key);\n\n let fetcher = _extends({\n state: "submitting"\n }, submission, {\n data: existingFetcher && existingFetcher.data,\n " _hasFetcherDoneAnything ": true\n });\n\n state.fetchers.set(key, fetcher);\n updateState({\n fetchers: new Map(state.fetchers)\n }); // Call the action for the fetcher\n\n let abortController = new AbortController();\n let fetchRequest = createClientSideRequest(init.history, path, abortController.signal, submission);\n fetchControllers.set(key, abortController);\n let actionResult = await callLoaderOrAction("action", fetchRequest, match, requestMatches, router.basename);\n\n if (fetchRequest.signal.aborted) {\n // We can delete this so long as we weren\'t aborted by ou our own fetcher\n // re-submit which would have put _new_ controller is in fetchControllers\n if (fetchControllers.get(key) === abortController) {\n fetchControllers.delete(key);\n }\n\n return;\n }\n\n if (isRedirectResult(actionResult)) {\n fetchControllers.delete(key);\n fetchRedirectIds.add(key);\n\n let loadingFetcher = _extends({\n state: "loading"\n }, submission, {\n data: undefined,\n " _hasFetcherDoneAnything ": true\n });\n\n state.fetchers.set(key, loadingFetcher);\n updateState({\n fetchers: new Map(state.fetchers)\n });\n return startRedirectNavigation(state, actionResult, {\n isFetchActionRedirect: true\n });\n } // Process any non-redirect errors thrown\n\n\n if (isErrorResult(actionResult)) {\n setFetcherError(key, routeId, actionResult.error);\n return;\n }\n\n if (isDeferredResult(actionResult)) {\n throw getInternalRouterError(400, {\n type: "defer-action"\n });\n } // Start the data load for current matches, or the next location if we\'re\n // in the middle of a navigation\n\n\n let nextLocation = state.navigation.location || state.location;\n let revalidationRequest = createClientSideRequest(init.history, nextLocation, abortController.signal);\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let matches = state.navigation.state !== "idle" ? matchRoutes(routesToUse, state.navigation.location, init.basename) : state.matches;\n invariant(matches, "Didn\'t find any matches after fetcher action");\n let loadId = ++incrementingLoadId;\n fetchReloadIds.set(key, loadId);\n\n let loadFetcher = _extends({\n state: "loading",\n data: actionResult.data\n }, submission, {\n " _hasFetcherDoneAnything ": true\n });\n\n state.fetchers.set(key, loadFetcher);\n let [matchesToLoad, revalidatingFetchers] = getMatchesToLoad(init.history, state, matches, submission, nextLocation, isRevalidationRequired, cancelledDeferredRoutes, cancelledFetcherLoads, fetchLoadMatches, routesToUse, init.basename, {\n [match.route.id]: actionResult.data\n }, undefined // No need to send through errors since we short circuit above\n ); // Put all revalidating fetchers into the loading state, except for the\n // current fetcher which we want to keep in it\'s current loading state which\n // contains it\'s action submission info + action data\n\n revalidatingFetchers.filter(rf => rf.key !== key).forEach(rf => {\n let staleKey = rf.key;\n let existingFetcher = state.fetchers.get(staleKey);\n let revalidatingFetcher = {\n state: "loading",\n data: existingFetcher && existingFetcher.data,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n " _hasFetcherDoneAnything ": true\n };\n state.fetchers.set(staleKey, revalidatingFetcher);\n fetchControllers.set(staleKey, abortController);\n });\n updateState({\n fetchers: new Map(state.fetchers)\n });\n let {\n results,\n loaderResults,\n fetcherResults\n } = await callLoadersAndMaybeResolveData(state.matches, matches, matchesToLoad, revalidatingFetchers, revalidationRequest);\n\n if (abortController.signal.aborted) {\n return;\n }\n\n fetchReloadIds.delete(key);\n fetchControllers.delete(key);\n revalidatingFetchers.forEach(r => fetchControllers.delete(r.key));\n let redirect = findRedirect(results);\n\n if (redirect) {\n return startRedirectNavigation(state, redirect);\n } // Process and commit output from loaders\n\n\n let {\n loaderData,\n errors\n } = processLoaderData(state, state.matches, matchesToLoad, loaderResults, undefined, revalidatingFetchers, fetcherResults, activeDeferreds);\n let doneFetcher = {\n state: "idle",\n data: actionResult.data,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n " _hasFetcherDoneAnything ": true\n };\n state.fetchers.set(key, doneFetcher);\n let didAbortFetchLoads = abortStaleFetchLoads(loadId); // If we are currently in a navigation loading state and this fetcher is\n // more recent than the navigation, we want the newer data so abort the\n // navigation and complete it with the fetcher data\n\n if (state.navigation.state === "loading" && loadId > pendingNavigationLoadId) {\n invariant(pendingAction, "Expected pending action");\n pendingNavigationController && pendingNavigationController.abort();\n completeNavigation(state.navigation.location, {\n matches,\n loaderData,\n errors,\n fetchers: new Map(state.fetchers)\n });\n } else {\n // otherwise just update with the fetcher data, preserving any existing\n // loaderData for loaders that did not need to reload. We have to\n // manually merge here since we aren\'t going through completeNavigation\n updateState(_extends({\n errors,\n loaderData: mergeLoaderData(state.loaderData, loaderData, matches, errors)\n }, didAbortFetchLoads ? {\n fetchers: new Map(state.fetchers)\n } : {}));\n isRevalidationRequired = false;\n }\n } // Call the matched loader for fetcher.load(), handling redirects, errors, etc.\n\n\n async function handleFetcherLoader(key, routeId, path, match, matches, submission) {\n let existingFetcher = state.fetchers.get(key); // Put this fetcher into it\'s loading state\n\n let loadingFetcher = _extends({\n state: "loading",\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined\n }, submission, {\n data: existingFetcher && existingFetcher.data,\n " _hasFetcherDoneAnything ": true\n });\n\n state.fetchers.set(key, loadingFetcher);\n updateState({\n fetchers: new Map(state.fetchers)\n }); // Call the loader for this fetcher route match\n\n let abortController = new AbortController();\n let fetchRequest = createClientSideRequest(init.history, path, abortController.signal);\n fetchControllers.set(key, abortController);\n let result = await callLoaderOrAction("loader", fetchRequest, match, matches, router.basename); // Deferred isn\'t supported for fetcher loads, await everything and treat it\n // as a normal load. resolveDeferredData will return undefined if this\n // fetcher gets aborted, so we just leave result untouched and short circuit\n // below if that happens\n\n if (isDeferredResult(result)) {\n result = (await resolveDeferredData(result, fetchRequest.signal, true)) || result;\n } // We can delete this so long as we weren\'t aborted by ou our own fetcher\n // re-load which would have put _new_ controller is in fetchControllers\n\n\n if (fetchControllers.get(key) === abortController) {\n fetchControllers.delete(key);\n }\n\n if (fetchRequest.signal.aborted) {\n return;\n } // If the loader threw a redirect Response, start a new REPLACE navigation\n\n\n if (isRedirectResult(result)) {\n await startRedirectNavigation(state, result);\n return;\n } // Process any non-redirect errors thrown\n\n\n if (isErrorResult(result)) {\n let boundaryMatch = findNearestBoundary(state.matches, routeId);\n state.fetchers.delete(key); // TODO: In remix, this would reset to IDLE_NAVIGATION if it was a catch -\n // do we need to behave any differently with our non-redirect errors?\n // What if it was a non-redirect Response?\n\n updateState({\n fetchers: new Map(state.fetchers),\n errors: {\n [boundaryMatch.route.id]: result.error\n }\n });\n return;\n }\n\n invariant(!isDeferredResult(result), "Unhandled fetcher deferred data"); // Put the fetcher back into an idle state\n\n let doneFetcher = {\n state: "idle",\n data: result.data,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n " _hasFetcherDoneAnything ": true\n };\n state.fetchers.set(key, doneFetcher);\n updateState({\n fetchers: new Map(state.fetchers)\n });\n }\n /**\n * Utility function to handle redirects returned from an action or loader.\n * Normally, a redirect "replaces" the navigation that triggered it. So, for\n * example:\n *\n * - user is on /a\n * - user clicks a link to /b\n * - loader for /b redirects to /c\n *\n * In a non-JS app the browser would track the in-flight navigation to /b and\n * then replace it with /c when it encountered the redirect response. In\n * the end it would only ever update the URL bar with /c.\n *\n * In client-side routing using pushState/replaceState, we aim to emulate\n * this behavior and we also do not update history until the end of the\n * navigation (including processed redirects). This means that we never\n * actually touch history until we\'ve processed redirects, so we just use\n * the history action from the original navigation (PUSH or REPLACE).\n */\n\n\n async function startRedirectNavigation(state, redirect, _temp) {\n var _window;\n\n let {\n submission,\n replace,\n isFetchActionRedirect\n } = _temp === void 0 ? {} : _temp;\n\n if (redirect.revalidate) {\n isRevalidationRequired = true;\n }\n\n let redirectLocation = createLocation(state.location, redirect.location, // TODO: This can be removed once we get rid of useTransition in Remix v2\n _extends({\n _isRedirect: true\n }, isFetchActionRedirect ? {\n _isFetchActionRedirect: true\n } : {}));\n invariant(redirectLocation, "Expected a location on the redirect navigation"); // Check if this an absolute external redirect that goes to a new origin\n\n if (ABSOLUTE_URL_REGEX.test(redirect.location) && isBrowser && typeof ((_window = window) == null ? void 0 : _window.location) !== "undefined") {\n let url = init.history.createURL(redirect.location);\n let isDifferentBasename = stripBasename(url.pathname, init.basename || "/") == null;\n\n if (window.location.origin !== url.origin || isDifferentBasename) {\n if (replace) {\n window.location.replace(redirect.location);\n } else {\n window.location.assign(redirect.location);\n }\n\n return;\n }\n } // There\'s no need to abort on redirects, since we don\'t detect the\n // redirect until the action/loaders have settled\n\n\n pendingNavigationController = null;\n let redirectHistoryAction = replace === true ? Action.Replace : Action.Push; // Use the incoming submission if provided, fallback on the active one in\n // state.navigation\n\n let {\n formMethod,\n formAction,\n formEncType,\n formData\n } = state.navigation;\n\n if (!submission && formMethod && formAction && formData && formEncType) {\n submission = {\n formMethod,\n formAction,\n formEncType,\n formData\n };\n } // If this was a 307/308 submission we want to preserve the HTTP method and\n // re-submit the GET/POST/PUT/PATCH/DELETE as a submission navigation to the\n // redirected location\n\n\n if (redirectPreserveMethodStatusCodes.has(redirect.status) && submission && isMutationMethod(submission.formMethod)) {\n await startNavigation(redirectHistoryAction, redirectLocation, {\n submission: _extends({}, submission, {\n formAction: redirect.location\n }),\n // Preserve this flag across redirects\n preventScrollReset: pendingPreventScrollReset\n });\n } else {\n // Otherwise, we kick off a new loading navigation, preserving the\n // submission info for the duration of this navigation\n await startNavigation(redirectHistoryAction, redirectLocation, {\n overrideNavigation: {\n state: "loading",\n location: redirectLocation,\n formMethod: submission ? submission.formMethod : undefined,\n formAction: submission ? submission.formAction : undefined,\n formEncType: submission ? submission.formEncType : undefined,\n formData: submission ? submission.formData : undefined\n },\n // Preserve this flag across redirects\n preventScrollReset: pendingPreventScrollReset\n });\n }\n }\n\n async function callLoadersAndMaybeResolveData(currentMatches, matches, matchesToLoad, fetchersToLoad, request) {\n // Call all navigation loaders and revalidating fetcher loaders in parallel,\n // then slice off the results into separate arrays so we can handle them\n // accordingly\n let results = await Promise.all([...matchesToLoad.map(match => callLoaderOrAction("loader", request, match, matches, router.basename)), ...fetchersToLoad.map(f => {\n if (f.matches && f.match) {\n return callLoaderOrAction("loader", createClientSideRequest(init.history, f.path, request.signal), f.match, f.matches, router.basename);\n } else {\n let error = {\n type: ResultType.error,\n error: getInternalRouterError(404, {\n pathname: f.path\n })\n };\n return error;\n }\n })]);\n let loaderResults = results.slice(0, matchesToLoad.length);\n let fetcherResults = results.slice(matchesToLoad.length);\n await Promise.all([resolveDeferredResults(currentMatches, matchesToLoad, loaderResults, request.signal, false, state.loaderData), resolveDeferredResults(currentMatches, fetchersToLoad.map(f => f.match), fetcherResults, request.signal, true)]);\n return {\n results,\n loaderResults,\n fetcherResults\n };\n }\n\n function interruptActiveLoads() {\n // Every interruption triggers a revalidation\n isRevalidationRequired = true; // Cancel pending route-level deferreds and mark cancelled routes for\n // revalidation\n\n cancelledDeferredRoutes.push(...cancelActiveDeferreds()); // Abort in-flight fetcher loads\n\n fetchLoadMatches.forEach((_, key) => {\n if (fetchControllers.has(key)) {\n cancelledFetcherLoads.push(key);\n abortFetcher(key);\n }\n });\n }\n\n function setFetcherError(key, routeId, error) {\n let boundaryMatch = findNearestBoundary(state.matches, routeId);\n deleteFetcher(key);\n updateState({\n errors: {\n [boundaryMatch.route.id]: error\n },\n fetchers: new Map(state.fetchers)\n });\n }\n\n function deleteFetcher(key) {\n if (fetchControllers.has(key)) abortFetcher(key);\n fetchLoadMatches.delete(key);\n fetchReloadIds.delete(key);\n fetchRedirectIds.delete(key);\n state.fetchers.delete(key);\n }\n\n function abortFetcher(key) {\n let controller = fetchControllers.get(key);\n invariant(controller, "Expected fetch controller: " + key);\n controller.abort();\n fetchControllers.delete(key);\n }\n\n function markFetchersDone(keys) {\n for (let key of keys) {\n let fetcher = getFetcher(key);\n let doneFetcher = {\n state: "idle",\n data: fetcher.data,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n " _hasFetcherDoneAnything ": true\n };\n state.fetchers.set(key, doneFetcher);\n }\n }\n\n function markFetchRedirectsDone() {\n let doneKeys = [];\n\n for (let key of fetchRedirectIds) {\n let fetcher = state.fetchers.get(key);\n invariant(fetcher, "Expected fetcher: " + key);\n\n if (fetcher.state === "loading") {\n fetchRedirectIds.delete(key);\n doneKeys.push(key);\n }\n }\n\n markFetchersDone(doneKeys);\n }\n\n function abortStaleFetchLoads(landedId) {\n let yeetedKeys = [];\n\n for (let [key, id] of fetchReloadIds) {\n if (id < landedId) {\n let fetcher = state.fetchers.get(key);\n invariant(fetcher, "Expected fetcher: " + key);\n\n if (fetcher.state === "loading") {\n abortFetcher(key);\n fetchReloadIds.delete(key);\n yeetedKeys.push(key);\n }\n }\n }\n\n markFetchersDone(yeetedKeys);\n return yeetedKeys.length > 0;\n }\n\n function getBlocker(key, fn) {\n let blocker = state.blockers.get(key) || IDLE_BLOCKER;\n\n if (blockerFunctions.get(key) !== fn) {\n blockerFunctions.set(key, fn);\n }\n\n return blocker;\n }\n\n function deleteBlocker(key) {\n state.blockers.delete(key);\n blockerFunctions.delete(key);\n } // Utility function to update blockers, ensuring valid state transitions\n\n\n function updateBlocker(key, newBlocker) {\n let blocker = state.blockers.get(key) || IDLE_BLOCKER; // Poor mans state machine :)\n // https://mermaid.live/edit#pako:eNqVkc9OwzAMxl8l8nnjAYrEtDIOHEBIgwvKJTReGy3_lDpIqO27k6awMG0XcrLlnz87nwdonESogKXXBuE79rq75XZO3-yHds0RJVuv70YrPlUrCEe2HfrORS3rubqZfuhtpg5C9wk5tZ4VKcRUq88q9Z8RS0-48cE1iHJkL0ugbHuFLus9L6spZy8nX9MP2CNdomVaposqu3fGayT8T8-jJQwhepo_UtpgBQaDEUom04dZhAN1aJBDlUKJBxE1ceB2Smj0Mln-IBW5AFU2dwUiktt_2Qaq2dBfaKdEup85UV7Yd-dKjlnkabl2Pvr0DTkTreM\n\n invariant(blocker.state === "unblocked" && newBlocker.state === "blocked" || blocker.state === "blocked" && newBlocker.state === "blocked" || blocker.state === "blocked" && newBlocker.state === "proceeding" || blocker.state === "blocked" && newBlocker.state === "unblocked" || blocker.state === "proceeding" && newBlocker.state === "unblocked", "Invalid blocker state transition: " + blocker.state + " -> " + newBlocker.state);\n state.blockers.set(key, newBlocker);\n updateState({\n blockers: new Map(state.blockers)\n });\n }\n\n function shouldBlockNavigation(_ref2) {\n let {\n currentLocation,\n nextLocation,\n historyAction\n } = _ref2;\n\n if (blockerFunctions.size === 0) {\n return;\n } // We ony support a single active blocker at the moment since we don\'t have\n // any compelling use cases for multi-blocker yet\n\n\n if (blockerFunctions.size > 1) {\n warning(false, "A router only supports one blocker at a time");\n }\n\n let entries = Array.from(blockerFunctions.entries());\n let [blockerKey, blockerFunction] = entries[entries.length - 1];\n let blocker = state.blockers.get(blockerKey);\n\n if (blocker && blocker.state === "proceeding") {\n // If the blocker is currently proceeding, we don\'t need to re-check\n // it and can let this navigation continue\n return;\n } // At this point, we know we\'re unblocked/blocked so we need to check the\n // user-provided blocker function\n\n\n if (blockerFunction({\n currentLocation,\n nextLocation,\n historyAction\n })) {\n return blockerKey;\n }\n }\n\n function cancelActiveDeferreds(predicate) {\n let cancelledRouteIds = [];\n activeDeferreds.forEach((dfd, routeId) => {\n if (!predicate || predicate(routeId)) {\n // Cancel the deferred - but do not remove from activeDeferreds here -\n // we rely on the subscribers to do that so our tests can assert proper\n // cleanup via _internalActiveDeferreds\n dfd.cancel();\n cancelledRouteIds.push(routeId);\n activeDeferreds.delete(routeId);\n }\n });\n return cancelledRouteIds;\n } // Opt in to capturing and reporting scroll positions during navigations,\n // used by the component\n\n\n function enableScrollRestoration(positions, getPosition, getKey) {\n savedScrollPositions = positions;\n getScrollPosition = getPosition;\n\n getScrollRestorationKey = getKey || (location => location.key); // Perform initial hydration scroll restoration, since we miss the boat on\n // the initial updateState() because we\'ve not yet rendered \n // and therefore have no savedScrollPositions available\n\n\n if (!initialScrollRestored && state.navigation === IDLE_NAVIGATION) {\n initialScrollRestored = true;\n let y = getSavedScrollPosition(state.location, state.matches);\n\n if (y != null) {\n updateState({\n restoreScrollPosition: y\n });\n }\n }\n\n return () => {\n savedScrollPositions = null;\n getScrollPosition = null;\n getScrollRestorationKey = null;\n };\n }\n\n function saveScrollPosition(location, matches) {\n if (savedScrollPositions && getScrollRestorationKey && getScrollPosition) {\n let userMatches = matches.map(m => createUseMatchesMatch(m, state.loaderData));\n let key = getScrollRestorationKey(location, userMatches) || location.key;\n savedScrollPositions[key] = getScrollPosition();\n }\n }\n\n function getSavedScrollPosition(location, matches) {\n if (savedScrollPositions && getScrollRestorationKey && getScrollPosition) {\n let userMatches = matches.map(m => createUseMatchesMatch(m, state.loaderData));\n let key = getScrollRestorationKey(location, userMatches) || location.key;\n let y = savedScrollPositions[key];\n\n if (typeof y === "number") {\n return y;\n }\n }\n\n return null;\n }\n\n function _internalSetRoutes(newRoutes) {\n inFlightDataRoutes = newRoutes;\n }\n\n router = {\n get basename() {\n return init.basename;\n },\n\n get state() {\n return state;\n },\n\n get routes() {\n return dataRoutes;\n },\n\n initialize,\n subscribe,\n enableScrollRestoration,\n navigate,\n fetch,\n revalidate,\n // Passthrough to history-aware createHref used by useHref so we get proper\n // hash-aware URLs in DOM paths\n createHref: to => init.history.createHref(to),\n encodeLocation: to => init.history.encodeLocation(to),\n getFetcher,\n deleteFetcher,\n dispose,\n getBlocker,\n deleteBlocker,\n _internalFetchControllers: fetchControllers,\n _internalActiveDeferreds: activeDeferreds,\n // TODO: Remove setRoutes, it\'s temporary to avoid dealing with\n // updating the tree while validating the update algorithm.\n _internalSetRoutes\n };\n return router;\n} //#endregion\n////////////////////////////////////////////////////////////////////////////////\n//#region createStaticHandler\n////////////////////////////////////////////////////////////////////////////////\n\nconst UNSAFE_DEFERRED_SYMBOL = Symbol("deferred");\nfunction createStaticHandler(routes, opts) {\n invariant(routes.length > 0, "You must provide a non-empty routes array to createStaticHandler");\n let dataRoutes = convertRoutesToDataRoutes(routes);\n let basename = (opts ? opts.basename : null) || "/";\n /**\n * The query() method is intended for document requests, in which we want to\n * call an optional action and potentially multiple loaders for all nested\n * routes. It returns a StaticHandlerContext object, which is very similar\n * to the router state (location, loaderData, actionData, errors, etc.) and\n * also adds SSR-specific information such as the statusCode and headers\n * from action/loaders Responses.\n *\n * It _should_ never throw and should report all errors through the\n * returned context.errors object, properly associating errors to their error\n * boundary. Additionally, it tracks _deepestRenderedBoundaryId which can be\n * used to emulate React error boundaries during SSr by performing a second\n * pass only down to the boundaryId.\n *\n * The one exception where we do not return a StaticHandlerContext is when a\n * redirect response is returned or thrown from any action/loader. We\n * propagate that out and return the raw Response so the HTTP server can\n * return it directly.\n */\n\n async function query(request, _temp2) {\n let {\n requestContext\n } = _temp2 === void 0 ? {} : _temp2;\n let url = new URL(request.url);\n let method = request.method.toLowerCase();\n let location = createLocation("", createPath(url), null, "default");\n let matches = matchRoutes(dataRoutes, location, basename); // SSR supports HEAD requests while SPA doesn\'t\n\n if (!isValidMethod(method) && method !== "head") {\n let error = getInternalRouterError(405, {\n method\n });\n let {\n matches: methodNotAllowedMatches,\n route\n } = getShortCircuitMatches(dataRoutes);\n return {\n basename,\n location,\n matches: methodNotAllowedMatches,\n loaderData: {},\n actionData: null,\n errors: {\n [route.id]: error\n },\n statusCode: error.status,\n loaderHeaders: {},\n actionHeaders: {},\n activeDeferreds: null\n };\n } else if (!matches) {\n let error = getInternalRouterError(404, {\n pathname: location.pathname\n });\n let {\n matches: notFoundMatches,\n route\n } = getShortCircuitMatches(dataRoutes);\n return {\n basename,\n location,\n matches: notFoundMatches,\n loaderData: {},\n actionData: null,\n errors: {\n [route.id]: error\n },\n statusCode: error.status,\n loaderHeaders: {},\n actionHeaders: {},\n activeDeferreds: null\n };\n }\n\n let result = await queryImpl(request, location, matches, requestContext);\n\n if (isResponse(result)) {\n return result;\n } // When returning StaticHandlerContext, we patch back in the location here\n // since we need it for React Context. But this helps keep our submit and\n // loadRouteData operating on a Request instead of a Location\n\n\n return _extends({\n location,\n basename\n }, result);\n }\n /**\n * The queryRoute() method is intended for targeted route requests, either\n * for fetch ?_data requests or resource route requests. In this case, we\n * are only ever calling a single action or loader, and we are returning the\n * returned value directly. In most cases, this will be a Response returned\n * from the action/loader, but it may be a primitive or other value as well -\n * and in such cases the calling context should handle that accordingly.\n *\n * We do respect the throw/return differentiation, so if an action/loader\n * throws, then this method will throw the value. This is important so we\n * can do proper boundary identification in Remix where a thrown Response\n * must go to the Catch Boundary but a returned Response is happy-path.\n *\n * One thing to note is that any Router-initiated Errors that make sense\n * to associate with a status code will be thrown as an ErrorResponse\n * instance which include the raw Error, such that the calling context can\n * serialize the error as they see fit while including the proper response\n * code. Examples here are 404 and 405 errors that occur prior to reaching\n * any user-defined loaders.\n */\n\n\n async function queryRoute(request, _temp3) {\n let {\n routeId,\n requestContext\n } = _temp3 === void 0 ? {} : _temp3;\n let url = new URL(request.url);\n let method = request.method.toLowerCase();\n let location = createLocation("", createPath(url), null, "default");\n let matches = matchRoutes(dataRoutes, location, basename); // SSR supports HEAD requests while SPA doesn\'t\n\n if (!isValidMethod(method) && method !== "head" && method !== "options") {\n throw getInternalRouterError(405, {\n method\n });\n } else if (!matches) {\n throw getInternalRouterError(404, {\n pathname: location.pathname\n });\n }\n\n let match = routeId ? matches.find(m => m.route.id === routeId) : getTargetMatch(matches, location);\n\n if (routeId && !match) {\n throw getInternalRouterError(403, {\n pathname: location.pathname,\n routeId\n });\n } else if (!match) {\n // This should never hit I don\'t think?\n throw getInternalRouterError(404, {\n pathname: location.pathname\n });\n }\n\n let result = await queryImpl(request, location, matches, requestContext, match);\n\n if (isResponse(result)) {\n return result;\n }\n\n let error = result.errors ? Object.values(result.errors)[0] : undefined;\n\n if (error !== undefined) {\n // If we got back result.errors, that means the loader/action threw\n // _something_ that wasn\'t a Response, but it\'s not guaranteed/required\n // to be an `instanceof Error` either, so we have to use throw here to\n // preserve the "error" state outside of queryImpl.\n throw error;\n } // Pick off the right state value to return\n\n\n if (result.actionData) {\n return Object.values(result.actionData)[0];\n }\n\n if (result.loaderData) {\n var _result$activeDeferre;\n\n let data = Object.values(result.loaderData)[0];\n\n if ((_result$activeDeferre = result.activeDeferreds) != null && _result$activeDeferre[match.route.id]) {\n data[UNSAFE_DEFERRED_SYMBOL] = result.activeDeferreds[match.route.id];\n }\n\n return data;\n }\n\n return undefined;\n }\n\n async function queryImpl(request, location, matches, requestContext, routeMatch) {\n invariant(request.signal, "query()/queryRoute() requests must contain an AbortController signal");\n\n try {\n if (isMutationMethod(request.method.toLowerCase())) {\n let result = await submit(request, matches, routeMatch || getTargetMatch(matches, location), requestContext, routeMatch != null);\n return result;\n }\n\n let result = await loadRouteData(request, matches, requestContext, routeMatch);\n return isResponse(result) ? result : _extends({}, result, {\n actionData: null,\n actionHeaders: {}\n });\n } catch (e) {\n // If the user threw/returned a Response in callLoaderOrAction, we throw\n // it to bail out and then return or throw here based on whether the user\n // returned or threw\n if (isQueryRouteResponse(e)) {\n if (e.type === ResultType.error && !isRedirectResponse(e.response)) {\n throw e.response;\n }\n\n return e.response;\n } // Redirects are always returned since they don\'t propagate to catch\n // boundaries\n\n\n if (isRedirectResponse(e)) {\n return e;\n }\n\n throw e;\n }\n }\n\n async function submit(request, matches, actionMatch, requestContext, isRouteRequest) {\n let result;\n\n if (!actionMatch.route.action) {\n let error = getInternalRouterError(405, {\n method: request.method,\n pathname: new URL(request.url).pathname,\n routeId: actionMatch.route.id\n });\n\n if (isRouteRequest) {\n throw error;\n }\n\n result = {\n type: ResultType.error,\n error\n };\n } else {\n result = await callLoaderOrAction("action", request, actionMatch, matches, basename, true, isRouteRequest, requestContext);\n\n if (request.signal.aborted) {\n let method = isRouteRequest ? "queryRoute" : "query";\n throw new Error(method + "() call aborted");\n }\n }\n\n if (isRedirectResult(result)) {\n // Uhhhh - this should never happen, we should always throw these from\n // callLoaderOrAction, but the type narrowing here keeps TS happy and we\n // can get back on the "throw all redirect responses" train here should\n // this ever happen :/\n throw new Response(null, {\n status: result.status,\n headers: {\n Location: result.location\n }\n });\n }\n\n if (isDeferredResult(result)) {\n let error = getInternalRouterError(400, {\n type: "defer-action"\n });\n\n if (isRouteRequest) {\n throw error;\n }\n\n result = {\n type: ResultType.error,\n error\n };\n }\n\n if (isRouteRequest) {\n // Note: This should only be non-Response values if we get here, since\n // isRouteRequest should throw any Response received in callLoaderOrAction\n if (isErrorResult(result)) {\n throw result.error;\n }\n\n return {\n matches: [actionMatch],\n loaderData: {},\n actionData: {\n [actionMatch.route.id]: result.data\n },\n errors: null,\n // Note: statusCode + headers are unused here since queryRoute will\n // return the raw Response or value\n statusCode: 200,\n loaderHeaders: {},\n actionHeaders: {},\n activeDeferreds: null\n };\n }\n\n if (isErrorResult(result)) {\n // Store off the pending error - we use it to determine which loaders\n // to call and will commit it when we complete the navigation\n let boundaryMatch = findNearestBoundary(matches, actionMatch.route.id);\n let context = await loadRouteData(request, matches, requestContext, undefined, {\n [boundaryMatch.route.id]: result.error\n }); // action status codes take precedence over loader status codes\n\n return _extends({}, context, {\n statusCode: isRouteErrorResponse(result.error) ? result.error.status : 500,\n actionData: null,\n actionHeaders: _extends({}, result.headers ? {\n [actionMatch.route.id]: result.headers\n } : {})\n });\n } // Create a GET request for the loaders\n\n\n let loaderRequest = new Request(request.url, {\n headers: request.headers,\n redirect: request.redirect,\n signal: request.signal\n });\n let context = await loadRouteData(loaderRequest, matches, requestContext);\n return _extends({}, context, result.statusCode ? {\n statusCode: result.statusCode\n } : {}, {\n actionData: {\n [actionMatch.route.id]: result.data\n },\n actionHeaders: _extends({}, result.headers ? {\n [actionMatch.route.id]: result.headers\n } : {})\n });\n }\n\n async function loadRouteData(request, matches, requestContext, routeMatch, pendingActionError) {\n let isRouteRequest = routeMatch != null; // Short circuit if we have no loaders to run (queryRoute())\n\n if (isRouteRequest && !(routeMatch != null && routeMatch.route.loader)) {\n throw getInternalRouterError(400, {\n method: request.method,\n pathname: new URL(request.url).pathname,\n routeId: routeMatch == null ? void 0 : routeMatch.route.id\n });\n }\n\n let requestMatches = routeMatch ? [routeMatch] : getLoaderMatchesUntilBoundary(matches, Object.keys(pendingActionError || {})[0]);\n let matchesToLoad = requestMatches.filter(m => m.route.loader); // Short circuit if we have no loaders to run (query())\n\n if (matchesToLoad.length === 0) {\n return {\n matches,\n // Add a null for all matched routes for proper revalidation on the client\n loaderData: matches.reduce((acc, m) => Object.assign(acc, {\n [m.route.id]: null\n }), {}),\n errors: pendingActionError || null,\n statusCode: 200,\n loaderHeaders: {},\n activeDeferreds: null\n };\n }\n\n let results = await Promise.all([...matchesToLoad.map(match => callLoaderOrAction("loader", request, match, matches, basename, true, isRouteRequest, requestContext))]);\n\n if (request.signal.aborted) {\n let method = isRouteRequest ? "queryRoute" : "query";\n throw new Error(method + "() call aborted");\n } // Process and commit output from loaders\n\n\n let activeDeferreds = new Map();\n let context = processRouteLoaderData(matches, matchesToLoad, results, pendingActionError, activeDeferreds); // Add a null for any non-loader matches for proper revalidation on the client\n\n let executedLoaders = new Set(matchesToLoad.map(match => match.route.id));\n matches.forEach(match => {\n if (!executedLoaders.has(match.route.id)) {\n context.loaderData[match.route.id] = null;\n }\n });\n return _extends({}, context, {\n matches,\n activeDeferreds: activeDeferreds.size > 0 ? Object.fromEntries(activeDeferreds.entries()) : null\n });\n }\n\n return {\n dataRoutes,\n query,\n queryRoute\n };\n} //#endregion\n////////////////////////////////////////////////////////////////////////////////\n//#region Helpers\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Given an existing StaticHandlerContext and an error thrown at render time,\n * provide an updated StaticHandlerContext suitable for a second SSR render\n */\n\nfunction getStaticContextFromError(routes, context, error) {\n let newContext = _extends({}, context, {\n statusCode: 500,\n errors: {\n [context._deepestRenderedBoundaryId || routes[0].id]: error\n }\n });\n\n return newContext;\n}\n\nfunction isSubmissionNavigation(opts) {\n return opts != null && "formData" in opts;\n} // Normalize navigation options by converting formMethod=GET formData objects to\n// URLSearchParams so they behave identically to links with query params\n\n\nfunction normalizeNavigateOptions(to, opts, isFetcher) {\n if (isFetcher === void 0) {\n isFetcher = false;\n }\n\n let path = typeof to === "string" ? to : createPath(to); // Return location verbatim on non-submission navigations\n\n if (!opts || !isSubmissionNavigation(opts)) {\n return {\n path\n };\n }\n\n if (opts.formMethod && !isValidMethod(opts.formMethod)) {\n return {\n path,\n error: getInternalRouterError(405, {\n method: opts.formMethod\n })\n };\n } // Create a Submission on non-GET navigations\n\n\n let submission;\n\n if (opts.formData) {\n submission = {\n formMethod: opts.formMethod || "get",\n formAction: stripHashFromPath(path),\n formEncType: opts && opts.formEncType || "application/x-www-form-urlencoded",\n formData: opts.formData\n };\n\n if (isMutationMethod(submission.formMethod)) {\n return {\n path,\n submission\n };\n }\n } // Flatten submission onto URLSearchParams for GET submissions\n\n\n let parsedPath = parsePath(path);\n let searchParams = convertFormDataToSearchParams(opts.formData); // Since fetcher GET submissions only run a single loader (as opposed to\n // navigation GET submissions which run all loaders), we need to preserve\n // any incoming ?index params\n\n if (isFetcher && parsedPath.search && hasNakedIndexQuery(parsedPath.search)) {\n searchParams.append("index", "");\n }\n\n parsedPath.search = "?" + searchParams;\n return {\n path: createPath(parsedPath),\n submission\n };\n} // Filter out all routes below any caught error as they aren\'t going to\n// render so we don\'t need to load them\n\n\nfunction getLoaderMatchesUntilBoundary(matches, boundaryId) {\n let boundaryMatches = matches;\n\n if (boundaryId) {\n let index = matches.findIndex(m => m.route.id === boundaryId);\n\n if (index >= 0) {\n boundaryMatches = matches.slice(0, index);\n }\n }\n\n return boundaryMatches;\n}\n\nfunction getMatchesToLoad(history, state, matches, submission, location, isRevalidationRequired, cancelledDeferredRoutes, cancelledFetcherLoads, fetchLoadMatches, routesToUse, basename, pendingActionData, pendingError) {\n let actionResult = pendingError ? Object.values(pendingError)[0] : pendingActionData ? Object.values(pendingActionData)[0] : undefined;\n let currentUrl = history.createURL(state.location);\n let nextUrl = history.createURL(location);\n let defaultShouldRevalidate = // Forced revalidation due to submission, useRevalidate, or X-Remix-Revalidate\n isRevalidationRequired || // Clicked the same link, resubmitted a GET form\n currentUrl.toString() === nextUrl.toString() || // Search params affect all loaders\n currentUrl.search !== nextUrl.search; // Pick navigation matches that are net-new or qualify for revalidation\n\n let boundaryId = pendingError ? Object.keys(pendingError)[0] : undefined;\n let boundaryMatches = getLoaderMatchesUntilBoundary(matches, boundaryId);\n let navigationMatches = boundaryMatches.filter((match, index) => {\n if (match.route.loader == null) {\n return false;\n } // Always call the loader on new route instances and pending defer cancellations\n\n\n if (isNewLoader(state.loaderData, state.matches[index], match) || cancelledDeferredRoutes.some(id => id === match.route.id)) {\n return true;\n } // This is the default implementation for when we revalidate. If the route\n // provides it\'s own implementation, then we give them full control but\n // provide this value so they can leverage it if needed after they check\n // their own specific use cases\n\n\n let currentRouteMatch = state.matches[index];\n let nextRouteMatch = match;\n return shouldRevalidateLoader(match, _extends({\n currentUrl,\n currentParams: currentRouteMatch.params,\n nextUrl,\n nextParams: nextRouteMatch.params\n }, submission, {\n actionResult,\n defaultShouldRevalidate: defaultShouldRevalidate || isNewRouteInstance(currentRouteMatch, nextRouteMatch)\n }));\n }); // Pick fetcher.loads that need to be revalidated\n\n let revalidatingFetchers = [];\n fetchLoadMatches.forEach((f, key) => {\n // Don\'t revalidate if fetcher won\'t be present in the subsequent render\n if (!matches.some(m => m.route.id === f.routeId)) {\n return;\n }\n\n let fetcherMatches = matchRoutes(routesToUse, f.path, basename); // If the fetcher path no longer matches, push it in with null matches so\n // we can trigger a 404 in callLoadersAndMaybeResolveData\n\n if (!fetcherMatches) {\n revalidatingFetchers.push(_extends({\n key\n }, f, {\n matches: null,\n match: null\n }));\n return;\n }\n\n let fetcherMatch = getTargetMatch(fetcherMatches, f.path);\n\n if (cancelledFetcherLoads.includes(key)) {\n revalidatingFetchers.push(_extends({\n key,\n matches: fetcherMatches,\n match: fetcherMatch\n }, f));\n return;\n } // Revalidating fetchers are decoupled from the route matches since they\n // hit a static href, so they _always_ check shouldRevalidate and the\n // default is strictly if a revalidation is explicitly required (action\n // submissions, useRevalidator, X-Remix-Revalidate).\n\n\n let shouldRevalidate = shouldRevalidateLoader(fetcherMatch, _extends({\n currentUrl,\n currentParams: state.matches[state.matches.length - 1].params,\n nextUrl,\n nextParams: matches[matches.length - 1].params\n }, submission, {\n actionResult,\n defaultShouldRevalidate\n }));\n\n if (shouldRevalidate) {\n revalidatingFetchers.push(_extends({\n key,\n matches: fetcherMatches,\n match: fetcherMatch\n }, f));\n }\n });\n return [navigationMatches, revalidatingFetchers];\n}\n\nfunction isNewLoader(currentLoaderData, currentMatch, match) {\n let isNew = // [a] -> [a, b]\n !currentMatch || // [a, b] -> [a, c]\n match.route.id !== currentMatch.route.id; // Handle the case that we don\'t have data for a re-used route, potentially\n // from a prior error or from a cancelled pending deferred\n\n let isMissingData = currentLoaderData[match.route.id] === undefined; // Always load if this is a net-new route or we don\'t yet have data\n\n return isNew || isMissingData;\n}\n\nfunction isNewRouteInstance(currentMatch, match) {\n let currentPath = currentMatch.route.path;\n return (// param change for this match, /users/123 -> /users/456\n currentMatch.pathname !== match.pathname || // splat param changed, which is not present in match.path\n // e.g. /files/images/avatar.jpg -> files/finances.xls\n currentPath != null && currentPath.endsWith("*") && currentMatch.params["*"] !== match.params["*"]\n );\n}\n\nfunction shouldRevalidateLoader(loaderMatch, arg) {\n if (loaderMatch.route.shouldRevalidate) {\n let routeChoice = loaderMatch.route.shouldRevalidate(arg);\n\n if (typeof routeChoice === "boolean") {\n return routeChoice;\n }\n }\n\n return arg.defaultShouldRevalidate;\n}\n\nasync function callLoaderOrAction(type, request, match, matches, basename, isStaticRequest, isRouteRequest, requestContext) {\n if (basename === void 0) {\n basename = "/";\n }\n\n if (isStaticRequest === void 0) {\n isStaticRequest = false;\n }\n\n if (isRouteRequest === void 0) {\n isRouteRequest = false;\n }\n\n let resultType;\n let result; // Setup a promise we can race against so that abort signals short circuit\n\n let reject;\n let abortPromise = new Promise((_, r) => reject = r);\n\n let onReject = () => reject();\n\n request.signal.addEventListener("abort", onReject);\n\n try {\n let handler = match.route[type];\n invariant(handler, "Could not find the " + type + " to run on the \\"" + match.route.id + "\\" route");\n result = await Promise.race([handler({\n request,\n params: match.params,\n context: requestContext\n }), abortPromise]);\n invariant(result !== undefined, "You defined " + (type === "action" ? "an action" : "a loader") + " for route " + ("\\"" + match.route.id + "\\" but didn\'t return anything from your `" + type + "` ") + "function. Please return a value or `null`.");\n } catch (e) {\n resultType = ResultType.error;\n result = e;\n } finally {\n request.signal.removeEventListener("abort", onReject);\n }\n\n if (isResponse(result)) {\n let status = result.status; // Process redirects\n\n if (redirectStatusCodes.has(status)) {\n let location = result.headers.get("Location");\n invariant(location, "Redirects returned/thrown from loaders/actions must have a Location header"); // Support relative routing in internal redirects\n\n if (!ABSOLUTE_URL_REGEX.test(location)) {\n let activeMatches = matches.slice(0, matches.indexOf(match) + 1);\n let routePathnames = getPathContributingMatches(activeMatches).map(match => match.pathnameBase);\n let resolvedLocation = resolveTo(location, routePathnames, new URL(request.url).pathname);\n invariant(createPath(resolvedLocation), "Unable to resolve redirect location: " + location); // Prepend the basename to the redirect location if we have one\n\n if (basename) {\n let path = resolvedLocation.pathname;\n resolvedLocation.pathname = path === "/" ? basename : joinPaths([basename, path]);\n }\n\n location = createPath(resolvedLocation);\n } else if (!isStaticRequest) {\n // Strip off the protocol+origin for same-origin + same-basename absolute\n // redirects. If this is a static request, we can let it go back to the\n // browser as-is\n let currentUrl = new URL(request.url);\n let url = location.startsWith("//") ? new URL(currentUrl.protocol + location) : new URL(location);\n let isSameBasename = stripBasename(url.pathname, basename) != null;\n\n if (url.origin === currentUrl.origin && isSameBasename) {\n location = url.pathname + url.search + url.hash;\n }\n } // Don\'t process redirects in the router during static requests requests.\n // Instead, throw the Response and let the server handle it with an HTTP\n // redirect. We also update the Location header in place in this flow so\n // basename and relative routing is taken into account\n\n\n if (isStaticRequest) {\n result.headers.set("Location", location);\n throw result;\n }\n\n return {\n type: ResultType.redirect,\n status,\n location,\n revalidate: result.headers.get("X-Remix-Revalidate") !== null\n };\n } // For SSR single-route requests, we want to hand Responses back directly\n // without unwrapping. We do this with the QueryRouteResponse wrapper\n // interface so we can know whether it was returned or thrown\n\n\n if (isRouteRequest) {\n // eslint-disable-next-line no-throw-literal\n throw {\n type: resultType || ResultType.data,\n response: result\n };\n }\n\n let data;\n let contentType = result.headers.get("Content-Type"); // Check between word boundaries instead of startsWith() due to the last\n // paragraph of https://httpwg.org/specs/rfc9110.html#field.content-type\n\n if (contentType && /\\bapplication\\/json\\b/.test(contentType)) {\n data = await result.json();\n } else {\n data = await result.text();\n }\n\n if (resultType === ResultType.error) {\n return {\n type: resultType,\n error: new ErrorResponse(status, result.statusText, data),\n headers: result.headers\n };\n }\n\n return {\n type: ResultType.data,\n data,\n statusCode: result.status,\n headers: result.headers\n };\n }\n\n if (resultType === ResultType.error) {\n return {\n type: resultType,\n error: result\n };\n }\n\n if (result instanceof DeferredData) {\n var _result$init, _result$init2;\n\n return {\n type: ResultType.deferred,\n deferredData: result,\n statusCode: (_result$init = result.init) == null ? void 0 : _result$init.status,\n headers: ((_result$init2 = result.init) == null ? void 0 : _result$init2.headers) && new Headers(result.init.headers)\n };\n }\n\n return {\n type: ResultType.data,\n data: result\n };\n} // Utility method for creating the Request instances for loaders/actions during\n// client-side navigations and fetches. During SSR we will always have a\n// Request instance from the static handler (query/queryRoute)\n\n\nfunction createClientSideRequest(history, location, signal, submission) {\n let url = history.createURL(stripHashFromPath(location)).toString();\n let init = {\n signal\n };\n\n if (submission && isMutationMethod(submission.formMethod)) {\n let {\n formMethod,\n formEncType,\n formData\n } = submission;\n init.method = formMethod.toUpperCase();\n init.body = formEncType === "application/x-www-form-urlencoded" ? convertFormDataToSearchParams(formData) : formData;\n } // Content-Type is inferred (https://fetch.spec.whatwg.org/#dom-request)\n\n\n return new Request(url, init);\n}\n\nfunction convertFormDataToSearchParams(formData) {\n let searchParams = new URLSearchParams();\n\n for (let [key, value] of formData.entries()) {\n // https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#converting-an-entry-list-to-a-list-of-name-value-pairs\n searchParams.append(key, value instanceof File ? value.name : value);\n }\n\n return searchParams;\n}\n\nfunction processRouteLoaderData(matches, matchesToLoad, results, pendingError, activeDeferreds) {\n // Fill in loaderData/errors from our loaders\n let loaderData = {};\n let errors = null;\n let statusCode;\n let foundError = false;\n let loaderHeaders = {}; // Process loader results into state.loaderData/state.errors\n\n results.forEach((result, index) => {\n let id = matchesToLoad[index].route.id;\n invariant(!isRedirectResult(result), "Cannot handle redirect results in processLoaderData");\n\n if (isErrorResult(result)) {\n // Look upwards from the matched route for the closest ancestor\n // error boundary, defaulting to the root match\n let boundaryMatch = findNearestBoundary(matches, id);\n let error = result.error; // If we have a pending action error, we report it at the highest-route\n // that throws a loader error, and then clear it out to indicate that\n // it was consumed\n\n if (pendingError) {\n error = Object.values(pendingError)[0];\n pendingError = undefined;\n }\n\n errors = errors || {}; // Prefer higher error values if lower errors bubble to the same boundary\n\n if (errors[boundaryMatch.route.id] == null) {\n errors[boundaryMatch.route.id] = error;\n } // Clear our any prior loaderData for the throwing route\n\n\n loaderData[id] = undefined; // Once we find our first (highest) error, we set the status code and\n // prevent deeper status codes from overriding\n\n if (!foundError) {\n foundError = true;\n statusCode = isRouteErrorResponse(result.error) ? result.error.status : 500;\n }\n\n if (result.headers) {\n loaderHeaders[id] = result.headers;\n }\n } else {\n if (isDeferredResult(result)) {\n activeDeferreds.set(id, result.deferredData);\n loaderData[id] = result.deferredData.data;\n } else {\n loaderData[id] = result.data;\n } // Error status codes always override success status codes, but if all\n // loaders are successful we take the deepest status code.\n\n\n if (result.statusCode != null && result.statusCode !== 200 && !foundError) {\n statusCode = result.statusCode;\n }\n\n if (result.headers) {\n loaderHeaders[id] = result.headers;\n }\n }\n }); // If we didn\'t consume the pending action error (i.e., all loaders\n // resolved), then consume it here. Also clear out any loaderData for the\n // throwing route\n\n if (pendingError) {\n errors = pendingError;\n loaderData[Object.keys(pendingError)[0]] = undefined;\n }\n\n return {\n loaderData,\n errors,\n statusCode: statusCode || 200,\n loaderHeaders\n };\n}\n\nfunction processLoaderData(state, matches, matchesToLoad, results, pendingError, revalidatingFetchers, fetcherResults, activeDeferreds) {\n let {\n loaderData,\n errors\n } = processRouteLoaderData(matches, matchesToLoad, results, pendingError, activeDeferreds); // Process results from our revalidating fetchers\n\n for (let index = 0; index < revalidatingFetchers.length; index++) {\n let {\n key,\n match\n } = revalidatingFetchers[index];\n invariant(fetcherResults !== undefined && fetcherResults[index] !== undefined, "Did not find corresponding fetcher result");\n let result = fetcherResults[index]; // Process fetcher non-redirect errors\n\n if (isErrorResult(result)) {\n let boundaryMatch = findNearestBoundary(state.matches, match == null ? void 0 : match.route.id);\n\n if (!(errors && errors[boundaryMatch.route.id])) {\n errors = _extends({}, errors, {\n [boundaryMatch.route.id]: result.error\n });\n }\n\n state.fetchers.delete(key);\n } else if (isRedirectResult(result)) {\n // Should never get here, redirects should get processed above, but we\n // keep this to type narrow to a success result in the else\n invariant(false, "Unhandled fetcher revalidation redirect");\n } else if (isDeferredResult(result)) {\n // Should never get here, deferred data should be awaited for fetchers\n // in resolveDeferredResults\n invariant(false, "Unhandled fetcher deferred data");\n } else {\n let doneFetcher = {\n state: "idle",\n data: result.data,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n " _hasFetcherDoneAnything ": true\n };\n state.fetchers.set(key, doneFetcher);\n }\n }\n\n return {\n loaderData,\n errors\n };\n}\n\nfunction mergeLoaderData(loaderData, newLoaderData, matches, errors) {\n let mergedLoaderData = _extends({}, newLoaderData);\n\n for (let match of matches) {\n let id = match.route.id;\n\n if (newLoaderData.hasOwnProperty(id)) {\n if (newLoaderData[id] !== undefined) {\n mergedLoaderData[id] = newLoaderData[id];\n }\n } else if (loaderData[id] !== undefined && match.route.loader) {\n // Preserve existing keys not included in newLoaderData and where a loader\n // wasn\'t removed by HMR\n mergedLoaderData[id] = loaderData[id];\n }\n\n if (errors && errors.hasOwnProperty(id)) {\n // Don\'t keep any loader data below the boundary\n break;\n }\n }\n\n return mergedLoaderData;\n} // Find the nearest error boundary, looking upwards from the leaf route (or the\n// route specified by routeId) for the closest ancestor error boundary,\n// defaulting to the root match\n\n\nfunction findNearestBoundary(matches, routeId) {\n let eligibleMatches = routeId ? matches.slice(0, matches.findIndex(m => m.route.id === routeId) + 1) : [...matches];\n return eligibleMatches.reverse().find(m => m.route.hasErrorBoundary === true) || matches[0];\n}\n\nfunction getShortCircuitMatches(routes) {\n // Prefer a root layout route if present, otherwise shim in a route object\n let route = routes.find(r => r.index || !r.path || r.path === "/") || {\n id: "__shim-error-route__"\n };\n return {\n matches: [{\n params: {},\n pathname: "",\n pathnameBase: "",\n route\n }],\n route\n };\n}\n\nfunction getInternalRouterError(status, _temp4) {\n let {\n pathname,\n routeId,\n method,\n type\n } = _temp4 === void 0 ? {} : _temp4;\n let statusText = "Unknown Server Error";\n let errorMessage = "Unknown @remix-run/router error";\n\n if (status === 400) {\n statusText = "Bad Request";\n\n if (method && pathname && routeId) {\n errorMessage = "You made a " + method + " request to \\"" + pathname + "\\" but " + ("did not provide a `loader` for route \\"" + routeId + "\\", ") + "so there is no way to handle the request.";\n } else if (type === "defer-action") {\n errorMessage = "defer() is not supported in actions";\n }\n } else if (status === 403) {\n statusText = "Forbidden";\n errorMessage = "Route \\"" + routeId + "\\" does not match URL \\"" + pathname + "\\"";\n } else if (status === 404) {\n statusText = "Not Found";\n errorMessage = "No route matches URL \\"" + pathname + "\\"";\n } else if (status === 405) {\n statusText = "Method Not Allowed";\n\n if (method && pathname && routeId) {\n errorMessage = "You made a " + method.toUpperCase() + " request to \\"" + pathname + "\\" but " + ("did not provide an `action` for route \\"" + routeId + "\\", ") + "so there is no way to handle the request.";\n } else if (method) {\n errorMessage = "Invalid request method \\"" + method.toUpperCase() + "\\"";\n }\n }\n\n return new ErrorResponse(status || 500, statusText, new Error(errorMessage), true);\n} // Find any returned redirect errors, starting from the lowest match\n\n\nfunction findRedirect(results) {\n for (let i = results.length - 1; i >= 0; i--) {\n let result = results[i];\n\n if (isRedirectResult(result)) {\n return result;\n }\n }\n}\n\nfunction stripHashFromPath(path) {\n let parsedPath = typeof path === "string" ? parsePath(path) : path;\n return createPath(_extends({}, parsedPath, {\n hash: ""\n }));\n}\n\nfunction isHashChangeOnly(a, b) {\n return a.pathname === b.pathname && a.search === b.search && a.hash !== b.hash;\n}\n\nfunction isDeferredResult(result) {\n return result.type === ResultType.deferred;\n}\n\nfunction isErrorResult(result) {\n return result.type === ResultType.error;\n}\n\nfunction isRedirectResult(result) {\n return (result && result.type) === ResultType.redirect;\n}\n\nfunction isResponse(value) {\n return value != null && typeof value.status === "number" && typeof value.statusText === "string" && typeof value.headers === "object" && typeof value.body !== "undefined";\n}\n\nfunction isRedirectResponse(result) {\n if (!isResponse(result)) {\n return false;\n }\n\n let status = result.status;\n let location = result.headers.get("Location");\n return status >= 300 && status <= 399 && location != null;\n}\n\nfunction isQueryRouteResponse(obj) {\n return obj && isResponse(obj.response) && (obj.type === ResultType.data || ResultType.error);\n}\n\nfunction isValidMethod(method) {\n return validRequestMethods.has(method);\n}\n\nfunction isMutationMethod(method) {\n return validMutationMethods.has(method);\n}\n\nasync function resolveDeferredResults(currentMatches, matchesToLoad, results, signal, isFetcher, currentLoaderData) {\n for (let index = 0; index < results.length; index++) {\n let result = results[index];\n let match = matchesToLoad[index]; // If we don\'t have a match, then we can have a deferred result to do\n // anything with. This is for revalidating fetchers where the route was\n // removed during HMR\n\n if (!match) {\n continue;\n }\n\n let currentMatch = currentMatches.find(m => m.route.id === match.route.id);\n let isRevalidatingLoader = currentMatch != null && !isNewRouteInstance(currentMatch, match) && (currentLoaderData && currentLoaderData[match.route.id]) !== undefined;\n\n if (isDeferredResult(result) && (isFetcher || isRevalidatingLoader)) {\n // Note: we do not have to touch activeDeferreds here since we race them\n // against the signal in resolveDeferredData and they\'ll get aborted\n // there if needed\n await resolveDeferredData(result, signal, isFetcher).then(result => {\n if (result) {\n results[index] = result || results[index];\n }\n });\n }\n }\n}\n\nasync function resolveDeferredData(result, signal, unwrap) {\n if (unwrap === void 0) {\n unwrap = false;\n }\n\n let aborted = await result.deferredData.resolveData(signal);\n\n if (aborted) {\n return;\n }\n\n if (unwrap) {\n try {\n return {\n type: ResultType.data,\n data: result.deferredData.unwrappedData\n };\n } catch (e) {\n // Handle any TrackedPromise._error values encountered while unwrapping\n return {\n type: ResultType.error,\n error: e\n };\n }\n }\n\n return {\n type: ResultType.data,\n data: result.deferredData.data\n };\n}\n\nfunction hasNakedIndexQuery(search) {\n return new URLSearchParams(search).getAll("index").some(v => v === "");\n} // Note: This should match the format exported by useMatches, so if you change\n// this please also change that :) Eventually we\'ll DRY this up\n\n\nfunction createUseMatchesMatch(match, loaderData) {\n let {\n route,\n pathname,\n params\n } = match;\n return {\n id: route.id,\n pathname,\n params,\n data: loaderData[route.id],\n handle: route.handle\n };\n}\n\nfunction getTargetMatch(matches, location) {\n let search = typeof location === "string" ? parsePath(location).search : location.search;\n\n if (matches[matches.length - 1].route.index && hasNakedIndexQuery(search || "")) {\n // Return the leaf index route when index is present\n return matches[matches.length - 1];\n } // Otherwise grab the deepest "path contributing" match (ignoring index and\n // pathless layout routes)\n\n\n let pathMatches = getPathContributingMatches(matches);\n return pathMatches[pathMatches.length - 1];\n} //#endregion\n\n\n//# sourceMappingURL=router.js.map\n\n\n//# sourceURL=webpack://frontend/./node_modules/@remix-run/router/dist/router.js?')},"./src/App.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-router-dom */ "./node_modules/react-router-dom/dist/index.js");\n/* harmony import */ var react_router_dom__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-router-dom */ "./node_modules/react-router/dist/index.js");\n/* harmony import */ var react_loader_spinner__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-loader-spinner */ "./node_modules/react-loader-spinner/dist/esm/index.js");\n\n\n\nconst Dashboard = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.lazy)(() => Promise.all(/*! import() */[__webpack_require__.e("vendors-node_modules_css-loader_dist_runtime_api_js-node_modules_css-loader_dist_runtime_noSo-3fe857"), __webpack_require__.e("src_views_dashboard_js-node_modules_moment_locale_sync_recursive_")]).then(__webpack_require__.bind(__webpack_require__, /*! ./views/dashboard */ "./src/views/dashboard.js")));\nconst Booklist = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.lazy)(() => Promise.resolve().then(function webpackMissingModule() { var e = new Error("Cannot find module \'./views/booklist\'"); e.code = \'MODULE_NOT_FOUND\'; throw e; }));\nfunction App() {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_2__.BrowserRouter, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react__WEBPACK_IMPORTED_MODULE_0__.Suspense, {\n fallback: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {\n className: "loading-screen-overlay",\n id: "loading-overlay"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {\n className: "loading-screen"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_loader_spinner__WEBPACK_IMPORTED_MODULE_1__.ColorRing, {\n visible: true,\n height: "80",\n width: "80",\n ariaLabel: "blocks-loading",\n wrapperStyle: {},\n wrapperClass: "blocks-wrapper",\n colors: [\'#404e67\', \'#01a9ac\', \'#64c5b1\', \'#1ABB9C\']\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "Data wordt geladen...")))\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_3__.Routes, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_3__.Route, {\n exact: true,\n path: "/",\n element: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(Dashboard, null)\n }))));\n}\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (App);\n\n//# sourceURL=webpack://frontend/./src/App.js?')},"./src/index.js":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_dom_client__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom/client */ "./node_modules/react-dom/client.js");\n/* harmony import */ var _App__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./App */ "./src/App.js");\n\n\n\nconst root = react_dom_client__WEBPACK_IMPORTED_MODULE_1__.createRoot(document.getElementById(\'app\'));\nroot.render( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_App__WEBPACK_IMPORTED_MODULE_2__["default"], null)));\n\n//# sourceURL=webpack://frontend/./src/index.js?')},"./node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js":(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";eval("\n\nvar reactIs = __webpack_require__(/*! react-is */ \"./node_modules/react-is/index.js\");\n\n/**\n * Copyright 2015, Yahoo! Inc.\n * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.\n */\nvar REACT_STATICS = {\n childContextTypes: true,\n contextType: true,\n contextTypes: true,\n defaultProps: true,\n displayName: true,\n getDefaultProps: true,\n getDerivedStateFromError: true,\n getDerivedStateFromProps: true,\n mixins: true,\n propTypes: true,\n type: true\n};\nvar KNOWN_STATICS = {\n name: true,\n length: true,\n prototype: true,\n caller: true,\n callee: true,\n arguments: true,\n arity: true\n};\nvar FORWARD_REF_STATICS = {\n '$$typeof': true,\n render: true,\n defaultProps: true,\n displayName: true,\n propTypes: true\n};\nvar MEMO_STATICS = {\n '$$typeof': true,\n compare: true,\n defaultProps: true,\n displayName: true,\n propTypes: true,\n type: true\n};\nvar TYPE_STATICS = {};\nTYPE_STATICS[reactIs.ForwardRef] = FORWARD_REF_STATICS;\nTYPE_STATICS[reactIs.Memo] = MEMO_STATICS;\n\nfunction getStatics(component) {\n // React v16.11 and below\n if (reactIs.isMemo(component)) {\n return MEMO_STATICS;\n } // React v16.12 and above\n\n\n return TYPE_STATICS[component['$$typeof']] || REACT_STATICS;\n}\n\nvar defineProperty = Object.defineProperty;\nvar getOwnPropertyNames = Object.getOwnPropertyNames;\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar getPrototypeOf = Object.getPrototypeOf;\nvar objectPrototype = Object.prototype;\nfunction hoistNonReactStatics(targetComponent, sourceComponent, blacklist) {\n if (typeof sourceComponent !== 'string') {\n // don't hoist over string (html) components\n if (objectPrototype) {\n var inheritedComponent = getPrototypeOf(sourceComponent);\n\n if (inheritedComponent && inheritedComponent !== objectPrototype) {\n hoistNonReactStatics(targetComponent, inheritedComponent, blacklist);\n }\n }\n\n var keys = getOwnPropertyNames(sourceComponent);\n\n if (getOwnPropertySymbols) {\n keys = keys.concat(getOwnPropertySymbols(sourceComponent));\n }\n\n var targetStatics = getStatics(targetComponent);\n var sourceStatics = getStatics(sourceComponent);\n\n for (var i = 0; i < keys.length; ++i) {\n var key = keys[i];\n\n if (!KNOWN_STATICS[key] && !(blacklist && blacklist[key]) && !(sourceStatics && sourceStatics[key]) && !(targetStatics && targetStatics[key])) {\n var descriptor = getOwnPropertyDescriptor(sourceComponent, key);\n\n try {\n // Avoid failures from read-only properties\n defineProperty(targetComponent, key, descriptor);\n } catch (e) {}\n }\n }\n }\n\n return targetComponent;\n}\n\nmodule.exports = hoistNonReactStatics;\n\n\n//# sourceURL=webpack://frontend/./node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js?")},"./node_modules/react-dom/cjs/react-dom.development.js":(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";eval("/**\n * @license React\n * react-dom.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\nif (true) {\n (function() {\n\n 'use strict';\n\n/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\nif (\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart ===\n 'function'\n) {\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error());\n}\n var React = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\nvar Scheduler = __webpack_require__(/*! scheduler */ \"./node_modules/scheduler/index.js\");\n\nvar ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n\nvar suppressWarning = false;\nfunction setSuppressWarning(newSuppressWarning) {\n {\n suppressWarning = newSuppressWarning;\n }\n} // In DEV, calls to console.warn and console.error get replaced\n// by calls to these methods by a Babel plugin.\n//\n// In PROD (or in packages without access to React internals),\n// they are left as they are instead.\n\nfunction warn(format) {\n {\n if (!suppressWarning) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n printWarning('warn', format, args);\n }\n }\n}\nfunction error(format) {\n {\n if (!suppressWarning) {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n printWarning('error', format, args);\n }\n }\n}\n\nfunction printWarning(level, format, args) {\n // When changing this logic, you might want to also\n // update consoleWithStackDev.www.js as well.\n {\n var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n var stack = ReactDebugCurrentFrame.getStackAddendum();\n\n if (stack !== '') {\n format += '%s';\n args = args.concat([stack]);\n } // eslint-disable-next-line react-internal/safe-string-coercion\n\n\n var argsWithFormat = args.map(function (item) {\n return String(item);\n }); // Careful: RN currently depends on this prefix\n\n argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it\n // breaks IE9: https://github.com/facebook/react/issues/13610\n // eslint-disable-next-line react-internal/no-production-logging\n\n Function.prototype.apply.call(console[level], console, argsWithFormat);\n }\n}\n\nvar FunctionComponent = 0;\nvar ClassComponent = 1;\nvar IndeterminateComponent = 2; // Before we know whether it is function or class\n\nvar HostRoot = 3; // Root of a host tree. Could be nested inside another node.\n\nvar HostPortal = 4; // A subtree. Could be an entry point to a different renderer.\n\nvar HostComponent = 5;\nvar HostText = 6;\nvar Fragment = 7;\nvar Mode = 8;\nvar ContextConsumer = 9;\nvar ContextProvider = 10;\nvar ForwardRef = 11;\nvar Profiler = 12;\nvar SuspenseComponent = 13;\nvar MemoComponent = 14;\nvar SimpleMemoComponent = 15;\nvar LazyComponent = 16;\nvar IncompleteClassComponent = 17;\nvar DehydratedFragment = 18;\nvar SuspenseListComponent = 19;\nvar ScopeComponent = 21;\nvar OffscreenComponent = 22;\nvar LegacyHiddenComponent = 23;\nvar CacheComponent = 24;\nvar TracingMarkerComponent = 25;\n\n// -----------------------------------------------------------------------------\n\nvar enableClientRenderFallbackOnTextMismatch = true; // TODO: Need to review this code one more time before landing\n// the react-reconciler package.\n\nvar enableNewReconciler = false; // Support legacy Primer support on internal FB www\n\nvar enableLazyContextPropagation = false; // FB-only usage. The new API has different semantics.\n\nvar enableLegacyHidden = false; // Enables unstable_avoidThisFallback feature in Fiber\n\nvar enableSuspenseAvoidThisFallback = false; // Enables unstable_avoidThisFallback feature in Fizz\n// React DOM Chopping Block\n//\n// Similar to main Chopping Block but only flags related to React DOM. These are\n// grouped because we will likely batch all of them into a single major release.\n// -----------------------------------------------------------------------------\n// Disable support for comment nodes as React DOM containers. Already disabled\n// in open source, but www codebase still relies on it. Need to remove.\n\nvar disableCommentsAsDOMContainers = true; // Disable javascript: URL strings in href for XSS protection.\n// and client rendering, mostly to allow JSX attributes to apply to the custom\n// element's object properties instead of only HTML attributes.\n// https://github.com/facebook/react/issues/11347\n\nvar enableCustomElementPropertySupport = false; // Disables children for ";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n\n\t// Support: IE <=9 only\n\t// IE <=9 replaces ";\n\tsupport.option = !!div.lastChild;\n} )();\n\n\n// We have to close these tags to support XHTML (trac-13200)\nvar wrapMap = {\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting or other required elements.\n\tthead: [ 1, "", "
" ],\n\tcol: [ 2, "", "
" ],\n\ttr: [ 2, "", "
" ],\n\ttd: [ 3, "", "
" ],\n\n\t_default: [ 0, "", "" ]\n};\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// Support: IE <=9 only\nif ( !support.option ) {\n\twrapMap.optgroup = wrapMap.option = [ 1, "" ];\n}\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (trac-15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== "undefined" ) {\n\t\tret = context.getElementsByTagName( tag || "*" );\n\n\t} else if ( typeof context.querySelectorAll !== "undefined" ) {\n\t\tret = context.querySelectorAll( tag || "*" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t"globalEval",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], "globalEval" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, attached, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( toType( elem ) === "object" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( "div" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (trac-12392)\n\t\t\t\ttmp.textContent = "";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = "";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tattached = isAttached( elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), "script" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( attached ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || "" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\nvar rtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE <=9 - 11+\n// focus() and blur() are asynchronous, except when they are no-op.\n// So expect focus to be synchronous when the element is already active,\n// and blur to be synchronous when the element is not already active.\n// (focus and blur are always synchronous in other supported browsers,\n// this just defines when we can count on it).\nfunction expectSync( elem, type ) {\n\treturn ( elem === safeActiveElement() ) === ( type === "focus" );\n}\n\n// Support: IE <=9 only\n// Accessing document.activeElement can throw unexpectedly\n// https://bugs.jquery.com/ticket/13393\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === "object" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== "string" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === "string" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards\' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Only attach events to objects that accept data\n\t\tif ( !acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element\'s event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = Object.create( null );\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || "" ).match( rnothtmlwhite ) || [ "" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( "." )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we\'re the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element\'s handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || "" ).match( rnothtmlwhite ) || [ "" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( "(^|\\\\.)" + namespaces.join( "\\\\.(?:.*\\\\.|)" ) + "(\\\\.|$)" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === "**" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it\'s no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, "handle events" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\n\t\t\t// Make a writable jQuery.Event from the native event object\n\t\t\tevent = jQuery.event.fix( nativeEvent ),\n\n\t\t\thandlers = (\n\t\t\t\tdataPriv.get( this, "events" ) || Object.create( null )\n\t\t\t)[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// If the event is namespaced, then each handler is only invoked if it is\n\t\t\t\t// specially universal or its namespaces are a superset of the event\'s.\n\t\t\t\tif ( !event.rnamespace || handleObj.namespace === false ||\n\t\t\t\t\tevent.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === "click" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don\'t check non-elements (trac-13208)\n\t\t\t\t// Don\'t process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don\'t conflict with Object.prototype properties (trac-13203)\n\t\t\t\t\t\tsel = handleObj.selector + " ";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tclick: {\n\n\t\t\t// Utilize native event to ensure correct state for checkable inputs\n\t\t\tsetup: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Claim the first handler\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, "input" ) ) {\n\n\t\t\t\t\t// dataPriv.set( el, "click", ... )\n\t\t\t\t\tleverageNative( el, "click", returnTrue );\n\t\t\t\t}\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\ttrigger: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Force setup before triggering a click\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, "input" ) ) {\n\n\t\t\t\t\tleverageNative( el, "click" );\n\t\t\t\t}\n\n\t\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, suppress native .click() on links\n\t\t\t// Also prevent it if we\'re currently inside a leveraged native-event stack\n\t\t\t_default: function( event ) {\n\t\t\t\tvar target = event.target;\n\t\t\t\treturn rcheckableType.test( target.type ) &&\n\t\t\t\t\ttarget.click && nodeName( target, "input" ) &&\n\t\t\t\t\tdataPriv.get( target, "click" ) ||\n\t\t\t\t\tnodeName( target, "a" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn\'t alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Ensure the presence of an event listener that handles manually-triggered\n// synthetic events by interrupting progress until reinvoked in response to\n// *native* events that it fires directly, ensuring that state changes have\n// already occurred before other listeners are invoked.\nfunction leverageNative( el, type, expectSync ) {\n\n\t// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add\n\tif ( !expectSync ) {\n\t\tif ( dataPriv.get( el, type ) === undefined ) {\n\t\t\tjQuery.event.add( el, type, returnTrue );\n\t\t}\n\t\treturn;\n\t}\n\n\t// Register the controller as a special universal handler for all event namespaces\n\tdataPriv.set( el, type, false );\n\tjQuery.event.add( el, type, {\n\t\tnamespace: false,\n\t\thandler: function( event ) {\n\t\t\tvar notAsync, result,\n\t\t\t\tsaved = dataPriv.get( this, type );\n\n\t\t\tif ( ( event.isTrigger & 1 ) && this[ type ] ) {\n\n\t\t\t\t// Interrupt processing of the outer synthetic .trigger()ed event\n\t\t\t\t// Saved data should be false in such cases, but might be a leftover capture object\n\t\t\t\t// from an async native handler (gh-4350)\n\t\t\t\tif ( !saved.length ) {\n\n\t\t\t\t\t// Store arguments for use when handling the inner native event\n\t\t\t\t\t// There will always be at least one argument (an event object), so this array\n\t\t\t\t\t// will not be confused with a leftover capture object.\n\t\t\t\t\tsaved = slice.call( arguments );\n\t\t\t\t\tdataPriv.set( this, type, saved );\n\n\t\t\t\t\t// Trigger the native event and capture its result\n\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t// focus() and blur() are asynchronous\n\t\t\t\t\tnotAsync = expectSync( this, type );\n\t\t\t\t\tthis[ type ]();\n\t\t\t\t\tresult = dataPriv.get( this, type );\n\t\t\t\t\tif ( saved !== result || notAsync ) {\n\t\t\t\t\t\tdataPriv.set( this, type, false );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult = {};\n\t\t\t\t\t}\n\t\t\t\t\tif ( saved !== result ) {\n\n\t\t\t\t\t\t// Cancel the outer synthetic event\n\t\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t\t// Support: Chrome 86+\n\t\t\t\t\t\t// In Chrome, if an element having a focusout handler is blurred by\n\t\t\t\t\t\t// clicking outside of it, it invokes the handler synchronously. If\n\t\t\t\t\t\t// that handler calls `.remove()` on the element, the data is cleared,\n\t\t\t\t\t\t// leaving `result` undefined. We need to guard against this.\n\t\t\t\t\t\treturn result && result.value;\n\t\t\t\t\t}\n\n\t\t\t\t// If this is an inner synthetic event for an event with a bubbling surrogate\n\t\t\t\t// (focus or blur), assume that the surrogate already propagated from triggering the\n\t\t\t\t// native event and prevent that from happening again here.\n\t\t\t\t// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the\n\t\t\t\t// bubbling surrogate propagates *after* the non-bubbling base), but that seems\n\t\t\t\t// less bad than duplication.\n\t\t\t\t} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t}\n\n\t\t\t// If this is a native event triggered above, everything is now in order\n\t\t\t// Fire an inner synthetic event with the original arguments\n\t\t\t} else if ( saved.length ) {\n\n\t\t\t\t// ...and capture the result\n\t\t\t\tdataPriv.set( this, type, {\n\t\t\t\t\tvalue: jQuery.event.trigger(\n\n\t\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t\t// Extend with the prototype to reset the above stopImmediatePropagation()\n\t\t\t\t\t\tjQuery.extend( saved[ 0 ], jQuery.Event.prototype ),\n\t\t\t\t\t\tsaved.slice( 1 ),\n\t\t\t\t\t\tthis\n\t\t\t\t\t)\n\t\t\t\t} );\n\n\t\t\t\t// Abort handling of the native event\n\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t}\n\t\t}\n\t} );\n}\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This "if" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the \'new\' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (trac-504, trac-13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn\'t have one\n\tthis.timeStamp = src && src.timeStamp || Date.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t"char": true,\n\tcode: true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\twhich: true\n}, jQuery.event.addProp );\n\njQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {\n\tjQuery.event.special[ type ] = {\n\n\t\t// Utilize native event if possible so blur/focus sequence is correct\n\t\tsetup: function() {\n\n\t\t\t// Claim the first handler\n\t\t\t// dataPriv.set( this, "focus", ... )\n\t\t\t// dataPriv.set( this, "blur", ... )\n\t\t\tleverageNative( this, type, expectSync );\n\n\t\t\t// Return false to allow normal processing in the caller\n\t\t\treturn false;\n\t\t},\n\t\ttrigger: function() {\n\n\t\t\t// Force setup before trigger\n\t\t\tleverageNative( this, type );\n\n\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\treturn true;\n\t\t},\n\n\t\t// Suppress native focus or blur if we\'re currently inside\n\t\t// a leveraged native-event stack\n\t\t_default: function( event ) {\n\t\t\treturn dataPriv.get( event.target, type );\n\t\t},\n\n\t\tdelegateType: delegateType\n\t};\n} );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: "mouseover",\n\tmouseleave: "mouseout",\n\tpointerenter: "pointerover",\n\tpointerleave: "pointerout"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event ) dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + "." + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === "object" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === "function" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t// Support: IE <=10 - 11, Edge 12 - 13 only\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, "table" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {\n\n\t\treturn jQuery( elem ).children( "tbody" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tif ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) {\n\t\telem.type = elem.type.slice( 5 );\n\t} else {\n\t\telem.removeAttribute( "type" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.get( src );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdataPriv.remove( dest, "handle events" );\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === "input" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === "input" || nodeName === "textarea" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = flat( args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tvalueIsFunction = isFunction( value );\n\n\t// We can\'t cloneNode fragments that contain checked, in WebKit\n\tif ( valueIsFunction ||\n\t\t\t( l > 1 && typeof value === "string" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, "script" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (trac-8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, "script" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || "" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, "globalEval" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won\'t run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl && !node.noModule ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src, {\n\t\t\t\t\t\t\t\t\tnonce: node.nonce || node.getAttribute( "nonce" )\n\t\t\t\t\t\t\t\t}, doc );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Unwrap a CDATA section containing script contents. This shouldn\'t be\n\t\t\t\t\t\t\t// needed as in XML documents they\'re already not visible when\n\t\t\t\t\t\t\t// inspecting element contents and in HTML documents they have no\n\t\t\t\t\t\t\t// meaning but we\'re preserving that logic for backwards compatibility.\n\t\t\t\t\t\t\t// This will be removed completely in 4.0. See gh-4904.\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && isAttached( node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, "script" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html;\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = isAttached( elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, "script" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, "script" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove\'s overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = "";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === "string" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: "append",\n\tprependTo: "prepend",\n\tinsertBefore: "before",\n\tinsertAfter: "after",\n\treplaceAll: "replaceWith"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );\n\nvar rcustomProp = /^--/;\n\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\nvar swap = function( elem, options, callback ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.call( elem );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\nvar rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );\n\nvar whitespace = "[\\\\x20\\\\t\\\\r\\\\n\\\\f]";\n\n\nvar rtrimCSS = new RegExp(\n\t"^" + whitespace + "+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)" + whitespace + "+$",\n\t"g"\n);\n\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they\'re executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.cssText = "position:absolute;left:-11111px;width:60px;" +\n\t\t\t"margin-top:1px;padding:0;border:0";\n\t\tdiv.style.cssText =\n\t\t\t"position:relative;display:block;box-sizing:border-box;overflow:scroll;" +\n\t\t\t"margin:auto;border:1px;padding:1px;" +\n\t\t\t"width:60%;top:1%";\n\t\tdocumentElement.appendChild( container ).appendChild( div );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== "1%";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;\n\n\t\t// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n\t\t// Some styles come back with percentage values, even though they shouldn\'t\n\t\tdiv.style.right = "60%";\n\t\tpixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;\n\n\t\t// Support: IE 9 - 11 only\n\t\t// Detect misreporting of content dimensions for box-sizing:border-box elements\n\t\tboxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;\n\n\t\t// Support: IE 9 only\n\t\t// Detect overflow:scroll screwiness (gh-3699)\n\t\t// Support: Chrome <=64\n\t\t// Don\'t get tricked when zoom affects offsetWidth (gh-4029)\n\t\tdiv.style.position = "absolute";\n\t\tscrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn\'t be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tfunction roundPixelMeasures( measure ) {\n\t\treturn Math.round( parseFloat( measure ) );\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,\n\t\treliableTrDimensionsVal, reliableMarginLeftVal,\n\t\tcontainer = document.createElement( "div" ),\n\t\tdiv = document.createElement( "div" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (trac-8908)\n\tdiv.style.backgroundClip = "content-box";\n\tdiv.cloneNode( true ).style.backgroundClip = "";\n\tsupport.clearCloneStyle = div.style.backgroundClip === "content-box";\n\n\tjQuery.extend( support, {\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelBoxStyles: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelBoxStylesVal;\n\t\t},\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t},\n\t\tscrollboxSize: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn scrollboxSizeVal;\n\t\t},\n\n\t\t// Support: IE 9 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Behavior in IE 9 is more subtle than in newer versions & it passes\n\t\t// some versions of this test; make sure not to make it pass there!\n\t\t//\n\t\t// Support: Firefox 70+\n\t\t// Only Firefox includes border widths\n\t\t// in computed dimensions. (gh-4529)\n\t\treliableTrDimensions: function() {\n\t\t\tvar table, tr, trChild, trStyle;\n\t\t\tif ( reliableTrDimensionsVal == null ) {\n\t\t\t\ttable = document.createElement( "table" );\n\t\t\t\ttr = document.createElement( "tr" );\n\t\t\t\ttrChild = document.createElement( "div" );\n\n\t\t\t\ttable.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";\n\t\t\t\ttr.style.cssText = "border:1px solid";\n\n\t\t\t\t// Support: Chrome 86+\n\t\t\t\t// Height set through cssText does not get applied.\n\t\t\t\t// Computed height then comes back as 0.\n\t\t\t\ttr.style.height = "1px";\n\t\t\t\ttrChild.style.height = "9px";\n\n\t\t\t\t// Support: Android 8 Chrome 86+\n\t\t\t\t// In our bodyBackground.html iframe,\n\t\t\t\t// display for all div elements is set to "inline",\n\t\t\t\t// which causes a problem only in Android 8 Chrome 86.\n\t\t\t\t// Ensuring the div is display: block\n\t\t\t\t// gets around this issue.\n\t\t\t\ttrChild.style.display = "block";\n\n\t\t\t\tdocumentElement\n\t\t\t\t\t.appendChild( table )\n\t\t\t\t\t.appendChild( tr )\n\t\t\t\t\t.appendChild( trChild );\n\n\t\t\t\ttrStyle = window.getComputedStyle( tr );\n\t\t\t\treliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderTopWidth, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;\n\n\t\t\t\tdocumentElement.removeChild( table );\n\t\t\t}\n\t\t\treturn reliableTrDimensionsVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\t\tisCustomProp = rcustomProp.test( name ),\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t// .css(\'filter\') (IE 9 only, trac-12537)\n\t// .css(\'--customProperty) (gh-3144)\n\tif ( computed ) {\n\n\t\t// Support: IE <=9 - 11+\n\t\t// IE only supports `"float"` in `getPropertyValue`; in computed styles\n\t\t// it\'s only available as `"cssFloat"`. We no longer modify properties\n\t\t// sent to `.css()` apart from camelCasing, so we need to check both.\n\t\t// Normally, this would create difference in behavior: if\n\t\t// `getPropertyValue` returns an empty string, the value returned\n\t\t// by `.css()` would be `undefined`. This is usually the case for\n\t\t// disconnected elements. However, in IE even disconnected elements\n\t\t// with no styles return `"none"` for `getPropertyValue( "float" )`\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( isCustomProp && ret ) {\n\n\t\t\t// Support: Firefox 105+, Chrome <=105+\n\t\t\t// Spec requires trimming whitespace for custom properties (gh-4926).\n\t\t\t// Firefox only trims leading whitespace. Chrome just collapses\n\t\t\t// both leading & trailing whitespace to a single space.\n\t\t\t//\n\t\t\t// Fall back to `undefined` if empty string returned.\n\t\t\t// This collapses a missing definition with property defined\n\t\t\t// and set to an empty string but there\'s no standard API\n\t\t\t// allowing us to differentiate them without a performance penalty\n\t\t\t// and returning `undefined` aligns with older jQuery.\n\t\t\t//\n\t\t\t// rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED\n\t\t\t// as whitespace while CSS does not, but this is not a problem\n\t\t\t// because CSS preprocessing replaces them with U+000A LINE FEED\n\t\t\t// (which *is* CSS whitespace)\n\t\t\t// https://www.w3.org/TR/css-syntax-3/#input-preprocessing\n\t\t\tret = ret.replace( rtrimCSS, "$1" ) || undefined;\n\t\t}\n\n\t\tif ( ret === "" && !isAttached( elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the "awesome hack by Dean Edwards"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + "" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we\'ll check on the first run if it\'s really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it\'s not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar cssPrefixes = [ "Webkit", "Moz", "ms" ],\n\temptyStyle = document.createElement( "div" ).style,\n\tvendorProps = {};\n\n// Return a vendor-prefixed property or undefined\nfunction vendorPropName( name ) {\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a potentially-mapped jQuery.cssProps or vendor prefixed property\nfunction finalPropName( name ) {\n\tvar final = jQuery.cssProps[ name ] || vendorProps[ name ];\n\n\tif ( final ) {\n\t\treturn final;\n\t}\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\treturn vendorProps[ name ] = vendorPropName( name ) || name;\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except "table", "table-cell", or "table-caption"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\tcssShow = { position: "absolute", visibility: "hidden", display: "block" },\n\tcssNormalTransform = {\n\t\tletterSpacing: "0",\n\t\tfontWeight: "400"\n\t};\n\nfunction setPositiveNumber( _elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined "subtract", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :\n\t\tvalue;\n}\n\nfunction boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {\n\tvar i = dimension === "width" ? 1 : 0,\n\t\textra = 0,\n\t\tdelta = 0;\n\n\t// Adjustment may not be necessary\n\tif ( box === ( isBorderBox ? "border" : "content" ) ) {\n\t\treturn 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin\n\t\tif ( box === "margin" ) {\n\t\t\tdelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\t// If we get here with a content-box, we\'re seeking "padding" or "border" or "margin"\n\t\tif ( !isBorderBox ) {\n\n\t\t\t// Add padding\n\t\t\tdelta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );\n\n\t\t\t// For "border" or "margin", add border\n\t\t\tif ( box !== "padding" ) {\n\t\t\t\tdelta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );\n\n\t\t\t// But still keep track of it otherwise\n\t\t\t} else {\n\t\t\t\textra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );\n\t\t\t}\n\n\t\t// If we get here with a border-box (content + padding + border), we\'re seeking "content" or\n\t\t// "padding" or "margin"\n\t\t} else {\n\n\t\t\t// For "content", subtract padding\n\t\t\tif ( box === "content" ) {\n\t\t\t\tdelta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// For "content" or "padding", subtract border\n\t\t\tif ( box !== "margin" ) {\n\t\t\t\tdelta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for positive content-box scroll gutter when requested by providing computedVal\n\tif ( !isBorderBox && computedVal >= 0 ) {\n\n\t\t// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n\t\t// Assuming integer scroll gutter, subtract the rest and round down\n\t\tdelta += Math.max( 0, Math.ceil(\n\t\t\telem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\tcomputedVal -\n\t\t\tdelta -\n\t\t\textra -\n\t\t\t0.5\n\n\t\t// If offsetWidth/offsetHeight is unknown, then we can\'t determine content-box scroll gutter\n\t\t// Use an explicit zero to avoid NaN (gh-3964)\n\t\t) ) || 0;\n\t}\n\n\treturn delta;\n}\n\nfunction getWidthOrHeight( elem, dimension, extra ) {\n\n\t// Start with computed style\n\tvar styles = getStyles( elem ),\n\n\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).\n\t\t// Fake content-box until we know it\'s needed to know the true value.\n\t\tboxSizingNeeded = !support.boxSizingReliable() || extra,\n\t\tisBorderBox = boxSizingNeeded &&\n\t\t\tjQuery.css( elem, "boxSizing", false, styles ) === "border-box",\n\t\tvalueIsBorderBox = isBorderBox,\n\n\t\tval = curCSS( elem, dimension, styles ),\n\t\toffsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );\n\n\t// Support: Firefox <=54\n\t// Return a confounding non-pixel value or feign ignorance, as appropriate.\n\tif ( rnumnonpx.test( val ) ) {\n\t\tif ( !extra ) {\n\t\t\treturn val;\n\t\t}\n\t\tval = "auto";\n\t}\n\n\n\t// Support: IE 9 - 11 only\n\t// Use offsetWidth/offsetHeight for when box sizing is unreliable.\n\t// In those cases, the computed value can be trusted to be border-box.\n\tif ( ( !support.boxSizingReliable() && isBorderBox ||\n\n\t\t// Support: IE 10 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Interestingly, in some cases IE 9 doesn\'t suffer from this issue.\n\t\t!support.reliableTrDimensions() && nodeName( elem, "tr" ) ||\n\n\t\t// Fall back to offsetWidth/offsetHeight when value is "auto"\n\t\t// This happens for inline elements with no explicit setting (gh-3571)\n\t\tval === "auto" ||\n\n\t\t// Support: Android <=4.1 - 4.3 only\n\t\t// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n\t\t!parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) &&\n\n\t\t// Make sure the element is visible & connected\n\t\telem.getClientRects().length ) {\n\n\t\tisBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";\n\n\t\t// Where available, offsetWidth/offsetHeight approximate border box dimensions.\n\t\t// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the\n\t\t// retrieved value as a content box dimension.\n\t\tvalueIsBorderBox = offsetProp in elem;\n\t\tif ( valueIsBorderBox ) {\n\t\t\tval = elem[ offsetProp ];\n\t\t}\n\t}\n\n\t// Normalize "" and auto\n\tval = parseFloat( val ) || 0;\n\n\t// Adjust for the element\'s box model\n\treturn ( val +\n\t\tboxModelAdjustment(\n\t\t\telem,\n\t\t\tdimension,\n\t\t\textra || ( isBorderBox ? "border" : "content" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles,\n\n\t\t\t// Provide the current computed size to request scroll gutter calculation (gh-3589)\n\t\t\tval\n\t\t)\n\t) + "px";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, "opacity" );\n\t\t\t\t\treturn ret === "" ? "1" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don\'t automatically add "px" to these possibly-unitless properties\n\tcssNumber: {\n\t\t"animationIterationCount": true,\n\t\t"columnCount": true,\n\t\t"fillOpacity": true,\n\t\t"flexGrow": true,\n\t\t"flexShrink": true,\n\t\t"fontWeight": true,\n\t\t"gridArea": true,\n\t\t"gridColumn": true,\n\t\t"gridColumnEnd": true,\n\t\t"gridColumnStart": true,\n\t\t"gridRow": true,\n\t\t"gridRowEnd": true,\n\t\t"gridRowStart": true,\n\t\t"lineHeight": true,\n\t\t"opacity": true,\n\t\t"order": true,\n\t\t"orphans": true,\n\t\t"widows": true,\n\t\t"zIndex": true,\n\t\t"zoom": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don\'t set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we\'re working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we\'re working with the right name. We don\'t\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we\'re setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert "+=" or "-=" to relative numbers (trac-7345)\n\t\t\tif ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug trac-9237\n\t\t\t\ttype = "number";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren\'t set (trac-7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\t// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append\n\t\t\t// "px" to a few hardcoded values.\n\t\t\tif ( type === "number" && !isCustomProp ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone\'s values\n\t\t\tif ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {\n\t\t\t\tstyle[ name ] = "inherit";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( "set" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && "get" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we\'re working with the right name. We don\'t\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && "get" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert "normal" to computed value\n\t\tif ( val === "normal" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === "" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ "height", "width" ], function( _i, dimension ) {\n\tjQuery.cssHooks[ dimension ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, "display" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t} ) :\n\t\t\t\t\tgetWidthOrHeight( elem, dimension, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = getStyles( elem ),\n\n\t\t\t\t// Only read styles.position if the test has a chance to fail\n\t\t\t\t// to avoid forcing a reflow.\n\t\t\t\tscrollboxSizeBuggy = !support.scrollboxSize() &&\n\t\t\t\t\tstyles.position === "absolute",\n\n\t\t\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)\n\t\t\t\tboxSizingNeeded = scrollboxSizeBuggy || extra,\n\t\t\t\tisBorderBox = boxSizingNeeded &&\n\t\t\t\t\tjQuery.css( elem, "boxSizing", false, styles ) === "border-box",\n\t\t\t\tsubtract = extra ?\n\t\t\t\t\tboxModelAdjustment(\n\t\t\t\t\t\telem,\n\t\t\t\t\t\tdimension,\n\t\t\t\t\t\textra,\n\t\t\t\t\t\tisBorderBox,\n\t\t\t\t\t\tstyles\n\t\t\t\t\t) :\n\t\t\t\t\t0;\n\n\t\t\t// Account for unreliable border-box dimensions by comparing offset* to computed and\n\t\t\t// faking a content-box to get border and padding (gh-3699)\n\t\t\tif ( isBorderBox && scrollboxSizeBuggy ) {\n\t\t\t\tsubtract -= Math.ceil(\n\t\t\t\t\telem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\t\t\tparseFloat( styles[ dimension ] ) -\n\t\t\t\t\tboxModelAdjustment( elem, dimension, "border", false, styles ) -\n\t\t\t\t\t0.5\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || "px" ) !== "px" ) {\n\n\t\t\t\telem.style[ dimension ] = value;\n\t\t\t\tvalue = jQuery.css( elem, dimension );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, "marginLeft" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t) + "px";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: "",\n\tpadding: "",\n\tborder: "Width"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === "string" ? value.split( " " ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( prefix !== "margin" ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as "10px" are parsed to Float;\n\t\t\t// complex values such as "rotate(1rad)" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, "" );\n\n\t\t\t// Empty strings, null, undefined and "auto" are converted to 0.\n\t\t\treturn !result || result === "auto" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 && (\n\t\t\t\tjQuery.cssHooks[ tween.prop ] ||\n\t\t\t\t\ttween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: "swing"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = Date.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ "margin" + which ] = attrs[ "padding" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We\'re done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = "width" in props || "height" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, "fxshow" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, "fx" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, "fx" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === "toggle";\n\t\t\tif ( value === ( hidden ? "hide" : "show" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a "show" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict "overflow" and "display" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 15\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY and Edge just mirrors\n\t\t// the overflowX value there.\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, "display" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, "display" );\n\t\tif ( display === "none" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, "display" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, "float" ) === "none" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === "none" ? "" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = "inline-block";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = "hidden";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( "hidden" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` "reverses"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a "hide" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, "fxshow" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && "expand" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won\'t overwrite existing keys.\n\t\t\t// Reusing \'index\' because we have the correct "name"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don\'t match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won\'t allow us to use `1 - ( 0.5 || 0 )` (trac-12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\t// If there\'s more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tresult.stop.bind( result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t"*": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ "*" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tisFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== "number" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> "fx"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = "fx";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won\'t be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, "finish" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\n\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== "string" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue ) {\n\t\t\tthis.queue( type || "fx", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + "queueHooks",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn\'t forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || "fx";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + "queue" ],\n\t\t\t\thooks = data[ type + "queueHooks" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === "boolean" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( "show" ),\n\tslideUp: genFx( "hide" ),\n\tslideToggle: genFx( "toggle" ),\n\tfadeIn: { opacity: "show" },\n\tfadeOut: { opacity: "hide" },\n\tfadeToggle: { opacity: "toggle" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = Date.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || "fx";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( "input" ),\n\t\tselect = document.createElement( "select" ),\n\t\topt = select.appendChild( document.createElement( "option" ) );\n\n\tinput.type = "checkbox";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be "on"\n\tsupport.checkOn = input.value !== "";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( "input" );\n\tinput.value = "t";\n\tinput.type = "radio";\n\tsupport.radioValue = input.value === "t";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don\'t get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === "undefined" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && "set" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + "" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === "radio" &&\n\t\t\t\t\tnodeName( elem, "input" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( "type", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( _i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don\'t get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && "set" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn\'t always return the\n\t\t\t\t// correct value when it hasn\'t been explicitly set\n\t\t\t\t// Use proper attribute retrieval (trac-12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, "tabindex" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t"for": "htmlFor",\n\t\t"class": "className"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule "no-unused-expressions" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: "off" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: "off" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t"tabIndex",\n\t"readOnly",\n\t"maxLength",\n\t"cellSpacing",\n\t"cellPadding",\n\t"rowSpan",\n\t"colSpan",\n\t"useMap",\n\t"frameBorder",\n\t"contentEditable"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( " " );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( "class" ) || "";\n}\n\nfunction classesToArray( value ) {\n\tif ( Array.isArray( value ) ) {\n\t\treturn value;\n\t}\n\tif ( typeof value === "string" ) {\n\t\treturn value.match( rnothtmlwhite ) || [];\n\t}\n\treturn [];\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classNames, cur, curValue, className, i, finalValue;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\tif ( classNames.length ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tcurValue = getClass( this );\n\t\t\t\tcur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\t\tclassName = classNames[ i ];\n\t\t\t\t\t\tif ( cur.indexOf( " " + className + " " ) < 0 ) {\n\t\t\t\t\t\t\tcur += className + " ";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\tthis.setAttribute( "class", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classNames, cur, curValue, className, i, finalValue;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( "class", "" );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\tif ( classNames.length ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tcurValue = getClass( this );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\t\tclassName = classNames[ i ];\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( " " + className + " " ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( " " + className + " ", " " );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\tthis.setAttribute( "class", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar classNames, className, i, self,\n\t\t\ttype = typeof value,\n\t\t\tisValidValue = type === "string" || Array.isArray( value );\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\tif ( typeof stateVal === "boolean" && isValidValue ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\treturn this.each( function() {\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\tself = jQuery( this );\n\n\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\tclassName = classNames[ i ];\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === "boolean" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, "__className__", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we\'re passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( "class",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\t"" :\n\t\t\t\t\t\t\tdataPriv.get( this, "__className__" ) || ""\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = " " + selector + " ";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, valueIsFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t"get" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, "value" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === "string" ) {\n\t\t\t\t\treturn ret.replace( rreturn, "" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? "" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueIsFunction = isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as ""; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = "";\n\n\t\t\t} else if ( typeof val === "number" ) {\n\t\t\t\tval += "";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? "" : value + "";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, "value" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (trac-14686, trac-14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === "select-one",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn\'t update selected after form reset (trac-2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don\'t return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, "optgroup" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don\'t need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ "radio", "checkbox" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( "value" ) === null ? "on" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\nsupport.focusin = "onfocusin" in window;\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\tstopPropagationCallback = function( e ) {\n\t\te.stopPropagation();\n\t};\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special, lastElement,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, "type" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];\n\n\t\tcur = lastElement = tmp = elem = elem || document;\n\n\t\t// Don\'t do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we\'re not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( "." ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( "." );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( ":" ) < 0 && "on" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === "object" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( "." );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( "(^|\\\\.)" + namespaces.join( "\\\\.(?:.*\\\\.|)" ) + "(\\\\.|$)" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (trac-9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tlastElement = cur;\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, "handle" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don\'t do default actions on window, that\'s where global variables be (trac-6170)\n\t\t\t\tif ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {\n\n\t\t\t\t\t// Don\'t re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.addEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\telem[ type ]();\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.removeEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\n// Support: Firefox <=44\n// Firefox doesn\'t have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\nif ( !support.focusin ) {\n\tjQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\n\t\t\t\t// Handle: regular nodes (via `this.ownerDocument`), window\n\t\t\t\t// (via `this.document`) & document (via `this`).\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdataPriv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\nvar location = window.location;\n\nvar nonce = { guid: Date.now() };\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml, parserErrorElem;\n\tif ( !data || typeof data !== "string" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );\n\t} catch ( e ) {}\n\n\tparserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];\n\tif ( !xml || parserErrorElem ) {\n\t\tjQuery.error( "Invalid XML: " + (\n\t\t\tparserErrorElem ?\n\t\t\t\tjQuery.map( parserErrorElem.childNodes, function( el ) {\n\t\t\t\t\treturn el.textContent;\n\t\t\t\t} ).join( "\\n" ) :\n\t\t\t\tdata\n\t\t) );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && toType( obj ) === "object" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + "=" +\n\t\t\t\tencodeURIComponent( value == null ? "" : value );\n\t\t};\n\n\tif ( a == null ) {\n\t\treturn "";\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the "old" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( "&" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for "elements" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, "elements" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} ).filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( ":disabled" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( ":disabled" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} ).map( function( _i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, "\\r\\n" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, "\\r\\n" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// trac-7653, trac-8125, trac-8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t * - BEFORE asking for a transport\n\t * - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol "*" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to "*" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol "*" can be used\n\t * 3) selection will start with transport dataType and THEN go to "*" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression\n\tallTypes = "*/".concat( "*" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( "a" );\n\noriginAnchor.href = location.href;\n\n// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to "*"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== "string" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = "*";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === "+" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || "*";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === "string" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );\n}\n\n// A special extend for ajax options\n// that takes "flat" options (not to be deep extended)\n// Fixes trac-9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === "*" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );\n\t\t}\n\t}\n\n\t// Check if we\'re dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There\'s only work to do if current dataType is non-auto\n\t\t\tif ( current === "*" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== "*" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + " " + current ] || converters[ "* " + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( " " );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + " " + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ "* " + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: "parsererror",\n\t\t\t\t\t\t\t\terror: conv ? e : "No conversion from " + prev + " to " + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: "success", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: "GET",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: "application/x-www-form-urlencoded; charset=UTF-8",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t"*": allTypes,\n\t\t\ttext: "text/plain",\n\t\t\thtml: "text/html",\n\t\t\txml: "application/xml, text/xml",\n\t\t\tjson: "application/json, text/javascript"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: "responseXML",\n\t\t\ttext: "responseText",\n\t\t\tjson: "responseJSON"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall "*") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t"* text": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t"text html": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t"text json": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t"text xml": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn\'t be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn\'t be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === "object" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( "once memory" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = "canceled",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() + " " ] =\n\t\t\t\t\t\t\t\t\t( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] )\n\t\t\t\t\t\t\t\t\t\t.concat( match[ 2 ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() + " " ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match.join( ", " );\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (trac-10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + "" )\n\t\t\t.replace( rprotocol, location.protocol + "//" );\n\n\t\t// Alias method option to type as per ticket trac-12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];\n\n\t\t// A cross-domain request is in order when the origin doesn\'t match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( "a" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 15\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor\'s host property isn\'t correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + "//" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== "string" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don\'t fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( "ajaxStart" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we\'re toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, "" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available and should be processed, append data to url\n\t\t\tif ( s.data && ( s.processData || typeof s.data === "string" ) ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;\n\n\t\t\t\t// trac-9682: remove data so that it\'s not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, "$1" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) +\n\t\t\t\t\tuncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change \'%20\' to \'+\' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, "+" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( "Content-Type", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t"Accept",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :\n\t\t\t\ts.accepts[ "*" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = "abort";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, "No Transport" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( "timeout" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || "";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Use a noop converter for missing script but not if jsonp\n\t\t\tif ( !isSuccess &&\n\t\t\t\tjQuery.inArray( "script", s.dataTypes ) > -1 &&\n\t\t\t\tjQuery.inArray( "json", s.dataTypes ) < 0 ) {\n\t\t\t\ts.converters[ "text script" ] = function() {};\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( "Last-Modified" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( "etag" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === "HEAD" ) {\n\t\t\t\t\tstatusText = "nocontent";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = "notmodified";\n\n\t\t\t\t// If we have data, let\'s convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = "error";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + "";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( "ajaxStop" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, "json" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, "script" );\n\t}\n} );\n\njQuery.each( [ "get", "post" ], function( _i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\njQuery.ajaxPrefilter( function( s ) {\n\tvar i;\n\tfor ( i in s.headers ) {\n\t\tif ( i.toLowerCase() === "content-type" ) {\n\t\t\ts.contentType = s.headers[ i ] || "";\n\t\t}\n\t}\n} );\n\n\njQuery._evalUrl = function( url, options, doc ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (trac-11264)\n\t\ttype: "GET",\n\t\tdataType: "script",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\n\t\t// Only evaluate the response if it is successful (gh-4126)\n\t\t// dataFilter is not invoked for failure responses, so using it instead\n\t\t// of the default converter is kludgy but it works.\n\t\tconverters: {\n\t\t\t"text script": function() {}\n\t\t},\n\t\tdataFilter: function( response ) {\n\t\t\tjQuery.globalEval( response, options, doc );\n\t\t}\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar htmlIsFunction = isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( "body" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// trac-1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won\'t change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {\n\t\t\t\t\theaders[ "X-Requested-With" ] = "XMLHttpRequest";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.ontimeout =\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === "abort" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === "error" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== "number" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, "error" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see trac-8605, trac-14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || "text" ) !== "text" ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== "string" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = xhr.ontimeout = callback( "error" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( "abort" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// trac-14683: Only rethrow if this hasn\'t been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: "text/javascript, application/javascript, " +\n\t\t\t"application/ecmascript, application/x-ecmascript"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t"text script": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache\'s special case and crossDomain\njQuery.ajaxPrefilter( "script", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = "GET";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( "script", function( s ) {\n\n\t// This transport only deals with cross domain or forced-by-attrs requests\n\tif ( s.crossDomain || s.scriptAttrs ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( "