From 5f069285c22391f1fed65a8f8445c2d1fb0cf5c5 Mon Sep 17 00:00:00 2001 From: luxferre Date: Thu, 7 May 2026 12:54:55 +0100 Subject: [PATCH 1/6] fix: auth port to joserfc authlib.jose is deprecated and no longer works with other updated dependencies. --- src/auth/service.py | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/src/auth/service.py b/src/auth/service.py index 28f1c9c..52a5275 100644 --- a/src/auth/service.py +++ b/src/auth/service.py @@ -6,16 +6,15 @@ Exports: - authed_dependency """ import json +import requests -from typing import Annotated -from authlib.jose import jwt +from typing import Annotated, Any +from joserfc import jwt from urllib.request import urlopen from fastapi import Depends, HTTPException from fastapi.security import OpenIdConnect -from authlib.jose.rfc7517.jwk import JsonWebKey -from authlib.jose.rfc7517.key_set import KeySet -from authlib.oauth2.rfc7523.validator import JWTBearerToken +from joserfc.jwk import KeySet from src.auth.config import auth_settings @@ -24,12 +23,12 @@ oidc = OpenIdConnect(openIdConnectUrl=auth_settings.OIDC_CONFIG) oidc_dependency = Annotated[str, Depends(oidc)] -async def get_current_user(oidc_auth_string: oidc_dependency) -> JWTBearerToken: +async def get_current_user(oidc_auth_string: oidc_dependency) -> dict[str, Any]: config_url = urlopen(auth_settings.OIDC_CONFIG) config = json.loads(config_url.read()) jwks_uri = config["jwks_uri"] - key_response = urlopen(jwks_uri) - jwk_keys: KeySet = JsonWebKey.import_key_set(json.loads(key_response.read())) + key_response = requests.get(jwks_uri) + jwk_keys = KeySet.import_key_set(key_response.json()) claims_options = { "exp": {"essential": True}, @@ -37,19 +36,19 @@ async def get_current_user(oidc_auth_string: oidc_dependency) -> JWTBearerToken: "iss": {"essential": True, "value": auth_settings.OIDC_ISSUER}, } - claims: JWTBearerToken = jwt.decode( + token = jwt.decode( oidc_auth_string.replace("Bearer ", ""), - jwk_keys, - claims_options=claims_options, - claims_cls=JWTBearerToken, + jwk_keys ) - claims.validate() + claims_requests = jwt.JWTClaimsRegistry(**claims_options) - return claims + claims_requests.validate(token.claims) + + return token.claims -claims_dependency = Annotated[JWTBearerToken, Depends(get_current_user)] +claims_dependency = Annotated[dict[str, Any], Depends(get_current_user)] async def is_authed_user(claims: claims_dependency) -> bool: From 3a1e822b6371ae59c5303a6038f0232873eff0f5 Mon Sep 17 00:00:00 2001 From: luxferre Date: Thu, 7 May 2026 12:56:30 +0100 Subject: [PATCH 2/6] feat: authed users in env --- src/auth/config.py | 2 ++ src/auth/service.py | 2 +- template.env | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/auth/config.py b/src/auth/config.py index 99803fd..43819a0 100644 --- a/src/auth/config.py +++ b/src/auth/config.py @@ -9,5 +9,7 @@ class AuthConfig(CustomBaseSettings): OIDC_AUDIENCE: str = "" CLIENT_ID: str = "" + AUTHORISED_USERS: list[str] = [] + auth_settings = AuthConfig() diff --git a/src/auth/service.py b/src/auth/service.py index 52a5275..68fd855 100644 --- a/src/auth/service.py +++ b/src/auth/service.py @@ -52,7 +52,7 @@ claims_dependency = Annotated[dict[str, Any], Depends(get_current_user)] async def is_authed_user(claims: claims_dependency) -> bool: - authed_users: list[str] = ["chris@sr2.uk"] + authed_users: list[str] = auth_settings.AUTHORISED_USERS user_email = claims.get("email", None) if not user_email or user_email not in authed_users: raise HTTPException(status_code=403, detail="Not authenticated") diff --git a/template.env b/template.env index 70e4f43..d36e29d 100644 --- a/template.env +++ b/template.env @@ -16,3 +16,5 @@ MISP_OUTPUT_FILE="" ALLOWED_TLP='["tlp:clear", "tlp:white", "tlp:green"]' IGNORED_TLP='["tlp:red", "tlp:amber+strict", "tlp:amber"]' UNBOUND_CERT_DIR="" + +AUTHORISED_USERS='[]' \ No newline at end of file From a86047ec796c22c6f3dbece62f0986df1f487898 Mon Sep 17 00:00:00 2001 From: luxferre Date: Fri, 8 May 2026 16:43:37 +0100 Subject: [PATCH 3/6] feat: metrics endpoint for frontend --- src/misp/router.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/misp/router.py b/src/misp/router.py index e985c25..6c70250 100644 --- a/src/misp/router.py +++ b/src/misp/router.py @@ -10,6 +10,7 @@ from sqlalchemy.sql import and_ from src.auth.service import authed_dependency from src.database import db_dependency +from src.prometheus import prometheus from src.misp.models import Domain from src.misp.schemas import MispUpdatePutRequest, MispUpdatePutResponse @@ -20,6 +21,21 @@ router = APIRouter( ) +@router.get("/dashboard_metrics", include_in_schema=False) +async def dashboard_metrics(): + """ + Endpoint for UI status bar. JSONifies required Prometheus metrics. + :return: + """ + return { + "blocked_domain_count": prometheus.blocked_domain_count._value.get(), + "TIMER_STATE": prometheus.TIMER_STATE._value, + "MISP_STATE": prometheus.MISP_STATE._value, + "last_update_complete_time": prometheus.last_update_complete_time._value.get(), + "last_update_length": prometheus.last_update_length._value.get(), + } + + @router.put("/manual_update", response_model=MispUpdatePutResponse) async def manual_misp_update(request: Request, update_request: MispUpdatePutRequest, background_tasks: BackgroundTasks): published_time = update_request.published_timestamp From 2fe455ee8135e666593a23de534662e2371db82e Mon Sep 17 00:00:00 2001 From: luxferre Date: Fri, 8 May 2026 16:44:12 +0100 Subject: [PATCH 4/6] feat: domain details endpoint Needs a response model to filter response data --- src/misp/router.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/misp/router.py b/src/misp/router.py index 6c70250..03b8405 100644 --- a/src/misp/router.py +++ b/src/misp/router.py @@ -137,3 +137,9 @@ async def event_reinstate(domain: str, db: db_dependency, event: int): db.commit() return {"status": "Event Un-ignored"} + +@router.get("/domain/details/{domain}") +async def domain_details(db: db_dependency, domain: str): + result = db.query(Domain).filter(Domain.domain==domain).first() + + return result From 875c0cc258f20defac0be0f688f2634246a8e82e Mon Sep 17 00:00:00 2001 From: luxferre Date: Fri, 8 May 2026 16:44:40 +0100 Subject: [PATCH 5/6] feat: static file mounting for frontend --- src/main.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main.py b/src/main.py index c85985e..5b1b615 100644 --- a/src/main.py +++ b/src/main.py @@ -6,6 +6,7 @@ from typing import AsyncGenerator from prometheus_client import make_asgi_app from fastapi import FastAPI +from fastapi.staticfiles import StaticFiles from starlette.middleware.sessions import SessionMiddleware from starlette.middleware.cors import CORSMiddleware @@ -64,4 +65,6 @@ app.include_router(api_router) app.misp_handler = MISPHandler() +app.mount('/', StaticFiles(directory='src/static',html=True)) + prometheus.APP_STATE.state("running") From 4a7b66b48160125477e5a4feb0953bc5f550d1ac Mon Sep 17 00:00:00 2001 From: luxferre Date: Fri, 8 May 2026 16:45:33 +0100 Subject: [PATCH 6/6] feat: frontend --- src/static/assets/index/scripts.js | 556 ++++++++++++++++++ src/static/assets/index/styles.css | 120 ++++ src/static/index.html | 105 ++++ src/static/libraries/axios.min.js | 5 + src/static/libraries/luxgrid_combined.min.css | 1 + src/static/signin-callback.html | 30 + src/static/signout-callback.html | 30 + 7 files changed, 847 insertions(+) create mode 100644 src/static/assets/index/scripts.js create mode 100644 src/static/assets/index/styles.css create mode 100644 src/static/index.html create mode 100644 src/static/libraries/axios.min.js create mode 100644 src/static/libraries/luxgrid_combined.min.css create mode 100644 src/static/signin-callback.html create mode 100644 src/static/signout-callback.html diff --git a/src/static/assets/index/scripts.js b/src/static/assets/index/scripts.js new file mode 100644 index 0000000..56af2d7 --- /dev/null +++ b/src/static/assets/index/scripts.js @@ -0,0 +1,556 @@ +class Auth { + constructor() { + this.url = "http://localhost:8000" + this.settings = { + authority: "https://sso.sr2.uk/realms/sr2", + client_id: "chris-dev", + redirect_uri: this.url + "/signin-callback.html", + response_type: "code", + scope: "openid email profile", + + response_mode: "fragment", + } + + this.user_manager = new oidc.UserManager(this.settings) + this.get_user().then(() => { + window.is_authenticated = Boolean(this.user); + ui.update_auth_button() + }) + } + + async get_user() { + this.user = await this.user_manager.getUser() + } + + async login() { + try { + this.user = await this.user_manager.signinPopup(); + window.is_authenticated = Boolean(auth.user); + } catch (error) { + console.error(error); + } + } + + async logout() { + try { + this.user = await this.user_manager.signoutPopup(); + window.is_authenticated = Boolean(auth.user); + } catch (error) { + console.error(error); + } + } +} + +class UI { + constructor() { + this.auth_button = document.getElementById("auth_button"); + + this.blocked_domains = document.getElementById("blocked_domains") + this.timer_status = document.getElementById("timer_status") + this.overall_status = document.getElementById("overall_status") + this.last_update_complete_time = document.getElementById("last_update_complete_time") + this.last_update_duration = document.getElementById("last_update_duration") + + this.manual_update_btn = document.getElementById("manual_update_btn") + this.start_timer_btn = document.getElementById("start_timer_btn") + this.stop_timer_btn = document.getElementById("stop_timer_btn") + + this.domain_search_btn = document.getElementById("domain_search_btn") + + this.false_positive_load_btn = document.getElementById("false_positive_load_btn") + this.event_container = document.getElementById("events_container") + + this.create_listeners() + } + + create_listeners() { + this.auth_button.addEventListener("click", this.onclick_auth_button) + + this.manual_update_btn.addEventListener("click", this.onclick_manual_update_btn) + this.start_timer_btn.addEventListener("click", this.onclick_start_timer_btn) + this.stop_timer_btn.addEventListener("click", this.onclick_stop_timer_btn) + + this.domain_search_btn.addEventListener("click", this.onclick_domain_search_btn) + + this.false_positive_load_btn.addEventListener("click", this.onclick_false_positive_load_btn) + this.event_container.addEventListener("click", this.onclick_event_button) + + document.getElementById("modal_button").addEventListener("click", this.onclick_modal_button) + } + + open_modal(title, message) { + document.getElementById("modal_title").innerText = title; + document.getElementById("modal_message").innerText = message; + + document.getElementById("modal_backdrop").style.display = "flex"; + } + + set_loading(button_id, loading) { + const button = document.getElementById(button_id); + + button.disabled = loading; + + if (loading) { + button.dataset.original_text = button.innerText; + button.innerText = "Loading..."; + } else { + button.innerText = button.dataset.original_text; + } + } + + sync_timer_buttons() { + this.start_timer_btn.disabled = timer_running; + this.stop_timer_btn.disabled = !timer_running; + } + + render_search_results(results) { + const container = document.getElementById("domain_search_results"); + const result_count = Object.keys(results).length; + if (!result_count) { + container.innerHTML = `
No results found.
`; + return; + } + container.innerHTML = ""; + for (const [key, value] of Object.entries(results)) { + const row = document.createElement("div"); + row.className = "search-result"; + row.innerHTML = ` +
+
+ ${key} +
+ +
+ ${value} +
+
+ `; + container.appendChild(row); + } + } + + onclick_auth_button() { + if (is_authenticated) { + auth.logout().then(() => { + ui.update_auth_button() + }) + } else { + auth.login().then(() => { + ui.update_auth_button() + }) + } + ui.update_auth_button() + } + + update_auth_button() { + const button = document.getElementById("auth_button"); + + if (is_authenticated) { + button.innerText = "Logged In"; + button.className = "button default-dm success"; + } else { + button.innerText = "Logged Out"; + button.className = "button default-dm secondary"; + } + } + + event_status_class(value) { + switch (value.toUpperCase()) { + case "ALLOWED": + return "status-good"; + case "IGNORED": + return "status-warning"; + default: + return "status-bad"; + } + } + + update_metrics(metrics){ + this.blocked_domains.innerHTML = metrics.blocked_domain_count; + + let date + let pretty_length + if(!metrics.last_update_complete_time){ + date = "No update since last restart" + pretty_length = "" + } else { + date = new Date(metrics.last_update_complete_time * 1000).toLocaleString(); + pretty_length = `${Math.round(metrics.last_update_length)} seconds` + } + this.last_update_complete_time.innerHTML = date; + this.last_update_duration.innerHTML = pretty_length; + + let timer_value = "" + switch (metrics.TIMER_STATE) { + case 0: + timer_value = "RUNNING" + window.timer_running = true; + break; + case 1: + timer_value = "STOPPING" + window.timer_running = true; + break; + case 2: + timer_value = "STOPPED" + window.timer_running = false; + break; + } + this.timer_status.innerHTML = timer_value; + this.timer_status.className = timer_running ? "status-good" : "status-warning"; + this.sync_timer_buttons() + + let overall_status = "" + switch (metrics.MISP_STATE) { + case 0: + overall_status = "IDLE" + break; + case 1: + overall_status = "FETCHING" + break; + case 2: + overall_status = "UPDATING" + break; + case 3: + overall_status = "RELOADING" + break; + case 4: + overall_status = "ERROR" + break; + } + this.overall_status.innerHTML = overall_status; + } + + render_false_positive_controls(domain_data) { + document.getElementById("false_positive_actions").style.display = "block"; + const always_allow_btn = document.getElementById("always_allow_btn"); + + always_allow_btn.innerText = domain_data.always_allow ? "Enabled" : "Disabled"; + always_allow_btn.className = domain_data.always_allow ? "button default-dm success" : "button default-dm secondary"; + always_allow_btn.dataset.domain = domain_data.domain; + always_allow_btn.dataset.always_allow = domain_data.always_allow; + + always_allow_btn.addEventListener("click", ui.onclick_always_allow_btn) + + ui.event_container.innerHTML = ""; + + domain_data.events.forEach(event => { + const button = document.createElement("button"); + + button.className = `button event-btn ${event.ignored ? "default-dm warning" : "default-dm danger" }`; + button.innerText = event.id; + button.dataset.id = event.id; + button.dataset.ignored = event.ignored + button.dataset.domain = domain_data.domain; + + ui.event_container.appendChild(button); + }); + } + + async onclick_manual_update_btn() { + ui.set_loading("manual_update_btn", true); + try { + const data = await api.manual_update() + if(data.state==="Starting"){ + ui.open_modal( + "Update Triggered", + "Manual update process successfully started." + ); + } else { + throw new Error() + } + } catch (error) { + ui.open_modal( + "Update Failed", + "Failed to trigger update process." + ); + } finally { + ui.set_loading("manual_update_btn", false); + } + } + + async onclick_start_timer_btn() { + ui.set_loading("start_timer_btn", true); + try { + const data = await api.start_timer() + api.update_metrics() + } catch (error) { + console.error(error); + } finally { + ui.set_loading("start_timer_btn", false); + } + } + + async onclick_stop_timer_btn() { + ui.set_loading("stop_timer_btn", true); + try { + const data = await api.stop_timer() + api.update_metrics() + } catch (error) { + console.error(error); + } finally { + ui.set_loading("stop_timer_btn", false); + } + } + + async onclick_domain_search_btn(){ + ui.set_loading("domain_search_btn", true); + try { + const data = await api.domain_search() + ui.render_search_results(data) + } catch (error) { + console.error(error); + } finally { + ui.set_loading("domain_search_btn", false); + } + } + + async load_false_positive_controls(){ + ui.set_loading("false_positive_load_btn", true); + try { + const data = await api.load_domain_fp() + const parsed_data= { + domain: data.domain, + always_allow: data.always_allowed, + events: [] + } + + data.events.forEach(event => { + parsed_data.events.push({"id": event, "ignored": data.ignored_events.includes(event)}); + }) + + ui.render_false_positive_controls(parsed_data) + } catch (error) { + console.error(error); + } finally { + ui.set_loading("false_positive_load_btn", false); + } + } + + async onclick_false_positive_load_btn(){ + await ui.load_false_positive_controls() + } + + async onclick_event_button(event){ + if (event.target === event.currentTarget) return; + const event_id = event.target.dataset.id; + const domain = event.target.dataset.domain; + const ignored = event.target.dataset.ignored === "true"; + try { + if(ignored){ + await api.reinstate_event(domain, event_id) + } else { + await api.ignore_event(domain, event_id) + } + await ui.load_false_positive_controls() + } catch (error) { + console.error(error); + } + } + + async onclick_always_allow_btn(event){ + const domain = event.target.dataset.domain; + const always_allowed = event.target.dataset.always_allow === "true"; + try { + await api.change_always_allow(domain, always_allowed) + await ui.load_false_positive_controls() + } catch (error) { + console.error(error); + } + } + + onclick_modal_button() { + document.getElementById("modal_backdrop").style.display = "none"; + } +} + +class API { + constructor() { + const self = this + this.update_metrics() + this.metrics_timer = setInterval(self.update_metrics, 5000) + } + + update_metrics() { + axios.get(`misp/dashboard_metrics`) + .then(response => { + ui.update_metrics(response.data); + }) + .catch(error => { + console.log(error) + }) + } + + async manual_update(published_timestamp = null){ + const user = await auth.get_user() + return axios.put( + `misp/manual_update`, + { + "published_timestamp": published_timestamp + }, + { + headers: { + "Authorization": `Bearer ${user?.access_token}` + } + + } + ) + .then(response => { + return response.data + }) + .catch(error => { + console.log(error) + }) + } + + async start_timer(){ + const user = await auth.get_user() + return axios.put( + `control/start_timer`, + {}, + { + headers: { + "Authorization": `Bearer ${user?.access_token}` + } + + } + ) + .then(response => { + return response.data + }) + .catch(error => { + console.log(error) + }) + } + + async stop_timer(){ + const user = await auth.get_user() + return axios.put( + `control/stop_timer`, + {}, + { + headers: { + "Authorization": `Bearer ${user?.access_token}` + } + + } + ) + .then(response => { + return response.data + }) + .catch(error => { + console.log(error) + }) + } + + async domain_search(){ + const user = await auth.get_user() + const search_term = document.getElementById("domain_search_input").value + return axios.get( + `misp/domain/search?domain=${search_term}`, + {}, + { + headers: { + "Authorization": `Bearer ${user?.access_token}` + } + + } + ) + .then(response => { + return response.data + }) + .catch(error => { + console.log(error) + }) + } + + async load_domain_fp(){ + const user = await auth.get_user() + const search_term = document.getElementById("false_positive_domain").value + return axios.get( + `/misp/domain/details/${search_term}`, + {}, + { + headers: { + "Authorization": `Bearer ${user?.access_token}` + } + + } + ) + .then(response => { + return response.data + }) + .catch(error => { + console.log(error) + }) + } + + async ignore_event(domain, event_id){ + const user = await auth.get_user() + return axios.patch( + `/misp/domain/events/${domain}/ignore?event=${event_id}`, + {}, + { + headers: { + "Authorization": `Bearer ${user?.access_token}` + } + + } + ) + .then(response => { + return response.data + }) + .catch(error => { + console.log(error) + }) + } + + async reinstate_event(domain, event_id){ + const user = await auth.get_user() + return axios.patch( + `/misp/domain/events/${domain}/reinstate?event=${event_id}`, + {}, + { + headers: { + "Authorization": `Bearer ${user?.access_token}` + } + + } + ) + .then(response => { + return response.data + }) + .catch(error => { + console.log(error) + }) + } + + async change_always_allow(domain, currently_allowed){ + const user = await auth.get_user() + return axios.patch( + `/misp/domain/always_allowed/${domain}?allow=${!currently_allowed}`, + {}, + { + headers: { + "Authorization": `Bearer ${user?.access_token}` + } + + } + ) + .then(response => { + return response.data + }) + .catch(error => { + console.log(error) + }) + } +} + +window.onload = () => { + window.ui = new UI() + window.auth = new Auth() + window.api = new API() + + window.timer_running = false; + + ui.sync_timer_buttons(); +} \ No newline at end of file diff --git a/src/static/assets/index/styles.css b/src/static/assets/index/styles.css new file mode 100644 index 0000000..a59a80b --- /dev/null +++ b/src/static/assets/index/styles.css @@ -0,0 +1,120 @@ +body { + margin: 0; + padding: 24px; + font-family: Arial, sans-serif; +} + +.title { + font-size: 48px; +} + +#auth_button { + max-height: 2.5rem; +} + +.card { + border: 1px solid #333; + border-radius: 8px; + padding: 18px; + margin-bottom: 20px; + background-color: light-dark(#eee, #171717); +} + +.card h2 { + margin-top: 0; +} + +.label { + display: block; + margin-bottom: 6px; + font-size: 14px; +} + +.input { + width: 100%; + padding: 10px; + border: 1px solid #444; + border-radius: 4px; + box-sizing: border-box; +} + +.button { + padding: 10px 14px; + border: none; + border-radius: 4px; + cursor: pointer; + font-weight: bold; +} + +.button:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +.status-good { + color: #4ade80; + font-weight: bold; +} + +.status-bad { + color: #f87171; + font-weight: bold; +} + +.status-warning { + color: #facc15; + font-weight: bold; +} + +.summary-row { + margin-bottom: 12px; +} + +.search-results { + margin-top: 12px; + max-height: 400px; + overflow-y: auto; + border: 1px solid #333; +} + +.search-result { + padding: 10px; + border-bottom: 1px solid #333; +} + +.event-grid { + display: flex; + flex-wrap: wrap; + gap: 8px; + margin-top: 12px; +} + +.event-btn { + min-width: 80px; +} + +.top-bar { + margin-bottom: 20px; +} + +.modal-backdrop { + position: fixed; + inset: 0; + background: rgba(0, 0, 0, 0.65); + display: none; + justify-content: center; + align-items: center; +} + +.modal { + width: 400px; + background: #1c1c1c; + border: 1px solid #444; + border-radius: 8px; + padding: 24px; +} + +.modal-footer { + margin-top: 20px; + text-align: right; +} \ No newline at end of file diff --git a/src/static/index.html b/src/static/index.html new file mode 100644 index 0000000..bdad9e7 --- /dev/null +++ b/src/static/index.html @@ -0,0 +1,105 @@ + + + + + + Title + + + + +
+
+
Logo
+
Title
+
+ +
+
+
+

System Status

+
+
+
Total Blocked Domains
+
+
+
+
Timer Status
+
+
+
+
Overall Status
+
+
+
+
Last Update
+
+
+
+
+
+
+

Actions

+
+
+ +
+
+ +
+
+ +
+
+
+
+

Domain Search

+ + +
+ +
+
+
+
+

False Positive Handling

+
+
+ + +
+
+ + +
+
+ +
+
+ + + + + + \ No newline at end of file diff --git a/src/static/libraries/axios.min.js b/src/static/libraries/axios.min.js new file mode 100644 index 0000000..8378a04 --- /dev/null +++ b/src/static/libraries/axios.min.js @@ -0,0 +1,5 @@ +/*! Axios v1.16.0 Copyright (c) 2026 Matt Zabriskie and contributors */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).axios=t()}(this,function(){"use strict";function e(e,t){this.v=e,this.k=t}function t(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n3?(o=h===r)&&(s=i[(u=i[4])?5:(u=3,3)],i[4]=i[5]=e):i[0]<=p&&((o=n<2&&pr||r>h)&&(i[4]=n,i[5]=r,d.n=h,u=0))}if(o||n>1)return a;throw l=!0,r}return function(o,f,h){if(c>1)throw TypeError("Generator is already running");for(l&&1===f&&p(f,h),u=f,s=h;(t=u<2?e:s)||!l;){i||(u?u<3?(u>1&&(d.n=-1),p(u,s)):d.n=s:d.v=s);try{if(c=2,i){if(u||(o="next"),t=i[o]){if(!(t=t.call(i,s)))throw TypeError("iterator result is not an object");if(!t.done)return t;s=t.value,u<2&&(u=0)}else 1===u&&(t=i.return)&&t.call(i),u<2&&(s=TypeError("The iterator does not provide a '"+o+"' method"),u=1);i=e}else if((t=(l=d.n<0)?s:n.call(r,d))!==a)break}catch(t){i=e,u=1,s=t}finally{c=1}}return{value:t,done:l}}}(n,o,i),!0),c}var a={};function u(){}function s(){}function c(){}t=Object.getPrototypeOf;var f=[][r]?t(t([][r]())):(g(t={},r,function(){return this}),t),l=c.prototype=u.prototype=Object.create(f);function d(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,c):(e.__proto__=c,g(e,o,"GeneratorFunction")),e.prototype=Object.create(l),e}return s.prototype=c,g(l,"constructor",c),g(c,"constructor",s),s.displayName="GeneratorFunction",g(c,o,"GeneratorFunction"),g(l),g(l,o,"Generator"),g(l,r,function(){return this}),g(l,"toString",function(){return"[object Generator]"}),(m=function(){return{w:i,m:d}})()}function g(e,t,n,r){var o=Object.defineProperty;try{o({},"",{})}catch(e){o=0}g=function(e,t,n,r){function i(t,n){g(e,t,function(e){return this._invoke(t,n,e)})}t?o?o(e,t,{value:n,enumerable:!r,configurable:!r,writable:!r}):e[t]=n:(i("next",0),i("throw",1),i("return",2))},g(e,t,n,r)}function w(e){if(null!=e){var t=e["function"==typeof Symbol&&Symbol.iterator||"@@iterator"],n=0;if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length))return{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}}}throw new TypeError(typeof e+" is not iterable")}function O(e,t){return O=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},O(e,t)}function E(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,i,a,u=[],s=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(r=i.call(n)).done)&&(u.push(r.value),u.length!==t);s=!0);}catch(e){c=!0,o=e}finally{try{if(!s&&null!=n.return&&(a=n.return(),Object(a)!==a))return}finally{if(c)throw o}}return u}}(e,t)||A(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function R(e){return function(e){if(Array.isArray(e))return t(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||A(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function S(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t);if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}function _(e){return _="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_(e)}function A(e,n){if(e){if("string"==typeof e)return t(e,n);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?t(e,n):void 0}}function T(e){return function(){return new j(e.apply(this,arguments))}}function j(t){var n,r;function o(n,r){try{var a=t[n](r),u=a.value,s=u instanceof e;Promise.resolve(s?u.v:u).then(function(e){if(s){var r="return"===n?"return":"next";if(!u.k||e.done)return o(r,e);e=t[r](e).value}i(a.done?"return":"normal",e)},function(e){o("throw",e)})}catch(e){i("throw",e)}}function i(e,t){switch(e){case"return":n.resolve({value:t,done:!0});break;case"throw":n.reject(t);break;default:n.resolve({value:t,done:!1})}(n=n.next)?o(n.key,n.arg):r=null}this._invoke=function(e,t){return new Promise(function(i,a){var u={key:e,arg:t,resolve:i,reject:a,next:null};r?r=r.next=u:(n=r=u,o(e,t))})},"function"!=typeof t.return&&(this.return=void 0)}function P(e){var t="function"==typeof Map?new Map:void 0;return P=function(e){if(null===e||!function(e){try{return-1!==Function.toString.call(e).indexOf("[native code]")}catch(t){return"function"==typeof e}}(e))return e;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return function(e,t,n){if(y())return Reflect.construct.apply(null,arguments);var r=[null];r.push.apply(r,t);var o=new(e.bind.apply(e,r));return n&&O(o,n.prototype),o}(e,arguments,p(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),O(n,e)},P(e)}function k(e,t){return function(){return e.apply(t,arguments)}}j.prototype["function"==typeof Symbol&&Symbol.asyncIterator||"@@asyncIterator"]=function(){return this},j.prototype.next=function(e){return this._invoke("next",e)},j.prototype.throw=function(e){return this._invoke("throw",e)},j.prototype.return=function(e){return this._invoke("return",e)};var x,C=Object.prototype.toString,N=Object.getPrototypeOf,D=Symbol.iterator,U=Symbol.toStringTag,F=(x=Object.create(null),function(e){var t=C.call(e);return x[t]||(x[t]=t.slice(8,-1).toLowerCase())}),L=function(e){return e=e.toLowerCase(),function(t){return F(t)===e}},B=function(e){return function(t){return _(t)===e}},I=Array.isArray,q=B("undefined");function M(e){return null!==e&&!q(e)&&null!==e.constructor&&!q(e.constructor)&&J(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}var z=L("ArrayBuffer");var H=B("string"),J=B("function"),W=B("number"),K=function(e){return null!==e&&"object"===_(e)},V=function(e){if("object"!==F(e))return!1;var t=N(e);return!(null!==t&&t!==Object.prototype&&null!==Object.getPrototypeOf(t)||U in e||D in e)},X=L("Date"),G=L("File"),$=L("Blob"),Q=L("FileList");var Y="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},Z=void 0!==Y.FormData?Y.FormData:void 0,ee=L("URLSearchParams"),te=E(["ReadableStream","Request","Response","Headers"].map(L),4),ne=te[0],re=te[1],oe=te[2],ie=te[3];function ae(e,t){var n,r,o=(arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}).allOwnKeys,i=void 0!==o&&o;if(null!=e)if("object"!==_(e)&&(e=[e]),I(e))for(n=0,r=e.length;n0;)if(t===(n=r[o]).toLowerCase())return n;return null}var se="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:global,ce=function(e){return!q(e)&&e!==se};var fe,le=(fe="undefined"!=typeof Uint8Array&&N(Uint8Array),function(e){return fe&&e instanceof fe}),de=L("HTMLFormElement"),pe=function(){var e=Object.prototype.hasOwnProperty;return function(t,n){return e.call(t,n)}}(),he=L("RegExp"),ye=function(e,t){var n=Object.getOwnPropertyDescriptors(e),r={};ae(n,function(n,o){var i;!1!==(i=t(n,o,e))&&(r[o]=i||n)}),Object.defineProperties(e,r)};var ve,be,me,ge,we=L("AsyncFunction"),Oe=(ve="function"==typeof setImmediate,be=J(se.postMessage),ve?setImmediate:be?(me="axios@".concat(Math.random()),ge=[],se.addEventListener("message",function(e){var t=e.source,n=e.data;t===se&&n===me&&ge.length&&ge.shift()()},!1),function(e){ge.push(e),se.postMessage(me,"*")}):function(e){return setTimeout(e)}),Ee="undefined"!=typeof queueMicrotask?queueMicrotask.bind(se):"undefined"!=typeof process&&process.nextTick||Oe,Re={isArray:I,isArrayBuffer:z,isBuffer:M,isFormData:function(e){if(!e)return!1;if(Z&&e instanceof Z)return!0;var t=N(e);if(!t||t===Object.prototype)return!1;if(!J(e.append))return!1;var n=F(e);return"formdata"===n||"object"===n&&J(e.toString)&&"[object FormData]"===e.toString()},isArrayBufferView:function(e){return"undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&z(e.buffer)},isString:H,isNumber:W,isBoolean:function(e){return!0===e||!1===e},isObject:K,isPlainObject:V,isEmptyObject:function(e){if(!K(e)||M(e))return!1;try{return 0===Object.keys(e).length&&Object.getPrototypeOf(e)===Object.prototype}catch(e){return!1}},isReadableStream:ne,isRequest:re,isResponse:oe,isHeaders:ie,isUndefined:q,isDate:X,isFile:G,isReactNativeBlob:function(e){return!(!e||void 0===e.uri)},isReactNative:function(e){return e&&void 0!==e.getParts},isBlob:$,isRegExp:he,isFunction:J,isStream:function(e){return K(e)&&J(e.pipe)},isURLSearchParams:ee,isTypedArray:le,isFileList:Q,forEach:ae,merge:function e(){for(var t=ce(this)&&this||{},n=t.caseless,r=t.skipUndefined,o={},i=function(t,i){if("__proto__"!==i&&"constructor"!==i&&"prototype"!==i){var a=n&&ue(o,i)||i,u=pe(o,a)?o[a]:void 0;V(u)&&V(t)?o[a]=e(u,t):V(t)?o[a]=e({},t):I(t)?o[a]=t.slice():r&&q(t)||(o[a]=t)}},a=arguments.length,u=new Array(a),s=0;s3&&void 0!==arguments[3]?arguments[3]:{}).allOwnKeys}),e},trim:function(e){return e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")},stripBOM:function(e){return 65279===e.charCodeAt(0)&&(e=e.slice(1)),e},inherits:function(e,t,n,r){e.prototype=Object.create(t.prototype,r),Object.defineProperty(e.prototype,"constructor",{__proto__:null,value:e,writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(e,"super",{__proto__:null,value:t.prototype}),n&&Object.assign(e.prototype,n)},toFlatObject:function(e,t,n,r){var o,i,a,u={};if(t=t||{},null==e)return t;do{for(i=(o=Object.getOwnPropertyNames(e)).length;i-- >0;)a=o[i],r&&!r(a,e,t)||u[a]||(t[a]=e[a],u[a]=!0);e=!1!==n&&N(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},kindOf:F,kindOfTest:L,endsWith:function(e,t,n){e=String(e),(void 0===n||n>e.length)&&(n=e.length),n-=t.length;var r=e.indexOf(t,n);return-1!==r&&r===n},toArray:function(e){if(!e)return null;if(I(e))return e;var t=e.length;if(!W(t))return null;for(var n=new Array(t);t-- >0;)n[t]=e[t];return n},forEachEntry:function(e,t){for(var n,r=(e&&e[D]).call(e);(n=r.next())&&!n.done;){var o=n.value;t.call(e,o[0],o[1])}},matchAll:function(e,t){for(var n,r=[];null!==(n=e.exec(t));)r.push(n);return r},isHTMLForm:de,hasOwnProperty:pe,hasOwnProp:pe,reduceDescriptors:ye,freezeMethods:function(e){ye(e,function(t,n){if(J(e)&&["arguments","caller","callee"].includes(n))return!1;var r=e[n];J(r)&&(t.enumerable=!1,"writable"in t?t.writable=!1:t.set||(t.set=function(){throw Error("Can not rewrite read-only method '"+n+"'")}))})},toObjectSet:function(e,t){var n={},r=function(e){e.forEach(function(e){n[e]=!0})};return I(e)?r(e):r(String(e).split(t)),n},toCamelCase:function(e){return e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(e,t,n){return t.toUpperCase()+n})},noop:function(){},toFiniteNumber:function(e,t){return null!=e&&Number.isFinite(e=+e)?e:t},findKey:ue,global:se,isContextDefined:ce,isSpecCompliantForm:function(e){return!!(e&&J(e.append)&&"FormData"===e[U]&&e[D])},toJSONObject:function(e){var t=new Array(10),n=function(e,r){if(K(e)){if(t.indexOf(e)>=0)return;if(M(e))return e;if(!("toJSON"in e)){t[r]=e;var o=I(e)?[]:{};return ae(e,function(e,t){var i=n(e,r+1);!q(i)&&(o[t]=i)}),t[r]=void 0,o}}return e};return n(e,0)},isAsyncFn:we,isThenable:function(e){return e&&(K(e)||J(e))&&J(e.then)&&J(e.catch)},setImmediate:Oe,asap:Ee,isIterable:function(e){return null!=e&&J(e[D])}},Se=Re.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),_e=Symbol("internals"),Ae=/[^\x09\x20-\x7E\x80-\xFF]/g;function Te(e){return e&&String(e).trim().toLowerCase()}function je(e){return!1===e||null==e?e:Re.isArray(e)?e.map(je):function(e){for(var t=0,n=e.length;tt;){var o=e.charCodeAt(n-1);if(9!==o&&32!==o)break;n-=1}return 0===t&&n===e.length?e:e.slice(t,n)}(String(e).replace(Ae,""))}function Pe(e,t,n,r,o){return Re.isFunction(r)?r.call(this,t,n):(o&&(t=n),Re.isString(t)?Re.isString(r)?-1!==t.indexOf(r):Re.isRegExp(r)?r.test(t):void 0:void 0)}var ke=function(){return l(function e(t){c(this,e),t&&this.set(t)},[{key:"set",value:function(e,t,n){var r=this;function o(e,t,n){var o=Te(t);if(!o)throw new Error("header name must be a non-empty string");var i=Re.findKey(r,o);(!i||void 0===r[i]||!0===n||void 0===n&&!1!==r[i])&&(r[i||t]=je(e))}var i=function(e,t){return Re.forEach(e,function(e,n){return o(e,n,t)})};if(Re.isPlainObject(e)||e instanceof this.constructor)i(e,t);else if(Re.isString(e)&&(e=e.trim())&&!/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim()))i(function(e){var t,n,r,o={};return e&&e.split("\n").forEach(function(e){r=e.indexOf(":"),t=e.substring(0,r).trim().toLowerCase(),n=e.substring(r+1).trim(),!t||o[t]&&Se[t]||("set-cookie"===t?o[t]?o[t].push(n):o[t]=[n]:o[t]=o[t]?o[t]+", "+n:n)}),o}(e),t);else if(Re.isObject(e)&&Re.isIterable(e)){var a,u,s,c={},f=function(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=A(e))||t){n&&(e=n);var r=0,o=function(){};return{s:o,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,u=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return a=e.done,e},e:function(e){u=!0,i=e},f:function(){try{a||null==n.return||n.return()}finally{if(u)throw i}}}}(e);try{for(f.s();!(s=f.n()).done;){var l=s.value;if(!Re.isArray(l))throw TypeError("Object iterator must return a key-value pair");c[u=l[0]]=(a=c[u])?Re.isArray(a)?[].concat(R(a),[l[1]]):[a,l[1]]:l[1]}}catch(e){f.e(e)}finally{f.f()}i(c,t)}else null!=e&&o(t,e,n);return this}},{key:"get",value:function(e,t){if(e=Te(e)){var n=Re.findKey(this,e);if(n){var r=this[n];if(!t)return r;if(!0===t)return function(e){for(var t,n=Object.create(null),r=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;t=r.exec(e);)n[t[1]]=t[2];return n}(r);if(Re.isFunction(t))return t.call(this,r,n);if(Re.isRegExp(t))return t.exec(r);throw new TypeError("parser must be boolean|regexp|function")}}}},{key:"has",value:function(e,t){if(e=Te(e)){var n=Re.findKey(this,e);return!(!n||void 0===this[n]||t&&!Pe(0,this[n],n,t))}return!1}},{key:"delete",value:function(e,t){var n=this,r=!1;function o(e){if(e=Te(e)){var o=Re.findKey(n,e);!o||t&&!Pe(0,n[o],o,t)||(delete n[o],r=!0)}}return Re.isArray(e)?e.forEach(o):o(e),r}},{key:"clear",value:function(e){for(var t=Object.keys(this),n=t.length,r=!1;n--;){var o=t[n];e&&!Pe(0,this[o],o,e,!0)||(delete this[o],r=!0)}return r}},{key:"normalize",value:function(e){var t=this,n={};return Re.forEach(this,function(r,o){var i=Re.findKey(n,o);if(i)return t[i]=je(r),void delete t[o];var a=e?function(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,function(e,t,n){return t.toUpperCase()+n})}(o):String(o).trim();a!==o&&delete t[o],t[a]=je(r),n[a]=!0}),this}},{key:"concat",value:function(){for(var e,t=arguments.length,n=new Array(t),r=0;r1?n-1:0),o=1;o0?xe(e,t):Re.toJSONObject(e);return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:n,code:this.code,status:this.status}}}],[{key:"from",value:function(e,n,r,o,i,a){var u=new t(e.message,n||e.code,r,o,i);return u.cause=e,u.name=e.name,null!=e.status&&null==u.status&&(u.status=e.status),a&&Object.assign(u,a),u}}])}(P(Error));Ce.ERR_BAD_OPTION_VALUE="ERR_BAD_OPTION_VALUE",Ce.ERR_BAD_OPTION="ERR_BAD_OPTION",Ce.ECONNABORTED="ECONNABORTED",Ce.ETIMEDOUT="ETIMEDOUT",Ce.ECONNREFUSED="ECONNREFUSED",Ce.ERR_NETWORK="ERR_NETWORK",Ce.ERR_FR_TOO_MANY_REDIRECTS="ERR_FR_TOO_MANY_REDIRECTS",Ce.ERR_DEPRECATED="ERR_DEPRECATED",Ce.ERR_BAD_RESPONSE="ERR_BAD_RESPONSE",Ce.ERR_BAD_REQUEST="ERR_BAD_REQUEST",Ce.ERR_CANCELED="ERR_CANCELED",Ce.ERR_NOT_SUPPORT="ERR_NOT_SUPPORT",Ce.ERR_INVALID_URL="ERR_INVALID_URL",Ce.ERR_FORM_DATA_DEPTH_EXCEEDED="ERR_FORM_DATA_DEPTH_EXCEEDED";function Ne(e){return Re.isPlainObject(e)||Re.isArray(e)}function De(e){return Re.endsWith(e,"[]")?e.slice(0,-2):e}function Ue(e,t,n){return e?e.concat(t).map(function(e,t){return e=De(e),!n&&t?"["+e+"]":e}).join(n?".":""):t}var Fe=Re.toFlatObject(Re,{},null,function(e){return/^is[A-Z]/.test(e)});function Le(e,t,n){if(!Re.isObject(e))throw new TypeError("target must be an object");t=t||new FormData;var r=(n=Re.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(e,t){return!Re.isUndefined(t[e])})).metaTokens,o=n.visitor||l,i=n.dots,a=n.indexes,u=n.Blob||"undefined"!=typeof Blob&&Blob,s=void 0===n.maxDepth?100:n.maxDepth,c=u&&Re.isSpecCompliantForm(t);if(!Re.isFunction(o))throw new TypeError("visitor must be a function");function f(e){if(null===e)return"";if(Re.isDate(e))return e.toISOString();if(Re.isBoolean(e))return e.toString();if(!c&&Re.isBlob(e))throw new Ce("Blob is not supported. Use a Buffer instead.");return Re.isArrayBuffer(e)||Re.isTypedArray(e)?c&&"function"==typeof Blob?new Blob([e]):Buffer.from(e):e}function l(e,n,o){var u=e;if(Re.isReactNative(t)&&Re.isReactNativeBlob(e))return t.append(Ue(o,n,i),f(e)),!1;if(e&&!o&&"object"===_(e))if(Re.endsWith(n,"{}"))n=r?n:n.slice(0,-2),e=JSON.stringify(e);else if(Re.isArray(e)&&function(e){return Re.isArray(e)&&!e.some(Ne)}(e)||(Re.isFileList(e)||Re.endsWith(n,"[]"))&&(u=Re.toArray(e)))return n=De(n),u.forEach(function(e,r){!Re.isUndefined(e)&&null!==e&&t.append(!0===a?Ue([n],r,i):null===a?n:n+"[]",f(e))}),!1;return!!Ne(e)||(t.append(Ue(o,n,i),f(e)),!1)}var d=[],p=Object.assign(Fe,{defaultVisitor:l,convertValue:f,isVisitable:Ne});if(!Re.isObject(e))throw new TypeError("data must be an object");return function e(n,r){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;if(!Re.isUndefined(n)){if(i>s)throw new Ce("Object is too deeply nested ("+i+" levels). Max depth: "+s,Ce.ERR_FORM_DATA_DEPTH_EXCEEDED);if(-1!==d.indexOf(n))throw Error("Circular reference detected in "+r.join("."));d.push(n),Re.forEach(n,function(n,a){!0===(!(Re.isUndefined(n)||null===n)&&o.call(t,n,Re.isString(a)?a.trim():a,r,p))&&e(n,r?r.concat(a):[a],i+1)}),d.pop()}}(e),t}function Be(e){var t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"};return encodeURIComponent(e).replace(/[!'()~]|%20/g,function(e){return t[e]})}function Ie(e,t){this._pairs=[],e&&Le(e,this,t)}var qe=Ie.prototype;function Me(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+")}function ze(e,t,n){if(!t)return e;var r,o=n&&n.encode||Me,i=Re.isFunction(n)?{serialize:n}:n,a=i&&i.serialize;if(r=a?a(t,i):Re.isURLSearchParams(t)?t.toString():new Ie(t,i).toString(o)){var u=e.indexOf("#");-1!==u&&(e=e.slice(0,u)),e+=(-1===e.indexOf("?")?"?":"&")+r}return e}qe.append=function(e,t){this._pairs.push([e,t])},qe.toString=function(e){var t=e?function(t){return e.call(this,t,Be)}:Be;return this._pairs.map(function(e){return t(e[0])+"="+t(e[1])},"").join("&")};var He=function(){return l(function e(){c(this,e),this.handlers=[]},[{key:"use",value:function(e,t,n){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!n&&n.synchronous,runWhen:n?n.runWhen:null}),this.handlers.length-1}},{key:"eject",value:function(e){this.handlers[e]&&(this.handlers[e]=null)}},{key:"clear",value:function(){this.handlers&&(this.handlers=[])}},{key:"forEach",value:function(e){Re.forEach(this.handlers,function(t){null!==t&&e(t)})}}])}(),Je={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1,legacyInterceptorReqResOrdering:!0},We={isBrowser:!0,classes:{URLSearchParams:"undefined"!=typeof URLSearchParams?URLSearchParams:Ie,FormData:"undefined"!=typeof FormData?FormData:null,Blob:"undefined"!=typeof Blob?Blob:null},protocols:["http","https","file","blob","url","data"]},Ke="undefined"!=typeof window&&"undefined"!=typeof document,Ve="object"===("undefined"==typeof navigator?"undefined":_(navigator))&&navigator||void 0,Xe=Ke&&(!Ve||["ReactNative","NativeScript","NS"].indexOf(Ve.product)<0),Ge="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&"function"==typeof self.importScripts,$e=Ke&&window.location.href||"http://localhost",Qe=b(b({},Object.freeze({__proto__:null,hasBrowserEnv:Ke,hasStandardBrowserEnv:Xe,hasStandardBrowserWebWorkerEnv:Ge,navigator:Ve,origin:$e})),We);function Ye(e){function t(e,n,r,o){var i=e[o++];if("__proto__"===i)return!0;var a=Number.isFinite(+i),u=o>=e.length;return i=!i&&Re.isArray(r)?r.length:i,u?(Re.hasOwnProp(r,i)?r[i]=Re.isArray(r[i])?r[i].concat(n):[r[i],n]:r[i]=n,!a):(r[i]&&Re.isObject(r[i])||(r[i]=[]),t(e,n,r[i],o)&&Re.isArray(r[i])&&(r[i]=function(e){var t,n,r={},o=Object.keys(e),i=o.length;for(t=0;t-1,i=Re.isObject(e);if(i&&Re.isHTMLForm(e)&&(e=new FormData(e)),Re.isFormData(e))return o?JSON.stringify(Ye(e)):e;if(Re.isArrayBuffer(e)||Re.isBuffer(e)||Re.isStream(e)||Re.isFile(e)||Re.isBlob(e)||Re.isReadableStream(e))return e;if(Re.isArrayBufferView(e))return e.buffer;if(Re.isURLSearchParams(e))return t.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),e.toString();if(i){var a=Ze(this,"formSerializer");if(r.indexOf("application/x-www-form-urlencoded")>-1)return function(e,t){return Le(e,new Qe.classes.URLSearchParams,b({visitor:function(e,t,n,r){return Qe.isNode&&Re.isBuffer(e)?(this.append(t,e.toString("base64")),!1):r.defaultVisitor.apply(this,arguments)}},t))}(e,a).toString();if((n=Re.isFileList(e))||r.indexOf("multipart/form-data")>-1){var u=Ze(this,"env"),s=u&&u.FormData;return Le(n?{"files[]":e}:e,s&&new s,a)}}return i||o?(t.setContentType("application/json",!1),function(e,t,n){if(Re.isString(e))try{return(t||JSON.parse)(e),Re.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return(n||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){var t=Ze(this,"transitional")||et.transitional,n=t&&t.forcedJSONParsing,r=Ze(this,"responseType"),o="json"===r;if(Re.isResponse(e)||Re.isReadableStream(e))return e;if(e&&Re.isString(e)&&(n&&!r||o)){var i=!(t&&t.silentJSONParsing)&&o;try{return JSON.parse(e,Ze(this,"parseReviver"))}catch(e){if(i){if("SyntaxError"===e.name)throw Ce.from(e,Ce.ERR_BAD_RESPONSE,this,null,Ze(this,"response"));throw e}}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:Qe.classes.FormData,Blob:Qe.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};function tt(e,t){var n=this||et,r=t||n,o=ke.from(r.headers),i=r.data;return Re.forEach(e,function(e){i=e.call(n,i,o.normalize(),t?t.status:void 0)}),o.normalize(),i}function nt(e){return!(!e||!e.__CANCEL__)}Re.forEach(["delete","get","head","post","put","patch","query"],function(e){et.headers[e]={}});var rt=function(e){function t(e,n,r){var o;return c(this,t),(o=s(this,t,[null==e?"canceled":e,Ce.ERR_CANCELED,n,r])).name="CanceledError",o.__CANCEL__=!0,o}return h(t,e),l(t)}(Ce);function ot(e,t,n){var r=n.config.validateStatus;n.status&&r&&!r(n.status)?t(new Ce("Request failed with status code "+n.status,n.status>=400&&n.status<500?Ce.ERR_BAD_REQUEST:Ce.ERR_BAD_RESPONSE,n.config,n.request,n)):e(n)}var it=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:3,r=0,o=function(e,t){e=e||10;var n,r=new Array(e),o=new Array(e),i=0,a=0;return t=void 0!==t?t:1e3,function(u){var s=Date.now(),c=o[a];n||(n=s),r[i]=u,o[i]=s;for(var f=a,l=0;f!==i;)l+=r[f++],f%=e;if((i=(i+1)%e)===a&&(a=(a+1)%e),!(s-n1&&void 0!==arguments[1]?arguments[1]:Date.now();o=i,n=null,r&&(clearTimeout(r),r=null),e.apply(void 0,R(t))};return[function(){for(var e=Date.now(),t=e-o,u=arguments.length,s=new Array(u),c=0;c=i?a(s,e):(n=s,r||(r=setTimeout(function(){r=null,a(n)},i-t)))},function(){return n&&a(n)}]}(function(n){var i=n.loaded,a=n.lengthComputable?n.total:void 0,u=null!=a?Math.min(i,a):i,s=Math.max(0,u-r),c=o(s);r=Math.max(r,u);var f=d({loaded:u,total:a,progress:a?u/a:void 0,bytes:s,rate:c||void 0,estimated:c&&a?(a-u)/c:void 0,event:n,lengthComputable:null!=a},t?"download":"upload",!0);e(f)},n)},at=function(e,t){var n=null!=e;return[function(r){return t[0]({lengthComputable:n,total:e,loaded:r})},t[1]]},ut=function(e){return function(){for(var t=arguments.length,n=new Array(t),r=0;r=48&&u<=57||u>=65&&u<=70||u>=97&&u<=102)&&(s>=48&&s<=57||s>=65&&s<=70||s>=97&&s<=102)&&(o-=2,a+=2)}var c=0,f=i-1,l=function(e){return e>=2&&37===r.charCodeAt(e-2)&&51===r.charCodeAt(e-1)&&(68===r.charCodeAt(e)||100===r.charCodeAt(e))};f>=0&&(61===r.charCodeAt(f)?(c++,f--):l(f)&&(c++,f-=3)),1===c&&f>=0&&(61===r.charCodeAt(f)||l(f))&&c++;var d=3*Math.floor(o/4)-(c||0);return d>0?d:0}if("undefined"!=typeof Buffer&&"function"==typeof Buffer.byteLength)return Buffer.byteLength(r,"utf8");for(var p=0,h=0,y=r.length;h=55296&&v<=56319&&h+1=56320&&b<=57343?(p+=4,h++):p+=3}else p+=3}return p}var Et="1.16.0",Rt=Re.isFunction,St=function(e){try{for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r-1,x=Re.isNumber(P)&&P>-1,C=u||fetch,O=O?(O+"").toLowerCase():"text",N=vt([f,d&&d.toAbortSignal()],p),D=null,U=N&&N.unsubscribe&&function(){N.unsubscribe()},e.p=1,!k||"string"!=typeof r||!r.startsWith("data:")){e.n=2;break}if(!(Ot(r)>j)){e.n=2;break}throw new Ce("maxContentLength size of "+j+" exceeded",Ce.ERR_BAD_RESPONSE,t,D);case 2:if(!x||"get"===i||"head"===i){e.n=4;break}return e.n=3,R(S,a);case 3:if(!("number"==typeof(L=e.v)&&isFinite(L)&&L>P)){e.n=4;break}throw new Ce("Request body larger than maxBodyLength limit",Ce.ERR_BAD_REQUEST,t,D);case 4:if(!(ae=y&&v&&"get"!==i&&"head"!==i)){e.n=6;break}return e.n=5,R(S,a);case 5:ue=F=e.v,ae=0!==ue;case 6:if(!ae){e.n=7;break}B=new s(r,{method:"POST",body:a,duplex:"half"}),Re.isFormData(a)&&(I=B.headers.get("content-type"))&&S.setContentType(I),B.body&&(q=at(F,it(ut(y))),M=E(q,2),z=M[0],H=M[1],a=wt(B.body,65536,z,H));case 7:return Re.isString(A)||(A=A?"include":"omit"),J=l&&"credentials"in s.prototype,Re.isFormData(a)&&(W=S.getContentType())&&/^multipart\/form-data/i.test(W)&&!/boundary=/i.test(W)&&S.delete("content-type"),S.set("User-Agent","axios/"+Et,!1),K=b(b({},T),{},{signal:N,method:i.toUpperCase(),headers:S.normalize().toJSON(),body:a,duplex:"half",credentials:J?A:void 0}),D=l&&new s(r,K),e.n=8,l?C(D,T):C(r,K);case 8:if(V=e.v,!k){e.n=9;break}if(!(null!=(X=Re.toFiniteNumber(V.headers.get("content-length")))&&X>j)){e.n=9;break}throw new Ce("maxContentLength size of "+j+" exceeded",Ce.ERR_BAD_RESPONSE,t,D);case 9:return G=g&&("stream"===O||"response"===O),g&&V.body&&(h||k||G&&U)&&($={},["status","statusText","headers"].forEach(function(e){$[e]=V[e]}),Q=Re.toFiniteNumber(V.headers.get("content-length")),Y=h&&at(Q,it(ut(h),!0))||[],Z=E(Y,2),ee=Z[0],te=Z[1],ne=function(e){if(k&&e>j)throw new Ce("maxContentLength size of "+j+" exceeded",Ce.ERR_BAD_RESPONSE,t,D);ee&&ee(e)},V=new c(wt(V.body,65536,ne,function(){te&&te(),U&&U()}),$)),O=O||"text",e.n=10,w[Re.findKey(w,O)||"text"](V,t);case 10:if(re=e.v,!k||g||G){e.n=11;break}if(null!=re&&("number"==typeof re.byteLength?oe=re.byteLength:"number"==typeof re.size?oe=re.size:"string"==typeof re&&(oe="function"==typeof o?(new o).encode(re).byteLength:re.length)),!("number"==typeof oe&&oe>j)){e.n=11;break}throw new Ce("maxContentLength size of "+j+" exceeded",Ce.ERR_BAD_RESPONSE,t,D);case 11:return!G&&U&&U(),e.n=12,new Promise(function(e,n){ot(e,n,{data:re,headers:ke.from(V.headers),status:V.status,statusText:V.statusText,config:t,request:D})});case 12:return e.a(2,e.v);case 13:if(e.p=13,se=e.v,U&&U(),!(N&&N.aborted&&N.reason instanceof Ce)){e.n=14;break}throw(ie=N.reason).config=t,D&&(ie.request=D),se!==ie&&(ie.cause=se),ie;case 14:if(!se||"TypeError"!==se.name||!/Load failed|fetch/i.test(se.message)){e.n=15;break}throw Object.assign(new Ce("Network Error",Ce.ERR_NETWORK,t,D,se&&se.response),{cause:se.cause||se});case 15:throw Ce.from(se,se&&se.code,t,D,se&&se.response);case 16:return e.a(2)}},e,null,[[1,13]])}));return function(t){return e.apply(this,arguments)}}()},At=new Map,Tt=function(e){for(var t,n,r=e&&e.env||{},o=r.fetch,i=[r.Request,r.Response,o],a=i.length,u=At;a--;)t=i[a],void 0===(n=u.get(t))&&u.set(t,n=a?new Map:_t(r)),u=n;return n};Tt();var jt={http:null,xhr:yt,fetch:{get:Tt}};Re.forEach(jt,function(e,t){if(e){try{Object.defineProperty(e,"name",{__proto__:null,value:t})}catch(e){}Object.defineProperty(e,"adapterName",{__proto__:null,value:t})}});var Pt=function(e){return"- ".concat(e)},kt=function(e){return Re.isFunction(e)||null===e||!1===e};var xt={getAdapter:function(e,t){for(var n,r,o=(e=Re.isArray(e)?e:[e]).length,i={},a=0;a1?"since :\n"+s.map(Pt).join("\n"):" "+Pt(s[0]):"as no adapter specified";throw new Ce("There is no suitable adapter to dispatch the request "+c,"ERR_NOT_SUPPORT")}return r},adapters:jt};function Ct(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new rt(null,e)}function Nt(e){return Ct(e),e.headers=ke.from(e.headers),e.data=tt.call(e,e.transformRequest),-1!==["post","put","patch"].indexOf(e.method)&&e.headers.setContentType("application/x-www-form-urlencoded",!1),xt.getAdapter(e.adapter||et.adapter,e)(e).then(function(t){Ct(e),e.response=t;try{t.data=tt.call(e,e.transformResponse,t)}finally{delete e.response}return t.headers=ke.from(t.headers),t},function(t){if(!nt(t)&&(Ct(e),t&&t.response)){e.response=t.response;try{t.response.data=tt.call(e,e.transformResponse,t.response)}finally{delete e.response}t.response.headers=ke.from(t.response.headers)}return Promise.reject(t)})}var Dt={};["object","boolean","number","function","string","symbol"].forEach(function(e,t){Dt[e]=function(n){return _(n)===e||"a"+(t<1?"n ":" ")+e}});var Ut={};Dt.transitional=function(e,t,n){function r(e,t){return"[Axios v"+Et+"] Transitional option '"+e+"'"+t+(n?". "+n:"")}return function(n,o,i){if(!1===e)throw new Ce(r(o," has been removed"+(t?" in "+t:"")),Ce.ERR_DEPRECATED);return t&&!Ut[o]&&(Ut[o]=!0,console.warn(r(o," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(n,o,i)}},Dt.spelling=function(e){return function(t,n){return console.warn("".concat(n," is likely a misspelling of ").concat(e)),!0}};var Ft={assertOptions:function(e,t,n){if("object"!==_(e))throw new Ce("options must be an object",Ce.ERR_BAD_OPTION_VALUE);for(var r=Object.keys(e),o=r.length;o-- >0;){var i=r[o],a=Object.prototype.hasOwnProperty.call(t,i)?t[i]:void 0;if(a){var u=e[i],s=void 0===u||a(u,i,e);if(!0!==s)throw new Ce("option "+i+" must be "+s,Ce.ERR_BAD_OPTION_VALUE)}else if(!0!==n)throw new Ce("Unknown option "+i,Ce.ERR_BAD_OPTION)}},validators:Dt},Lt=Ft.validators,Bt=function(){return l(function e(t){c(this,e),this.defaults=t||{},this.interceptors={request:new He,response:new He}},[{key:"request",value:(e=a(m().m(function e(t,n){var r,o,i,a,u,s;return m().w(function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,e.n=1,this._request(t,n);case 1:return e.a(2,e.v);case 2:if(e.p=2,(s=e.v)instanceof Error){r={},Error.captureStackTrace?Error.captureStackTrace(r):r=new Error,o=function(){if(!r.stack)return"";var e=r.stack.indexOf("\n");return-1===e?"":r.stack.slice(e+1)}();try{s.stack?o&&(i=o.indexOf("\n"),a=-1===i?-1:o.indexOf("\n",i+1),u=-1===a?"":o.slice(a+1),String(s.stack).endsWith(u)||(s.stack+="\n"+o)):s.stack=o}catch(e){}}throw s;case 3:return e.a(2)}},e,this,[[0,2]])})),function(t,n){return e.apply(this,arguments)})},{key:"_request",value:function(e,t){"string"==typeof e?(t=t||{}).url=e:t=e||{};var n=t=dt(this.defaults,t),r=n.transitional,o=n.paramsSerializer,i=n.headers;void 0!==r&&Ft.assertOptions(r,{silentJSONParsing:Lt.transitional(Lt.boolean),forcedJSONParsing:Lt.transitional(Lt.boolean),clarifyTimeoutError:Lt.transitional(Lt.boolean),legacyInterceptorReqResOrdering:Lt.transitional(Lt.boolean)},!1),null!=o&&(Re.isFunction(o)?t.paramsSerializer={serialize:o}:Ft.assertOptions(o,{encode:Lt.function,serialize:Lt.function},!0)),void 0!==t.allowAbsoluteUrls||(void 0!==this.defaults.allowAbsoluteUrls?t.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:t.allowAbsoluteUrls=!0),Ft.assertOptions(t,{baseUrl:Lt.spelling("baseURL"),withXsrfToken:Lt.spelling("withXSRFToken")},!0),t.method=(t.method||this.defaults.method||"get").toLowerCase();var a=i&&Re.merge(i.common,i[t.method]);i&&Re.forEach(["delete","get","head","post","put","patch","query","common"],function(e){delete i[e]}),t.headers=ke.concat(a,i);var u=[],s=!0;this.interceptors.request.forEach(function(e){if("function"!=typeof e.runWhen||!1!==e.runWhen(t)){s=s&&e.synchronous;var n=t.transitional||Je;n&&n.legacyInterceptorReqResOrdering?u.unshift(e.fulfilled,e.rejected):u.push(e.fulfilled,e.rejected)}});var c,f=[];this.interceptors.response.forEach(function(e){f.push(e.fulfilled,e.rejected)});var l,d=0;if(!s){var p=[Nt.bind(this),void 0];for(p.unshift.apply(p,u),p.push.apply(p,f),l=p.length,c=Promise.resolve(t);d0;)r._listeners[t](e);r._listeners=null}}),this.promise.then=function(e){var t,n=new Promise(function(e){r.subscribe(e),t=e}).then(e);return n.cancel=function(){r.unsubscribe(t)},n},t(function(e,t,o){r.reason||(r.reason=new rt(e,t,o),n(r.reason))})}return l(e,[{key:"throwIfRequested",value:function(){if(this.reason)throw this.reason}},{key:"subscribe",value:function(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]}},{key:"unsubscribe",value:function(e){if(this._listeners){var t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}}},{key:"toAbortSignal",value:function(){var e=this,t=new AbortController,n=function(e){t.abort(e)};return this.subscribe(n),t.signal.unsubscribe=function(){return e.unsubscribe(n)},t.signal}}],[{key:"source",value:function(){var t;return{token:new e(function(e){t=e}),cancel:t}}}])}();var qt={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(qt).forEach(function(e){var t=E(e,2),n=t[0],r=t[1];qt[r]=n});var Mt=function e(t){var n=new Bt(t),r=k(Bt.prototype.request,n);return Re.extend(r,Bt.prototype,n,{allOwnKeys:!0}),Re.extend(r,n,null,{allOwnKeys:!0}),r.create=function(n){return e(dt(t,n))},r}(et);return Mt.Axios=Bt,Mt.CanceledError=rt,Mt.CancelToken=It,Mt.isCancel=nt,Mt.VERSION=Et,Mt.toFormData=Le,Mt.AxiosError=Ce,Mt.Cancel=Mt.CanceledError,Mt.all=function(e){return Promise.all(e)},Mt.spread=function(e){return function(t){return e.apply(null,t)}},Mt.isAxiosError=function(e){return Re.isObject(e)&&!0===e.isAxiosError},Mt.mergeConfig=dt,Mt.AxiosHeaders=ke,Mt.formToJSON=function(e){return Ye(Re.isHTMLForm(e)?new FormData(e):e)},Mt.getAdapter=xt.getAdapter,Mt.HttpStatusCode=qt,Mt.default=Mt,Mt}); +//# sourceMappingURL=axios.min.js.map diff --git a/src/static/libraries/luxgrid_combined.min.css b/src/static/libraries/luxgrid_combined.min.css new file mode 100644 index 0000000..4f0d468 --- /dev/null +++ b/src/static/libraries/luxgrid_combined.min.css @@ -0,0 +1 @@ +body,button,input,select,textarea{color:light-dark(black,var(--dm-text-colour))}.col,[class*=col-]{padding-left:15px;padding-right:15px;box-sizing:border-box;min-width:8.33%}:root{color-scheme:light dark;--dm-text-colour:#e0e0e0;--primary-bg:#007bff;--secondary-bg:#6c757d;--success-bg:#28a745;--danger-bg:#dc3545;--warning-bg:#ffc107;--info-bg:#17a2b8;--light-bg:#f8f9fa;--dark-bg:#343a40;--light-bg-text:#212529;--dark-bg-text:white}.danger,.info,.light,.primary,.secondary,.success,.warning{color:var(--light-bg-text)}body{background-color:light-dark(white,#121212)}button{background-color:light-dark(#f0f0f0,#333);border-color:light-dark(white,#555);border-radius:2px}button:hover{background-color:light-dark(#e5e5e5,#555);border-color:light-dark(white,#666)}input,select,textarea{background-color:light-dark(#fafafa,#1e1e1e);border-style:solid;border-width:1px;border-color:light-dark(black,#333)}input:focus,select:focus,textarea:focus{border-color:light-dark(black,#036);border-radius:2px;outline:solid 2px}h1,h2,h3,h4,h5,h6{color:light-dark(black,#fff)}.default{background-color:var(--base-bg-colour)}.default-dm{background-color:light-dark(var(--base-bg-colour),oklch(from var(--base-bg-colour) clamp(0,l + .22,1) clamp(0,c - .02,1) h))}.lighten{background-color:oklch(from var(--base-bg-colour) clamp(0,l + .27,1) c h)}.darken{background-color:oklch(from var(--base-bg-colour) clamp(0,l - .09,1) c h)}.subtle{background-color:rgba(from var(--base-bg-colour) r g b / .6)}.primary{--base-bg-colour:var(--primary-bg)}.secondary{--base-bg-colour:var(--secondary-bg)}.success{--base-bg-colour:var(--success-bg)}.danger{--base-bg-colour:var(--danger-bg)}.warning{--base-bg-colour:var(--warning-bg)}.info{--base-bg-colour:var(--info-bg)}.light{--base-bg-colour:var(--light-bg)}.dark{--base-bg-colour:var(--dark-bg);color:var(--dark-bg-text)}.container{width:100%;margin-left:auto;margin-right:auto;padding-left:15px;padding-right:15px;box-sizing:border-box}.row{display:flex;margin-bottom:5px;flex-wrap:wrap}.col{flex:1;max-width:100%}.col-1{width:8.33%}.col-2{width:16.66%}.col-3,.w-25{width:25%}.col-4{width:33.33%}.col-5{width:41.66%}.col-6,.w-50{width:50%}.col-7{width:58.33%}.col-8{width:66.66%}.col-9,.w-75{width:75%}.col-10{width:83.33%}.col-11{width:91.66%}.col-12,.w-100{width:100%}@media (min-width:576px){.col-sm-1{width:8.33%}.col-sm-2{width:16.66%}.col-sm-3{width:25%}.col-sm-4{width:33.33%}.col-sm-5{width:41.66%}.col-sm-6{width:50%}.col-sm-7{width:58.33%}.col-sm-8{width:66.66%}.col-sm-9{width:75%}.col-sm-10{width:83.33%}.col-sm-11{width:91.66%}.col-sm-12{width:100%}}@media (min-width:768px){.col-md-1{width:8.33%}.col-md-2{width:16.66%}.col-md-3{width:25%}.col-md-4{width:33.33%}.col-md-5{width:41.66%}.col-md-6{width:50%}.col-md-7{width:58.33%}.col-md-8{width:66.66%}.col-md-9{width:75%}.col-md-10{width:83.33%}.col-md-11{width:91.66%}.col-md-12{width:100%}}@media (min-width:992px){.col-lg-1{width:8.33%}.col-lg-2{width:16.66%}.col-lg-3{width:25%}.col-lg-4{width:33.33%}.col-lg-5{width:41.66%}.col-lg-6{width:50%}.col-lg-7{width:58.33%}.col-lg-8{width:66.66%}.col-lg-9{width:75%}.col-lg-10{width:83.33%}.col-lg-11{width:91.66%}.col-lg-12{width:100%}}@media (min-width:1200px){.col-xl-1{width:8.33%}.col-xl-2{width:16.66%}.col-xl-3{width:25%}.col-xl-4{width:33.33%}.col-xl-5{width:41.66%}.col-xl-6{width:50%}.col-xl-7{width:58.33%}.col-xl-8{width:66.66%}.col-xl-9{width:75%}.col-xl-10{width:83.33%}.col-xl-11{width:91.66%}.col-xl-12{width:100%}}.axis-vert{flex-direction:column}.axis-horz{flex-direction:row}.justify-start{display:flex;justify-content:flex-start}.justify-end{display:flex;justify-content:flex-end}.justify-center{display:flex;justify-content:center}.justify-between{display:flex;justify-content:space-between}.justify-around{display:flex;justify-content:space-around}.justify-evenly{display:flex;justify-content:space-evenly}.align-start{display:flex;align-items:flex-start}.align-end{display:flex;align-items:flex-end}.align-center{display:flex;align-items:center}.h-25{height:25%}.h-50{height:50%}.h-75{height:75%}.h-100{height:100%}.vh-25{height:25vh}.vh-50{height:50vh}.vh-75{height:75vh}.vh-100{height:100vh}.vw-25{width:25vw}.vw-50{width:50vw}.vw-75{width:75vw}.vw-100{width:100vw}.text-center{text-align:center}.text-left{text-align:start}.text-right{text-align:end} \ No newline at end of file diff --git a/src/static/signin-callback.html b/src/static/signin-callback.html new file mode 100644 index 0000000..a1ca86a --- /dev/null +++ b/src/static/signin-callback.html @@ -0,0 +1,30 @@ + + + + + Title + + + + + + + \ No newline at end of file diff --git a/src/static/signout-callback.html b/src/static/signout-callback.html new file mode 100644 index 0000000..c087cb7 --- /dev/null +++ b/src/static/signout-callback.html @@ -0,0 +1,30 @@ + + + + + Title + + + + + + + \ No newline at end of file