From 1d204f26b8d55a71ada16bb08534b5f9e7059730 Mon Sep 17 00:00:00 2001 From: apeters Date: Wed, 21 May 2025 08:05:07 +0000 Subject: [PATCH] pre-Korves.Net Signed-off-by: apeters --- .gitignore | 168 + components/cache.py | 25 + components/cluster/__init__.py | 624 ++ components/cluster/cli.py | 57 + components/cluster/cluster.py | 4 + components/cluster/exceptions.py | 23 + components/cluster/leader.py | 60 + components/cluster/monitor.py | 196 + components/cluster/peers.py | 71 + components/cluster/ssl.py | 21 + components/logs/__init__.py | 18 + components/logs/log.py | 124 + components/models/__init__.py | 26 + components/models/cluster.py | 193 + components/models/objects.py | 628 ++ components/models/system.py | 91 + components/models/tables.py | 49 + components/models/users.py | 264 + components/objects.py | 401 + components/system.py | 18 + components/users.py | 228 + components/utils/__init__.py | 99 + components/utils/cryptography.py | 129 + components/utils/datetimes.py | 28 + components/web/__init__.py | 149 + components/web/blueprints/__init__.py | 6 + components/web/blueprints/auth.py | 647 ++ components/web/blueprints/objects.py | 265 + components/web/blueprints/profile.py | 103 + components/web/blueprints/root.py | 46 + components/web/blueprints/system.py | 302 + components/web/blueprints/users.py | 211 + components/web/static_files/.gitignore | 1 + components/web/static_files/css/.gitignore | 4 + .../web/static_files/css/pico-custom.css | 9363 +++++++++++++++++ .../web/static_files/css/pico-custom.scss | 485 + components/web/static_files/empty.html | 0 .../static_files/fonts/Go-Bold-Italic.woff2 | Bin 0 -> 49992 bytes .../web/static_files/fonts/Go-Bold.woff2 | Bin 0 -> 48036 bytes .../web/static_files/fonts/Go-Italic.woff2 | Bin 0 -> 50028 bytes .../static_files/fonts/Go-Medium-Italic.woff2 | Bin 0 -> 56328 bytes .../web/static_files/fonts/Go-Medium.woff2 | Bin 0 -> 53740 bytes .../fonts/Go-Mono-Bold-Italic.woff2 | Bin 0 -> 57164 bytes .../web/static_files/fonts/Go-Mono-Bold.woff2 | Bin 0 -> 53868 bytes .../static_files/fonts/Go-Mono-Italic.woff2 | Bin 0 -> 57288 bytes .../web/static_files/fonts/Go-Mono.woff2 | Bin 0 -> 55056 bytes .../web/static_files/fonts/Go-Regular.woff2 | Bin 0 -> 47924 bytes .../fonts/Go-Smallcaps-Italic.woff2 | Bin 0 -> 45772 bytes .../web/static_files/fonts/Go-Smallcaps.woff2 | Bin 0 -> 43764 bytes components/web/static_files/fonts/LICENSE.txt | 36 + .../web/static_files/hyperscript/common._hs | 272 + .../js/_hyperscript/_hyperscript.js | 7723 ++++++++++++++ .../js/_hyperscript/_hyperscript.template.js | 86 + .../web/static_files/js/htmx.org/htmx.org.js | 5261 +++++++++ .../js/htmx.org/htmx.org.json-enc.js | 35 + .../js/htmx.org/htmx.org.loading-states.js | 1 + .../static_files/js/htmx.org/htmx.org.ws.js | 471 + .../simplewebauthn-browser.js | 3 + components/web/static_files/js/site.js | 61 + components/web/static_files/js/uservault.js | 223 + components/web/static_files/manifest.json | 8 + .../web/templates/auth/authenticate.html | 21 + .../templates/auth/includes/login/login.html | 82 + .../auth/includes/register/register.html | 23 + .../templates/auth/login/request/confirm.html | 38 + .../auth/login/request/internal/confirm.html | 19 + .../templates/auth/login/request/start.html | 24 + .../web/templates/auth/login/token.html | 29 + .../auth/register/request/confirm.html | 18 + .../web/templates/auth/register/token.html | 33 + components/web/templates/base.html | 59 + components/web/templates/ehlo.svg | 473 + .../web/templates/includes/form_builder.html | 309 + components/web/templates/includes/menu.html | 163 + .../web/templates/includes/notifications.html | 82 + .../web/templates/includes/warnings.html | 12 + .../objects/includes/create/addresses.html | 23 + .../objects/includes/create/domains.html | 8 + .../objects/includes/create/emailusers.html | 8 + .../objects/includes/create/keypairs.html | 8 + .../includes/objects/row/addresses.html | 18 + .../objects/includes/objects/row/domains.html | 14 + .../includes/objects/row/emailusers.html | 14 + .../includes/objects/row/keypairs.html | 14 + .../objects/includes/objects/select.html | 22 + .../objects/includes/objects/table.html | 26 + .../objects/includes/objects/table_body.html | 4 + .../objects/table_filters/addresses.html | 39 + .../objects/table_filters/domains.html | 0 .../objects/table_filters/emailusers.html | 0 .../objects/table_filters/keypairs.html | 0 .../includes/objects/table_navigation.html | 56 + components/web/templates/objects/object.html | 50 + components/web/templates/objects/objects.html | 42 + .../profile/includes/credentials.html | 75 + components/web/templates/profile/profile.html | 35 + .../templates/system/includes/logs/row.html | 9 + .../templates/system/includes/logs/table.html | 32 + .../system/includes/logs/table_body.html | 4 + .../includes/logs/table_navigation.html | 60 + .../system/includes/users/groups.html | 116 + .../templates/system/includes/users/row.html | 23 + .../system/includes/users/select.html | 14 + .../system/includes/users/table.html | 25 + .../system/includes/users/table_body.html | 4 + .../includes/users/table_navigation.html | 51 + components/web/templates/system/logs.html | 27 + components/web/templates/system/settings.html | 50 + components/web/templates/system/status.html | 111 + components/web/templates/system/user.html | 89 + components/web/templates/system/users.html | 31 + components/web/utils/__init__.py | 96 + components/web/utils/locking.py | 123 + components/web/utils/notifications.py | 119 + components/web/utils/quart.py | 12 + components/web/utils/wrappers.py | 207 + config/defaults.py | 38 + ctrl | 119 + main.py | 81 + pyproject.toml | 3 + requirements.txt | 7 + system/certs/.gitignore | 2 + 122 files changed, 32601 insertions(+) create mode 100644 .gitignore create mode 100644 components/cache.py create mode 100644 components/cluster/__init__.py create mode 100644 components/cluster/cli.py create mode 100644 components/cluster/cluster.py create mode 100644 components/cluster/exceptions.py create mode 100644 components/cluster/leader.py create mode 100644 components/cluster/monitor.py create mode 100644 components/cluster/peers.py create mode 100644 components/cluster/ssl.py create mode 100644 components/logs/__init__.py create mode 100644 components/logs/log.py create mode 100644 components/models/__init__.py create mode 100644 components/models/cluster.py create mode 100644 components/models/objects.py create mode 100644 components/models/system.py create mode 100644 components/models/tables.py create mode 100644 components/models/users.py create mode 100644 components/objects.py create mode 100644 components/system.py create mode 100644 components/users.py create mode 100644 components/utils/__init__.py create mode 100644 components/utils/cryptography.py create mode 100644 components/utils/datetimes.py create mode 100644 components/web/__init__.py create mode 100644 components/web/blueprints/__init__.py create mode 100644 components/web/blueprints/auth.py create mode 100644 components/web/blueprints/objects.py create mode 100644 components/web/blueprints/profile.py create mode 100644 components/web/blueprints/root.py create mode 100644 components/web/blueprints/system.py create mode 100644 components/web/blueprints/users.py create mode 100644 components/web/static_files/.gitignore create mode 100644 components/web/static_files/css/.gitignore create mode 100644 components/web/static_files/css/pico-custom.css create mode 100644 components/web/static_files/css/pico-custom.scss create mode 100644 components/web/static_files/empty.html create mode 100644 components/web/static_files/fonts/Go-Bold-Italic.woff2 create mode 100644 components/web/static_files/fonts/Go-Bold.woff2 create mode 100644 components/web/static_files/fonts/Go-Italic.woff2 create mode 100644 components/web/static_files/fonts/Go-Medium-Italic.woff2 create mode 100644 components/web/static_files/fonts/Go-Medium.woff2 create mode 100644 components/web/static_files/fonts/Go-Mono-Bold-Italic.woff2 create mode 100644 components/web/static_files/fonts/Go-Mono-Bold.woff2 create mode 100644 components/web/static_files/fonts/Go-Mono-Italic.woff2 create mode 100644 components/web/static_files/fonts/Go-Mono.woff2 create mode 100644 components/web/static_files/fonts/Go-Regular.woff2 create mode 100644 components/web/static_files/fonts/Go-Smallcaps-Italic.woff2 create mode 100644 components/web/static_files/fonts/Go-Smallcaps.woff2 create mode 100644 components/web/static_files/fonts/LICENSE.txt create mode 100644 components/web/static_files/hyperscript/common._hs create mode 100644 components/web/static_files/js/_hyperscript/_hyperscript.js create mode 100644 components/web/static_files/js/_hyperscript/_hyperscript.template.js create mode 100644 components/web/static_files/js/htmx.org/htmx.org.js create mode 100644 components/web/static_files/js/htmx.org/htmx.org.json-enc.js create mode 100644 components/web/static_files/js/htmx.org/htmx.org.loading-states.js create mode 100644 components/web/static_files/js/htmx.org/htmx.org.ws.js create mode 100644 components/web/static_files/js/simplewebauthn-browser/simplewebauthn-browser.js create mode 100644 components/web/static_files/js/site.js create mode 100644 components/web/static_files/js/uservault.js create mode 100644 components/web/static_files/manifest.json create mode 100644 components/web/templates/auth/authenticate.html create mode 100644 components/web/templates/auth/includes/login/login.html create mode 100644 components/web/templates/auth/includes/register/register.html create mode 100644 components/web/templates/auth/login/request/confirm.html create mode 100644 components/web/templates/auth/login/request/internal/confirm.html create mode 100644 components/web/templates/auth/login/request/start.html create mode 100644 components/web/templates/auth/login/token.html create mode 100644 components/web/templates/auth/register/request/confirm.html create mode 100644 components/web/templates/auth/register/token.html create mode 100644 components/web/templates/base.html create mode 100644 components/web/templates/ehlo.svg create mode 100644 components/web/templates/includes/form_builder.html create mode 100644 components/web/templates/includes/menu.html create mode 100644 components/web/templates/includes/notifications.html create mode 100644 components/web/templates/includes/warnings.html create mode 100644 components/web/templates/objects/includes/create/addresses.html create mode 100644 components/web/templates/objects/includes/create/domains.html create mode 100644 components/web/templates/objects/includes/create/emailusers.html create mode 100644 components/web/templates/objects/includes/create/keypairs.html create mode 100644 components/web/templates/objects/includes/objects/row/addresses.html create mode 100644 components/web/templates/objects/includes/objects/row/domains.html create mode 100644 components/web/templates/objects/includes/objects/row/emailusers.html create mode 100644 components/web/templates/objects/includes/objects/row/keypairs.html create mode 100644 components/web/templates/objects/includes/objects/select.html create mode 100644 components/web/templates/objects/includes/objects/table.html create mode 100644 components/web/templates/objects/includes/objects/table_body.html create mode 100644 components/web/templates/objects/includes/objects/table_filters/addresses.html create mode 100644 components/web/templates/objects/includes/objects/table_filters/domains.html create mode 100644 components/web/templates/objects/includes/objects/table_filters/emailusers.html create mode 100644 components/web/templates/objects/includes/objects/table_filters/keypairs.html create mode 100644 components/web/templates/objects/includes/objects/table_navigation.html create mode 100644 components/web/templates/objects/object.html create mode 100644 components/web/templates/objects/objects.html create mode 100644 components/web/templates/profile/includes/credentials.html create mode 100644 components/web/templates/profile/profile.html create mode 100644 components/web/templates/system/includes/logs/row.html create mode 100644 components/web/templates/system/includes/logs/table.html create mode 100644 components/web/templates/system/includes/logs/table_body.html create mode 100644 components/web/templates/system/includes/logs/table_navigation.html create mode 100644 components/web/templates/system/includes/users/groups.html create mode 100644 components/web/templates/system/includes/users/row.html create mode 100644 components/web/templates/system/includes/users/select.html create mode 100644 components/web/templates/system/includes/users/table.html create mode 100644 components/web/templates/system/includes/users/table_body.html create mode 100644 components/web/templates/system/includes/users/table_navigation.html create mode 100644 components/web/templates/system/logs.html create mode 100644 components/web/templates/system/settings.html create mode 100644 components/web/templates/system/status.html create mode 100644 components/web/templates/system/user.html create mode 100644 components/web/templates/system/users.html create mode 100644 components/web/utils/__init__.py create mode 100644 components/web/utils/locking.py create mode 100644 components/web/utils/notifications.py create mode 100644 components/web/utils/quart.py create mode 100644 components/web/utils/wrappers.py create mode 100644 config/defaults.py create mode 100755 ctrl create mode 100644 main.py create mode 100644 pyproject.toml create mode 100644 requirements.txt create mode 100644 system/certs/.gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..17d1877 --- /dev/null +++ b/.gitignore @@ -0,0 +1,168 @@ +system/certs/* +database/ +logs/* +misc/* + +.sync +rsync.sh + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ diff --git a/components/cache.py b/components/cache.py new file mode 100644 index 0000000..608d635 --- /dev/null +++ b/components/cache.py @@ -0,0 +1,25 @@ +from components.database import IN_MEMORY_DB +from components.models import UUID, validate_call +from components.utils import ensure_list + + +@validate_call +def buster(object_id: UUID | list[UUID]): + object_ids = ensure_list(object_id) + for object_id in object_ids: + object_id = str(object_id) + + for user_id in IN_MEMORY_DB["OBJECTS_CACHE"]: + cached_keys = list(IN_MEMORY_DB["OBJECTS_CACHE"][user_id].keys()) + if object_id in cached_keys: + mapping_name = IN_MEMORY_DB["OBJECTS_CACHE"][user_id][object_id].name + if object_id in IN_MEMORY_DB["OBJECTS_CACHE"][user_id]: + del IN_MEMORY_DB["OBJECTS_CACHE"][user_id][object_id] + + for user_id in IN_MEMORY_DB["FORM_OPTIONS_CACHE"]: + for option in IN_MEMORY_DB["FORM_OPTIONS_CACHE"][user_id].copy(): + if any( + d["value"] == object_id + for d in IN_MEMORY_DB["FORM_OPTIONS_CACHE"][user_id][option] + ): + del IN_MEMORY_DB["FORM_OPTIONS_CACHE"][user_id][option] diff --git a/components/cluster/__init__.py b/components/cluster/__init__.py new file mode 100644 index 0000000..f840834 --- /dev/null +++ b/components/cluster/__init__.py @@ -0,0 +1,624 @@ +import asyncio +import base64 +import json +import os +import random +import re +import socket +import sys +import zlib + +from config import defaults +from contextlib import closing, suppress +from components.cluster.exceptions import ( + IncompleteClusterResponses, + DistLockCancelled, + UnknownPeer, + ZombiePeer, +) +from components.cluster.cli import cli_processor +from components.models.cluster import ( + CritErrors, + Role, + FilePath, + validate_call, + ConnectionStatus, +) +from components.cluster.leader import elect_leader +from components.cluster.peers import Peers +from components.cluster.monitor import Monitor +from components.cluster.ssl import get_ssl_context +from components.logs import logger +from components.database import * +from components.utils.cryptography import dict_digest_sha1 +from components.utils.datetimes import ntime_utc_now +from components.utils import ensure_list, is_path_within_cwd, chunk_string + + +class Cluster: + def __init__(self, peers, port): + self.locks = dict() + self.port = port + self.receiving = asyncio.Condition() + self.tickets = dict() + self._partial_tickets = dict() + self.monitor = Monitor(self) + self.server_limit = 104857600 # 100 MiB + self.peers = Peers(peers) + self.sending = asyncio.Lock() + self._session_patched_tables = dict() + + def _release_tables(self, tables): + for t in tables: + with suppress(RuntimeError): + self.locks[t]["lock"].release() + self.locks[t]["ticket"] = None + + async def read_command(self, reader: asyncio.StreamReader) -> tuple[str, str, dict]: + bytes_to_read = int.from_bytes(await reader.readexactly(4), "big") + input_bytes = await reader.readexactly(bytes_to_read) + + input_decoded = input_bytes.strip().decode("utf-8") + data, _, meta = input_decoded.partition(" :META ") + ticket, _, cmd = data.partition(" ") + + patterns = [ + r"NAME (?P\S+)", + r"SWARM (?P\S+)", + r"STARTED (?P\S+)", + r"LEADER (?P\S+)", + ] + + match = re.search(" ".join(patterns), meta) + meta_dict = match.groupdict() + name = meta_dict["name"] + + if not name in self.peers.remotes: + raise UnknownPeer(name) + + self.peers.remotes[name].leader = meta_dict["leader"] + self.peers.remotes[name].started = float(meta_dict["started"]) + self.peers.remotes[name].swarm = meta_dict["swarm"] + + msg = cmd[:150] + (cmd[150:] and "...") + logger.debug(f"[← Receiving from {name}][{ticket}] - {msg}") + + return ticket, cmd, meta_dict + + async def incoming_handler( + self, reader: asyncio.StreamReader, writer: asyncio.StreamWriter + ): + monitor_init = False + raddr, *_ = writer.get_extra_info("peername") + socket, *_ = writer.get_extra_info("socket").getsockname() + + if socket and raddr in defaults.CLUSTER_CLI_BINDINGS: + return await cli_processor((reader, writer)) + + if raddr not in self.peers.remote_ips(): + raise UnknownPeer(raddr) + + while True: + try: + ticket, cmd, peer_meta = await self.read_command(reader) + if not monitor_init: + self.peers.remotes[peer_meta["name"]].streams._in = ( + reader, + writer, + ) + await self.monitor.start_peer_monitoring(peer_meta["name"]) + monitor_init = True + except (asyncio.exceptions.IncompleteReadError, ConnectionResetError): + break + except TimeoutError as e: + if str(e) == "SSL shutdown timed out": + break + raise + except ZombiePeer: + await self.send_command( + CritErrors.ZOMBIE.response, peer_meta["name"], ticket=ticket + ) + break + try: + if not self.peers.local.leader and not any( + map( + lambda s: cmd.startswith(s), + ["ACK", "STATUS", "FULLTABLE", "INIT"], + ) + ): + await self.send_command( + CritErrors.NOT_READY.response, peer_meta["name"], ticket=ticket + ) + + elif cmd.startswith("PATCHTABLE") or cmd.startswith("FULLTABLE"): + _, _, payload = cmd.partition(" ") + table_w_hash, table_payload = payload.split(" ") + table, table_digest = table_w_hash.split("@") + db_params = evaluate_db_params(ticket) + + async with TinyDB(**db_params) as db: + if not table in db.tables(): + await self.send_command( + CritErrors.NO_SUCH_TABLE.response, + peer_meta["name"], + ticket=ticket, + ) + else: + if not ticket in self._session_patched_tables: + self._session_patched_tables[ticket] = set() + + self._session_patched_tables[ticket].add(table) + + try: + if cmd.startswith("PATCHTABLE"): + table_data = { + doc.doc_id: doc for doc in db.table(table).all() + } + errors = [] + local_table_digest = dict_digest_sha1(table_data) + if local_table_digest != table_digest: + await self.send_command( + CritErrors.TABLE_HASH_MISMATCH.response, + peer_meta["name"], + ticket=ticket, + ) + continue + + diff = json.loads(base64.b64decode(table_payload)) + + for doc_id, docs in diff["changed"].items(): + a, b = docs + c = db.table(table).get(doc_id=doc_id) + if c != a: + await self.send_command( + CritErrors.DOC_MISMATCH.response, + peer_meta["name"], + ticket=ticket, + ) + break + db.table(table).upsert( + Document(b, doc_id=doc_id) + ) + else: # if no break occured, continue + for doc_id, doc in diff["added"].items(): + db.table(table).insert( + Document(doc, doc_id=doc_id) + ) + db.table(table).remove( + Query().id.one_of( + [ + doc["id"] + for doc in diff["removed"].values() + ] + ) + ) + + elif cmd.startswith("FULLTABLE"): + insert_data = json.loads( + base64.b64decode(table_payload) + ) + db.table(table).truncate() + for doc_id, doc in insert_data.items(): + db.table(table).insert( + Document(doc, doc_id=doc_id) + ) + + await self.send_command( + "ACK", peer_meta["name"], ticket=ticket + ) + + except Exception as e: + await self.send_command( + CritErrors.CANNOT_APPLY.response, + peer_meta["name"], + ticket=ticket, + ) + continue + + elif cmd == "COMMIT": + if not ticket in self._session_patched_tables: + await self.send_command( + CritErrors.NOTHING_TO_COMMIT.response, + peer_meta["name"], + ticket=ticket, + ) + continue + + commit_tables = self._session_patched_tables[ticket] + del self._session_patched_tables[ticket] + await dbcommit(commit_tables, ticket) + await self.send_command("ACK", peer_meta["name"], ticket=ticket) + + elif cmd == "STATUS" or cmd == "INIT": + await self.send_command("ACK", peer_meta["name"], ticket=ticket) + + elif cmd == "BYE": + self.peers.remotes[peer_meta["name"]] = self.peers.remotes[ + peer_meta["name"] + ].reset() + + elif cmd.startswith("FILEGET"): + _, _, payload = cmd.partition(" ") + start, end, file = payload.split(" ") + + if not is_path_within_cwd(file) or not os.path.exists(file): + await self.send_command( + CritErrors.INVALID_FILE_PATH.response, + peer_meta["name"], + ticket=ticket, + ) + continue + + if os.stat(file).st_size < int(start): + await self.send_command( + CritErrors.START_BEHIND_FILE_END.response, + peer_meta["name"], + ticket=ticket, + ) + continue + + with open(file, "rb") as f: + f.seek(int(start)) + compressed_data = zlib.compress(f.read(int(end))) + compressed_data_encoded = base64.b64encode( + compressed_data + ).decode("utf-8") + + chunks = chunk_string(f"{file} {compressed_data_encoded}") + for idx, c in enumerate(chunks, 1): + await self.send_command( + f"PACK CHUNKED {idx} {len(chunks)} {c}", + peer_meta["name"], + ticket=ticket, + ) + + elif cmd.startswith("UNLOCK"): + _, _, tables_str = cmd.partition(" ") + tables = tables_str.split(",") + + for t in tables: + with suppress(RuntimeError): + self.locks[t]["lock"].release() + self.locks[t]["ticket"] = None + + await self.send_command("ACK", peer_meta["name"], ticket=ticket) + + elif cmd.startswith("LOCK"): + _, _, tables_str = cmd.partition(" ") + tables = tables_str.split(",") + + if peer_meta["swarm"] != self.peers.local.swarm: + await self.send_command( + CritErrors.PEERS_MISMATCH.response, + peer_meta["name"], + ticket=ticket, + ) + continue + + try: + for t in tables: + if t not in self.locks: + self.locks[t] = { + "lock": asyncio.Lock(), + "ticket": None, + } + await asyncio.wait_for( + self.locks[t]["lock"].acquire(), + 0.3 + random.uniform(0.1, 0.5), + ) + self.locks[t]["ticket"] = ticket + + except TimeoutError: + await self.send_command( + "ACK BUSY", peer_meta["name"], ticket=ticket + ) + else: + await self.send_command("ACK", peer_meta["name"], ticket=ticket) + + elif cmd.startswith("PACK"): + if not ticket in self._partial_tickets: + self._partial_tickets[ticket] = [] + + _, _, payload = cmd.partition(" ") + _, idx, total, partial_data = payload.split(" ", 3) + + self._partial_tickets[ticket].append(partial_data) + if idx == total: + self.tickets[ticket].add( + (peer_meta["name"], "".join(self._partial_tickets[ticket])) + ) + + elif cmd.startswith("ACK"): + _, _, payload = cmd.partition(" ") + if ticket in self.tickets: + self.tickets[ticket].add((peer_meta["name"], payload)) + + async with self.receiving: + self.receiving.notify_all() + + except ConnectionResetError: + break + + async def send_command(self, cmd, peers, ticket: str | None = None): + if not ticket: + ticket = str(ntime_utc_now()) + + if peers == "*": + peers = self.peers.remotes.keys() + else: + peers = ensure_list(peers) + + if ticket not in self.tickets: + self.tickets[ticket] = set() + + successful_receivers = [] + + for name in peers: + async with self.peers.remotes[name].sending_lock: + con, status = await self.peers.remotes[name].connect() + if con: + reader, writer = con + buffer_data = [ + ticket, + cmd, + ":META", + f"NAME {self.peers.local.name}", + "SWARM {swarm}".format( + swarm=self.peers.local.swarm or "?CONFUSED" + ), + f"STARTED {self.peers.local.started}", + "LEADER {leader}".format( + leader=self.peers.local.leader or "?CONFUSED" + ), + ] + buffer_bytes = " ".join(buffer_data).encode("utf-8") + writer.write(len(buffer_bytes).to_bytes(4, "big")) + writer.write(buffer_bytes) + await writer.drain() + + msg = cmd[:150] + (cmd[150:] and "...") + logger.debug(f"[→ Sending to {name}][{ticket}] - {msg}") + + successful_receivers.append(name) + else: + logger.warning(f"Cannot send to peer {name} - {status}") + + return ticket, successful_receivers + + async def release(self, tables: list = ["main"]) -> str: + CTX_TICKET.reset(self._ctx_ticket) + + if self.peers.local.role == Role.FOLLOWER: + try: + ticket, receivers = await self.send_command( + f"UNLOCK {','.join(tables)}", + self.peers.local.leader, + ) + async with self.receiving: + ret, responses = await self.await_receivers( + ticket, receivers, raise_err=True + ) + except IncompleteClusterResponses: + self._release_tables(tables) + raise DistLockCancelled( + "Leader did not respond properly to unlock request" + ) + + self._release_tables(tables) + + async def acquire_lock(self, tables: list = ["main"]) -> str: + try: + ticket = str(ntime_utc_now()) + for t in tables: + if t not in self.locks: + self.locks[t] = { + "lock": asyncio.Lock(), + "ticket": None, + } + + await asyncio.wait_for(self.locks[t]["lock"].acquire(), 20.0) + self.locks[t]["ticket"] = ticket + + except TimeoutError: + raise DistLockCancelled("Unable to acquire local lock") + + if self.peers.local.role == Role.FOLLOWER: + try: + if not self.peers.local.leader: + self._release_tables(tables) + raise IncompleteClusterResponses("Cluster is not ready") + + ticket, receivers = await self.send_command( + f"LOCK {','.join(tables)}", self.peers.local.leader + ) + + async with self.receiving: + result, responses = await self.await_receivers( + ticket, receivers, raise_err=False + ) + + if "BUSY" in responses: + self._release_tables(tables) + return await self.acquire_lock(tables) + + elif not result: + self._release_tables(tables) + if CritErrors.PEERS_MISMATCH in responses: + raise DistLockCancelled( + "Leader rejected lock due to member inconsistency" + ) + else: + raise DistLockCancelled( + "Cannot acquire lock from leader, trying a re-election" + ) + + except asyncio.CancelledError: + self._release_tables(tables) + raise DistLockCancelled("Application raised CancelledError") + + self._ctx_ticket = CTX_TICKET.set(ticket) + + @validate_call + async def request_files( + self, + files: FilePath | list[FilePath], + peers: str | list, + start: int = 0, + end: int = -1, + ): + assert self.locks["files"]["lock"].locked() + for file in ensure_list(files): + try: + if not is_path_within_cwd(file): + logger.error(f"File not within cwd: {file}") + continue + + for peer in ensure_list(peers): + peer_start = start + peer_end = end + assert peer in self.peers.remotes + if peer_start == -1: + if os.path.exists(f"peer_files/{peer}/{file}"): + peer_start = os.stat(f"peer_files/{peer}/{file}").st_size + else: + peer_start = 0 + + ticket, receivers = await self.send_command( + f"FILEGET {peer_start} {peer_end} {file}", peer + ) + async with self.receiving: + _, response = await self.await_receivers( + ticket, receivers, raise_err=True + ) + + for r in response: + r_file, r_data = r.split(" ") + assert FilePath(r_file) == file + file_dest = f"peer_files/{peer}/{file}" + os.makedirs(os.path.dirname(file_dest), exist_ok=True) + payload = zlib.decompress(base64.b64decode(r_data)) + if os.path.exists(file_dest): + mode = "r+b" + else: + mode = "w+b" + with open(file_dest, mode) as f: + f.seek(peer_start) + f.write(payload) + + except IncompleteClusterResponses: + logger.error(f"Sending command to peers '{peers}' failed") + raise + except Exception as e: + logger.error(f"Unhandled error: {e}") + raise + + async def run(self, shutdown_trigger) -> None: + server = await asyncio.start_server( + self.incoming_handler, + self.peers.local._all_bindings_as_str, + self.port, + ssl=get_ssl_context("server"), + limit=self.server_limit, + ) + self._shutdown = shutdown_trigger + + logger.info( + f"Listening on {self.port} on address {' and '.join(self.peers.local._all_bindings_as_str)}..." + ) + + async with server: + for name in self.peers.remotes: + ip, status = self.peers.remotes[name]._eval_ip() + if ip: + con, status = await self.peers.remotes[name].connect(ip) + if con: + ticket, receivers = await self.send_command("INIT", name) + async with self.receiving: + ret, responses = await self.await_receivers( + ticket, receivers, raise_err=False + ) + if CritErrors.ZOMBIE in responses: + logger.critical( + f"Peer {name} has not yet disconnected a previous session: {status}" + ) + shutdown_trigger.set() + break + else: + logger.debug(f"Not sending INIT to peer {name}: {status}") + else: + logger.debug(f"Not sending INIT to peer {name}: {status}") + + t = asyncio.create_task(self.monitor._ticket_worker(), name="tickets") + self.monitor.tasks.add(t) + t.add_done_callback(self.monitor.tasks.discard) + + try: + binds = [s.getsockname()[0] for s in server.sockets] + for local_rbind in self.peers.local._bindings_as_str: + if local_rbind not in binds: + logger.critical( + f"Could not bind requested address {local_rbind}" + ) + shutdown_trigger.set() + break + else: + await shutdown_trigger.wait() + except asyncio.CancelledError: + if self.peers.get_established(): + await self.send_command("BYE", "*") + + [t.cancel() for t in self.monitor.tasks] + + async def await_receivers( + self, + ticket, + receivers, + raise_err: bool, + timeout: float = defaults.CLUSTER_PEERS_TIMEOUT * len(defaults.CLUSTER_PEERS), + ): + errors = [] + missing_receivers = [] + + assert self.receiving.locked() + + if timeout >= defaults.CLUSTER_PEERS_TIMEOUT * len(defaults.CLUSTER_PEERS) + 10: + raise ValueError("Timeout is too high") + + try: + while not all( + r in [peer for peer, _ in self.tickets[ticket]] for r in receivers + ): + await asyncio.wait_for(self.receiving.wait(), timeout) + except TimeoutError: + missing_receivers = [ + r + for r in receivers + if r not in [peer for peer, _ in self.tickets[ticket]] + ] + errors.append( + f"Timeout waiting for receviers: {', '.join(missing_receivers)}" + ) + + finally: + responses = [] + + for peer, response in self.tickets[ticket]: + if response in CritErrors._value2member_map_: + responses.append(CritErrors(response)) + errors.append(f"CRIT response from {peer}: {CritErrors(response)}") + else: + responses.append(response) + + if not missing_receivers and len(responses) != len(receivers): + errors.append("Unplausible amount of responses for ticket") + + self.tickets.pop(ticket, None) + + if errors: + logger.error("\n".join(errors)) + if raise_err: + raise IncompleteClusterResponses("\n".join(errors)) + else: + logger.success(f"{ticket} OK") + + return not errors, responses diff --git a/components/cluster/cli.py b/components/cluster/cli.py new file mode 100644 index 0000000..193f18d --- /dev/null +++ b/components/cluster/cli.py @@ -0,0 +1,57 @@ +import asyncio +import json +import random + + +async def cli_processor(streams: tuple[asyncio.StreamReader, asyncio.StreamWriter]): + from components.users import what_id, get + from components.database import IN_MEMORY_DB + + try: + reader, writer = streams + while not reader.at_eof(): + cmd = await reader.readexactly(1) + if cmd == b"\x97": + data = await reader.readuntil(b"\n") + login = data.strip().decode("utf-8") + try: + user_id = await what_id(login=login) + user = await get(user_id=user_id) + if "system" not in user.acl: + IN_MEMORY_DB["PROMOTE_USERS"].add(user_id) + writer.write(b"\x01") + else: + writer.write(b"\x02") + except Exception as e: + writer.write(b"\x03") + await writer.drain() + elif cmd == b"\x98": + awaiting = dict() + idx = 1 + for k, v in IN_MEMORY_DB.items(): + if ( + isinstance(v, dict) + and v.get("token_type") == "cli_confirmation" + ): + awaiting[idx] = (k, v["intention"]) + idx += 1 + writer.write(f"{json.dumps(awaiting)}\n".encode("ascii")) + await writer.drain() + elif cmd == b"\x99": + data = await reader.readexactly(14) + confirmed = data.strip().decode("ascii") + code = "%06d" % random.randint(0, 999999) + IN_MEMORY_DB.get(confirmed, {}).update( + {"status": "confirmed", "code": code} + ) + writer.write(f"{code}\n".encode("ascii")) + await writer.drain() + except Exception as e: + if type(e) not in [ + asyncio.exceptions.IncompleteReadError, + ConnectionResetError, + ]: + raise + finally: + writer.close() + await writer.wait_closed() diff --git a/components/cluster/cluster.py b/components/cluster/cluster.py new file mode 100644 index 0000000..30c28c6 --- /dev/null +++ b/components/cluster/cluster.py @@ -0,0 +1,4 @@ +from config.defaults import CLUSTER_PEERS +from components.cluster import Cluster + +cluster = Cluster(peers=CLUSTER_PEERS, port=2102) diff --git a/components/cluster/exceptions.py b/components/cluster/exceptions.py new file mode 100644 index 0000000..68f305a --- /dev/null +++ b/components/cluster/exceptions.py @@ -0,0 +1,23 @@ +from werkzeug.exceptions import HTTPException + + +class DistLockCancelled(Exception): + pass + + +class IncompleteClusterResponses(Exception): + pass + + +class ZombiePeer(Exception): + pass + + +class UnknownPeer(Exception): + pass + + +class ClusterHTTPException(HTTPException): + def __init__(self, description=None): + super().__init__(description) + self.code = 999 diff --git a/components/cluster/leader.py b/components/cluster/leader.py new file mode 100644 index 0000000..717c996 --- /dev/null +++ b/components/cluster/leader.py @@ -0,0 +1,60 @@ +from components.logs import logger +from components.models.cluster import Role + + +def elect_leader(peers: "Peers") -> None: + def _destroy(): + peers.local.leader = None + peers.local.role = Role.FOLLOWER + peers.local.swarm = "" + + n_eligible_peers = len(peers.get_established(include_local=True)) + n_all_peers = len(peers.remotes) + 1 # + self + + if not (n_eligible_peers >= (51 / 100) * n_all_peers): + logger.info("Cannot elect leader node, not enough peers") + _destroy() + return + + leader, started = min( + ( + (peer, peer_data.started) + for peer, peer_data in peers.remotes.items() + if peer_data._fully_established + ), + key=lambda x: x[1], + default=(None, float("inf")), + ) + + if peers.local.started < started: + if peers.local.leader != peers.local.name: + logger.info("This node has been elected as the leader.") + peers.local.leader = peers.local.name + peers.local.role = Role.LEADER + + else: + if peers.remotes[leader].leader == "?CONFUSED": + _destroy() + logger.info( + f"""Potential leader node '{leader}' is still in the +election process or confused; waiting.""" + ) + return + + if peers.remotes[leader].leader != leader: + _destroy() + logger.warning( + f"Potential leader node '{leader}' reports a different leader; waiting" + ) + return + + if peers.local.leader != leader: + peers.local.leader = leader + peers.local.role = Role.FOLLOWER + logger.info(f"Elected node '{leader}' as the leader") + + if peers.local.leader: + peers.local.swarm = ";".join(peers.get_established(include_local=True)) + peers.local.swarm_complete = n_eligible_peers == n_all_peers + + logger.debug(f"Cluster size {n_eligible_peers}/{n_all_peers}") diff --git a/components/cluster/monitor.py b/components/cluster/monitor.py new file mode 100644 index 0000000..e0544a3 --- /dev/null +++ b/components/cluster/monitor.py @@ -0,0 +1,196 @@ +import asyncio +from contextlib import suppress + +from config import defaults +from components.logs import logger +from components.utils.datetimes import ntime_utc_now +from components.cluster.leader import elect_leader +from components.cluster.exceptions import ZombiePeer + + +class Monitor: + def __init__(self, cluster_instance: "Cluster"): + self.cluster_instance = cluster_instance + self.tasks = set() + + async def _ticket_worker(self): + """ + This asynchronous method checks for locks on tables and releases them if existent. It also deletes the tickets from + the cluster instance, which have exceeded the timeout threshold. It performs these checks every 10 seconds until + a shutdown is set. + + There are no input parameters for this function and it does not return anything. It gives an output through logs or errors. + """ + while not self.cluster_instance._shutdown.is_set(): + for table in self.cluster_instance.locks: + ticket = self.cluster_instance.locks[table]["ticket"] + table_locked = self.cluster_instance.locks[table]["lock"].locked() + + if (table_locked and not ticket) or ( + ntime_utc_now() - float(ticket or "inf") + ) > 20.0: + with suppress(RuntimeError): + self.cluster_instance.locks[table]["lock"].release() + self.cluster_instance.locks[table]["ticket"] = None + logger.error( + f"Force release of table '{table}': " + + f"Ticket: {ticket} / Lock status: {table_locked}" + ) + + for t in self.cluster_instance.tickets.copy(): + if ntime_utc_now() - float(t) > ( + defaults.CLUSTER_PEERS_TIMEOUT * len(defaults.CLUSTER_PEERS) + 10 + ): + with suppress(KeyError): + del self.cluster_instance.tickets[t] + + await asyncio.sleep(10) + + async def _cleanup_peer_connection(self, peer): + """ + Clean up a peer connection. Warning logs are created for the peer removal. The cluster instance of peers is reset + and if the shutdown is not set, leadership is elected and commands are sent to non-local peers. + + Args: + peer: the peer for whom the connection needs to be cleaned up. + """ + logger.warning(f"Removing {peer}") + self.cluster_instance.peers.remotes[peer] = self.cluster_instance.peers.remotes[ + peer + ].reset() + if not self.cluster_instance._shutdown.is_set(): + async with self.cluster_instance.receiving: + elect_leader(self.cluster_instance.peers) + if self.cluster_instance.peers.local.swarm != "": + for p in self.cluster_instance.peers.local.swarm.split(";"): + if p != self.cluster_instance.peers.local.name: + try: + ( + ticket, + receivers, + ) = await self.cluster_instance.send_command( + "STATUS", + p, + ) + except ConnectionResetError: + pass + + async def _peer_worker(self, name): + """ + The method works with the name as an input and evaluates the stream for the same. It also handles leader election + and various exception handling regarding connection reset and timeouts. + + Args: + name: the name for whom the peer works. + """ + ireader, iwriter = self.cluster_instance.peers.remotes[name].streams._in + timeout_c = 0 + c = -1 + + logger.info(f"Evaluating stream for {name}") + while not name in self.cluster_instance.peers.get_established(): + await asyncio.sleep(0.125) + + oreader, owriter = self.cluster_instance.peers.remotes[name].streams.out + + elect_leader(self.cluster_instance.peers) + + while True and timeout_c < 3: + try: + assert not all( + [ + oreader.at_eof(), + ireader.at_eof(), + iwriter.is_closing(), + owriter.is_closing(), + ] + ) + + async with asyncio.timeout(defaults.CLUSTER_PEERS_TIMEOUT * 3): + iwriter.write(b"\x11") + await iwriter.drain() + res = await oreader.readexactly(1) + assert res == b"\x11" + + timeout_c = 0 + c += 0.25 + await asyncio.sleep(0.25) + + if not c % 5: + if ( + not self.cluster_instance.peers.local.leader + or not self.cluster_instance.peers.local.swarm_complete + ): + try: + ( + ticket, + receivers, + ) = await self.cluster_instance.send_command( + "STATUS", + "*" + if self.cluster_instance.peers.local.leader + and not self.cluster_instance.peers.local.swarm_complete + else name, + ) + except ConnectionResetError: + break + + async with self.cluster_instance.receiving: + elect_leader(self.cluster_instance.peers) + await self.cluster_instance.await_receivers( + ticket, receivers, raise_err=False, timeout=3 + ) + c = 0 + + except TimeoutError: + timeout_c += 1 + continue + except ( + AssertionError, + ConnectionResetError, + asyncio.exceptions.IncompleteReadError, + ): + logger.error(f"Peer {name} failed") + break + + if c != -1: + try: + iwriter.close() + async with asyncio.timeout(0.1): + await iwriter.wait_closed() + except (ConnectionResetError, TimeoutError): + pass + + try: + owriter.close() + async with asyncio.timeout(0.1): + await owriter.wait_closed() + await owriter.wait_closed() + except (ConnectionResetError, TimeoutError): + pass + + def _on_task_done(self, task: asyncio.Task): + """ + Called when an asyncio Task is done. A cleanup peer connection task is created and the original task is removed + from the set of tasks. + + Args: + task: The task that was completed. + """ + asyncio.create_task(self._cleanup_peer_connection(task.get_name())) + self.tasks.discard(task) + + async def start_peer_monitoring(self, name): + """ + Start monitoring a peer. If the name of the peer is already in the list of tasks, it raises a ZombiePeer exception + and otherwise, the peer worker is created as a task with the peer’s name. + + Args: + name: the name of the peer to monitor. + """ + if name in [task.get_name() for task in self.tasks]: + raise ZombiePeer(name) + + t = asyncio.create_task(self._peer_worker(name), name=name) + self.tasks.add(t) + t.add_done_callback(self._on_task_done) diff --git a/components/cluster/peers.py b/components/cluster/peers.py new file mode 100644 index 0000000..e0da036 --- /dev/null +++ b/components/cluster/peers.py @@ -0,0 +1,71 @@ +from components.logs import logger +from components.models.cluster import LocalPeer, RemotePeer +from components.utils import ensure_list + + +class Peers: + def __init__(self, peers): + self.remotes = dict() + + for peer in peers: + if not peer.get("is_self", False): + _peer = RemotePeer(**peer) + self.remotes[_peer.name] = _peer + + self.local = LocalPeer(**next(peer for peer in peers if peer.get("is_self"))) + self._peers = peers + + def get_offline_peers(self): + return [p for p in self.remotes if p not in self.get_established()] + + def get_established(self, names_only: bool = True, include_local: bool = False): + peers = [] + for peer, peer_data in self.remotes.items(): + if peer_data._fully_established == True: + if names_only: + peers.append(peer_data.name) + else: + peers.append(peer_data) + + if include_local: + if names_only: + peers.append(self.local.name) + else: + peers.append(self.local) + + if names_only: + return sorted(peers) + return sorted(peers, key=lambda peer: peer.name) + + def get_remote_peer_ip( + self, name: str, ip_version: str | list = ["ip4", "ip6", "nat_ip4"] + ): + def _select_best_ip(peer): + return ( + str(getattr(peer, "ip4")) + or str(getattr(peer, "ip6")) + or str(getattr(peer, "nat_ip4")) + ) + + def _get_ips(peer, ip_version): + return [ + str(ip) for key in ensure_list(ip_version) if (ip := getattr(peer, key)) + ] + + peer = self.remotes.get(name) + if peer: + if ip_version == "best": + return _select_best_ip(peer) + return _get_ips(peer, ip_version) + + def remote_ips(self): + for name in self.remotes: + for ip in self.get_remote_peer_ip( + name=name, ip_version=["ip4", "ip6", "nat_ip4"] + ): + yield ip + + def get_remote_peer_name(self, ip): + for peer_data in self.remotes.values(): + if ip in peer_data._all_ips_as_str: + return peer_data.name diff --git a/components/cluster/ssl.py b/components/cluster/ssl.py new file mode 100644 index 0000000..5a55486 --- /dev/null +++ b/components/cluster/ssl.py @@ -0,0 +1,21 @@ +import ssl +from components.logs import logger +from config import defaults + + +def get_ssl_context(type_value: str): + if type_value == "client": + context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) + elif type_value == "server": + context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) + else: + raise Exception("Unknown type_value") + + context.load_cert_chain( + certfile=defaults.TLS_CERTFILE, keyfile=defaults.TLS_KEYFILE + ) + context.load_verify_locations(cafile=defaults.TLS_CA) + context.check_hostname = False + context.verify_mode = ssl.VerifyMode.CERT_REQUIRED + context.minimum_version = ssl.TLSVersion.TLSv1_3 + return context diff --git a/components/logs/__init__.py b/components/logs/__init__.py new file mode 100644 index 0000000..04a61a3 --- /dev/null +++ b/components/logs/__init__.py @@ -0,0 +1,18 @@ +from components.logs import log +from config.defaults import ( + LOG_LEVEL, + LOG_FILE_ROTATION, + LOG_FILE_RETENTION, + CLUSTER_PEERS, +) + +logger = log.Logger() +logger.add( + f"logs/application.log", + level=LOG_LEVEL, + colorize=False, + max_size_mb=LOG_FILE_ROTATION, + retention=LOG_FILE_RETENTION, + text=lambda _: next(p["name"] for p in CLUSTER_PEERS if p.get("is_self")), + serialize=True, +) diff --git a/components/logs/log.py b/components/logs/log.py new file mode 100644 index 0000000..679696c --- /dev/null +++ b/components/logs/log.py @@ -0,0 +1,124 @@ +import logging +import json +import traceback +from logging.handlers import RotatingFileHandler +from components.utils.datetimes import datetime, timedelta + +SUCCESS_LEVEL = 25 +CRITICAL_LEVEL = 50 +logging.addLevelName(SUCCESS_LEVEL, "SUCCESS") +logging.addLevelName(CRITICAL_LEVEL, "CRITICAL") + +LOG_COLORS = { + "DEBUG": "\033[94m", + "INFO": "\033[96m", + "SUCCESS": "\033[92m", + "WARNING": "\033[93m", + "ERROR": "\033[91m", + "CRITICAL": "\033[95m", + "RESET": "\033[0m", + "BOLD": "\033[1m", +} + + +class JSONFormatter(logging.Formatter): + def __init__(self, text): + super().__init__() + self.text = text + + def format(self, record): + exc_text = None + if record.exc_info: + exc_text = traceback.format_exc() + + log_entry = { + "text": self.text, + "record": { + "elapsed": { + "repr": str(timedelta(seconds=record.relativeCreated / 1000)), + "seconds": record.relativeCreated / 1000, + }, + "exception": exc_text, + "extra": record.__dict__.get("extra", {}), + "file": {"name": record.filename, "path": record.pathname}, + "function": record.funcName, + "level": { + "icon": "✅" + if record.levelno == SUCCESS_LEVEL + else "ℹ️" + if record.levelno == logging.INFO + else "⚠️", + "name": record.levelname, + "no": record.levelno, + }, + "line": record.lineno, + "message": record.getMessage(), + "module": record.module, + "name": record.name, + "process": {"id": record.process, "name": record.processName}, + "thread": {"id": record.thread, "name": record.threadName}, + "time": { + "repr": datetime.utcfromtimestamp(record.created).isoformat() + + "+00:00", + "timestamp": record.created, + }, + }, + } + return json.dumps(log_entry) + + +class PlainTextFormatter(logging.Formatter): + def format(self, record): + log_time = datetime.utcfromtimestamp(record.created).strftime( + "%Y-%m-%d %H:%M:%S.%f" + )[:-3] + level_color = LOG_COLORS.get(record.levelname, LOG_COLORS["RESET"]) + message_bold = f"{LOG_COLORS['BOLD']}{record.getMessage()}{LOG_COLORS['RESET']}" + return f"{log_time} | {LOG_COLORS['BOLD']}{level_color}{record.levelname:<8}{LOG_COLORS['RESET']} | {record.funcName}:{record.lineno} - {message_bold}" + + +class Logger: + def __init__(self): + self.logger = logging.getLogger("custom_logger") + self.logger.setLevel(logging.DEBUG) + stdout_handler = logging.StreamHandler() + stdout_handler.setLevel(logging.DEBUG) + stdout_handler.setFormatter(PlainTextFormatter()) + self.logger.addHandler(stdout_handler) + + def add(self, filepath, level, colorize, max_size_mb, retention, text, serialize): + for handler in self.logger.handlers[:]: + if isinstance(handler, RotatingFileHandler): + self.logger.removeHandler(handler) + handler.close() + + handler = RotatingFileHandler( + filepath, + maxBytes=max_size_mb * 1024 * 1024, + backupCount=retention, + encoding="utf-8", + ) + handler.setLevel(level) + handler.setFormatter(JSONFormatter(text(None))) + self.logger.addHandler(handler) + + def log(self, level, message): + self.logger.log(level, message, stacklevel=2) + + def info(self, message): + self.logger.info(message, stacklevel=2) + + def warning(self, message): + self.logger.warning(message, stacklevel=2) + + def error(self, message): + self.logger.error(message, stacklevel=2) + + def debug(self, message): + self.logger.debug(message, stacklevel=2) + + def success(self, message): + self.logger.log(SUCCESS_LEVEL, message, stacklevel=2) + + def critical(self, message): + self.logger.log(CRITICAL_LEVEL, message, exc_info=True, stacklevel=2) diff --git a/components/models/__init__.py b/components/models/__init__.py new file mode 100644 index 0000000..a4577ac --- /dev/null +++ b/components/models/__init__.py @@ -0,0 +1,26 @@ +import email_validator +from pydantic import ( + AfterValidator, + BaseModel, + BeforeValidator, + computed_field, + ConfigDict, + conint, + constr, + Field, + field_serializer, + field_validator, + FilePath, + model_validator, + TypeAdapter, + validate_call, + ValidationError, +) +from pydantic.networks import IPvAnyAddress +from pydantic_core import PydanticCustomError +from typing import List, Dict, Any, Literal, Annotated, Any +from uuid import UUID, uuid4 +from enum import Enum + +email_validator.TEST_ENVIRONMENT = True +validate_email = email_validator.validate_email diff --git a/components/models/cluster.py b/components/models/cluster.py new file mode 100644 index 0000000..ab8a33c --- /dev/null +++ b/components/models/cluster.py @@ -0,0 +1,193 @@ +import asyncio +import socket + +from components.cluster.ssl import get_ssl_context +from components.models import * +from components.utils.datetimes import ntime_utc_now +from config import defaults +from contextlib import closing + + +class Role(Enum): + LEADER = 1 + FOLLOWER = 2 + + +class ConnectionStatus(Enum): + CONNECTED = 0 + REFUSED = 1 + SOCKET_REFUSED = 2 + ALL_AVAILABLE_FAILED = 3 + OK = 4 + OK_WITH_PREVIOUS_ERRORS = 5 + + +class CritErrors(Enum): + NOT_READY = "CRIT:NOT_READY" + NO_SUCH_TABLE = "CRIT:NO_SUCH_TABLE" + TABLE_HASH_MISMATCH = "CRIT:TABLE_HASH_MISMATCH" + CANNOT_APPLY = "CRIT:CANNOT_APPLY" + NOTHING_TO_COMMIT = "CRIT:NOTHING_TO_COMMIT" + INVALID_FILE_PATH = "CRIT:INVALID_FILE_PATH" + START_BEHIND_FILE_END = "CRIT:START_BEHIND_FILE_END" + PEERS_MISMATCH = "CRIT:PEERS_MISMATCH" + DOC_MISMATCH = "CRIT:DOC_MISMATCH" + ZOMBIE = "CRIT:ZOMBIE" + + @property + def response(self): + return f"ACK {self.value}" + + +class LocalPeer(BaseModel): + @model_validator(mode="before") + @classmethod + def pre_init(cls, data: Any) -> Any: + if not data["ip4"] and not data["ip6"]: + raise ValueError("Neither a IPv4 nor a IPv6 address was provided") + return data + + @field_validator("is_self") + def local_self_validator(cls, v): + if v != True: + raise ValueError("LocalPeer does not have is_self flag") + return v + + is_self: bool + name: constr(pattern=r"^[a-zA-Z0-9\-_\.]+$", min_length=3) + ip4: IPvAnyAddress | None = None + ip6: IPvAnyAddress | None = None + cli_bindings: list[IPvAnyAddress] = defaults.CLUSTER_CLI_BINDINGS + leader: str | None = None + role: Role = Role.FOLLOWER + swarm: str = "" + started: float = ntime_utc_now() + swarm_complete: bool = False + + @computed_field + @property + def _bindings_as_str(self) -> str: + return [str(ip) for key in ("ip4", "ip6") if (ip := getattr(self, key))] + + @computed_field + @property + def _all_bindings_as_str(self) -> str: + return [ + str(ip) for key in ("ip4", "ip6") if (ip := getattr(self, key)) + ] + self.cli_bindings + + @model_validator(mode="after") + def cli_bindings_validator(self): + for ip in self.cli_bindings: + if ip == self.ip4 or ip == self.ip6: + raise ValueError("CLI bindings overlap local bindings") + return self + + +class Streams(BaseModel): + model_config = ConfigDict(arbitrary_types_allowed=True) + + out: tuple[asyncio.StreamReader, asyncio.StreamWriter] | None = None + _in: tuple[asyncio.StreamReader, asyncio.StreamWriter] | None = None + + +class RemotePeer(BaseModel): + model_config = ConfigDict(arbitrary_types_allowed=True) + + @model_validator(mode="before") + @classmethod + def pre_init(cls, data: Any) -> Any: + if not data["ip4"] and not data["ip6"]: + raise ValueError("Neither a IPv4 nor a IPv6 address was provided") + return data + + @field_validator("is_self") + def local_self_validator(cls, v): + if v: + raise ValueError("RemotePeer has is_self flag") + return v + + is_self: bool = False + sending_lock: asyncio.Lock = asyncio.Lock() + swarm: str = "" + leader: str | None = None + started: float | None = None + name: constr(pattern=r"^[a-zA-Z0-9\-_\.]+$", min_length=3) + ip4: IPvAnyAddress | None = None + ip6: IPvAnyAddress | None = None + nat_ip4: IPvAnyAddress | None = None + streams: Streams = Streams() + port: int = 2102 + + def reset(self): + self.streams._in = None + self.streams.out = None + self.leader = None + self.started = None + self.swarm = "" + return self + + def _eval_ip( + self, + ) -> tuple[IPvAnyAddress | None, tuple[ConnectionStatus, dict]]: + errors = dict() + peer_ips = [ip for ip in [self.ip4, self.ip6] if ip is not None] + for ip in peer_ips: + with closing( + socket.socket( + socket.AF_INET if ip.version == 4 else socket.AF_INET6, + socket.SOCK_STREAM, + ) + ) as sock: + sock.settimeout(defaults.CLUSTER_PEERS_TIMEOUT) + connection_return = sock.connect_ex((str(ip), self.port)) + if connection_return != 0: + errors[ip] = ( + ConnectionStatus.SOCKET_REFUSED, + socket.errno.errorcode.get(connection_return), + ) + else: + if errors: + return ip, (ConnectionStatus.OK_WITH_PREVIOUS_ERRORS, errors) + return ip, (ConnectionStatus.OK, errors) + else: + return None, (ConnectionStatus.ALL_AVAILABLE_FAILED, errors) + + async def connect( + self, + ip: IPvAnyAddress | None = None, + ) -> tuple[ + tuple[asyncio.StreamReader, asyncio.StreamWriter] | None, + tuple[ConnectionStatus, Any], + ]: + if not self.streams.out: + if not ip: + ip, status = self._eval_ip() + if not ip: + return None, status + try: + self.streams.out = await asyncio.open_connection( + str(ip), self.port, ssl=get_ssl_context("client") + ) + except ConnectionRefusedError as e: + return None, (ConnectionStatus.REFUSED, e) + + return self.streams.out, (ConnectionStatus.CONNECTED, None) + + @computed_field + @property + def _all_ips_as_str(self) -> str: + return [str(ip) for key in ("ip4", "ip6") if (ip := getattr(self, key))] + + @computed_field + @property + def _fully_established(self) -> str: + return ( + True + if self.streams.out + and self.streams._in + and self.swarm + and self.started + and self.leader + else False + ) diff --git a/components/models/objects.py b/components/models/objects.py new file mode 100644 index 0000000..a84cab0 --- /dev/null +++ b/components/models/objects.py @@ -0,0 +1,628 @@ +from components.utils import ensure_list, to_unique_sorted_str_list +from components.utils.datetimes import utc_now_as_str +from components.utils.cryptography import generate_rsa_dkim +from components.models import * + +POLICIES = [ + ("-- None --", "disallow_all"), + ("Send to external", "send_external"), + ("Receive from external", "receive_external"), + ("Send to internal", "send_internal"), + ("Receive from internal", "receive_internal"), +] + +POLICY_DESC = [p[1] for p in POLICIES] + + +def ascii_email(v): + try: + name = validate_email(v).ascii_email + except: + raise PydanticCustomError( + "name_invalid", + "The provided name is not a valid local part", + dict(name_invalid=v), + ) + return name + + +def ascii_domain(v): + try: + name = validate_email(f"name@{v}").ascii_domain + except: + raise PydanticCustomError( + "name_invalid", + "The provided name is not a valid domain name", + dict(name_invalid=v), + ) + return name + + +def ascii_local_part(v): + try: + name = validate_email(f"{v}@example.org").ascii_local_part + except: + raise PydanticCustomError( + "name_invalid", + "The provided name is not a valid local part", + dict(name_invalid=v), + ) + return name + + +class ObjectDomain(BaseModel): + def model_post_init(self, __context): + if ( + self.dkim_selector == self.arc_selector + and self.assigned_dkim_keypair != self.assigned_arc_keypair + ): + raise PydanticCustomError( + "selector_conflict", + "ARC and DKIM selectors cannot be the same while using different keys", + dict(), + ) + + @field_validator("bcc_inbound") + def bcc_inbound_validator(cls, v): + if v in [None, ""]: + return "" + return ascii_email(v) + + @field_validator("bcc_outbound") + def bcc_outbound_validator(cls, v): + if v in [None, ""]: + return "" + return ascii_email(v) + + @field_validator("domain") + def domain_validator(cls, v): + return ascii_domain(v) + + display_name: str = Field( + default="", + json_schema_extra={ + "title": "Display name", + "description": "The display name of the mailbox", + "type": "text", + "input_extra": 'autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"', + "form_id": f"mailbox-{str(uuid4())}", + }, + ) + + domain: str = Field( + json_schema_extra={ + "title": "Domain name", + "description": "A unique domain name", + "type": "text", + "input_extra": 'autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"', + "form_id": f"domain-{str(uuid4())}", + }, + ) + + bcc_inbound: str = Field( + default="", + json_schema_extra={ + "title": "BCC inbound", + "description": "BCC destination for incoming messages", + "type": "email", + "input_extra": 'autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"', + "form_id": f"bcc-inbound-{str(uuid4())}", + }, + ) + + bcc_outbound: str = Field( + default="", + json_schema_extra={ + "title": "BCC outbound", + "description": "BCC destination for outbound messages", + "type": "email", + "input_extra": 'autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"', + "form_id": f"bcc-outbound-{str(uuid4())}", + }, + ) + + n_mailboxes: conint(ge=0) | Literal[""] = Field( + default="", + json_schema_extra={ + "title": "Max. mailboxes", + "description": "Limit domain to n mailboxes", + "type": "number", + "input_extra": 'autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"', + "form_id": f"n-mailboxes-outbound-{str(uuid4())}", + }, + ) + + ratelimit: conint(ge=0) | Literal[""] = Field( + default="", + json_schema_extra={ + "title": "Ratelimit", + "description": "Amount of elements to allow in a given time unit (see below)", + "type": "number", + "input_extra": 'autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"', + "form_id": f"ratelimit-{str(uuid4())}", + }, + ) + + ratelimit_unit: Literal["day", "hour", "minute"] = Field( + default="hour", + json_schema_extra={ + "title": "Ratelimit unit", + "description": "Policy override options.", + "type": "select", + "options": [ + {"name": "Day", "value": "day"}, + {"name": "Hour", "value": "hour"}, + {"name": "Minute", "value": "minute"}, + ], + "input_extra": 'autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"', + "form_id": f"ratelimit-unit-{str(uuid4())}", + }, + ) + + dkim: Annotated[ + Literal[True, False], + BeforeValidator(lambda x: True if str(x).lower() == "true" else False), + AfterValidator(lambda x: True if str(x).lower() == "true" else False), + ] = Field( + default=True, + json_schema_extra={ + "title": "DKIM", + "description": "Enable DKIM signatures", + "type": "radio", + "input_extra": 'autocomplete="off"', + "form_id": f"dkim-signatures-{str(uuid4())}", + }, + ) + + arc: Annotated[ + Literal[True, False], + BeforeValidator(lambda x: True if str(x).lower() == "true" else False), + AfterValidator(lambda x: True if str(x).lower() == "true" else False), + ] = Field( + default=True, + json_schema_extra={ + "title": "ARC", + "description": "Enable ARC signatures", + "type": "radio", + "input_extra": 'autocomplete="off"', + "form_id": f"arc-signatures-{str(uuid4())}", + }, + ) + + dkim_selector: constr(strip_whitespace=True, min_length=1) = Field( + default="mail", + json_schema_extra={ + "title": "DKIM Selector", + "description": "Selector name", + "type": "text", + "input_extra": 'autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"', + "form_id": f"dkim-selector-{str(uuid4())}", + }, + ) + + arc_selector: constr(strip_whitespace=True, min_length=1) = Field( + default="mail", + json_schema_extra={ + "title": "ARC Selector", + "description": "Selector name", + "type": "text", + "input_extra": 'autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"', + "form_id": f"arc-selector-{str(uuid4())}", + }, + ) + + assigned_dkim_keypair: BaseModel | str = Field( + default="", + json_schema_extra={ + "title": "DKIM key pair", + "description": "Assign a key pair for DKIM signatures.", + "type": "keypair", + "input_extra": 'autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"', + "form_id": f"assigned-dkim-keypair-{str(uuid4())}", + }, + ) + + assigned_arc_keypair: BaseModel | str = Field( + default="", + json_schema_extra={ + "title": "ARC key pair", + "description": "Assign a key pair for ARC signatures.", + "type": "keypair", + "input_extra": 'autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"', + "form_id": f"assigned-arc-keypair-{str(uuid4())}", + }, + ) + + policies: Annotated[ + Literal[*POLICY_DESC] | list[Literal[*POLICY_DESC]], + AfterValidator(lambda x: to_unique_sorted_str_list(ensure_list(x))), + ] = Field( + default=["disallow_all"], + json_schema_extra={ + "title": "Policies", + "description": "Policies for this domain.", + "type": "select:multi", + "options": [{"name": p[0], "value": p[1]} for p in POLICIES], + "input_extra": '_="on change if event.target.value is \'disallow_all\' set my selectedIndex to 0 end" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"', + "form_id": f"policies-{str(uuid4())}", + }, + ) + + policy_weight: str = Field( + default="domain_mailbox", + json_schema_extra={ + "title": "Policy weight", + "description": "Policy override options.", + "type": "select", + "options": [ + {"name": "Domain > Mailbox", "value": "domain_mailbox"}, + {"name": "Mailbox > Domain", "value": "mailbox_domain"}, + ], + "input_extra": 'autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"', + "form_id": f"policy-weight-{str(uuid4())}", + }, + ) + + assigned_users: Annotated[ + str | list, + AfterValidator(lambda x: to_unique_sorted_str_list(ensure_list(x))), + ] = Field( + json_schema_extra={ + "title": "Assigned users", + "description": "Assign this object to users.", + "type": "users:multi", + "input_extra": 'autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"', + "form_id": f"assigned-users-{str(uuid4())}", + }, + ) + + +class ObjectAddress(BaseModel): + local_part: constr(strip_whitespace=True, min_length=1) = Field( + json_schema_extra={ + "title": "Local part", + "description": "A local part as in @example.org; must be unique in combination with its assigned domain", + "type": "text", + "input_extra": 'autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"', + "form_id": f"local-part-{str(uuid4())}", + }, + ) + + assigned_domain: BaseModel | str = Field( + json_schema_extra={ + "title": "Assigned domain", + "description": "Assign a domain for this address.", + "type": "domain", + "input_extra": 'autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"', + "form_id": f"domain-{str(uuid4())}", + }, + ) + + assigned_emailusers: Annotated[ + str | BaseModel | None | list[BaseModel | str | None], + AfterValidator(lambda x: to_unique_sorted_str_list(ensure_list(x))), + ] = Field( + default=[], + json_schema_extra={ + "title": "Assigned email users", + "description": "Assign this mailbox to email users.", + "type": "emailusers:multi", + "input_extra": 'autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"', + "form_id": f"assigned-emailusers-{str(uuid4())}", + }, + ) + + display_name: str = Field( + default="%DOMAIN_DISPLAY_NAME%", + json_schema_extra={ + "title": "Display name", + "description": "You can use %DOMAIN_DISPLAY_NAME% as variable", + "type": "text", + "input_extra": 'autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"', + "form_id": f"mailbox-{str(uuid4())}", + }, + ) + + policies: Annotated[ + Literal[*POLICY_DESC] | list[Literal[*POLICY_DESC]], + AfterValidator(lambda x: to_unique_sorted_str_list(ensure_list(x))), + ] = Field( + default=["disallow_all"], + json_schema_extra={ + "title": "Policies", + "description": "Policies for this address.", + "type": "select:multi", + "options": [{"name": p[0], "value": p[1]} for p in POLICIES], + "input_extra": '_="on change if event.target.value is \'disallow_all\' set my selectedIndex to 0 end" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"', + "form_id": f"policies-{str(uuid4())}", + }, + ) + + assigned_users: Annotated[ + str | list, + AfterValidator(lambda x: to_unique_sorted_str_list(ensure_list(x))), + ] = Field( + json_schema_extra={ + "title": "Assigned users", + "description": "Assign this object to users.", + "type": "users:multi", + "input_extra": 'autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"', + "form_id": f"assigned-users-{str(uuid4())}", + }, + ) + + +class ObjectUser(BaseModel): + username: constr(strip_whitespace=True, min_length=1) = Field( + json_schema_extra={ + "title": "Username", + "description": "A unique username", + "type": "text", + "input_extra": 'autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"', + "form_id": f"login-{str(uuid4())}", + }, + ) + + display_name: str = Field( + default="%MAILBOX_DISPLAY_NAME%", + json_schema_extra={ + "title": "Display name", + "description": "You can use %MAILBOX_DISPLAY_NAME% and %DOMAIN_DISPLAY_NAME% variables", + "type": "text", + "input_extra": 'autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"', + "form_id": f"mailbox-{str(uuid4())}", + }, + ) + + policies: Annotated[ + Literal[*POLICY_DESC] | list[Literal[*POLICY_DESC]], + AfterValidator(lambda x: to_unique_sorted_str_list(ensure_list(x))), + ] = Field( + default=["disallow_all"], + json_schema_extra={ + "title": "Policies", + "description": "Policies for this address.", + "type": "select:multi", + "options": [{"name": p[0], "value": p[1]} for p in POLICIES], + "input_extra": '_="on change if event.target.value is \'disallow_all\' set my selectedIndex to 0 end" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"', + "form_id": f"policies-{str(uuid4())}", + }, + ) + + assigned_users: Annotated[ + str | list, + AfterValidator(lambda x: to_unique_sorted_str_list(ensure_list(x))), + ] = Field( + json_schema_extra={ + "title": "Assigned users", + "description": "Assign this object to users.", + "type": "users:multi", + "input_extra": 'autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"', + "form_id": f"assigned-users-{str(uuid4())}", + }, + ) + + +class ObjectKeyPair(BaseModel): + private_key_pem: str + public_key_base64: str + key_size: int + key_name: constr(strip_whitespace=True, min_length=1) = Field( + default="KeyPair", + json_schema_extra={ + "title": "Name", + "description": "A human readable name", + "type": "text", + "input_extra": 'autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"', + "form_id": f"keyname-{str(uuid4())}", + }, + ) + assigned_users: Annotated[ + str | list, + AfterValidator(lambda x: to_unique_sorted_str_list(ensure_list(x))), + ] = Field( + json_schema_extra={ + "title": "Assigned users", + "description": "Assign this object to users.", + "type": "users:multi", + "input_extra": 'autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"', + "form_id": f"assigned-users-{str(uuid4())}", + }, + ) + + @computed_field + @property + def dns_formatted(self) -> str: + return ( + "v=DKIM1; p=" + self.public_key_base64 if self.public_key_base64 else None + ) + + +class ObjectBase(BaseModel): + id: Annotated[str, AfterValidator(lambda v: str(UUID(v)))] + created: str + updated: str + + +class ObjectBaseDomain(ObjectBase): + details: ObjectDomain + + @computed_field + @property + def name(self) -> str: + return self.details.domain + + +class ObjectBaseUser(ObjectBase): + details: ObjectUser + + @computed_field + @property + def name(self) -> str: + return self.details.username + + +class ObjectBaseAddress(ObjectBase): + details: ObjectAddress + + @computed_field + @property + def name(self) -> str: + return self.details.local_part + + +class ObjectBaseKeyPair(ObjectBase): + details: ObjectKeyPair + + @computed_field + @property + def name(self) -> str: + return self.details.key_name + + +class ObjectAdd(BaseModel): + @computed_field + @property + def id(self) -> str: + return str(uuid4()) + + @computed_field + @property + def created(self) -> str: + return utc_now_as_str() + + @computed_field + @property + def updated(self) -> str: + return utc_now_as_str() + + +class ObjectAddDomain(ObjectAdd): + details: ObjectDomain + + +class ObjectAddAddress(ObjectAdd): + details: ObjectAddress + + +class ObjectAddUser(ObjectAdd): + details: ObjectUser + + +class ObjectAddKeyPair(ObjectAdd): + def model_post_init(self, __context): + print(self) + print(__context) + + @model_validator(mode="before") + @classmethod + def pre_init(cls, data: Any) -> Any: + if not all( + data["details"].get(k) + for k in ObjectKeyPair.__fields__ + if k != "assigned_users" + ): + data["details"] = cls.generate_rsa( + 2048, + data["details"].get("assigned_users", []), + data["details"].get("key_name", "KeyPair"), + ) + return data + + @classmethod + def generate_rsa( + cls, key_size: int = 2048, assigned_users: list = [], key_name: str = "KeyPair" + ) -> "ObjectKeyPair": + priv, pub = generate_rsa_dkim(key_size) + return ObjectKeyPair( + private_key_pem=priv, + public_key_base64=pub, + key_size=key_size, + assigned_users=assigned_users, + key_name=key_name, + ).dict() + + details: ObjectKeyPair + + +class ObjectPatch(BaseModel): + model_config = ConfigDict(validate_assignment=True) + + @computed_field + @property + def updated(self) -> str: + return utc_now_as_str() + + +class ObjectPatchDomain(ObjectPatch): + details: ObjectDomain + + +class ObjectPatchUser(ObjectPatch): + details: ObjectUser + + +class ObjectPatchAddress(ObjectPatch): + details: ObjectAddress + + +class _KeyPairHelper(ObjectPatch): + key_name: constr(strip_whitespace=True, min_length=1) = Field( + default="KeyPair", + ) + assigned_users: Annotated[ + str | list, + AfterValidator(lambda x: to_unique_sorted_str_list(ensure_list(x))), + ] + + +class ObjectPatchKeyPair(ObjectPatch): + details: _KeyPairHelper + + +model_classes = { + "types": ["domains", "addresses", "emailusers", "keypairs"], + "forms": { + "domains": ObjectDomain, + "addresses": ObjectAddress, + "emailusers": ObjectUser, + "keypairs": ObjectKeyPair, + }, + "patch": { + "domains": ObjectPatchDomain, + "addresses": ObjectPatchAddress, + "emailusers": ObjectPatchUser, + "keypairs": ObjectPatchKeyPair, + }, + "add": { + "domains": ObjectAddDomain, + "addresses": ObjectAddAddress, + "emailusers": ObjectAddUser, + "keypairs": ObjectAddKeyPair, + }, + "base": { + "domains": ObjectBaseDomain, + "addresses": ObjectBaseAddress, + "emailusers": ObjectBaseUser, + "keypairs": ObjectBaseKeyPair, + }, + "unique_fields": { + "domains": ["domain"], + "addresses": ["local_part", "assigned_domain"], + "emailusers": ["username"], + "keypairs": ["key_name"], + }, + "system_fields": { + "domains": ["assigned_users", "n_mailboxes"], + "addresses": ["assigned_users"], + "emailusers": ["assigned_users"], + "keypairs": ["assigned_users"], + }, +} + + +class ObjectIdList(BaseModel): + object_id: Annotated[ + UUID | list[UUID], + AfterValidator(lambda x: to_unique_sorted_str_list(ensure_list(x))), + ] diff --git a/components/models/system.py b/components/models/system.py new file mode 100644 index 0000000..27a346d --- /dev/null +++ b/components/models/system.py @@ -0,0 +1,91 @@ +from config import defaults +from components.utils import ensure_list +from components.utils.datetimes import utc_now_as_str +from components.models import * + + +class SystemSettings(BaseModel): + ACCEPT_LANGUAGES: Annotated[ + list[Literal["en", "de"]], + BeforeValidator(lambda x: ensure_list(x)), + ] = Field( + min_length=1, + default=defaults.ACCEPT_LANGUAGES, + json_schema_extra={ + "title": "Accepted languages", + "description": "Accepted languages by the clients browser.", + "type": "list:text", + "input_extra": 'autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"', + "form_id": f"accept-languages-{str(uuid4())}", + }, + ) + + AUTH_REQUEST_TIMEOUT: int = Field( + default=defaults.AUTH_REQUEST_TIMEOUT, + json_schema_extra={ + "title": "Proxy timeout", + "description": "Proxy authentication timeout", + "type": "number", + "input_extra": 'autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"', + "form_id": f"proxy-auth-timeout-{str(uuid4())}", + }, + ) + + TABLE_PAGE_SIZE: int = Field( + default=defaults.TABLE_PAGE_SIZE, + json_schema_extra={ + "title": "Table page size", + "description": "Default table page size", + "type": "number", + "input_extra": 'autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"', + "form_id": f"table-page-size-{str(uuid4())}", + }, + ) + + LOG_FILE_RETENTION: int = Field( + default=defaults.LOG_FILE_RETENTION, + json_schema_extra={ + "title": "Log file retention", + "description": "Number of log files to keep after each rotation", + "type": "number", + "input_extra": 'autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"', + "form_id": f"log-file-retention-{str(uuid4())}", + }, + ) + + LOG_FILE_ROTATION: int = Field( + default=defaults.LOG_FILE_ROTATION, + json_schema_extra={ + "title": "Max size in bytes", + "description": "Log files will rotate after given bytes", + "type": "number", + "input_extra": 'autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"', + "form_id": f"log-file-rotation-{str(uuid4())}", + }, + ) + + TEMPLATES_AUTO_RELOAD: Annotated[ + Literal[True, False], + BeforeValidator(lambda x: True if str(x).lower() == "true" else False), + AfterValidator(lambda x: True if str(x).lower() == "true" else False), + ] = Field( + default=defaults.TEMPLATES_AUTO_RELOAD, + json_schema_extra={ + "title": "Reload templates", + "description": "Automatically reload templates on change", + "type": "radio", + "input_extra": 'autocomplete="off"', + "form_id": f"templats-auto-reload-{str(uuid4())}", + }, + ) + + +class SystemSettingsBase(BaseModel): + details: SystemSettings = SystemSettings() + + +class UpdateSystemSettings(SystemSettingsBase): + @computed_field + @property + def updated(self) -> str: + return utc_now_as_str() diff --git a/components/models/tables.py b/components/models/tables.py new file mode 100644 index 0000000..746ac73 --- /dev/null +++ b/components/models/tables.py @@ -0,0 +1,49 @@ +from config import defaults +from components.utils import ensure_list, to_unique_sorted_str_list +from components.models import * + + +class TableSearch(BaseModel): + q: Annotated[Any, AfterValidator(lambda x: str(x))] = "" + page: Annotated[Any, AfterValidator(lambda x: int(x) if x else 1)] = 1 + page_size: Annotated[ + Any, + AfterValidator(lambda x: int(x) if x else defaults.TABLE_PAGE_SIZE), + ] = defaults.TABLE_PAGE_SIZE + sorting: tuple = ("created", True) + filters: Annotated[ + Any, + AfterValidator(lambda x: to_unique_sorted_str_list(ensure_list(x))), + ] = {} + + @field_validator("filters", mode="after") + def filters_formatter(cls, v): + filters = dict() + for f in v: + key_name, key_value = f.split(":") + if key_name == "assigned_users": + continue + if key_name not in filters.keys(): + filters[key_name] = key_value + else: + if isinstance(filters[key_name], list): + filters[key_name].append(key_value) + else: + filters[key_name] = [filters[key_name], key_value] + + return filters + + @field_validator("sorting", mode="before") + def split_sorting(cls, v): + if isinstance(v, str): + match v.split(":"): + case [ + sort_attr, + direction, + ]: + sort_reverse = True if direction == "desc" else False + case _: + sort_reverse = True + sort_attr = "created" + + return (sort_attr, sort_reverse) diff --git a/components/models/users.py b/components/models/users.py new file mode 100644 index 0000000..6adfc61 --- /dev/null +++ b/components/models/users.py @@ -0,0 +1,264 @@ +import random +import json +from config.defaults import USER_ACLS, ACCESS_TOKEN_FORMAT, ACCEPT_LANGUAGES +from components.utils import ensure_list, to_unique_sorted_str_list +from components.utils.datetimes import ntime_utc_now, utc_now_as_str +from webauthn.helpers.structs import AuthenticatorTransport +from components.models import * + + +class TokenConfirmation(BaseModel): + confirmation_code: Annotated[int, AfterValidator(lambda i: "%06d" % i)] + token: str = constr(strip_whitespace=True, min_length=14, max_length=14) + + +class AuthToken(BaseModel): + login: str = constr(strip_whitespace=True, min_length=1) + + @computed_field + @property + def token(self) -> str: + return "%04d-%04d-%04d" % ( + random.randint(0, 9999), + random.randint(0, 9999), + random.randint(0, 9999), + ) + + +class Credential(BaseModel): + id: Annotated[str, AfterValidator(lambda x: bytes.fromhex(x))] | bytes + public_key: Annotated[str, AfterValidator(lambda x: bytes.fromhex(x))] | bytes + friendly_name: constr(strip_whitespace=True, min_length=1) + last_login: str + sign_count: int + transports: list[AuthenticatorTransport] | None = [] + active: bool + updated: str + created: str + + @field_serializer("id", "public_key") + def serialize_bytes_to_hex(self, v: bytes, _info): + return v.hex() if isinstance(v, bytes) else v + + +class AddCredential(BaseModel): + id: Annotated[bytes, AfterValidator(lambda x: x.hex())] | str + public_key: Annotated[bytes, AfterValidator(lambda x: x.hex())] | str + sign_count: int + friendly_name: str = "New passkey" + transports: list[AuthenticatorTransport] | None = [] + active: bool = True + last_login: str = "" + + @computed_field + @property + def created(self) -> str: + return utc_now_as_str() + + @computed_field + @property + def updated(self) -> str: + return utc_now_as_str() + + +class UserProfile(BaseModel): + model_config = ConfigDict(validate_assignment=True) + + @field_validator("email", mode="before") + def email_validator(cls, v): + if v in [None, ""]: + return "" + try: + email = validate_email(v, check_deliverability=False).ascii_email + except: + raise PydanticCustomError( + "email_invalid", + "The provided email address is invalid", + dict(provided_email=v), + ) + return email + + @field_validator("access_tokens", mode="after") + def access_tokens_validator(cls, v): + for s in v: + try: + TypeAdapter(ACCESS_TOKEN_FORMAT).validate_python(s) + except ValidationError as e: + s_priv = s[:3] + (s[3:] and "***") + raise PydanticCustomError( + "access_tokens", + f"The provided token {s_priv} is invalid", + dict(), + ) + + return v + + @field_validator("tresor", mode="after") + def parse_tresor(cls, v): + try: + if v: + tresor = json.loads(v) + assert all( + k in tresor.keys() + for k in ["public_key_pem", "wrapped_private_key", "iv", "salt"] + ) + return v + except: + raise PydanticCustomError( + "tresor", + f"The provided tresor data is invalid", + dict(), + ) + + tresor: str | None = Field( + default=None, + json_schema_extra={ + "title": "Personal tresor", + "type": "tresor", + "input_extra": 'autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"', + "form_id": f"tresor-{str(uuid4())}", + }, + ) + + email: str = Field( + default="", + json_schema_extra={ + "title": "Email address", + "description": "Your email address is optional", + "type": "email", + "input_extra": 'autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"', + "form_id": f"email-{str(uuid4())}", + }, + ) + + access_tokens: Annotated[ + str | list, + AfterValidator(lambda x: to_unique_sorted_str_list(ensure_list(x))), + ] = Field( + default=[], + json_schema_extra={ + "title": "Access tokens", + "description": "Tokens to access the API. Save profile after removing a token.", + "type": "list:text", + "input_extra": 'autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"', + "form_id": f"access-tokens-{str(uuid4())}", + }, + ) + + permit_auth_requests: Annotated[ + Literal[True, False], + BeforeValidator(lambda x: True if str(x).lower() == "true" else False), + AfterValidator(lambda x: True if str(x).lower() == "true" else False), + ] = Field( + default=True, + json_schema_extra={ + "title": "Authentication requests", + "description": "Allow other devices to issue authentication requests to active sessions via pop-up", + "type": "radio", + "input_extra": 'autocomplete="off"', + "form_id": f"proxy-login-{str(uuid4())}", + }, + ) + + updated: str | None = None + + +class User(BaseModel): + model_config = ConfigDict(validate_assignment=True) + + id: Annotated[str, AfterValidator(lambda v: str(UUID(v)))] + login: constr(strip_whitespace=True, min_length=1) + credentials: dict[str, Credential] | Annotated[ + str | list[str], + AfterValidator(lambda v: ensure_list(v)), + ] = {} + acl: Annotated[ + Literal[*USER_ACLS] | list[Literal[*USER_ACLS]], + AfterValidator(lambda v: ensure_list(v)), + ] + groups: Annotated[ + constr(strip_whitespace=True, min_length=1) + | list[constr(strip_whitespace=True, min_length=1)], + AfterValidator(lambda v: ensure_list(v)), + ] = [] + profile: UserProfile + created: str + updated: str + + +class UserGroups(BaseModel): + name: constr(strip_whitespace=True, min_length=1) + new_name: constr(strip_whitespace=True, min_length=1) + members: Annotated[ + str | list, + AfterValidator(lambda x: to_unique_sorted_str_list(ensure_list(x))), + ] = [] + + +class UserAdd(BaseModel): + login: str = constr(strip_whitespace=True, min_length=1) + credentials: list[str] = [] + acl: list[Literal[*USER_ACLS]] = ["user"] + profile: UserProfile = UserProfile.parse_obj({}) + groups: list[constr(strip_whitespace=True, min_length=1)] = [] + + @computed_field + @property + def id(self) -> str: + return str(uuid4()) + + @computed_field + @property + def created(self) -> str: + return utc_now_as_str() + + @computed_field + @property + def updated(self) -> str: + return utc_now_as_str() + + +class UserPatch(BaseModel): + login: str | None = None + acl: str | list = [] + credentials: str | list = [] + groups: str | list | None = None + + @computed_field + @property + def updated(self) -> str: + return utc_now_as_str() + + +class UserProfilePatch(BaseModel): + email: str | None = None + tresor: str | None = None + access_tokens: str | list = [] + permit_auth_requests: bool | None = None + + @computed_field + @property + def updated(self) -> str: + return utc_now_as_str() + + +class CredentialPatch(BaseModel): + friendly_name: str | None = None + active: bool | None = None + last_login: str | None = None + sign_count: int | None = None + + @computed_field + @property + def updated(self) -> str: + return utc_now_as_str() + + +class UserSession(BaseModel): + id: str + login: str + acl: list | str + cred_id: str | None = None + lang: Literal[*ACCEPT_LANGUAGES] = "en" + profile: dict | UserProfile | None = {} + login_ts: float = Field(default_factory=ntime_utc_now) diff --git a/components/objects.py b/components/objects.py new file mode 100644 index 0000000..6842ef8 --- /dev/null +++ b/components/objects.py @@ -0,0 +1,401 @@ +from components.models.objects import ( + ObjectIdList, + model_classes, + validate_call, + UUID, + Literal, +) +from components.web.utils.quart import current_app, session +from components.utils import ensure_list, merge_models +from components.cache import buster +from components.database import * + + +@validate_call +async def get( + object_type: Literal[*model_classes["types"]], + object_id: UUID | list[UUID], + permission_validation=True, +): + get_objects = ObjectIdList(object_id=object_id).object_id + db_params = evaluate_db_params() + + if current_app and session.get("id"): + user_id = session["id"] + else: + user_id = "anonymous" + + if not user_id in IN_MEMORY_DB["OBJECTS_CACHE"]: + IN_MEMORY_DB["OBJECTS_CACHE"][user_id] = dict() + + async with TinyDB(**db_params) as db: + found_objects = db.table(object_type).search(Query().id.one_of(get_objects)) + + object_data = [] + + for o in found_objects: + o_parsed = model_classes["base"][object_type].model_validate(o) + + if ( + not "system" in session["acl"] + and permission_validation == True + and user_id not in o_parsed.details.assigned_users + ): + continue + + for k, v in o_parsed.details.model_dump(mode="json").items(): + if k == "assigned_domain": + if not v in IN_MEMORY_DB["OBJECTS_CACHE"][user_id]: + IN_MEMORY_DB["OBJECTS_CACHE"][user_id][v] = await get( + object_type="domains", + object_id=v, + permission_validation=False, + ) + + o_parsed.details.assigned_domain = IN_MEMORY_DB["OBJECTS_CACHE"][ + user_id + ][v] + elif k in ["assigned_arc_keypair", "assigned_dkim_keypair"] and v: + if not v in IN_MEMORY_DB["OBJECTS_CACHE"][user_id]: + IN_MEMORY_DB["OBJECTS_CACHE"][user_id][v] = await get( + object_type="keypairs", + object_id=v, + permission_validation=False, + ) + setattr(o_parsed.details, k, IN_MEMORY_DB["OBJECTS_CACHE"][user_id][v]) + elif k == "assigned_emailusers" and v: + o_parsed.details.assigned_emailusers = [] + for u in ensure_list(v): + if not u in IN_MEMORY_DB["OBJECTS_CACHE"][user_id]: + IN_MEMORY_DB["OBJECTS_CACHE"][user_id][u] = await get( + object_type="emailusers", + object_id=u, + permission_validation=False, + ) + o_parsed.details.assigned_emailusers.append( + IN_MEMORY_DB["OBJECTS_CACHE"][user_id][u] + ) + + object_data.append(o_parsed) + + if len(object_data) == 1: + return object_data.pop() + + return object_data if object_data else None + + +async def delete( + object_type: Literal[*model_classes["types"]], + object_id: UUID | list[UUID], +): + delete_objects = [o for o in ensure_list(await get(object_type, object_id))] + db_params = evaluate_db_params() + + if object_type == "domains": + for o in delete_objects: + addresses = await search(object_type="addresses", fully_resolve=False) + if o.id in [address.details.assigned_domain for address in addresses]: + raise ValueError("name", f"Domain {o.name} is not empty") + + async with TinyDB(**db_params) as db: + buster([o.id for o in delete_objects]) + return db.table(object_type).remove( + Query().id.one_of([o.id for o in delete_objects]) + ) + + +@validate_call +async def patch( + object_type: Literal[*model_classes["types"]], + object_id: UUID | list[UUID], + data: dict, +): + assert current_app and session.get("id") + + to_patch_objects = [o for o in ensure_list(await get(object_type, object_id))] + db_params = evaluate_db_params() + + for to_patch in to_patch_objects: + if not "system" in session["acl"]: + if not "details" in data: + data["details"] = dict() + for f in model_classes["system_fields"][object_type]: + data["details"][f] = getattr(to_patch.details, f) + + patch_data = model_classes["patch"][object_type].model_validate(data) + patched_object = merge_models( + to_patch, patch_data + ) # returns updated to_patch model + + conflicts = await search( + object_type=object_type, + match_all={ + f: getattr(patched_object.details, f) + for f in model_classes["unique_fields"][object_type] + }, + fully_resolve=False, + ) + if [o.id for o in conflicts if o.id != patched_object.id]: + raise ValueError( + f"details.{model_classes['unique_fields'][object_type][0]}", + "The provided object exists", + ) + + if object_type == "domains": + if "system" in session["acl"]: + addresses_in_domain = await search( + object_type="addresses", + match_all={"assigned_domain": patched_object.id}, + fully_resolve=False, + ) + if ( + patched_object.details.n_mailboxes + and len(addresses_in_domain) > patched_object.details.n_mailboxes + ): + raise ValueError( + f"details.n_mailboxes", + f"Cannot reduce allowed mailboxes below {len(addresses_in_domain)}", + ) + + else: + for attr in ["assigned_dkim_keypair", "assigned_arc_keypair"]: + # keypairs default to "", verify + if attr not in data.get("details", {}): + continue + + patched_obj_keypair = getattr(patched_object.details, attr) + patched_obj_keypair_id = ( + patched_obj_keypair.id + if hasattr(patched_obj_keypair, "id") + else patched_obj_keypair + ) + + to_patch_obj_keypair = getattr(to_patch.details, attr) + to_patch_obj_keypair_id = ( + to_patch_obj_keypair.id + if hasattr(to_patch_obj_keypair, "id") + else to_patch_obj_keypair + ) + + if patched_obj_keypair_id != to_patch_obj_keypair_id: + if not "system" in session["acl"]: + if not await get("keypairs", to_patch_obj_keypair_id): + raise ValueError( + f"details.{attr}", + f"Cannot unassign a non-permitted keypair", + ) + if not await get("keypairs", patched_obj_keypair_id): + raise ValueError( + f"details.{attr}", + f"Cannot assign non-permitted keypair", + ) + if object_type == "addresses": + if not "system" in session["acl"]: + if ( + patched_object.details.assigned_domain + != to_patch.details.assigned_domain.id + ): # only when assigned_domain changed + if ( + not len( + await get( + "domains", + [ + patched_object.details.assigned_domain, + to_patch.details.assigned_domain.id, + ], + ) + ) + == 2 + ): + # disallow a change to a permitted domain if the current domain is not permitted + raise ValueError( + "details.assigned_domain", + f"Cannot assign selected domain for object {to_patch.details.local_part}", + ) + + if set(patched_object.details.assigned_emailusers) != set( + [u.id for u in to_patch.details.assigned_emailusers] + ): # only when assigned_emailusers changed + non_permitted_users = set() + + for emailuser in [ + *patched_object.details.assigned_emailusers, + *[u.id for u in to_patch.details.assigned_emailusers], + ]: + _ = await get( + object_type="emailusers", + object_id=emailuser, + permission_validation=False, + ) + if session["id"] not in _.details.assigned_users: + non_permitted_users.add(_.name if _ else "") + + if non_permitted_users: + # disallow a change to a permitted domain if the current domain is not permitted + raise ValueError( + "details.assigned_emailusers", + f"You are not allow to change email user assignments for {', '.join(non_permitted_users)} of address {to_patch.details.local_part}", + ) + if ( + patched_object.details.assigned_domain + != to_patch.details.assigned_domain.id + ): + addresses_in_new_domain_now = await search( + object_type="addresses", + match_all={ + "assigned_domain": patched_object.details.assigned_domain + }, + fully_resolve=False, + ) + new_domain_data = await get( + object_type="domains", + object_id=patched_object.details.assigned_domain, + permission_validation=True, + ) + if ( + new_domain_data.details.n_mailboxes + and new_domain_data.details.n_mailboxes + < (len(addresses_in_new_domain_now) + 1) + ): + raise ValueError( + f"details.assigned_domain", + "The domain's mailbox limit is reached", + ) + + async with TinyDB(**db_params) as db: + db.table(object_type).update( + patched_object.model_dump( + mode="json", exclude_none=True, exclude={"name", "id", "created"} + ), + Query().id == to_patch.id, + ) + buster([o.id for o in to_patch_objects]) + + return [o.id for o in to_patch_objects] + + +async def create( + object_type: Literal[*model_classes["types"]], + data: dict, +): + assert current_app and session.get("id") + + db_params = evaluate_db_params() + + if not "details" in data: + data["details"] = dict() + + data["details"]["assigned_users"] = session["id"] + + create_object = model_classes["add"][object_type].model_validate(data) + + conflicts = await search( + object_type=object_type, + match_all={ + f: getattr(create_object.details, f) + for f in model_classes["unique_fields"][object_type] + }, + fully_resolve=False, + ) + if [o.id for o in conflicts]: + raise ValueError( + f"details.{model_classes['unique_fields'][object_type][0]}", + "The provided object exists", + ) + + if object_type == "addresses": + if not "system" in session["acl"]: + if not await get("domains", create_object.details.assigned_domain): + raise ValueError("name", "The provided domain is unavailable") + + addresses_in_domain = await search( + object_type="addresses", + match_all={"assigned_domain": create_object.details.assigned_domain}, + fully_resolve=False, + ) + domain_data = await get( + object_type="domains", + object_id=create_object.details.assigned_domain, + permission_validation=True, + ) + + domain_assigned_users = set(domain_data.details.assigned_users) + domain_assigned_users.add(session["id"]) + create_object.details.assigned_users = list(domain_assigned_users) + + if domain_data.details.n_mailboxes and domain_data.details.n_mailboxes < ( + len(addresses_in_domain) + 1 + ): + raise ValueError( + f"details.assigned_domain", + "The domain's mailbox limit is reached", + ) + + if object_type == "domains": + if not "system" in session["acl"]: + raise ValueError("name", "You need system permission to create a domain") + + async with TinyDB(**db_params) as db: + insert_data = create_object.model_dump(mode="json") + db.table(object_type).insert(insert_data) + + try: + del IN_MEMORY_DB["FORM_OPTIONS_CACHE"][session.get("id")][object_type] + finally: + return insert_data["id"] + + +async def search( + object_type: Literal[*model_classes["types"]], + object_id: UUID | None = None, + match_all: dict = {}, + match_any: dict = {}, + fully_resolve: bool = False, +): + db_params = evaluate_db_params() + + def search_object_id(s): + return (object_id and str(object_id) == s) or not object_id + + def filter_details(s, _any: bool = False): + def match(key, value, current_data): + if key in current_data: + if isinstance(value, list): + return any(item in ensure_list(current_data[key]) for item in value) + + return value in current_data[key] + + for sub_key, sub_value in current_data.items(): + if isinstance(sub_value, dict): + if match(key, value, sub_value): # Recursive call + return True + return False + + if _any: + return any(match(k, v, s) for k, v in match_any.items()) + + return all(match(k, v, s) for k, v in match_all.items()) + + query = Query().id.test(search_object_id) + if match_all: + query = query & Query().details.test(filter_details) + if match_any: + query = query & Query().details.test(filter_details, True) + + async with TinyDB(**db_params) as db: + matches = db.table(object_type).search(query) + + if fully_resolve: + return ensure_list( + await get( + object_type=object_type, + object_id=[o["id"] for o in matches], + permission_validation=False, + ) + or [] + ) + else: + _parsed = [] + for o in matches: + _parsed.append(model_classes["base"][object_type].model_validate(o)) + return _parsed diff --git a/components/system.py b/components/system.py new file mode 100644 index 0000000..f903670 --- /dev/null +++ b/components/system.py @@ -0,0 +1,18 @@ +import os +import glob +from components.models.system import SystemSettingsBase +from components.database import TinyDB, TINYDB_PARAMS + + +async def get_system_settings(): + async with TinyDB(**TINYDB_PARAMS) as db: + settings = db.table("system_settings").get(doc_id=1) or {} + return SystemSettingsBase.parse_obj(settings).dict() + + +def list_application_log_files(): + yield "logs/application.log" + for peer_dir in glob.glob("peer_files/*"): + peer_log = os.path.join(peer_dir, "logs/application.log") + if os.path.isfile(peer_log): + yield peer_log diff --git a/components/users.py b/components/users.py new file mode 100644 index 0000000..7d9acc5 --- /dev/null +++ b/components/users.py @@ -0,0 +1,228 @@ +from components.models.users import ( + AddCredential, + CredentialPatch, + Credential, + User, + UserAdd, + UserPatch, + UserProfile, + UserProfilePatch, + UserSession, + constr, + validate_call, + UUID, +) +from components.utils import merge_models +from components.database import * +from components.cache import buster + + +def _create_credentials_mapping(credentials: dict): + user_credentials = dict() + for c in credentials: + user_credentials.update({c["id"]: Credential.model_validate(c)}) + return user_credentials + + +@validate_call +async def what_id(login: str): + db_params = evaluate_db_params() + + async with TinyDB(**db_params) as db: + user = db.table("users").get(Query().login == login) + + if user: + return user["id"] + else: + raise ValueError("login", "The provided login name is unknown") + + +@validate_call +async def create(data: dict): + db_params = evaluate_db_params() + create_user = UserAdd.model_validate(data) + + async with TinyDB(**db_params) as db: + if db.table("users").search(Query().login == create_user.login): + raise ValueError("name", "The provided login name exists") + insert_data = create_user.model_dump(mode="json") + db.table("users").insert(insert_data) + + for user_id in IN_MEMORY_DB["FORM_OPTIONS_CACHE"].copy(): + if "users" in IN_MEMORY_DB["FORM_OPTIONS_CACHE"][user_id]: + del IN_MEMORY_DB["FORM_OPTIONS_CACHE"][user_id]["users"] + + return insert_data["id"] + + +@validate_call +async def get(user_id: UUID, join_credentials: bool = True): + db_params = evaluate_db_params() + + async with TinyDB(**db_params) as db: + user = User.model_validate(db.table("users").get(Query().id == str(user_id))) + credentials = db.table("credentials").search( + (Query().id.one_of(user.credentials)) + ) + if join_credentials: + user.credentials = _create_credentials_mapping(credentials) + + return user + + +@validate_call +async def delete(user_id: UUID): + db_params = evaluate_db_params() + user = await get(user_id=user_id, join_credentials=False) + + if not user: + raise ValueError("name", "The provided user does not exist") + + async with TinyDB(**db_params) as db: + if len(db.table("users").all()) == 1: + raise ValueError("name", "Cannot delete last user") + + db.table("credentials").remove(Query().id.one_of(user.credentials)) + deleted = db.table("users").remove(Query().id == str(user_id)) + buster(user.id) + return user.id + + +@validate_call +async def create_credential(user_id: UUID, data: dict): + db_params = evaluate_db_params() + credential = AddCredential.model_validate(data) + user = await get(user_id=user_id, join_credentials=False) + if not user: + raise ValueError("name", "The provided user does not exist") + + async with TinyDB(**db_params) as db: + db.table("credentials").insert(credential.model_dump(mode="json")) + user.credentials.append(credential.id) + db.table("users").update( + {"credentials": user.credentials}, + Query().id == str(user_id), + ) + return credential.id + + +@validate_call +async def delete_credential( + user_id: UUID, hex_id: constr(pattern=r"^[0-9a-fA-F]+$", min_length=2) +): + db_params = evaluate_db_params() + user = await get(user_id=user_id, join_credentials=False) + + if not user: + raise ValueError("name", "The provided user does not exist") + + async with TinyDB(**db_params) as db: + if hex_id in user.credentials: + user.credentials.remove(hex_id) + db.table("credentials").remove(Query().id == hex_id) + db.table("users").update( + {"credentials": user.credentials}, Query().id == str(user_id) + ) + return hex_id + + +@validate_call +async def patch(user_id: UUID, data: dict): + db_params = evaluate_db_params() + user = await get(user_id=user_id, join_credentials=False) + + if not user: + raise ValueError("name", "The provided user does not exist") + + patch_data = UserPatch.model_validate(data) + patched_user = merge_models( + user, + patch_data, + exclude_strategies=["exclude_override_none"], + ) + + async with TinyDB(**db_params) as db: + if db.table("users").get( + (Query().login == patched_user.login) & (Query().id != str(user_id)) + ): + raise ValueError("login", "The provided login name exists") + + orphaned_credentials = [ + c for c in user.credentials if c not in patched_user.credentials + ] + db.table("users").update( + patched_user.model_dump(mode="json"), + Query().id == str(user_id), + ) + db.table("credentials").remove(Query().id.one_of(orphaned_credentials)) + + buster(user.id) + return user.id + + +@validate_call +async def patch_profile(user_id: UUID, data: dict): + db_params = evaluate_db_params() + user = await get(user_id=user_id, join_credentials=False) + + if not user: + raise ValueError("name", "The provided user does not exist") + + patch_data = UserProfilePatch.model_validate(data) + patched_user_profile = merge_models( + user.profile, patch_data, exclude_strategies=["exclude_override_none"] + ) + + async with TinyDB(**db_params) as db: + db.table("users").update( + {"profile": patched_user_profile.model_dump(mode="json")}, + Query().id == str(user_id), + ) + return user_id + + +@validate_call +async def patch_credential( + user_id: UUID, hex_id: constr(pattern=r"^[0-9a-fA-F]+$", min_length=2), data: dict +): + db_params = evaluate_db_params() + user = await get(user_id=user_id, join_credentials=True) + + if not user: + raise ValueError("name", "The provided user does not exist") + + if hex_id not in user.credentials: + raise ValueError( + "hex_id", + "The provided credential ID was not found in user context", + ) + + patch_data = CredentialPatch.model_validate(data) + patched_credential = merge_models( + user.credentials[hex_id], + patch_data, + exclude_strategies=["exclude_override_none"], + ) + + async with TinyDB(**db_params) as db: + db.table("credentials").update( + patched_credential.model_dump(mode="json"), Query().id == hex_id + ) + return hex_id + + +@validate_call +async def search( + name: constr(strip_whitespace=True, min_length=0), join_credentials: bool = True +): + db_params = evaluate_db_params() + + def search_name(s): + return name in s + + async with TinyDB(**db_params) as db: + matches = db.table("users").search(Query().login.test(search_name)) + + return [ + await get(user["id"], join_credentials=join_credentials) for user in matches + ] diff --git a/components/utils/__init__.py b/components/utils/__init__.py new file mode 100644 index 0000000..bf84cd1 --- /dev/null +++ b/components/utils/__init__.py @@ -0,0 +1,99 @@ +import asyncio +import os +import re + +from components.models import Any, BaseModel, Literal, UUID +from copy import deepcopy + + +__all__ = [ + "merge_models", + "merge_deep", + "batch", + "ensure_list", + "to_unique_sorted_str_list", + "is_path_within_cwd", + "expire_key", +] + + +# Returns new model (based on original model) using +# deep merged data of both input models data +def merge_models( + original: BaseModel, + override: BaseModel, + exclude_strategies: list = Literal[ + "exclude_original_none", + "exclude_original_unset", + "exclude_override_none", + "exclude_override_unset", + ], +) -> BaseModel: + # Convert both models to dictionaries + original_data = original.model_dump( + mode="json", + exclude_none=True if "exclude_original_none" in exclude_strategies else False, + exclude_unset=True if "exclude_original_unset" in exclude_strategies else False, + ) + override_data = override.model_dump( + mode="json", + exclude_none=True if "exclude_override_none" in exclude_strategies else False, + exclude_unset=True if "exclude_override_unset" in exclude_strategies else False, + ) + + # Merge with override taking priority + merged_data = merge_deep(original_data, override_data) + + # Return a revalidated model using the original model's class + return original.__class__(**merged_data) + + +def merge_deep(original_data: dict, override_data: dict): + result = deepcopy(original_data) + + def _recursive_merge(_original_data, _override_data): + for key in _override_data: + if ( + key in _original_data + and isinstance(_original_data[key], dict) + and isinstance(_override_data[key], dict) + ): + _recursive_merge(_original_data[key], _override_data[key]) + else: + _original_data[key] = _override_data[key] + + _recursive_merge(result, override_data) + return result + + +def batch(l: list, n: int): + _l = len(l) + for ndx in range(0, _l, n): + yield l[ndx : min(ndx + n, _l)] + + +def chunk_string(s, size=1_000_000): + return [s[i : i + size] for i in range(0, len(s), size)] + + +def ensure_list(a: Any | list[Any] | None) -> list: + if a: + if not isinstance(a, list): + return [a] + return a + return [] + + +def to_unique_sorted_str_list(l: list[str | UUID]) -> list: + _l = [str(x) for x in set(l) if x] + return sorted(_l) + + +def is_path_within_cwd(path): + requested_path = os.path.abspath(path) + return requested_path.startswith(os.path.abspath(".")) + + +async def expire_key(in_dict: dict, dict_key: int | str, wait_time: float | int): + await asyncio.sleep(wait_time) + in_dict.pop(dict_key, None) diff --git a/components/utils/cryptography.py b/components/utils/cryptography.py new file mode 100644 index 0000000..5708901 --- /dev/null +++ b/components/utils/cryptography.py @@ -0,0 +1,129 @@ +import base64 +import hashlib +import os +import json + +from cryptography.fernet import Fernet +from cryptography.fernet import InvalidToken +from cryptography.hazmat.backends import default_backend +from cryptography.hazmat.primitives import hashes +from cryptography.hazmat.primitives import padding +from cryptography.hazmat.primitives import serialization +from cryptography.hazmat.primitives.asymmetric import rsa +from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes +from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC +from functools import lru_cache + + +__all__ = [ + "InvalidToken", + "fernet_encrypt", + "fernet_decrypt", + "aes_cbc_encrypt", + "aes_cbc_decrypt", +] + + +def generate_rsa_dkim(key_size, public_exponent=65537): + private_key = rsa.generate_private_key( + public_exponent=public_exponent, + key_size=key_size, + ) + + public_key_bytes = private_key.public_key().public_bytes( + encoding=serialization.Encoding.DER, + format=serialization.PublicFormat.SubjectPublicKeyInfo, + ) + private_key_pem_bytes = private_key.private_bytes( + encoding=serialization.Encoding.PEM, + format=serialization.PrivateFormat.PKCS8, + encryption_algorithm=serialization.NoEncryption(), + ) + + public_key_string = base64.b64encode(public_key_bytes).decode("utf-8") + private_key_pem_string = private_key_pem_bytes.decode("utf-8") + + return private_key_pem_string, public_key_string + + +def file_digest_sha256(filename: str): + with open(filename, "rb", buffering=0) as f: + return hashlib.file_digest(f, "256").hexdigest() + + +def dict_digest_sha1(d: str): + return hashlib.sha1(json.dumps(d, sort_keys=True).encode("utf-8")).hexdigest() + + +def dict_digest_sha256(d: str): + return hashlib.sha256(json.dumps(d, sort_keys=True).encode("utf-8")).hexdigest() + + +def aes_cbc_encrypt( + data: str, code: str, iv: bytes = os.urandom(16), salt: bytes = os.urandom(16) +) -> bytes: + kdf = PBKDF2HMAC( + algorithm=hashes.SHA256(), + length=32, + salt=salt, + iterations=100000, + backend=default_backend(), + ) + key = kdf.derive(code.encode("utf-8")) + cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend()) + padder = padding.PKCS7(algorithms.AES.block_size).padder() + padded_data = padder.update(data.encode("utf-8")) + padder.finalize() + encryptor = cipher.encryptor() + ciphertext = encryptor.update(padded_data) + encryptor.finalize() + return salt + iv + ciphertext + + +@lru_cache +def aes_cbc_decrypt(data: bytes, code: str) -> str: + salt = data[:16] + iv = data[16:32] + ciphertext = data[32:] + kdf = PBKDF2HMAC( + algorithm=hashes.SHA256(), + length=32, + salt=salt, + iterations=100000, + backend=default_backend(), + ) + key = kdf.derive(code.encode("utf-8")) + cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend()) + decryptor = cipher.decryptor() + padded_plaintext = decryptor.update(ciphertext) + decryptor.finalize() + unpadder = padding.PKCS7(algorithms.AES.block_size).unpadder() + plaintext = unpadder.update(padded_plaintext) + unpadder.finalize() + return plaintext.decode(encoding="utf-8") + + +def fernet_encrypt(data: str, code: str, salt: bytes = os.urandom(16)) -> bytes: + kdf = PBKDF2HMAC( + algorithm=hashes.SHA256(), + length=32, + salt=salt, + iterations=100000, + backend=default_backend(), + ) + fernet = Fernet( + base64.urlsafe_b64encode(kdf.derive(code.encode("utf-8"))), + ) + return base64.urlsafe_b64encode(salt + fernet.encrypt(data.encode("utf-8"))) + + +@lru_cache +def fernet_decrypt(data: str, code: str) -> str: + data = base64.urlsafe_b64decode(data) + salt = data[:16] + encrypted_data = data[16:] + kdf = PBKDF2HMAC( + algorithm=hashes.SHA256(), + length=32, + salt=salt, + iterations=100000, + backend=default_backend(), + ) + fernet = Fernet(base64.urlsafe_b64encode(kdf.derive(code.encode("utf-8")))) + return fernet.decrypt(encrypted_data).decode(encoding="utf-8") diff --git a/components/utils/datetimes.py b/components/utils/datetimes.py new file mode 100644 index 0000000..634dd38 --- /dev/null +++ b/components/utils/datetimes.py @@ -0,0 +1,28 @@ +import os +from datetime import datetime, timezone, UTC, timedelta + + +def system_now_as_str(): + return datetime.now().astimezone().strftime("%Y-%m-%dT%H:%M:%S%z") + + +def ntime_utc_now(): + return datetime.now(UTC).timestamp() + + +def utc_now_as_str(dtformat="%Y-%m-%dT%H:%M:%S%z"): + return datetime.now(timezone.utc).strftime(dtformat) + + +def last_modified_http(file): + try: + last_modified_time = os.path.getmtime(file) + except FileNotFoundError: + last_modified_time = 0 + return datetime.utcfromtimestamp(last_modified_time).strftime( + "%a, %d %b %Y %H:%M:%S GMT" + ) + + +def parse_last_modified_http(last_modified_http): + return datetime.strptime(last_modified_http, "%a, %d %b %Y %H:%M:%S GMT") diff --git a/components/web/__init__.py b/components/web/__init__.py new file mode 100644 index 0000000..e12268f --- /dev/null +++ b/components/web/__init__.py @@ -0,0 +1,149 @@ +import asyncio +import json +import os +import time + +from config import defaults +from components.database import IN_MEMORY_DB +from components.utils import merge_deep, ensure_list +from components.utils.datetimes import ntime_utc_now +from components.web.blueprints import * +from components.web.utils import * + +app = Quart( + __name__, + static_url_path="/static", + static_folder="static_files", + template_folder="templates", +) + +app.register_blueprint(root.blueprint) +app.register_blueprint(auth.blueprint) +app.register_blueprint(objects.blueprint) +app.register_blueprint(profile.blueprint) +app.register_blueprint(system.blueprint) +app.register_blueprint(users.blueprint) + +app.config["SEND_FILE_MAX_AGE_DEFAULT"] = defaults.SEND_FILE_MAX_AGE_DEFAULT +app.config["SECRET_KEY"] = defaults.SECRET_KEY +app.config["TEMPLATES_AUTO_RELOAD"] = defaults.TEMPLATES_AUTO_RELOAD +app.config["SERVER_NAME"] = defaults.HOSTNAME +app.config["MOD_REQ_LIMIT"] = 10 +IN_MEMORY_DB["SESSION_VALIDATED"] = dict() +IN_MEMORY_DB["WS_CONNECTIONS"] = dict() +IN_MEMORY_DB["FORM_OPTIONS_CACHE"] = dict() +IN_MEMORY_DB["OBJECTS_CACHE"] = dict() +IN_MEMORY_DB["APP_LOGS_FULL_PULL"] = dict() +IN_MEMORY_DB["PROMOTE_USERS"] = set() + +modifying_request_limiter = asyncio.Semaphore(app.config["MOD_REQ_LIMIT"]) + + +@app.context_processor +def load_context(): + enforce_dbupdate = IN_MEMORY_DB.get("ENFORCE_DBUPDATE", False) + if enforce_dbupdate: + enforce_dbupdate = defaults.CLUSTER_ENFORCE_DBUPDATE_TIMEOUT - ( + round(ntime_utc_now() - enforce_dbupdate) + ) + + return { + "ENFORCE_DBUPDATE": enforce_dbupdate, + } + + +@app.errorhandler(ClusterHTTPException) +async def handle_cluster_error(error): + error_msg = str(error.description) + await ws_htmx( + "system", + "beforeend", + """""".format( + error=error_msg + ), + ) + return trigger_notification( + level="error", + response_body="", + response_code=error.code, + title="Cluster error", + message=error_msg, + ) + + +@app.before_request +async def before_request(): + request.form_parsed = {} + request.locked = False + + if session.get("id") and session["id"] in IN_MEMORY_DB["PROMOTE_USERS"]: + IN_MEMORY_DB["PROMOTE_USERS"].discard(session["id"]) + user = await get(user_id=session["id"]) + if "system" not in user.acl: + user.acl.append("system") + session["acl"] = user.acl + IN_MEMORY_DB["SESSION_VALIDATED"].update({session["id"]: user.acl}) + + if request.method in ["POST", "PATCH", "PUT", "DELETE"]: + await modifying_request_limiter.acquire() + form = await request.form + request.form_parsed = dict() + if form: + for k in form: + v = form.getlist(k) + if len(v) == 1: + request.form_parsed = merge_deep( + request.form_parsed, parse_form_to_dict(k, v.pop()) + ) + else: + request.form_parsed = merge_deep( + request.form_parsed, parse_form_to_dict(k, v) + ) + + +@app.after_request +async def after_request(response): + if defaults.DISABLE_CACHE == False: + return response + + response.headers["Pragma"] = "no-cache" + response.headers["Expires"] = "0" + response.headers["Cache-Control"] = "public, max-age=0" + + return response + + +@app.teardown_request +async def teardown_request(exc): + modifying_request_limiter.release() + + +@app.context_processor +def load_defaults(): + _defaults = { + k: v + for k, v in defaults.__dict__.items() + if not (k.startswith("__") or k.startswith("_")) + } + return _defaults + + +@app.template_filter(name="hex") +def to_hex(value): + return value.hex() + + +@app.template_filter(name="ensurelist") +def ensurelist(value): + return ensure_list(value) + + +@app.template_filter(name="toprettyjson") +def to_prettyjson(value): + return json.dumps(value, sort_keys=True, indent=2, separators=(",", ": ")) diff --git a/components/web/blueprints/__init__.py b/components/web/blueprints/__init__.py new file mode 100644 index 0000000..f786e6a --- /dev/null +++ b/components/web/blueprints/__init__.py @@ -0,0 +1,6 @@ +from components.web.blueprints import auth +from components.web.blueprints import objects +from components.web.blueprints import profile +from components.web.blueprints import root +from components.web.blueprints import system +from components.web.blueprints import users diff --git a/components/web/blueprints/auth.py b/components/web/blueprints/auth.py new file mode 100644 index 0000000..fa2d15a --- /dev/null +++ b/components/web/blueprints/auth.py @@ -0,0 +1,647 @@ +import asyncio +import json + +from base64 import b64decode, b64encode +from components.models.users import ( + UserSession, + AuthToken, + TokenConfirmation, + TypeAdapter, + uuid4, +) +from components.web.utils import * +from secrets import token_urlsafe +from components.utils import expire_key +from components.utils.datetimes import utc_now_as_str +from components.users import ( + get as get_user, + what_id, + patch_credential, + create as create_user, + create_credential, +) +from webauthn import ( + generate_registration_options, + options_to_json, + verify_registration_response, + verify_authentication_response, + generate_authentication_options, +) +from webauthn.helpers import ( + parse_registration_credential_json, + parse_authentication_credential_json, +) +from webauthn.helpers.structs import ( + AuthenticatorSelectionCriteria, + AttestationConveyancePreference, + UserVerificationRequirement, + ResidentKeyRequirement, + PublicKeyCredentialDescriptor, +) + +blueprint = Blueprint("auth", __name__, url_prefix="/auth") + + +# A link to be sent to a user to login using webauthn authentication +# /auth/login/request/confirm/ +@blueprint.route("/login/request/confirm/") +async def login_request_confirm(request_token: str): + try: + TypeAdapter(str).validate_python(request_token) + except: + return "", 200, {"HX-Redirect": "/"} + + token_status = IN_MEMORY_DB.get(request_token, {}).get("status") + + if token_status == "awaiting": + session["request_token"] = request_token + requested_login = IN_MEMORY_DB[request_token]["requested_login"] + + return await render_template( + "auth/login/request/confirm.html", + login=requested_login, + ) + + session["request_token"] = None + + return "", 200, {"HX-Redirect": "/profile", "HX-Refresh": False} + + +@blueprint.route("/register/request/confirm/", methods=["POST", "GET"]) +@acl("system") +async def register_request_confirm_modal(login: str): + return await render_template("auth/register/request/confirm.html") + + +# As shown to user that is currently logged in +# /auth/login/request/confirm/modal/ +@blueprint.route( + "/login/request/confirm/internal/", methods=["POST", "GET"] +) +@acl("any") +async def login_request_confirm_modal(request_token: str): + try: + TypeAdapter(str).validate_python(request_token) + except: + return "", 204 + + if request.method == "POST": + if ( + request_token in IN_MEMORY_DB + and IN_MEMORY_DB[request_token]["status"] == "awaiting" + ): + IN_MEMORY_DB[request_token].update( + { + "status": "confirmed", + "credential_id": "", + } + ) + current_app.add_background_task( + expire_key, + IN_MEMORY_DB, + request_token, + 10, + ) + + await ws_htmx(session["login"], "delete:#auth-login-request", "") + + return "", 204 + + return trigger_notification( + level="warning", + response_code=403, + title="Confirmation failed", + message="Token denied", + ) + + return await render_template("auth/login/request/internal/confirm.html") + + +# An unknown user issues a login request to users that are currently logged in +# /auth/login/request/start +@blueprint.route("/login/request/start", methods=["POST"]) +async def login_request_start(): + try: + request_data = AuthToken.parse_obj(request.form_parsed) + except ValidationError as e: + return validation_error(e.errors()) + + session_clear() + + try: + user_id = await what_id(login=request_data.login) + user = await get_user(user_id=user_id) + except (ValidationError, ValueError): + return validation_error([{"loc": ["login"], "msg": f"User is not available"}]) + + request_token = token_urlsafe() + + IN_MEMORY_DB[request_token] = { + "intention": f"Authenticate user: {request_data.login}", + "status": "awaiting", + "token_type": "web_confirmation", + "requested_login": request_data.login, + } + + current_app.add_background_task( + expire_key, + IN_MEMORY_DB, + request_token, + defaults.AUTH_REQUEST_TIMEOUT, + ) + + if user.profile.permit_auth_requests: + await ws_htmx( + request_data.login, + "beforeend", + f'
', + ) + + return await render_template( + "auth/login/request/start.html", + data={ + "request_token": request_token, + "request_issued_to_user": user.profile.permit_auth_requests, + }, + ) + + +# Polled every second by unknown user that issued a login request +# /auth/login/request/check/ +@blueprint.route("/login/request/check/") +async def login_request_check(request_token: str): + try: + TypeAdapter(str).validate_python(request_token) + except: + session.clear() + return "", 200, {"HX-Redirect": "/"} + + token_status, requested_login, credential_id = map( + IN_MEMORY_DB.get(request_token, {}).get, + ["status", "requested_login", "credential_id"], + ) + + if token_status == "confirmed": + try: + user_id = await what_id(login=requested_login) + user = await get_user(user_id=user_id) + except ValidationError as e: + return validation_error( + [{"loc": ["login"], "msg": f"User is not available"}] + ) + + for k, v in ( + UserSession( + login=user.login, + id=user.id, + acl=user.acl, + cred_id=credential_id, + lang=request.accept_languages.best_match(defaults.ACCEPT_LANGUAGES), + profile=user.profile, + ) + .dict() + .items() + ): + session[k] = v + + else: + if token_status: + return "", 204 + + return "", 200, {"HX-Redirect": "/"} + + +@blueprint.route("/login/token", methods=["POST"]) +async def login_token(): + try: + request_data = AuthToken.parse_obj(request.form_parsed) + token = request_data.token + IN_MEMORY_DB[token] = { + "intention": f"Authenticate user: {request_data.login}", + "status": "awaiting", + "token_type": "cli_confirmation", + "login": request_data.login, + } + current_app.add_background_task( + expire_key, + IN_MEMORY_DB, + token, + 120, + ) + + except ValidationError as e: + return validation_error(e.errors()) + + return await render_template( + "auth/login/token.html", + token=token, + ) + + +@blueprint.route("/login/token/verify", methods=["POST"]) +async def login_token_verify(): + try: + request_data = TokenConfirmation.parse_obj(request.form_parsed) + + token_status, token_login, token_confirmation_code = map( + IN_MEMORY_DB.get(request_data.token, {}).get, + ["status", "login", "code"], + ) + IN_MEMORY_DB.pop(request_data.token, None) + + if ( + token_status != "confirmed" + or token_confirmation_code != request_data.confirmation_code + ): + return validation_error( + [ + { + "loc": ["confirmation_code"], + "msg": "Confirmation code is invalid", + } + ] + ) + + user_id = await what_id(login=token_login) + user = await get_user(user_id=user_id) + + except ValidationError as e: + return validation_error(e.errors()) + + for k, v in ( + UserSession( + login=token_login, + id=user.id, + acl=user.acl, + lang=request.accept_languages.best_match(defaults.ACCEPT_LANGUAGES), + profile=user.profile, + ) + .dict() + .items() + ): + session[k] = v + + return "", 200, {"HX-Redirect": "/profile", "HX-Refresh": False} + + +# Generate login options for webauthn authentication +@blueprint.route("/login/webauthn/options", methods=["POST"]) +async def login_webauthn_options(): + try: + user_id = await what_id(login=request.form_parsed.get("login")) + user = await get_user(user_id=user_id) + if not user.credentials: + raise ValidationError + except (ValidationError, ValueError): + return validation_error([{"loc": ["login"], "msg": f"User is not available"}]) + + allow_credentials = [ + PublicKeyCredentialDescriptor(id=bytes.fromhex(c)) + for c in user.credentials.keys() + ] + + options = generate_authentication_options( + rp_id=defaults.WEBAUTHN_RP_ID, + timeout=defaults.WEBAUTHN_CHALLENGE_TIMEOUT * 1000, + allow_credentials=allow_credentials, + user_verification=UserVerificationRequirement.REQUIRED, + ) + + session["webauthn_challenge_id"] = token_urlsafe() + + IN_MEMORY_DB[session["webauthn_challenge_id"]] = { + "challenge": b64encode(options.challenge), + "login": user.login, + } + current_app.add_background_task( + expire_key, + IN_MEMORY_DB, + session["webauthn_challenge_id"], + defaults.WEBAUTHN_CHALLENGE_TIMEOUT, + ) + + return "", 204, {"HX-Trigger": json.dumps({"startAuth": options_to_json(options)})} + + +@blueprint.route("/register/token", methods=["POST"]) +async def register_token(): + try: + request_data = AuthToken.parse_obj(request.form_parsed) + token = request_data.token + IN_MEMORY_DB[token] = { + "intention": f"Register user: {request_data.login}", + "status": "awaiting", + "token_type": "cli_confirmation", + "login": request_data.login, + } + current_app.add_background_task( + expire_key, + IN_MEMORY_DB, + token, + 120, + ) + await ws_htmx( + "_system", + "beforeend", + f'
', + ) + + except ValidationError as e: + return validation_error(e.errors()) + + return await render_template( + "auth/register/token.html", + token=token, + ) + return template + + +@blueprint.route("/register/webauthn/options", methods=["POST"]) +async def register_webauthn_options(): + if "token" in request.form_parsed: + try: + request_data = TokenConfirmation.parse_obj(request.form_parsed) + except ValidationError as e: + return validation_error(e.errors()) + + token_status, token_login, token_confirmation_code = map( + IN_MEMORY_DB.get(request_data.token, {}).get, + ["status", "login", "code"], + ) + IN_MEMORY_DB.pop(request_data.token, None) + + if ( + token_status != "confirmed" + or token_confirmation_code != request_data.confirmation_code + ): + return validation_error( + [ + { + "loc": ["confirmation_code"], + "msg": "Confirmation code is invalid", + } + ] + ) + + exclude_credentials = [] + user_id = str(uuid4()) + login = token_login + appending_passkey = False + else: + if not session.get("id"): + return trigger_notification( + level="error", + response_code=409, + title="Registration failed", + message="Something went wrong", + ) + + user = await get_user(user_id=session["id"]) + + exclude_credentials = [ + PublicKeyCredentialDescriptor(id=bytes.fromhex(c)) + for c in user.credentials.keys() + ] + + user_id = session["id"] + login = session["login"] + appending_passkey = True + + options = generate_registration_options( + rp_name=defaults.WEBAUTHN_RP_NAME, + rp_id=defaults.WEBAUTHN_RP_ID, + user_id=user_id.encode("ascii"), + timeout=defaults.WEBAUTHN_CHALLENGE_TIMEOUT * 1000, + exclude_credentials=exclude_credentials, + user_name=login, + attestation=AttestationConveyancePreference.DIRECT, + authenticator_selection=AuthenticatorSelectionCriteria( + user_verification=UserVerificationRequirement.REQUIRED, + resident_key=ResidentKeyRequirement.REQUIRED, + ), + ) + + session["webauthn_challenge_id"] = token_urlsafe() + + IN_MEMORY_DB[session["webauthn_challenge_id"]] = { + "challenge": b64encode(options.challenge), + "login": login, + "user_id": user_id, + "appending_passkey": appending_passkey, + } + current_app.add_background_task( + expire_key, + IN_MEMORY_DB, + session["webauthn_challenge_id"], + defaults.WEBAUTHN_CHALLENGE_TIMEOUT, + ) + + return "", 204, {"HX-Trigger": json.dumps({"startReg": options_to_json(options)})} + + +@blueprint.route("/register/webauthn", methods=["POST"]) +async def register_webauthn(): + json_body = await request.json + + webauthn_challenge_id = session.get("webauthn_challenge_id") + session["webauthn_challenge_id"] = None + + challenge, login, user_id, appending_passkey = map( + IN_MEMORY_DB.get(webauthn_challenge_id, {}).get, + ["challenge", "login", "user_id", "appending_passkey"], + ) + IN_MEMORY_DB.pop(webauthn_challenge_id, None) + + if not challenge: + return trigger_notification( + level="error", + response_code=409, + title="Registration session invalid", + message="Registration session invalid", + additional_triggers={"authRegFailed": "register"}, + ) + + try: + credential = parse_registration_credential_json(json_body) + verification = verify_registration_response( + credential=credential, + expected_challenge=b64decode(challenge), + expected_rp_id=defaults.WEBAUTHN_RP_ID, + expected_origin=f"https://{defaults.WEBAUTHN_RP_ORIGIN}", + require_user_verification=True, + ) + except Exception as e: + return trigger_notification( + level="error", + response_code=409, + title="Registration failed", + message="An error occured while verifying the credential", + additional_triggers={"authRegFailed": "register"}, + ) + + credential_data = { + "id": verification.credential_id, + "public_key": verification.credential_public_key, + "sign_count": verification.sign_count, + "friendly_name": "Key Anú Reeves", + "transports": json_body.get("transports", []), + } + + try: + async with ClusterLock(["users", "credentials"], current_app): + if not appending_passkey: + user_id = await create_user(data={"login": login}) + + await create_credential( + user_id=user_id, + data={ + "id": verification.credential_id, + "public_key": verification.credential_public_key, + "sign_count": verification.sign_count, + "transports": json_body.get("transports", []), + }, + ) + + except Exception as e: + return trigger_notification( + level="error", + response_code=409, + title="Registration failed", + message="An error occured verifying the registration", + additional_triggers={"authRegFailed": "register"}, + ) + + if appending_passkey: + await ws_htmx( + session["login"], + "beforeend", + f'
', + ) + return trigger_notification( + level="success", + response_code=204, + title="New token registered", + message="A new token was appended to your account and can now be used to login", + ) + + return trigger_notification( + level="success", + response_code=204, + title="Welcome on board 👋", + message="Your account was created, you can now log in", + additional_triggers={"regCompleted": login}, + ) + + +@blueprint.route("/login/webauthn", methods=["POST"]) +async def auth_login_verify(): + json_body = await request.json + + try: + webauthn_challenge_id = session.get("webauthn_challenge_id") + challenge, login = map( + IN_MEMORY_DB.get(webauthn_challenge_id, {}).get, + ["challenge", "login"], + ) + IN_MEMORY_DB.pop(webauthn_challenge_id, None) + session["webauthn_challenge_id"] = None + + if not all([webauthn_challenge_id, challenge, login]): + return trigger_notification( + level="error", + response_code=409, + title="Verification failed", + message="Verification process timed out", + additional_triggers={"authRegFailed": "authenticate"}, + ) + + auth_challenge = b64decode(challenge) + + user_id = await what_id(login=login) + user = await get_user(user_id=user_id) + + credential = parse_authentication_credential_json(json_body) + + matched_user_credential = None + for k, v in user.credentials.items(): + if bytes.fromhex(k) == credential.raw_id: + matched_user_credential = v + + if not matched_user_credential: + return trigger_notification( + level="error", + response_code=409, + title="Verification failed", + message="No such credential in user realm", + additional_triggers={"authRegFailed": "authenticate"}, + ) + + verification = verify_authentication_response( + credential=credential, + expected_challenge=auth_challenge, + expected_rp_id=defaults.WEBAUTHN_RP_ORIGIN, + expected_origin=f"https://{defaults.WEBAUTHN_RP_ORIGIN}", + credential_public_key=matched_user_credential.public_key, + credential_current_sign_count=matched_user_credential.sign_count, + require_user_verification=True, + ) + + matched_user_credential.last_login = utc_now_as_str() + if matched_user_credential.sign_count != 0: + matched_user_credential.sign_count = verification.new_sign_count + + async with ClusterLock("credentials", current_app): + user_id = await what_id(login=login) + await patch_credential( + user_id=user_id, + hex_id=credential.raw_id.hex(), + data=matched_user_credential.model_dump(mode="json"), + ) + + except Exception as e: + return trigger_notification( + level="error", + response_code=409, + title="Verification failed", + message="An error occured verifying the credential", + additional_triggers={"authRegFailed": "authenticate"}, + ) + + request_token = session.get("request_token") + + if request_token: + """ + Not setting session login and id for device that is confirming the proxy authentication + Gracing 10s for the awaiting party to catch up an almost expired key + """ + IN_MEMORY_DB[request_token].update( + { + "status": "confirmed", + "credential_id": credential.raw_id.hex(), + } + ) + current_app.add_background_task( + expire_key, + IN_MEMORY_DB, + request_token, + 10, + ) + session["request_token"] = None + + return "", 204, {"HX-Trigger": "proxyAuthSuccess"} + + for k, v in ( + UserSession( + login=user.login, + id=user.id, + acl=user.acl, + cred_id=credential.raw_id.hex(), + lang=request.accept_languages.best_match(defaults.ACCEPT_LANGUAGES), + profile=user.profile, + ) + .dict() + .items() + ): + session[k] = v + + return "", 200, {"HX-Redirect": "/profile", "HX-Refresh": False} diff --git a/components/web/blueprints/objects.py b/components/web/blueprints/objects.py new file mode 100644 index 0000000..4c0afc0 --- /dev/null +++ b/components/web/blueprints/objects.py @@ -0,0 +1,265 @@ +import components.objects + +from components.models.objects import model_classes, uuid4 +from components.utils import batch, ensure_list +from components.web.utils import * + +blueprint = Blueprint("objects", __name__, url_prefix="/objects") + + +@blueprint.context_processor +async def load_context(): + context = dict() + context["system_fields"] = { + object_type: system_fields + for object_type, system_fields in model_classes["system_fields"].items() + } + context["unique_fields"] = { + object_type: unique_fields + for object_type, unique_fields in model_classes["unique_fields"].items() + } + context["schemas"] = { + object_type: v.model_json_schema() + for object_type, v in model_classes["forms"].items() + } + return context + + +@blueprint.before_request +async def objects_before_request(): + if "object_type" in request.view_args: + if request.view_args["object_type"] not in model_classes["types"]: + if "Hx-Request" in request.headers: + return trigger_notification( + level="error", + response_code=204, + title="Object type error", + message="Object type is unknown", + ) + else: + return (f"

Object type error

Object type is unknown

", 409) + + +@blueprint.route("//") +@acl("user") +@formoptions(["emailusers", "domains", "keypairs", "users"]) +async def get_object(object_type: str, object_id: str): + try: + object_data = await components.objects.get( + object_id=object_id, object_type=object_type + ) + + if not object_data: + return (f"

Object not found

Object is unknown

", 404) + + """ + Inject form options not provided by user permission. + A user will not be able to access detailed information about objects + with inherited permission nor will they be able to remove assignments. + """ + if object_type == "addresses": + object_domain = { + "name": object_data.details.assigned_domain.name, + "value": object_data.details.assigned_domain.id, + } + if object_domain not in request.form_options["domains"]: + object_domain["name"] = f"{object_data.details.assigned_domain.name} ⚠️" + request.form_options["domains"].append(object_domain) + + for object_emailuser in object_data.details.assigned_emailusers: + if object_emailuser: + u = { + "name": object_emailuser.name, + "value": object_emailuser.id, + } + if u not in request.form_options["emailusers"]: + u["name"] = f"{object_emailuser.name} ⚠️" + request.form_options["emailusers"].append(u) + + elif object_type == "domains": + object_keypair_injections = [] + for attr in ["assigned_dkim_keypair", "assigned_arc_keypair"]: + object_keypair_details = getattr(object_data.details, attr) + if hasattr(object_keypair_details, "id"): + object_keypair = { + "name": object_keypair_details.name, + "value": object_keypair_details.id, + } + if ( + object_keypair not in request.form_options["keypairs"] + and object_keypair not in object_keypair_injections + ): + object_keypair_injections.append(object_keypair) + for keypair in object_keypair_injections: + keypair["name"] = keypair["name"] + " ⚠️" + request.form_options["keypairs"].append(keypair) + + except ValidationError as e: + return validation_error(e.errors()) + except ValueError as e: + name, message = e.args + return validation_error([{"loc": [name], "msg": message}]) + + return await render_or_json( + "objects/object.html", request.headers, object=object_data + ) + + +@blueprint.route("/") +@blueprint.route("//search", methods=["POST"]) +@acl("user") +@formoptions(["domains"]) +async def get_objects(object_type: str): + try: + ( + search_model, + page, + page_size, + sort_attr, + sort_reverse, + filters, + ) = table_search_helper( + request.form_parsed, object_type, default_sort_attr="name" + ) + except ValidationError as e: + return validation_error(e.errors()) + + if request.method == "POST": + try: + match_any = { + "key_name": search_model.q, + "domain": search_model.q, + "local_part": search_model.q, + "username": search_model.q, + "assigned_domain": search_model.q, + } + match_all = ( + {"assigned_users": [session["id"]]} + if not "system" in session["acl"] + else {} + ) + matched_objects = await components.objects.search( + object_type=object_type, + match_any=match_any, + fully_resolve=True, + match_all=filters | match_all, + ) + except ValidationError as e: + return validation_error(e.errors()) + + object_pages = [ + m + for m in batch( + sorted( + matched_objects, + key=lambda x: getattr(x, sort_attr), + reverse=sort_reverse, + ), + page_size, + ) + ] + + try: + object_pages[page - 1] + except IndexError: + page = len(object_pages) + + objects = object_pages[page - 1] if page else object_pages + + return await render_template( + "objects/includes/objects/table_body.html", + data={ + "objects": objects, + "page_size": page_size, + "page": page, + "pages": len(object_pages), + "elements": len(matched_objects), + }, + ) + else: + return await render_template( + "objects/objects.html", data={"object_type": object_type} + ) + + +@blueprint.route("/", methods=["POST"]) +@acl("user") +async def create_object(object_type: str): + try: + async with ClusterLock(object_type, current_app): + object_id = await components.objects.create( + object_type=object_type, data=request.form_parsed + ) + except ValidationError as e: + return validation_error(e.errors()) + except ValueError as e: + name, message = e.args + return validation_error([{"loc": [name], "msg": message}]) + + return trigger_notification( + level="success", + response_code=204, + title="Object created", + message=f"Object {object_id} created", + ) + + +@blueprint.route("//delete", methods=["POST"]) +@blueprint.route("//", methods=["DELETE"]) +@acl("user") +async def delete_object(object_type: str, object_id: str | None = None): + if request.method == "POST": + object_id = request.form_parsed.get("id") + try: + object_ids = ensure_list(object_id) + async with ClusterLock(object_type, current_app): + deleted_objects = await components.objects.delete( + object_id=object_ids, object_type=object_type + ) + + except ValidationError as e: + return validation_error(e.errors()) + except ValueError as e: + name, message = e.args + return validation_error([{"loc": [name], "msg": message}]) + + return trigger_notification( + level="success", + response_code=204, + title="Object removed", + message=f"{len(deleted_objects)} object{'s' if len(deleted_objects) > 1 else ''} removed", + ) + + +@blueprint.route("//patch", methods=["POST"]) +@blueprint.route("//", methods=["PATCH"]) +@acl("user") +async def patch_object(object_type: str, object_id: str | None = None): + if request.method == "POST": + object_id = request.form_parsed.get("id") + try: + async with ClusterLock(object_type, current_app): + patched_objects = await components.objects.patch( + object_id=object_id, object_type=object_type, data=request.form_parsed + ) + + except ValidationError as e: + return validation_error(e.errors()) + except ValueError as e: + name, message = e.args + return validation_error([{"loc": [name], "msg": message}]) + + await ws_htmx( + "_user", + "beforeend", + f'
', + f"/objects/{object_type}/{object_id}", + exclude_self=True, + ) + + return trigger_notification( + level="success" if len(patched_objects) > 0 else "warning", + response_code=204, + title="Patch completed", + message=f"{len(patched_objects)} object{'s' if (len(patched_objects) > 1 or len(patched_objects) == 0) else ''} modified", + ) diff --git a/components/web/blueprints/profile.py b/components/web/blueprints/profile.py new file mode 100644 index 0000000..b5be9a3 --- /dev/null +++ b/components/web/blueprints/profile.py @@ -0,0 +1,103 @@ +import components.users + +from components.models.users import UserProfile +from components.web.utils import * + +blueprint = Blueprint("profile", __name__, url_prefix="/profile") + + +@blueprint.context_processor +def load_context(): + context = dict() + context["schemas"] = {"user_profile": UserProfile.model_json_schema()} + return context + + +@blueprint.route("/") +@acl("any") +async def user_profile_get(): + try: + user = await components.users.get(user_id=session["id"]) + except ValidationError: + session_clear() + return redirect(url_for("root.root")) + except ValueError as e: + name, message = e.args + return validation_error([{"loc": [name], "msg": message}]) + + return await render_template( + "profile/profile.html", + data={ + "user": user.dict(), + "keypair": None, + "credentials": user.credentials, + }, + ) + + +@blueprint.route("/edit", methods=["PATCH"]) +@acl("any") +async def user_profile_patch(): + try: + async with ClusterLock("users", current_app): + await components.users.patch_profile( + user_id=session["id"], data=request.form_parsed + ) + + user = await components.users.get(user_id=session["id"]) + + except ValidationError as e: + return validation_error(e.errors()) + except ValueError as e: + name, message = e.args + return validation_error([{"loc": [name], "msg": message}]) + + session.pop("profile", None) + session["profile"] = user.profile.dict() + + return trigger_notification( + level="success", + response_code=204, + title="Profile updated", + message="Your profile was updated", + ) + + +@blueprint.route("/credential/", methods=["PATCH"]) +@acl("any") +async def patch_credential(credential_hex_id: str): + try: + async with ClusterLock("credentials", current_app): + await components.users.patch_credential( + user_id=session["id"], + hex_id=credential_hex_id, + data=request.form_parsed, + ) + except ValidationError as e: + return validation_error(e.errors()) + + return trigger_notification( + level="success", + response_code=204, + title="Credential modified", + message="Credential was modified", + ) + + +@blueprint.route("/credential/", methods=["DELETE"]) +@acl("any") +async def delete_credential(credential_hex_id: str): + try: + async with ClusterLock(["credentials", "users"], current_app): + await components.users.delete_credential( + user_id=session["id"], hex_id=credential_hex_id + ) + except ValidationError as e: + return validation_error(e.errors()) + + return trigger_notification( + level="success", + response_code=204, + title="Credential deleted", + message="Credential was removed", + ) diff --git a/components/web/blueprints/root.py b/components/web/blueprints/root.py new file mode 100644 index 0000000..07930b7 --- /dev/null +++ b/components/web/blueprints/root.py @@ -0,0 +1,46 @@ +import asyncio +import json +import os + +from components.web.utils import * +from components.utils import is_path_within_cwd +from components.utils.datetimes import ( + last_modified_http, + parse_last_modified_http, + ntime_utc_now, +) + +blueprint = Blueprint("main", __name__, url_prefix="/") + + +@blueprint.route("/") +async def root(): + if session.get("id"): + return redirect(url_for("profile.user_profile_get")) + + session_clear() + return await render_template("auth/authenticate.html") + + +@blueprint.route("/logout", methods=["POST", "GET"]) +async def logout(): + session_clear() + return ("", 200, {"HX-Redirect": "/"}) + + +@blueprint.websocket("/ws") +@websocket_acl("any") +async def ws(): + while True: + await websocket.send( + f'
🟢
' + ) + data = await websocket.receive() + try: + data_dict = json.loads(data) + if "path" in data_dict: + IN_MEMORY_DB["WS_CONNECTIONS"][session["login"]][ + websocket._get_current_object() + ]["path"] = data_dict["path"] + except: + pass diff --git a/components/web/blueprints/system.py b/components/web/blueprints/system.py new file mode 100644 index 0000000..e9b9668 --- /dev/null +++ b/components/web/blueprints/system.py @@ -0,0 +1,302 @@ +import asyncio +import components.system +import fileinput +import json +import os + +from components.models.system import SystemSettings, UpdateSystemSettings +from components.utils import batch, expire_key +from components.utils.datetimes import datetime, ntime_utc_now +from components.web.utils import * + +blueprint = Blueprint("system", __name__, url_prefix="/system") +log_lock = asyncio.Lock() + + +@blueprint.context_processor +def load_context(): + from components.cluster.cluster import cluster + + context = dict() + context["schemas"] = {"system_settings": SystemSettings.model_json_schema()} + + return context + + +@blueprint.route("/cluster/update-status", methods=["POST"]) +@acl("system") +async def cluster_status_update(): + ticket, receivers = await cluster.send_command("STATUS", "*") + async with cluster.receiving: + await cluster.await_receivers(ticket, receivers, raise_err=False) + + return await status() + + +@blueprint.route("/cluster/db/enforce-updates", methods=["POST"]) +@acl("system") +async def cluster_db_enforce_updates(): + toggle = request.form_parsed.get("toggle", "off") + if toggle == "on": + if not IN_MEMORY_DB.get("ENFORCE_DBUPDATE", False): + IN_MEMORY_DB["ENFORCE_DBUPDATE"] = ntime_utc_now() + current_app.add_background_task( + expire_key, + IN_MEMORY_DB, + "ENFORCE_DBUPDATE", + defaults.CLUSTER_ENFORCE_DBUPDATE_TIMEOUT, + ) + await ws_htmx( + "_system", + "beforeend", + """""", + ) + + return trigger_notification( + level="success", + response_code=204, + title="Activated", + message="Enforced database updates are enabled", + ) + else: + return trigger_notification( + level="warning", + response_code=409, + title="Already active", + message="Enforced database updates are already enabled", + ) + elif toggle == "off": + IN_MEMORY_DB["ENFORCE_DBUPDATE"] = False + await ws_htmx( + "_system", + "beforeend", + '", + ) + return trigger_notification( + level="success", + response_code=204, + title="Deactivated", + message="Enforced transaction mode is disabled", + ) + + +@blueprint.route("/status", methods=["GET"]) +@acl("system") +async def status(): + status = { + "ENFORCE_DBUPDATE": IN_MEMORY_DB.get("ENFORCE_DBUPDATE", False), + "CLUSTER_PEERS_REMOTE_PEERS": cluster.peers.remotes, + "CLUSTER_PEERS_LOCAL": cluster.peers.local, + } + return await render_template("system/status.html", data={"status": status}) + + +@blueprint.route("/settings", methods=["PATCH"]) +@acl("system") +async def write_settings(): + try: + UpdateSystemSettingsModel = UpdateSystemSettings.parse_obj(request.form_parsed) + except ValidationError as e: + return validation_error(e.errors()) + + async with TinyDB(**TINYDB_PARAMS) as db: + db.table("system_settings").remove(doc_ids=[1]) + db.table("system_settings").insert( + Document(UpdateSystemSettingsModel.dict(), doc_id=1) + ) + + return trigger_notification( + level="success", + response_code=204, + title="Settings updated", + message="System settings were updated", + ) + + +@blueprint.route("/settings") +@acl("system") +async def settings(): + try: + settings = await components.system.get_system_settings() + except ValidationError as e: + return validation_error(e.errors()) + + return await render_template("system/settings.html", settings=settings) + + +@blueprint.route("/logs") +@blueprint.route("/logs/search", methods=["POST"]) +@acl("system") +async def cluster_logs(): + try: + ( + search_model, + page, + page_size, + sort_attr, + sort_reverse, + filters, + ) = table_search_helper( + request.form_parsed, + "system_logs", + default_sort_attr="record.time.repr", + default_sort_reverse=True, + ) + except ValidationError as e: + return validation_error(e.errors()) + + if request.method == "POST": + _logs = [] + async with log_lock: + parser_failed = False + + with fileinput.input( + components.system.list_application_log_files(), encoding="utf-8" + ) as f: + for line in f: + if search_model.q in line: + try: + _logs.append(json.loads(line.strip())) + except json.decoder.JSONDecodeError: + parser_failed = True + os.unlink(f.filename()) + f.nextfile() + + if parser_failed: + return trigger_notification( + level="user", + response_code=204, + title="Full refresh", + message="Logs rotated, requesting full refresh...", + additional_triggers={"forceRefresh": ""}, + duration=1000, + ) + + def system_logs_sort_func(sort_attr): + if sort_attr == "text": + return lambda d: ( + d["text"], + datetime.fromisoformat(d["record"]["time"]["repr"]).timestamp(), + ) + elif sort_attr == "record.level.no": + return lambda d: ( + d["record"]["level"]["no"], + datetime.fromisoformat(d["record"]["time"]["repr"]).timestamp(), + ) + else: # fallback to "record.time.repr" + return lambda d: datetime.fromisoformat( + d["record"]["time"]["repr"] + ).timestamp() + + log_pages = [ + m + for m in batch( + sorted( + _logs, + key=system_logs_sort_func(sort_attr), + reverse=sort_reverse, + ), + page_size, + ) + ] + + try: + log_pages[page - 1] + except IndexError: + page = len(log_pages) + + system_logs = log_pages[page - 1] if page else log_pages + + return await render_template( + "system/includes/logs/table_body.html", + data={ + "logs": system_logs, + "page_size": page_size, + "page": page, + "pages": len(log_pages), + "elements": len(_logs), + }, + ) + else: + return await render_template("system/logs.html") + + +@blueprint.route("/logs/refresh") +@acl("system") +async def refresh_cluster_logs(): + await ws_htmx( + session["login"], + "beforeend", + '", + "/system/logs", + ) + + if not IN_MEMORY_DB.get("application_logs_refresh") or request.args.get("force"): + IN_MEMORY_DB["application_logs_refresh"] = ntime_utc_now() + + current_app.add_background_task( + expire_key, + IN_MEMORY_DB, + "application_logs_refresh", + defaults.CLUSTER_LOGS_REFRESH_AFTER, + ) + + async with log_lock: + async with ClusterLock("files", current_app): + for peer in cluster.peers.get_established(): + if not peer in IN_MEMORY_DB["APP_LOGS_FULL_PULL"]: + IN_MEMORY_DB["APP_LOGS_FULL_PULL"][peer] = True + current_app.add_background_task( + expire_key, + IN_MEMORY_DB["APP_LOGS_FULL_PULL"], + peer, + 36000, + ) + start = 0 + else: + start = -1 + file_path = f"peer_files/{peer}/logs/application.log" + if os.path.exists(file_path) and os.path.getsize(file_path) > ( + 5 * 1024 * 1024 + ): + start = 0 + + await cluster.request_files("logs/application.log", peer, start, -1) + + missing_peers = ", ".join(cluster.peers.get_offline_peers()) + + if missing_peers: + await ws_htmx( + session["login"], + "beforeend", + '", + "/system/logs", + ) + + refresh_ago = round(ntime_utc_now() - IN_MEMORY_DB["application_logs_refresh"]) + + await ws_htmx( + session["login"], + "beforeend", + '', + "/system/logs", + ) + + return "", 204 diff --git a/components/web/blueprints/users.py b/components/web/blueprints/users.py new file mode 100644 index 0000000..a4b3afe --- /dev/null +++ b/components/web/blueprints/users.py @@ -0,0 +1,211 @@ +import components.users +from components.utils import batch, ensure_list +from components.database import IN_MEMORY_DB +from components.models.users import UserGroups +from components.web.utils import * + + +blueprint = Blueprint("users", __name__, url_prefix="/system/users") + + +@blueprint.context_processor +def load_context(): + from components.models.users import UserProfile + + context = dict() + context["schemas"] = {"user_profile": UserProfile.model_json_schema()} + return context + + +@blueprint.route("/groups", methods=["PATCH"]) +@acl("system") +async def user_group(): + try: + request_data = UserGroups.parse_obj(request.form_parsed) + + assigned_to = [ + u + for u in await components.users.search(name="", join_credentials=False) + if request_data.name in u.groups + ] + + assign_to = [] + for user_id in request_data.members: + assign_to.append( + await components.users.get(user_id=user_id, join_credentials=False) + ) + + _all = assigned_to + assign_to + + async with ClusterLock(["users", "credentials"], current_app): + for user in _all: + user_dict = user.model_dump(mode="json") + if request_data.name in user_dict["groups"]: + user_dict["groups"].remove(request_data.name) + + if ( + request_data.new_name not in user_dict["groups"] + and user in assign_to + ): + user_dict["groups"].append(request_data.new_name) + + await components.users.patch(user_id=user.id, data=user_dict) + + return "", 204 + + except ValidationError as e: + return validation_error(e.errors()) + except ValueError as e: + name, message = e.args + return validation_error([{"loc": [name], "msg": message}]) + + +@blueprint.route("/") +@acl("system") +async def get_user(user_id: str): + try: + user = await components.users.get(user_id=user_id) + except ValidationError as e: + return validation_error(e.errors()) + except ValueError as e: + name, message = e.args + return validation_error([{"loc": [name], "msg": message}]) + + return await render_or_json( + "system/includes/users/row.html", request.headers, user=user.dict() + ) + + +@blueprint.route("/") +@blueprint.route("/search", methods=["POST"]) +@acl("system") +@formoptions(["users"]) +async def get_users(): + try: + ( + search_model, + page, + page_size, + sort_attr, + sort_reverse, + filters, + ) = table_search_helper(request.form_parsed, "users", default_sort_attr="login") + except ValidationError as e: + return validation_error(e.errors()) + + if request.method == "POST": + matched_users = [ + m.dict() for m in await components.users.search(name=search_model.q) + ] + + user_pages = [ + m + for m in batch( + sorted( + matched_users, + key=lambda x: x.get(sort_attr, "id"), + reverse=sort_reverse, + ), + page_size, + ) + ] + + try: + user_pages[page - 1] + except IndexError: + page = len(user_pages) + + users = user_pages[page - 1] if page else user_pages + + return await render_template( + "system/includes/users/table_body.html", + data={ + "users": users, + "page_size": page_size, + "page": page, + "pages": len(user_pages), + "elements": len(matched_users), + }, + ) + else: + return await render_template("system/users.html", data={}) + + +@blueprint.route("/delete", methods=["POST"]) +@blueprint.route("/", methods=["DELETE"]) +@acl("system") +async def delete_user(user_id: str | None = None): + if request.method == "POST": + user_ids = request.form_parsed.get("id") + + try: + async with ClusterLock(["users", "credentials"], current_app): + for user_id in ensure_list(user_ids): + await components.users.delete(user_id=user_id) + + except ValidationError as e: + return validation_error(e.errors()) + except ValueError as e: + name, message = e.args + return validation_error([{"loc": [name], "msg": message}]) + + return trigger_notification( + level="success", + response_code=204, + title="User removed", + message=f"{len(ensure_list(user_ids))} user{'s' if len(ensure_list(user_ids)) > 1 else ''} removed", + ) + + +@blueprint.route("//credential/", methods=["PATCH"]) +@acl("system") +async def patch_user_credential(user_id: str, hex_id: str): + try: + async with ClusterLock("credentials", current_app): + await components.users.patch_credential( + user_id=user_id, + hex_id=hex_id, + data=request.form_parsed, + ) + except ValidationError as e: + return validation_error(e.errors()) + except ValueError as e: + name, message = e.args + return validation_error([{"loc": [name], "msg": message}]) + + return trigger_notification( + level="success", + response_code=204, + title="Credential modified", + message="Credential was modified", + ) + + +@blueprint.route("/patch", methods=["POST"]) +@blueprint.route("/", methods=["PATCH"]) +@acl("system") +async def patch_user(user_id: str | None = None): + try: + if not user_id: + user_id = request.form_parsed.get("id") + + async with ClusterLock(["users", "credentials"], current_app): + await components.users.patch(user_id=user_id, data=request.form_parsed) + await components.users.patch_profile( + user_id=user_id, data=request.form_parsed.get("profile", {}) + ) + + except ValidationError as e: + return validation_error(e.errors()) + except ValueError as e: + name, message = e.args + return validation_error([{"loc": [name], "msg": message}]) + + IN_MEMORY_DB["SESSION_VALIDATED"].pop(user_id, None) + + return trigger_notification( + level="success", + response_code=204, + title="User modified", + message=f"User was updated", + ) diff --git a/components/web/static_files/.gitignore b/components/web/static_files/.gitignore new file mode 100644 index 0000000..c97f963 --- /dev/null +++ b/components/web/static_files/.gitignore @@ -0,0 +1 @@ +*.sh diff --git a/components/web/static_files/css/.gitignore b/components/web/static_files/css/.gitignore new file mode 100644 index 0000000..ae47b83 --- /dev/null +++ b/components/web/static_files/css/.gitignore @@ -0,0 +1,4 @@ +* +!pico-custom.scss +!pico-custom.css +!.gitignore diff --git a/components/web/static_files/css/pico-custom.css b/components/web/static_files/css/pico-custom.css new file mode 100644 index 0000000..446e510 --- /dev/null +++ b/components/web/static_files/css/pico-custom.css @@ -0,0 +1,9363 @@ +@charset "UTF-8"; +/*! + * Pico CSS ✨ v2.0.6 (https://picocss.com) + * Copyright 2019-2024 - Licensed under MIT + */ +/** + * Styles + */ +:root { + --pico-font-family-emoji: "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --pico-font-family-sans-serif: system-ui, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, Helvetica, Arial, "Helvetica Neue", sans-serif, var(--pico-font-family-emoji); + --pico-font-family-monospace: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace, var(--pico-font-family-emoji); + --pico-font-family: var(--pico-font-family-sans-serif); + --pico-line-height: 1.5; + --pico-font-weight: 400; + --pico-font-size: 100%; + --pico-text-underline-offset: 0.1rem; + --pico-border-radius: 0.25rem; + --pico-border-width: 0.0625rem; + --pico-outline-width: 0.125rem; + --pico-transition: 0.2s ease-in-out; + --pico-spacing: 1rem; + --pico-typography-spacing-vertical: 1rem; + --pico-block-spacing-vertical: var(--pico-spacing); + --pico-block-spacing-horizontal: var(--pico-spacing); + --pico-grid-column-gap: var(--pico-spacing); + --pico-grid-row-gap: var(--pico-spacing); + --pico-form-element-spacing-vertical: 0.75rem; + --pico-form-element-spacing-horizontal: 1rem; + --pico-group-box-shadow: 0 0 0 rgba(0, 0, 0, 0); + --pico-group-box-shadow-focus-with-button: 0 0 0 var(--pico-outline-width) var(--pico-primary-focus); + --pico-group-box-shadow-focus-with-input: 0 0 0 0.0625rem var(--pico-form-element-border-color); + --pico-modal-overlay-backdrop-filter: blur(0.375rem); + --pico-nav-element-spacing-vertical: 1rem; + --pico-nav-element-spacing-horizontal: 0.5rem; + --pico-nav-link-spacing-vertical: 0.5rem; + --pico-nav-link-spacing-horizontal: 0.5rem; + --pico-nav-breadcrumb-divider: ">"; + --pico-icon-checkbox: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E"); + --pico-icon-minus: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='5' y1='12' x2='19' y2='12'%3E%3C/line%3E%3C/svg%3E"); + --pico-icon-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(136, 145, 164)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E"); + --pico-icon-date: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(136, 145, 164)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='18' rx='2' ry='2'%3E%3C/rect%3E%3Cline x1='16' y1='2' x2='16' y2='6'%3E%3C/line%3E%3Cline x1='8' y1='2' x2='8' y2='6'%3E%3C/line%3E%3Cline x1='3' y1='10' x2='21' y2='10'%3E%3C/line%3E%3C/svg%3E"); + --pico-icon-time: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(136, 145, 164)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cpolyline points='12 6 12 12 16 14'%3E%3C/polyline%3E%3C/svg%3E"); + --pico-icon-search: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(136, 145, 164)' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E"); + --pico-icon-close: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(136, 145, 164)' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='18' y1='6' x2='6' y2='18'%3E%3C/line%3E%3Cline x1='6' y1='6' x2='18' y2='18'%3E%3C/line%3E%3C/svg%3E"); + --pico-icon-loading: url("data:image/svg+xml,%3Csvg fill='none' height='24' width='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg' %3E%3Cstyle%3E g %7B animation: rotate 2s linear infinite; transform-origin: center center; %7D circle %7B stroke-dasharray: 75,100; stroke-dashoffset: -5; animation: dash 1.5s ease-in-out infinite; stroke-linecap: round; %7D @keyframes rotate %7B 0%25 %7B transform: rotate(0deg); %7D 100%25 %7B transform: rotate(360deg); %7D %7D @keyframes dash %7B 0%25 %7B stroke-dasharray: 1,100; stroke-dashoffset: 0; %7D 50%25 %7B stroke-dasharray: 44.5,100; stroke-dashoffset: -17.5; %7D 100%25 %7B stroke-dasharray: 44.5,100; stroke-dashoffset: -62; %7D %7D %3C/style%3E%3Cg%3E%3Ccircle cx='12' cy='12' r='10' fill='none' stroke='rgb(136, 145, 164)' stroke-width='4' /%3E%3C/g%3E%3C/svg%3E"); +} + +@media (min-width: 576px) { + body > header, + body > main, + body > footer, + section { + --pico-block-spacing-vertical: calc(var(--pico-spacing) * 1.25); + } +} +@media (min-width: 768px) { + body > header, + body > main, + body > footer, + section { + --pico-block-spacing-vertical: calc(var(--pico-spacing) * 1.5); + } +} +@media (min-width: 1024px) { + body > header, + body > main, + body > footer, + section { + --pico-block-spacing-vertical: calc(var(--pico-spacing) * 1.75); + } +} +@media (min-width: 1280px) { + body > header, + body > main, + body > footer, + section { + --pico-block-spacing-vertical: calc(var(--pico-spacing) * 2); + } +} +@media (min-width: 1536px) { + body > header, + body > main, + body > footer, + section { + --pico-block-spacing-vertical: calc(var(--pico-spacing) * 2.25); + } +} + +@media (min-width: 576px) { + article { + --pico-block-spacing-vertical: calc(var(--pico-spacing) * 1.25); + --pico-block-spacing-horizontal: calc(var(--pico-spacing) * 1.25); + } +} +@media (min-width: 768px) { + article { + --pico-block-spacing-vertical: calc(var(--pico-spacing) * 1.5); + --pico-block-spacing-horizontal: calc(var(--pico-spacing) * 1.5); + } +} +@media (min-width: 1024px) { + article { + --pico-block-spacing-vertical: calc(var(--pico-spacing) * 1.75); + --pico-block-spacing-horizontal: calc(var(--pico-spacing) * 1.75); + } +} +@media (min-width: 1280px) { + article { + --pico-block-spacing-vertical: calc(var(--pico-spacing) * 2); + --pico-block-spacing-horizontal: calc(var(--pico-spacing) * 2); + } +} +@media (min-width: 1536px) { + article { + --pico-block-spacing-vertical: calc(var(--pico-spacing) * 2.25); + --pico-block-spacing-horizontal: calc(var(--pico-spacing) * 2.25); + } +} + +a { + --pico-text-decoration: underline; +} +a.secondary, a.contrast { + --pico-text-decoration: underline; +} + +small { + --pico-font-size: 0.875em; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + --pico-font-weight: 700; +} + +h1 { + --pico-font-size: 2rem; + --pico-line-height: 1.125; + --pico-typography-spacing-top: 3rem; +} + +h2 { + --pico-font-size: 1.75rem; + --pico-line-height: 1.15; + --pico-typography-spacing-top: 2.625rem; +} + +h3 { + --pico-font-size: 1.5rem; + --pico-line-height: 1.175; + --pico-typography-spacing-top: 2.25rem; +} + +h4 { + --pico-font-size: 1.25rem; + --pico-line-height: 1.2; + --pico-typography-spacing-top: 1.874rem; +} + +h5 { + --pico-font-size: 1.125rem; + --pico-line-height: 1.225; + --pico-typography-spacing-top: 1.6875rem; +} + +h6 { + --pico-font-size: 1rem; + --pico-line-height: 1.25; + --pico-typography-spacing-top: 1.5rem; +} + +thead th, +thead td, +tfoot th, +tfoot td { + --pico-font-weight: 600; + --pico-border-width: 0.1875rem; +} + +pre, +code, +kbd, +samp { + --pico-font-family: var(--pico-font-family-monospace); +} + +kbd { + --pico-font-weight: bolder; +} + +input:not([type=submit], +[type=button], +[type=reset], +[type=checkbox], +[type=radio], +[type=file]), +:where(select, textarea) { + --pico-outline-width: 0.0625rem; +} + +[type=search] { + --pico-border-radius: 5rem; +} + +[type=checkbox], +[type=radio] { + --pico-border-width: 0.125rem; +} + +[type=checkbox][role=switch] { + --pico-border-width: 0.1875rem; +} + +details.dropdown summary:not([role=button]) { + --pico-outline-width: 0.0625rem; +} + +nav details.dropdown summary:focus-visible { + --pico-outline-width: 0.125rem; +} + +[role=search] { + --pico-border-radius: 5rem; +} + +[role=search]:has(button.secondary:focus, +[type=submit].secondary:focus, +[type=button].secondary:focus, +[role=button].secondary:focus), +[role=group]:has(button.secondary:focus, +[type=submit].secondary:focus, +[type=button].secondary:focus, +[role=button].secondary:focus) { + --pico-group-box-shadow-focus-with-button: 0 0 0 var(--pico-outline-width) var(--pico-secondary-focus); +} +[role=search]:has(button.contrast:focus, +[type=submit].contrast:focus, +[type=button].contrast:focus, +[role=button].contrast:focus), +[role=group]:has(button.contrast:focus, +[type=submit].contrast:focus, +[type=button].contrast:focus, +[role=button].contrast:focus) { + --pico-group-box-shadow-focus-with-button: 0 0 0 var(--pico-outline-width) var(--pico-contrast-focus); +} +[role=search] button, +[role=search] [type=submit], +[role=search] [type=button], +[role=search] [role=button], +[role=group] button, +[role=group] [type=submit], +[role=group] [type=button], +[role=group] [role=button] { + --pico-form-element-spacing-horizontal: 2rem; +} + +details summary[role=button]:not(.outline)::after { + filter: brightness(0) invert(1); +} + +[aria-busy=true]:not(input, select, textarea):is(button, [type=submit], [type=button], [type=reset], [role=button]):not(.outline)::before { + filter: brightness(0) invert(1); +} + +/** + * Color schemes + */ +[data-theme=light], +:root:not([data-theme=dark]) { + --pico-background-color: #fff; + --pico-color: #373c44; + --pico-text-selection-color: rgba(129, 145, 181, 0.25); + --pico-muted-color: #646b79; + --pico-muted-border-color: #e7eaf0; + --pico-primary: #5d6b89; + --pico-primary-background: #525f7a; + --pico-primary-border: var(--pico-primary-background); + --pico-primary-underline: rgba(93, 107, 137, 0.5); + --pico-primary-hover: #48536b; + --pico-primary-hover-background: #48536b; + --pico-primary-hover-border: var(--pico-primary-hover-background); + --pico-primary-hover-underline: var(--pico-primary-hover); + --pico-primary-focus: rgba(129, 145, 181, 0.5); + --pico-primary-inverse: #fff; + --pico-secondary: #5d6b89; + --pico-secondary-background: #525f7a; + --pico-secondary-border: var(--pico-secondary-background); + --pico-secondary-underline: rgba(93, 107, 137, 0.5); + --pico-secondary-hover: #48536b; + --pico-secondary-hover-background: #48536b; + --pico-secondary-hover-border: var(--pico-secondary-hover-background); + --pico-secondary-hover-underline: var(--pico-secondary-hover); + --pico-secondary-focus: rgba(93, 107, 137, 0.25); + --pico-secondary-inverse: #fff; + --pico-contrast: #181c25; + --pico-contrast-background: #181c25; + --pico-contrast-border: var(--pico-contrast-background); + --pico-contrast-underline: rgba(24, 28, 37, 0.5); + --pico-contrast-hover: #000; + --pico-contrast-hover-background: #000; + --pico-contrast-hover-border: var(--pico-contrast-hover-background); + --pico-contrast-hover-underline: var(--pico-secondary-hover); + --pico-contrast-focus: rgba(93, 107, 137, 0.25); + --pico-contrast-inverse: #fff; + --pico-box-shadow: 0.0145rem 0.029rem 0.174rem rgba(129, 145, 181, 0.01698), 0.0335rem 0.067rem 0.402rem rgba(129, 145, 181, 0.024), 0.0625rem 0.125rem 0.75rem rgba(129, 145, 181, 0.03), 0.1125rem 0.225rem 1.35rem rgba(129, 145, 181, 0.036), 0.2085rem 0.417rem 2.502rem rgba(129, 145, 181, 0.04302), 0.5rem 1rem 6rem rgba(129, 145, 181, 0.06), 0 0 0 0.0625rem rgba(129, 145, 181, 0.015); + --pico-h1-color: #2d3138; + --pico-h2-color: #373c44; + --pico-h3-color: #424751; + --pico-h4-color: #4d535e; + --pico-h5-color: #5c6370; + --pico-h6-color: #646b79; + --pico-mark-background-color: #fde7c0; + --pico-mark-color: #0f1114; + --pico-ins-color: #1d6a54; + --pico-del-color: #883935; + --pico-blockquote-border-color: var(--pico-muted-border-color); + --pico-blockquote-footer-color: var(--pico-muted-color); + --pico-button-box-shadow: 0 0 0 rgba(0, 0, 0, 0); + --pico-button-hover-box-shadow: 0 0 0 rgba(0, 0, 0, 0); + --pico-table-border-color: var(--pico-muted-border-color); + --pico-table-row-stripped-background-color: rgba(111, 120, 135, 0.0375); + --pico-code-background-color: #f3f5f7; + --pico-code-color: #646b79; + --pico-code-kbd-background-color: var(--pico-color); + --pico-code-kbd-color: var(--pico-background-color); + --pico-form-element-background-color: #fbfcfc; + --pico-form-element-selected-background-color: #dfe3eb; + --pico-form-element-border-color: #cfd5e2; + --pico-form-element-color: #23262c; + --pico-form-element-placeholder-color: var(--pico-muted-color); + --pico-form-element-active-background-color: #fff; + --pico-form-element-active-border-color: var(--pico-primary-border); + --pico-form-element-focus-color: var(--pico-primary-border); + --pico-form-element-disabled-opacity: 0.5; + --pico-form-element-invalid-border-color: #b86a6b; + --pico-form-element-invalid-active-border-color: #c84f48; + --pico-form-element-invalid-focus-color: var(--pico-form-element-invalid-active-border-color); + --pico-form-element-valid-border-color: #4c9b8a; + --pico-form-element-valid-active-border-color: #279977; + --pico-form-element-valid-focus-color: var(--pico-form-element-valid-active-border-color); + --pico-switch-background-color: #bfc7d9; + --pico-switch-checked-background-color: var(--pico-primary-background); + --pico-switch-color: #fff; + --pico-switch-thumb-box-shadow: 0 0 0 rgba(0, 0, 0, 0); + --pico-range-border-color: #dfe3eb; + --pico-range-active-border-color: #bfc7d9; + --pico-range-thumb-border-color: var(--pico-background-color); + --pico-range-thumb-color: var(--pico-secondary-background); + --pico-range-thumb-active-color: var(--pico-primary-background); + --pico-accordion-border-color: var(--pico-muted-border-color); + --pico-accordion-active-summary-color: var(--pico-primary-hover); + --pico-accordion-close-summary-color: var(--pico-color); + --pico-accordion-open-summary-color: var(--pico-muted-color); + --pico-card-background-color: var(--pico-background-color); + --pico-card-border-color: var(--pico-muted-border-color); + --pico-card-box-shadow: var(--pico-box-shadow); + --pico-card-sectioning-background-color: #fbfcfc; + --pico-dropdown-background-color: #fff; + --pico-dropdown-border-color: #eff1f4; + --pico-dropdown-box-shadow: var(--pico-box-shadow); + --pico-dropdown-color: var(--pico-color); + --pico-dropdown-hover-background-color: #eff1f4; + --pico-loading-spinner-opacity: 0.5; + --pico-modal-overlay-background-color: rgba(232, 234, 237, 0.75); + --pico-progress-background-color: #dfe3eb; + --pico-progress-color: var(--pico-primary-background); + --pico-tooltip-background-color: var(--pico-contrast-background); + --pico-tooltip-color: var(--pico-contrast-inverse); + --pico-icon-valid: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(76, 155, 138)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E"); + --pico-icon-invalid: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(200, 79, 72)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E"); + color-scheme: light; +} +[data-theme=light] input:is([type=submit], +[type=button], +[type=reset], +[type=checkbox], +[type=radio], +[type=file]), +:root:not([data-theme=dark]) input:is([type=submit], +[type=button], +[type=reset], +[type=checkbox], +[type=radio], +[type=file]) { + --pico-form-element-focus-color: var(--pico-primary-focus); +} + +@media only screen and (prefers-color-scheme: dark) { + :root:not([data-theme]) { + --pico-background-color: #13171f; + --pico-color: #c2c7d0; + --pico-text-selection-color: rgba(144, 158, 190, 0.1875); + --pico-muted-color: #7b8495; + --pico-muted-border-color: #202632; + --pico-primary: #909ebe; + --pico-primary-background: #525f7a; + --pico-primary-border: var(--pico-primary-background); + --pico-primary-underline: rgba(144, 158, 190, 0.5); + --pico-primary-hover: #b0b9d0; + --pico-primary-hover-background: #5d6b89; + --pico-primary-hover-border: var(--pico-primary-hover-background); + --pico-primary-hover-underline: var(--pico-primary-hover); + --pico-primary-focus: rgba(144, 158, 190, 0.375); + --pico-primary-inverse: #fff; + --pico-secondary: #969eaf; + --pico-secondary-background: #525f7a; + --pico-secondary-border: var(--pico-secondary-background); + --pico-secondary-underline: rgba(150, 158, 175, 0.5); + --pico-secondary-hover: #b3b9c5; + --pico-secondary-hover-background: #5d6b89; + --pico-secondary-hover-border: var(--pico-secondary-hover-background); + --pico-secondary-hover-underline: var(--pico-secondary-hover); + --pico-secondary-focus: rgba(144, 158, 190, 0.25); + --pico-secondary-inverse: #fff; + --pico-contrast: #dfe3eb; + --pico-contrast-background: #eff1f4; + --pico-contrast-border: var(--pico-contrast-background); + --pico-contrast-underline: rgba(223, 227, 235, 0.5); + --pico-contrast-hover: #fff; + --pico-contrast-hover-background: #fff; + --pico-contrast-hover-border: var(--pico-contrast-hover-background); + --pico-contrast-hover-underline: var(--pico-contrast-hover); + --pico-contrast-focus: rgba(207, 213, 226, 0.25); + --pico-contrast-inverse: #000; + --pico-box-shadow: 0.0145rem 0.029rem 0.174rem rgba(7, 9, 12, 0.01698), 0.0335rem 0.067rem 0.402rem rgba(7, 9, 12, 0.024), 0.0625rem 0.125rem 0.75rem rgba(7, 9, 12, 0.03), 0.1125rem 0.225rem 1.35rem rgba(7, 9, 12, 0.036), 0.2085rem 0.417rem 2.502rem rgba(7, 9, 12, 0.04302), 0.5rem 1rem 6rem rgba(7, 9, 12, 0.06), 0 0 0 0.0625rem rgba(7, 9, 12, 0.015); + --pico-h1-color: #f0f1f3; + --pico-h2-color: #e0e3e7; + --pico-h3-color: #c2c7d0; + --pico-h4-color: #b3b9c5; + --pico-h5-color: #a4acba; + --pico-h6-color: #8891a4; + --pico-mark-background-color: #014063; + --pico-mark-color: #fff; + --pico-ins-color: #62af9a; + --pico-del-color: #ce7e7b; + --pico-blockquote-border-color: var(--pico-muted-border-color); + --pico-blockquote-footer-color: var(--pico-muted-color); + --pico-button-box-shadow: 0 0 0 rgba(0, 0, 0, 0); + --pico-button-hover-box-shadow: 0 0 0 rgba(0, 0, 0, 0); + --pico-table-border-color: var(--pico-muted-border-color); + --pico-table-row-stripped-background-color: rgba(111, 120, 135, 0.0375); + --pico-code-background-color: #1a1f28; + --pico-code-color: #8891a4; + --pico-code-kbd-background-color: var(--pico-color); + --pico-code-kbd-color: var(--pico-background-color); + --pico-form-element-background-color: #1c212c; + --pico-form-element-selected-background-color: #2a3140; + --pico-form-element-border-color: #2a3140; + --pico-form-element-color: #e0e3e7; + --pico-form-element-placeholder-color: #8891a4; + --pico-form-element-active-background-color: #1a1f28; + --pico-form-element-active-border-color: var(--pico-primary-border); + --pico-form-element-focus-color: var(--pico-primary-border); + --pico-form-element-disabled-opacity: 0.5; + --pico-form-element-invalid-border-color: #964a50; + --pico-form-element-invalid-active-border-color: #b7403b; + --pico-form-element-invalid-focus-color: var(--pico-form-element-invalid-active-border-color); + --pico-form-element-valid-border-color: #2a7b6f; + --pico-form-element-valid-active-border-color: #16896a; + --pico-form-element-valid-focus-color: var(--pico-form-element-valid-active-border-color); + --pico-switch-background-color: #333c4e; + --pico-switch-checked-background-color: var(--pico-primary-background); + --pico-switch-color: #fff; + --pico-switch-thumb-box-shadow: 0 0 0 rgba(0, 0, 0, 0); + --pico-range-border-color: #202632; + --pico-range-active-border-color: #2a3140; + --pico-range-thumb-border-color: var(--pico-background-color); + --pico-range-thumb-color: var(--pico-secondary-background); + --pico-range-thumb-active-color: var(--pico-primary-background); + --pico-accordion-border-color: var(--pico-muted-border-color); + --pico-accordion-active-summary-color: var(--pico-primary-hover); + --pico-accordion-close-summary-color: var(--pico-color); + --pico-accordion-open-summary-color: var(--pico-muted-color); + --pico-card-background-color: #181c25; + --pico-card-border-color: var(--pico-card-background-color); + --pico-card-box-shadow: var(--pico-box-shadow); + --pico-card-sectioning-background-color: #1a1f28; + --pico-dropdown-background-color: #181c25; + --pico-dropdown-border-color: #202632; + --pico-dropdown-box-shadow: var(--pico-box-shadow); + --pico-dropdown-color: var(--pico-color); + --pico-dropdown-hover-background-color: #202632; + --pico-loading-spinner-opacity: 0.5; + --pico-modal-overlay-background-color: rgba(8, 9, 10, 0.75); + --pico-progress-background-color: #202632; + --pico-progress-color: var(--pico-primary-background); + --pico-tooltip-background-color: var(--pico-contrast-background); + --pico-tooltip-color: var(--pico-contrast-inverse); + --pico-icon-valid: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(42, 123, 111)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E"); + --pico-icon-invalid: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(150, 74, 80)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E"); + color-scheme: dark; + } + :root:not([data-theme]) input:is([type=submit], + [type=button], + [type=reset], + [type=checkbox], + [type=radio], + [type=file]) { + --pico-form-element-focus-color: var(--pico-primary-focus); + } + :root:not([data-theme]) details summary[role=button].contrast:not(.outline)::after { + filter: brightness(0); + } + :root:not([data-theme]) [aria-busy=true]:not(input, select, textarea).contrast:is(button, + [type=submit], + [type=button], + [type=reset], + [role=button]):not(.outline)::before { + filter: brightness(0); + } +} +[data-theme=dark] { + --pico-background-color: #13171f; + --pico-color: #c2c7d0; + --pico-text-selection-color: rgba(144, 158, 190, 0.1875); + --pico-muted-color: #7b8495; + --pico-muted-border-color: #202632; + --pico-primary: #909ebe; + --pico-primary-background: #525f7a; + --pico-primary-border: var(--pico-primary-background); + --pico-primary-underline: rgba(144, 158, 190, 0.5); + --pico-primary-hover: #b0b9d0; + --pico-primary-hover-background: #5d6b89; + --pico-primary-hover-border: var(--pico-primary-hover-background); + --pico-primary-hover-underline: var(--pico-primary-hover); + --pico-primary-focus: rgba(144, 158, 190, 0.375); + --pico-primary-inverse: #fff; + --pico-secondary: #969eaf; + --pico-secondary-background: #525f7a; + --pico-secondary-border: var(--pico-secondary-background); + --pico-secondary-underline: rgba(150, 158, 175, 0.5); + --pico-secondary-hover: #b3b9c5; + --pico-secondary-hover-background: #5d6b89; + --pico-secondary-hover-border: var(--pico-secondary-hover-background); + --pico-secondary-hover-underline: var(--pico-secondary-hover); + --pico-secondary-focus: rgba(144, 158, 190, 0.25); + --pico-secondary-inverse: #fff; + --pico-contrast: #dfe3eb; + --pico-contrast-background: #eff1f4; + --pico-contrast-border: var(--pico-contrast-background); + --pico-contrast-underline: rgba(223, 227, 235, 0.5); + --pico-contrast-hover: #fff; + --pico-contrast-hover-background: #fff; + --pico-contrast-hover-border: var(--pico-contrast-hover-background); + --pico-contrast-hover-underline: var(--pico-contrast-hover); + --pico-contrast-focus: rgba(207, 213, 226, 0.25); + --pico-contrast-inverse: #000; + --pico-box-shadow: 0.0145rem 0.029rem 0.174rem rgba(7, 9, 12, 0.01698), 0.0335rem 0.067rem 0.402rem rgba(7, 9, 12, 0.024), 0.0625rem 0.125rem 0.75rem rgba(7, 9, 12, 0.03), 0.1125rem 0.225rem 1.35rem rgba(7, 9, 12, 0.036), 0.2085rem 0.417rem 2.502rem rgba(7, 9, 12, 0.04302), 0.5rem 1rem 6rem rgba(7, 9, 12, 0.06), 0 0 0 0.0625rem rgba(7, 9, 12, 0.015); + --pico-h1-color: #f0f1f3; + --pico-h2-color: #e0e3e7; + --pico-h3-color: #c2c7d0; + --pico-h4-color: #b3b9c5; + --pico-h5-color: #a4acba; + --pico-h6-color: #8891a4; + --pico-mark-background-color: #014063; + --pico-mark-color: #fff; + --pico-ins-color: #62af9a; + --pico-del-color: #ce7e7b; + --pico-blockquote-border-color: var(--pico-muted-border-color); + --pico-blockquote-footer-color: var(--pico-muted-color); + --pico-button-box-shadow: 0 0 0 rgba(0, 0, 0, 0); + --pico-button-hover-box-shadow: 0 0 0 rgba(0, 0, 0, 0); + --pico-table-border-color: var(--pico-muted-border-color); + --pico-table-row-stripped-background-color: rgba(111, 120, 135, 0.0375); + --pico-code-background-color: #1a1f28; + --pico-code-color: #8891a4; + --pico-code-kbd-background-color: var(--pico-color); + --pico-code-kbd-color: var(--pico-background-color); + --pico-form-element-background-color: #1c212c; + --pico-form-element-selected-background-color: #2a3140; + --pico-form-element-border-color: #2a3140; + --pico-form-element-color: #e0e3e7; + --pico-form-element-placeholder-color: #8891a4; + --pico-form-element-active-background-color: #1a1f28; + --pico-form-element-active-border-color: var(--pico-primary-border); + --pico-form-element-focus-color: var(--pico-primary-border); + --pico-form-element-disabled-opacity: 0.5; + --pico-form-element-invalid-border-color: #964a50; + --pico-form-element-invalid-active-border-color: #b7403b; + --pico-form-element-invalid-focus-color: var(--pico-form-element-invalid-active-border-color); + --pico-form-element-valid-border-color: #2a7b6f; + --pico-form-element-valid-active-border-color: #16896a; + --pico-form-element-valid-focus-color: var(--pico-form-element-valid-active-border-color); + --pico-switch-background-color: #333c4e; + --pico-switch-checked-background-color: var(--pico-primary-background); + --pico-switch-color: #fff; + --pico-switch-thumb-box-shadow: 0 0 0 rgba(0, 0, 0, 0); + --pico-range-border-color: #202632; + --pico-range-active-border-color: #2a3140; + --pico-range-thumb-border-color: var(--pico-background-color); + --pico-range-thumb-color: var(--pico-secondary-background); + --pico-range-thumb-active-color: var(--pico-primary-background); + --pico-accordion-border-color: var(--pico-muted-border-color); + --pico-accordion-active-summary-color: var(--pico-primary-hover); + --pico-accordion-close-summary-color: var(--pico-color); + --pico-accordion-open-summary-color: var(--pico-muted-color); + --pico-card-background-color: #181c25; + --pico-card-border-color: var(--pico-card-background-color); + --pico-card-box-shadow: var(--pico-box-shadow); + --pico-card-sectioning-background-color: #1a1f28; + --pico-dropdown-background-color: #181c25; + --pico-dropdown-border-color: #202632; + --pico-dropdown-box-shadow: var(--pico-box-shadow); + --pico-dropdown-color: var(--pico-color); + --pico-dropdown-hover-background-color: #202632; + --pico-loading-spinner-opacity: 0.5; + --pico-modal-overlay-background-color: rgba(8, 9, 10, 0.75); + --pico-progress-background-color: #202632; + --pico-progress-color: var(--pico-primary-background); + --pico-tooltip-background-color: var(--pico-contrast-background); + --pico-tooltip-color: var(--pico-contrast-inverse); + --pico-icon-valid: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(42, 123, 111)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E"); + --pico-icon-invalid: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(150, 74, 80)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E"); + color-scheme: dark; +} +[data-theme=dark] input:is([type=submit], +[type=button], +[type=reset], +[type=checkbox], +[type=radio], +[type=file]) { + --pico-form-element-focus-color: var(--pico-primary-focus); +} +[data-theme=dark] details summary[role=button].contrast:not(.outline)::after { + filter: brightness(0); +} +[data-theme=dark] [aria-busy=true]:not(input, select, textarea).contrast:is(button, +[type=submit], +[type=button], +[type=reset], +[role=button]):not(.outline)::before { + filter: brightness(0); +} + +progress, +[type=checkbox], +[type=radio], +[type=range] { + accent-color: var(--pico-primary); +} + +/** + * Document + * Content-box & Responsive typography + */ +*, +*::before, +*::after { + box-sizing: border-box; + background-repeat: no-repeat; +} + +::before, +::after { + text-decoration: inherit; + vertical-align: inherit; +} + +:where(:root) { + -webkit-tap-highlight-color: transparent; + -webkit-text-size-adjust: 100%; + text-size-adjust: 100%; + background-color: var(--pico-background-color); + color: var(--pico-color); + font-weight: var(--pico-font-weight); + font-size: var(--pico-font-size); + line-height: var(--pico-line-height); + font-family: var(--pico-font-family); + text-underline-offset: var(--pico-text-underline-offset); + text-rendering: optimizeLegibility; + overflow-wrap: break-word; + tab-size: 4; +} + +/** + * Landmarks + */ +body { + width: 100%; + margin: 0; +} + +main { + display: block; +} + +body > header, +body > main, +body > footer { + width: 100%; + margin-right: auto; + margin-left: auto; + padding: var(--pico-block-spacing-vertical) var(--pico-block-spacing-horizontal); +} +@media (min-width: 576px) { + body > header, + body > main, + body > footer { + max-width: 95%; + padding-right: 0; + padding-left: 0; + } +} +@media (min-width: 768px) { + body > header, + body > main, + body > footer { + max-width: 95%; + } +} +@media (min-width: 1024px) { + body > header, + body > main, + body > footer { + max-width: 90%; + } +} +@media (min-width: 1280px) { + body > header, + body > main, + body > footer { + max-width: 90%; + } +} +@media (min-width: 1536px) { + body > header, + body > main, + body > footer { + max-width: 85%; + } +} + +/** + * Section + */ +section { + margin-bottom: var(--pico-block-spacing-vertical); +} + +/** + * Container + */ +.container, +.container-fluid { + width: 100%; + margin-right: auto; + margin-left: auto; + padding-right: var(--pico-spacing); + padding-left: var(--pico-spacing); +} + +@media (min-width: 576px) { + .container { + max-width: 95%; + padding-right: 0; + padding-left: 0; + } +} +@media (min-width: 768px) { + .container { + max-width: 95%; + } +} +@media (min-width: 1024px) { + .container { + max-width: 90%; + } +} +@media (min-width: 1280px) { + .container { + max-width: 90%; + } +} +@media (min-width: 1536px) { + .container { + max-width: 85%; + } +} + +/** + * Grid + * Minimal grid system with auto-layout columns + */ +.grid { + grid-column-gap: var(--pico-grid-column-gap); + grid-row-gap: var(--pico-grid-row-gap); + display: grid; + grid-template-columns: 1fr; +} +@media (min-width: 768px) { + .grid { + grid-template-columns: repeat(auto-fit, minmax(0%, 1fr)); + } +} +.grid > * { + min-width: 0; +} + +/** + * Overflow auto + */ +.overflow-auto { + overflow: auto; +} + +/** + * Typography + */ +b, +strong { + font-weight: bolder; +} + +sub, +sup { + position: relative; + font-size: 0.75em; + line-height: 0; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +address, +blockquote, +dl, +ol, +p, +pre, +table, +ul { + margin-top: 0; + margin-bottom: var(--pico-typography-spacing-vertical); + color: var(--pico-color); + font-style: normal; + font-weight: var(--pico-font-weight); +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin-top: 0; + margin-bottom: var(--pico-typography-spacing-vertical); + color: var(--pico-color); + font-weight: var(--pico-font-weight); + font-size: var(--pico-font-size); + line-height: var(--pico-line-height); + font-family: var(--pico-font-family); +} + +h1 { + --pico-color: var(--pico-h1-color); +} + +h2 { + --pico-color: var(--pico-h2-color); +} + +h3 { + --pico-color: var(--pico-h3-color); +} + +h4 { + --pico-color: var(--pico-h4-color); +} + +h5 { + --pico-color: var(--pico-h5-color); +} + +h6 { + --pico-color: var(--pico-h6-color); +} + +:where(article, address, blockquote, dl, figure, form, ol, p, pre, table, ul) ~ :is(h1, h2, h3, h4, h5, h6) { + margin-top: var(--pico-typography-spacing-top); +} + +p { + margin-bottom: var(--pico-typography-spacing-vertical); +} + +hgroup { + margin-bottom: var(--pico-typography-spacing-vertical); +} +hgroup > * { + margin-top: 0; + margin-bottom: 0; +} +hgroup > *:not(:first-child):last-child { + --pico-color: var(--pico-muted-color); + --pico-font-weight: unset; + font-size: 1rem; +} + +:where(ol, ul) li { + margin-bottom: calc(var(--pico-typography-spacing-vertical) * 0.25); +} + +:where(dl, ol, ul) :where(dl, ol, ul) { + margin: 0; + margin-top: calc(var(--pico-typography-spacing-vertical) * 0.25); +} + +ul li { + list-style: square; +} + +mark { + padding: 0.125rem 0.25rem; + background-color: var(--pico-mark-background-color); + color: var(--pico-mark-color); + vertical-align: baseline; +} + +blockquote { + display: block; + margin: var(--pico-typography-spacing-vertical) 0; + padding: var(--pico-spacing); + border-right: none; + border-left: 0.25rem solid var(--pico-blockquote-border-color); + border-inline-start: 0.25rem solid var(--pico-blockquote-border-color); + border-inline-end: none; +} +blockquote footer { + margin-top: calc(var(--pico-typography-spacing-vertical) * 0.5); + color: var(--pico-blockquote-footer-color); +} + +abbr[title] { + border-bottom: 1px dotted; + text-decoration: none; + cursor: help; +} + +ins { + color: var(--pico-ins-color); + text-decoration: none; +} + +del { + color: var(--pico-del-color); +} + +::selection { + background-color: var(--pico-text-selection-color); +} + +/** + * Link + */ +:where(a:not([role=button])), +[role=link] { + --pico-color: var(--pico-primary); + --pico-background-color: transparent; + --pico-underline: var(--pico-primary-underline); + outline: none; + background-color: var(--pico-background-color); + color: var(--pico-color); + text-decoration: var(--pico-text-decoration); + text-decoration-color: var(--pico-underline); + text-underline-offset: 0.125em; + transition: background-color var(--pico-transition), color var(--pico-transition), text-decoration var(--pico-transition), box-shadow var(--pico-transition); +} +:where(a:not([role=button])):is([aria-current]:not([aria-current=false]), :hover, :active, :focus), +[role=link]:is([aria-current]:not([aria-current=false]), :hover, :active, :focus) { + --pico-color: var(--pico-primary-hover); + --pico-underline: var(--pico-primary-hover-underline); + --pico-text-decoration: underline; +} +:where(a:not([role=button])):focus-visible, +[role=link]:focus-visible { + box-shadow: 0 0 0 var(--pico-outline-width) var(--pico-primary-focus); +} +:where(a:not([role=button])).secondary, +[role=link].secondary { + --pico-color: var(--pico-secondary); + --pico-underline: var(--pico-secondary-underline); +} +:where(a:not([role=button])).secondary:is([aria-current]:not([aria-current=false]), :hover, :active, :focus), +[role=link].secondary:is([aria-current]:not([aria-current=false]), :hover, :active, :focus) { + --pico-color: var(--pico-secondary-hover); + --pico-underline: var(--pico-secondary-hover-underline); +} +:where(a:not([role=button])).contrast, +[role=link].contrast { + --pico-color: var(--pico-contrast); + --pico-underline: var(--pico-contrast-underline); +} +:where(a:not([role=button])).contrast:is([aria-current]:not([aria-current=false]), :hover, :active, :focus), +[role=link].contrast:is([aria-current]:not([aria-current=false]), :hover, :active, :focus) { + --pico-color: var(--pico-contrast-hover); + --pico-underline: var(--pico-contrast-hover-underline); +} + +a[role=button] { + display: inline-block; +} + +/** + * Button + */ +button { + margin: 0; + overflow: visible; + font-family: inherit; + text-transform: none; +} + +button, +[type=submit], +[type=reset], +[type=button] { + -webkit-appearance: button; +} + +button, +[type=submit], +[type=reset], +[type=button], +[type=file]::file-selector-button, +[role=button] { + --pico-background-color: var(--pico-primary-background); + --pico-border-color: var(--pico-primary-border); + --pico-color: var(--pico-primary-inverse); + --pico-box-shadow: var(--pico-button-box-shadow, 0 0 0 rgba(0, 0, 0, 0)); + padding: var(--pico-form-element-spacing-vertical) var(--pico-form-element-spacing-horizontal); + border: var(--pico-border-width) solid var(--pico-border-color); + border-radius: var(--pico-border-radius); + outline: none; + background-color: var(--pico-background-color); + box-shadow: var(--pico-box-shadow); + color: var(--pico-color); + font-weight: var(--pico-font-weight); + font-size: 1rem; + line-height: var(--pico-line-height); + text-align: center; + text-decoration: none; + cursor: pointer; + user-select: none; + transition: background-color var(--pico-transition), border-color var(--pico-transition), color var(--pico-transition), box-shadow var(--pico-transition); +} +button:is([aria-current]:not([aria-current=false])), button:is(:hover, :active, :focus), +[type=submit]:is([aria-current]:not([aria-current=false])), +[type=submit]:is(:hover, :active, :focus), +[type=reset]:is([aria-current]:not([aria-current=false])), +[type=reset]:is(:hover, :active, :focus), +[type=button]:is([aria-current]:not([aria-current=false])), +[type=button]:is(:hover, :active, :focus), +[type=file]::file-selector-button:is([aria-current]:not([aria-current=false])), +[type=file]::file-selector-button:is(:hover, :active, :focus), +[role=button]:is([aria-current]:not([aria-current=false])), +[role=button]:is(:hover, :active, :focus) { + --pico-background-color: var(--pico-primary-hover-background); + --pico-border-color: var(--pico-primary-hover-border); + --pico-box-shadow: var(--pico-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)); + --pico-color: var(--pico-primary-inverse); +} +button:focus, button:is([aria-current]:not([aria-current=false])):focus, +[type=submit]:focus, +[type=submit]:is([aria-current]:not([aria-current=false])):focus, +[type=reset]:focus, +[type=reset]:is([aria-current]:not([aria-current=false])):focus, +[type=button]:focus, +[type=button]:is([aria-current]:not([aria-current=false])):focus, +[type=file]::file-selector-button:focus, +[type=file]::file-selector-button:is([aria-current]:not([aria-current=false])):focus, +[role=button]:focus, +[role=button]:is([aria-current]:not([aria-current=false])):focus { + --pico-box-shadow: var(--pico-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)), 0 0 0 var(--pico-outline-width) var(--pico-primary-focus); +} + +[type=submit], +[type=reset], +[type=button] { + margin-bottom: var(--pico-spacing); +} + +:is(button, [type=submit], [type=button], [role=button]).secondary, +[type=reset], +[type=file]::file-selector-button { + --pico-background-color: var(--pico-secondary-background); + --pico-border-color: var(--pico-secondary-border); + --pico-color: var(--pico-secondary-inverse); + cursor: pointer; +} +:is(button, [type=submit], [type=button], [role=button]).secondary:is([aria-current]:not([aria-current=false]), :hover, :active, :focus), +[type=reset]:is([aria-current]:not([aria-current=false]), :hover, :active, :focus), +[type=file]::file-selector-button:is([aria-current]:not([aria-current=false]), :hover, :active, :focus) { + --pico-background-color: var(--pico-secondary-hover-background); + --pico-border-color: var(--pico-secondary-hover-border); + --pico-color: var(--pico-secondary-inverse); +} +:is(button, [type=submit], [type=button], [role=button]).secondary:focus, :is(button, [type=submit], [type=button], [role=button]).secondary:is([aria-current]:not([aria-current=false])):focus, +[type=reset]:focus, +[type=reset]:is([aria-current]:not([aria-current=false])):focus, +[type=file]::file-selector-button:focus, +[type=file]::file-selector-button:is([aria-current]:not([aria-current=false])):focus { + --pico-box-shadow: var(--pico-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)), 0 0 0 var(--pico-outline-width) var(--pico-secondary-focus); +} + +:is(button, [type=submit], [type=button], [role=button]).contrast { + --pico-background-color: var(--pico-contrast-background); + --pico-border-color: var(--pico-contrast-border); + --pico-color: var(--pico-contrast-inverse); +} +:is(button, [type=submit], [type=button], [role=button]).contrast:is([aria-current]:not([aria-current=false]), :hover, :active, :focus) { + --pico-background-color: var(--pico-contrast-hover-background); + --pico-border-color: var(--pico-contrast-hover-border); + --pico-color: var(--pico-contrast-inverse); +} +:is(button, [type=submit], [type=button], [role=button]).contrast:focus, :is(button, [type=submit], [type=button], [role=button]).contrast:is([aria-current]:not([aria-current=false])):focus { + --pico-box-shadow: var(--pico-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)), 0 0 0 var(--pico-outline-width) var(--pico-contrast-focus); +} + +:is(button, [type=submit], [type=button], [role=button]).outline, +[type=reset].outline { + --pico-background-color: transparent; + --pico-color: var(--pico-primary); + --pico-border-color: var(--pico-primary); +} +:is(button, [type=submit], [type=button], [role=button]).outline:is([aria-current]:not([aria-current=false]), :hover, :active, :focus), +[type=reset].outline:is([aria-current]:not([aria-current=false]), :hover, :active, :focus) { + --pico-background-color: transparent; + --pico-color: var(--pico-primary-hover); + --pico-border-color: var(--pico-primary-hover); +} + +:is(button, [type=submit], [type=button], [role=button]).outline.secondary, +[type=reset].outline { + --pico-color: var(--pico-secondary); + --pico-border-color: var(--pico-secondary); +} +:is(button, [type=submit], [type=button], [role=button]).outline.secondary:is([aria-current]:not([aria-current=false]), :hover, :active, :focus), +[type=reset].outline:is([aria-current]:not([aria-current=false]), :hover, :active, :focus) { + --pico-color: var(--pico-secondary-hover); + --pico-border-color: var(--pico-secondary-hover); +} + +:is(button, [type=submit], [type=button], [role=button]).outline.contrast { + --pico-color: var(--pico-contrast); + --pico-border-color: var(--pico-contrast); +} +:is(button, [type=submit], [type=button], [role=button]).outline.contrast:is([aria-current]:not([aria-current=false]), :hover, :active, :focus) { + --pico-color: var(--pico-contrast-hover); + --pico-border-color: var(--pico-contrast-hover); +} + +:where(button, [type=submit], [type=reset], [type=button], [role=button])[disabled], +:where(fieldset[disabled]) :is(button, [type=submit], [type=button], [type=reset], [role=button]) { + opacity: 0.5; + pointer-events: none; +} + +/** + * Table + */ +:where(table) { + width: 100%; + border-collapse: collapse; + border-spacing: 0; + text-indent: 0; +} + +th, +td { + padding: calc(var(--pico-spacing) / 2) var(--pico-spacing); + border-bottom: var(--pico-border-width) solid var(--pico-table-border-color); + background-color: var(--pico-background-color); + color: var(--pico-color); + font-weight: var(--pico-font-weight); + text-align: left; + text-align: start; +} + +tfoot th, +tfoot td { + border-top: var(--pico-border-width) solid var(--pico-table-border-color); + border-bottom: 0; +} + +table.striped tbody tr:nth-child(odd) th, +table.striped tbody tr:nth-child(odd) td { + background-color: var(--pico-table-row-stripped-background-color); +} + +/** + * Embedded content + */ +:where(audio, canvas, iframe, img, svg, video) { + vertical-align: middle; +} + +audio, +video { + display: inline-block; +} + +audio:not([controls]) { + display: none; + height: 0; +} + +:where(iframe) { + border-style: none; +} + +img { + max-width: 100%; + height: auto; + border-style: none; +} + +:where(svg:not([fill])) { + fill: currentColor; +} + +svg:not(:root) { + overflow: hidden; +} + +/** + * Code + */ +pre, +code, +kbd, +samp { + font-size: 0.875em; + font-family: var(--pico-font-family); +} + +pre code { + font-size: inherit; + font-family: inherit; +} + +pre { + -ms-overflow-style: scrollbar; + overflow: auto; +} + +pre, +code, +kbd { + border-radius: var(--pico-border-radius); + background: var(--pico-code-background-color); + color: var(--pico-code-color); + font-weight: var(--pico-font-weight); + line-height: initial; +} + +code, +kbd { + display: inline-block; + padding: 0.375rem; +} + +pre { + display: block; + margin-bottom: var(--pico-spacing); + overflow-x: auto; +} +pre > code { + display: block; + padding: var(--pico-spacing); + background: none; + line-height: var(--pico-line-height); +} + +kbd { + background-color: var(--pico-code-kbd-background-color); + color: var(--pico-code-kbd-color); + vertical-align: baseline; +} + +/** + * Figure + */ +figure { + display: block; + margin: 0; + padding: 0; +} +figure figcaption { + padding: calc(var(--pico-spacing) * 0.5) 0; + color: var(--pico-muted-color); +} + +/** + * Miscs + */ +hr { + height: 0; + margin: var(--pico-typography-spacing-vertical) 0; + border: 0; + border-top: 1px solid var(--pico-muted-border-color); + color: inherit; +} + +[hidden], +template { + display: none !important; +} + +canvas { + display: inline-block; +} + +/** + * Basics form elements + */ +input, +optgroup, +select, +textarea { + margin: 0; + font-size: 1rem; + line-height: var(--pico-line-height); + font-family: inherit; + letter-spacing: inherit; +} + +input { + overflow: visible; +} + +select { + text-transform: none; +} + +legend { + max-width: 100%; + padding: 0; + color: inherit; + white-space: normal; +} + +textarea { + overflow: auto; +} + +[type=checkbox], +[type=radio] { + padding: 0; +} + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +[type=search] { + -webkit-appearance: textfield; + outline-offset: -2px; +} + +[type=search]::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit; +} + +::-moz-focus-inner { + padding: 0; + border-style: none; +} + +:-moz-focusring { + outline: none; +} + +:-moz-ui-invalid { + box-shadow: none; +} + +::-ms-expand { + display: none; +} + +[type=file], +[type=range] { + padding: 0; + border-width: 0; +} + +input:not([type=checkbox], [type=radio], [type=range]) { + height: calc(1rem * var(--pico-line-height) + var(--pico-form-element-spacing-vertical) * 2 + var(--pico-border-width) * 2); +} + +fieldset { + width: 100%; + margin: 0; + margin-bottom: var(--pico-spacing); + padding: 0; + border: 0; +} + +label, +fieldset legend { + display: block; + margin-bottom: calc(var(--pico-spacing) * 0.375); + color: var(--pico-color); + font-weight: var(--pico-form-label-font-weight, var(--pico-font-weight)); +} + +fieldset legend { + margin-bottom: calc(var(--pico-spacing) * 0.5); +} + +input:not([type=checkbox], [type=radio]), +button[type=submit], +select, +textarea { + width: 100%; +} + +input:not([type=checkbox], [type=radio], [type=range], [type=file]), +select, +textarea { + appearance: none; + padding: var(--pico-form-element-spacing-vertical) var(--pico-form-element-spacing-horizontal); +} + +input, +select, +textarea { + --pico-background-color: var(--pico-form-element-background-color); + --pico-border-color: var(--pico-form-element-border-color); + --pico-color: var(--pico-form-element-color); + --pico-box-shadow: none; + border: var(--pico-border-width) solid var(--pico-border-color); + border-radius: var(--pico-border-radius); + outline: none; + background-color: var(--pico-background-color); + box-shadow: var(--pico-box-shadow); + color: var(--pico-color); + font-weight: var(--pico-font-weight); + transition: background-color var(--pico-transition), border-color var(--pico-transition), color var(--pico-transition), box-shadow var(--pico-transition); +} + +input:not([type=submit], +[type=button], +[type=reset], +[type=checkbox], +[type=radio], +[readonly]):is(:active, :focus), +:where(select, textarea):not([readonly]):is(:active, :focus) { + --pico-background-color: var(--pico-form-element-active-background-color); +} + +input:not([type=submit], [type=button], [type=reset], [role=switch], [readonly]):is(:active, :focus), +:where(select, textarea):not([readonly]):is(:active, :focus) { + --pico-border-color: var(--pico-form-element-active-border-color); +} + +input:not([type=submit], +[type=button], +[type=reset], +[type=range], +[type=file], +[readonly]):focus, +:where(select, textarea):not([readonly]):focus { + --pico-box-shadow: 0 0 0 var(--pico-outline-width) var(--pico-form-element-focus-color); +} + +input:not([type=submit], [type=button], [type=reset])[disabled], +select[disabled], +textarea[disabled], +label[aria-disabled=true], +:where(fieldset[disabled]) :is(input:not([type=submit], [type=button], [type=reset]), select, textarea) { + opacity: var(--pico-form-element-disabled-opacity); + pointer-events: none; +} + +label[aria-disabled=true] input[disabled] { + opacity: 1; +} + +:where(input, select, textarea):not([type=checkbox], +[type=radio], +[type=date], +[type=datetime-local], +[type=month], +[type=time], +[type=week], +[type=range])[aria-invalid] { + padding-right: calc(var(--pico-form-element-spacing-horizontal) + 1.5rem) !important; + padding-left: var(--pico-form-element-spacing-horizontal); + padding-inline-start: var(--pico-form-element-spacing-horizontal) !important; + padding-inline-end: calc(var(--pico-form-element-spacing-horizontal) + 1.5rem) !important; + background-position: center right 0.75rem; + background-size: 1rem auto; + background-repeat: no-repeat; +} +:where(input, select, textarea):not([type=checkbox], +[type=radio], +[type=date], +[type=datetime-local], +[type=month], +[type=time], +[type=week], +[type=range])[aria-invalid=false]:not(select) { + background-image: var(--pico-icon-valid); +} +:where(input, select, textarea):not([type=checkbox], +[type=radio], +[type=date], +[type=datetime-local], +[type=month], +[type=time], +[type=week], +[type=range])[aria-invalid=true]:not(select) { + background-image: var(--pico-icon-invalid); +} +:where(input, select, textarea)[aria-invalid=false] { + --pico-border-color: var(--pico-form-element-valid-border-color); +} +:where(input, select, textarea)[aria-invalid=false]:is(:active, :focus) { + --pico-border-color: var(--pico-form-element-valid-active-border-color) !important; +} +:where(input, select, textarea)[aria-invalid=false]:is(:active, :focus):not([type=checkbox], [type=radio]) { + --pico-box-shadow: 0 0 0 var(--pico-outline-width) var(--pico-form-element-valid-focus-color) !important; +} +:where(input, select, textarea)[aria-invalid=true] { + --pico-border-color: var(--pico-form-element-invalid-border-color); +} +:where(input, select, textarea)[aria-invalid=true]:is(:active, :focus) { + --pico-border-color: var(--pico-form-element-invalid-active-border-color) !important; +} +:where(input, select, textarea)[aria-invalid=true]:is(:active, :focus):not([type=checkbox], [type=radio]) { + --pico-box-shadow: 0 0 0 var(--pico-outline-width) var(--pico-form-element-invalid-focus-color) !important; +} + +[dir=rtl] :where(input, select, textarea):not([type=checkbox], [type=radio]):is([aria-invalid], [aria-invalid=true], [aria-invalid=false]) { + background-position: center left 0.75rem; +} + +input::placeholder, +input::-webkit-input-placeholder, +textarea::placeholder, +textarea::-webkit-input-placeholder, +select:invalid { + color: var(--pico-form-element-placeholder-color); + opacity: 1; +} + +input:not([type=checkbox], [type=radio]), +select, +textarea { + margin-bottom: var(--pico-spacing); +} + +select::-ms-expand { + border: 0; + background-color: transparent; +} +select:not([multiple], [size]) { + padding-right: calc(var(--pico-form-element-spacing-horizontal) + 1.5rem); + padding-left: var(--pico-form-element-spacing-horizontal); + padding-inline-start: var(--pico-form-element-spacing-horizontal); + padding-inline-end: calc(var(--pico-form-element-spacing-horizontal) + 1.5rem); + background-image: var(--pico-icon-chevron); + background-position: center right 0.75rem; + background-size: 1rem auto; + background-repeat: no-repeat; +} +select[multiple] option:checked { + background: var(--pico-form-element-selected-background-color); + color: var(--pico-form-element-color); +} + +[dir=rtl] select:not([multiple], [size]) { + background-position: center left 0.75rem; +} + +textarea { + display: block; + resize: vertical; +} +textarea[aria-invalid] { + --pico-icon-height: calc(1rem * var(--pico-line-height) + var(--pico-form-element-spacing-vertical) * 2 + var(--pico-border-width) * 2); + background-position: top right 0.75rem !important; + background-size: 1rem var(--pico-icon-height) !important; +} + +:where(input, select, textarea, fieldset, .grid) + small { + display: block; + width: 100%; + margin-top: calc(var(--pico-spacing) * -0.75); + margin-bottom: var(--pico-spacing); + color: var(--pico-muted-color); +} +:where(input, select, textarea, fieldset, .grid)[aria-invalid=false] + small { + color: var(--pico-ins-color); +} +:where(input, select, textarea, fieldset, .grid)[aria-invalid=true] + small { + color: var(--pico-del-color); +} + +label > :where(input, select, textarea) { + margin-top: calc(var(--pico-spacing) * 0.25); +} + +/** + * Checkboxes, Radios and Switches + */ +label:has([type=checkbox], [type=radio]) { + width: fit-content; + cursor: pointer; +} + +[type=checkbox], +[type=radio] { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + width: 1.25em; + height: 1.25em; + margin-top: -0.125em; + margin-inline-end: 0.5em; + border-width: var(--pico-border-width); + vertical-align: middle; + cursor: pointer; +} +[type=checkbox]::-ms-check, +[type=radio]::-ms-check { + display: none; +} +[type=checkbox]:checked, [type=checkbox]:checked:active, [type=checkbox]:checked:focus, +[type=radio]:checked, +[type=radio]:checked:active, +[type=radio]:checked:focus { + --pico-background-color: var(--pico-primary-background); + --pico-border-color: var(--pico-primary-border); + background-image: var(--pico-icon-checkbox); + background-position: center; + background-size: 0.75em auto; + background-repeat: no-repeat; +} +[type=checkbox] ~ label, +[type=radio] ~ label { + display: inline-block; + margin-bottom: 0; + cursor: pointer; +} +[type=checkbox] ~ label:not(:last-of-type), +[type=radio] ~ label:not(:last-of-type) { + margin-inline-end: 1em; +} + +[type=checkbox]:indeterminate { + --pico-background-color: var(--pico-primary-background); + --pico-border-color: var(--pico-primary-border); + background-image: var(--pico-icon-minus); + background-position: center; + background-size: 0.75em auto; + background-repeat: no-repeat; +} + +[type=radio] { + border-radius: 50%; +} +[type=radio]:checked, [type=radio]:checked:active, [type=radio]:checked:focus { + --pico-background-color: var(--pico-primary-inverse); + border-width: 0.35em; + background-image: none; +} + +[type=checkbox][role=switch] { + --pico-background-color: var(--pico-switch-background-color); + --pico-color: var(--pico-switch-color); + width: 2.25em; + height: 1.25em; + border: var(--pico-border-width) solid var(--pico-border-color); + border-radius: 1.25em; + background-color: var(--pico-background-color); + line-height: 1.25em; +} +[type=checkbox][role=switch]:not([aria-invalid]) { + --pico-border-color: var(--pico-switch-background-color); +} +[type=checkbox][role=switch]:before { + display: block; + aspect-ratio: 1; + height: 100%; + border-radius: 50%; + background-color: var(--pico-color); + box-shadow: var(--pico-switch-thumb-box-shadow); + content: ""; + transition: margin 0.1s ease-in-out; +} +[type=checkbox][role=switch]:focus { + --pico-background-color: var(--pico-switch-background-color); + --pico-border-color: var(--pico-switch-background-color); +} +[type=checkbox][role=switch]:checked { + --pico-background-color: var(--pico-switch-checked-background-color); + --pico-border-color: var(--pico-switch-checked-background-color); + background-image: none; +} +[type=checkbox][role=switch]:checked::before { + margin-inline-start: calc(2.25em - 1.25em); +} +[type=checkbox][role=switch][disabled] { + --pico-background-color: var(--pico-border-color); +} + +[type=checkbox][aria-invalid=false]:checked, [type=checkbox][aria-invalid=false]:checked:active, [type=checkbox][aria-invalid=false]:checked:focus, +[type=checkbox][role=switch][aria-invalid=false]:checked, +[type=checkbox][role=switch][aria-invalid=false]:checked:active, +[type=checkbox][role=switch][aria-invalid=false]:checked:focus { + --pico-background-color: var(--pico-form-element-valid-border-color); +} +[type=checkbox]:checked[aria-invalid=true], [type=checkbox]:checked:active[aria-invalid=true], [type=checkbox]:checked:focus[aria-invalid=true], +[type=checkbox][role=switch]:checked[aria-invalid=true], +[type=checkbox][role=switch]:checked:active[aria-invalid=true], +[type=checkbox][role=switch]:checked:focus[aria-invalid=true] { + --pico-background-color: var(--pico-form-element-invalid-border-color); +} + +[type=checkbox][aria-invalid=false]:checked, [type=checkbox][aria-invalid=false]:checked:active, [type=checkbox][aria-invalid=false]:checked:focus, +[type=radio][aria-invalid=false]:checked, +[type=radio][aria-invalid=false]:checked:active, +[type=radio][aria-invalid=false]:checked:focus, +[type=checkbox][role=switch][aria-invalid=false]:checked, +[type=checkbox][role=switch][aria-invalid=false]:checked:active, +[type=checkbox][role=switch][aria-invalid=false]:checked:focus { + --pico-border-color: var(--pico-form-element-valid-border-color); +} +[type=checkbox]:checked[aria-invalid=true], [type=checkbox]:checked:active[aria-invalid=true], [type=checkbox]:checked:focus[aria-invalid=true], +[type=radio]:checked[aria-invalid=true], +[type=radio]:checked:active[aria-invalid=true], +[type=radio]:checked:focus[aria-invalid=true], +[type=checkbox][role=switch]:checked[aria-invalid=true], +[type=checkbox][role=switch]:checked:active[aria-invalid=true], +[type=checkbox][role=switch]:checked:focus[aria-invalid=true] { + --pico-border-color: var(--pico-form-element-invalid-border-color); +} + +/** + * Input type color + */ +[type=color]::-webkit-color-swatch-wrapper { + padding: 0; +} +[type=color]::-moz-focus-inner { + padding: 0; +} +[type=color]::-webkit-color-swatch { + border: 0; + border-radius: calc(var(--pico-border-radius) * 0.5); +} +[type=color]::-moz-color-swatch { + border: 0; + border-radius: calc(var(--pico-border-radius) * 0.5); +} + +/** + * Input type datetime + */ +input:not([type=checkbox], [type=radio], [type=range], [type=file]):is([type=date], [type=datetime-local], [type=month], [type=time], [type=week]) { + --pico-icon-position: 0.75rem; + --pico-icon-width: 1rem; + padding-right: calc(var(--pico-icon-width) + var(--pico-icon-position)); + background-image: var(--pico-icon-date); + background-position: center right var(--pico-icon-position); + background-size: var(--pico-icon-width) auto; + background-repeat: no-repeat; +} +input:not([type=checkbox], [type=radio], [type=range], [type=file])[type=time] { + background-image: var(--pico-icon-time); +} + +[type=date]::-webkit-calendar-picker-indicator, +[type=datetime-local]::-webkit-calendar-picker-indicator, +[type=month]::-webkit-calendar-picker-indicator, +[type=time]::-webkit-calendar-picker-indicator, +[type=week]::-webkit-calendar-picker-indicator { + width: var(--pico-icon-width); + margin-right: calc(var(--pico-icon-width) * -1); + margin-left: var(--pico-icon-position); + opacity: 0; +} + +@-moz-document url-prefix() { + [type=date], + [type=datetime-local], + [type=month], + [type=time], + [type=week] { + padding-right: var(--pico-form-element-spacing-horizontal) !important; + background-image: none !important; + } +} +[dir=rtl] :is([type=date], [type=datetime-local], [type=month], [type=time], [type=week]) { + text-align: right; +} + +/** + * Input type file + */ +[type=file] { + --pico-color: var(--pico-muted-color); + margin-left: calc(var(--pico-outline-width) * -1); + padding: calc(var(--pico-form-element-spacing-vertical) * 0.5) 0; + padding-left: var(--pico-outline-width); + border: 0; + border-radius: 0; + background: none; +} +[type=file]::file-selector-button { + margin-right: calc(var(--pico-spacing) / 2); + padding: calc(var(--pico-form-element-spacing-vertical) * 0.5) var(--pico-form-element-spacing-horizontal); +} +[type=file]:is(:hover, :active, :focus)::file-selector-button { + --pico-background-color: var(--pico-secondary-hover-background); + --pico-border-color: var(--pico-secondary-hover-border); +} +[type=file]:focus::file-selector-button { + --pico-box-shadow: var(--pico-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)), 0 0 0 var(--pico-outline-width) var(--pico-secondary-focus); +} + +/** + * Input type range + */ +[type=range] { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + width: 100%; + height: 1.25rem; + background: none; +} +[type=range]::-webkit-slider-runnable-track { + width: 100%; + height: 0.375rem; + border-radius: var(--pico-border-radius); + background-color: var(--pico-range-border-color); + transition: background-color var(--pico-transition), box-shadow var(--pico-transition); +} +[type=range]::-moz-range-track { + width: 100%; + height: 0.375rem; + border-radius: var(--pico-border-radius); + background-color: var(--pico-range-border-color); + transition: background-color var(--pico-transition), box-shadow var(--pico-transition); +} +[type=range]::-ms-track { + width: 100%; + height: 0.375rem; + border-radius: var(--pico-border-radius); + background-color: var(--pico-range-border-color); + transition: background-color var(--pico-transition), box-shadow var(--pico-transition); +} +[type=range]::-webkit-slider-thumb { + -webkit-appearance: none; + width: 1.25rem; + height: 1.25rem; + margin-top: -0.4375rem; + border: 2px solid var(--pico-range-thumb-border-color); + border-radius: 50%; + background-color: var(--pico-range-thumb-color); + cursor: pointer; + transition: background-color var(--pico-transition), transform var(--pico-transition); +} +[type=range]::-moz-range-thumb { + -webkit-appearance: none; + width: 1.25rem; + height: 1.25rem; + margin-top: -0.4375rem; + border: 2px solid var(--pico-range-thumb-border-color); + border-radius: 50%; + background-color: var(--pico-range-thumb-color); + cursor: pointer; + transition: background-color var(--pico-transition), transform var(--pico-transition); +} +[type=range]::-ms-thumb { + -webkit-appearance: none; + width: 1.25rem; + height: 1.25rem; + margin-top: -0.4375rem; + border: 2px solid var(--pico-range-thumb-border-color); + border-radius: 50%; + background-color: var(--pico-range-thumb-color); + cursor: pointer; + transition: background-color var(--pico-transition), transform var(--pico-transition); +} +[type=range]:active, [type=range]:focus-within { + --pico-range-border-color: var(--pico-range-active-border-color); + --pico-range-thumb-color: var(--pico-range-thumb-active-color); +} +[type=range]:active::-webkit-slider-thumb { + transform: scale(1.25); +} +[type=range]:active::-moz-range-thumb { + transform: scale(1.25); +} +[type=range]:active::-ms-thumb { + transform: scale(1.25); +} + +/** + * Input type search + */ +input:not([type=checkbox], [type=radio], [type=range], [type=file])[type=search] { + padding-inline-start: calc(var(--pico-form-element-spacing-horizontal) + 1.75rem); + background-image: var(--pico-icon-search); + background-position: center left calc(var(--pico-form-element-spacing-horizontal) + 0.125rem); + background-size: 1rem auto; + background-repeat: no-repeat; +} +input:not([type=checkbox], [type=radio], [type=range], [type=file])[type=search][aria-invalid] { + padding-inline-start: calc(var(--pico-form-element-spacing-horizontal) + 1.75rem) !important; + background-position: center left 1.125rem, center right 0.75rem; +} +input:not([type=checkbox], [type=radio], [type=range], [type=file])[type=search][aria-invalid=false] { + background-image: var(--pico-icon-search), var(--pico-icon-valid); +} +input:not([type=checkbox], [type=radio], [type=range], [type=file])[type=search][aria-invalid=true] { + background-image: var(--pico-icon-search), var(--pico-icon-invalid); +} + +[dir=rtl] :where(input):not([type=checkbox], [type=radio], [type=range], [type=file])[type=search] { + background-position: center right 1.125rem; +} +[dir=rtl] :where(input):not([type=checkbox], [type=radio], [type=range], [type=file])[type=search][aria-invalid] { + background-position: center right 1.125rem, center left 0.75rem; +} + +/** + * Accordion (
) + */ +details { + display: block; + margin-bottom: var(--pico-spacing); +} +details summary { + line-height: 1rem; + list-style-type: none; + cursor: pointer; + transition: color var(--pico-transition); +} +details summary:not([role]) { + color: var(--pico-accordion-close-summary-color); +} +details summary::-webkit-details-marker { + display: none; +} +details summary::marker { + display: none; +} +details summary::-moz-list-bullet { + list-style-type: none; +} +details summary::after { + display: block; + width: 1rem; + height: 1rem; + margin-inline-start: calc(var(--pico-spacing, 1rem) * 0.5); + float: right; + transform: rotate(-90deg); + background-image: var(--pico-icon-chevron); + background-position: right center; + background-size: 1rem auto; + background-repeat: no-repeat; + content: ""; + transition: transform var(--pico-transition); +} +details summary:focus { + outline: none; +} +details summary:focus:not([role]) { + color: var(--pico-accordion-active-summary-color); +} +details summary:focus-visible:not([role]) { + outline: var(--pico-outline-width) solid var(--pico-primary-focus); + outline-offset: calc(var(--pico-spacing, 1rem) * 0.5); + color: var(--pico-primary); +} +details summary[role=button] { + width: 100%; + text-align: left; +} +details summary[role=button]::after { + height: calc(1rem * var(--pico-line-height, 1.5)); +} +details[open] > summary { + margin-bottom: var(--pico-spacing); +} +details[open] > summary:not([role]):not(:focus) { + color: var(--pico-accordion-open-summary-color); +} +details[open] > summary::after { + transform: rotate(0); +} + +[dir=rtl] details summary { + text-align: right; +} +[dir=rtl] details summary::after { + float: left; + background-position: left center; +} + +/** + * Card (
) + */ +article { + margin-bottom: var(--pico-block-spacing-vertical); + padding: var(--pico-block-spacing-vertical) var(--pico-block-spacing-horizontal); + border-radius: var(--pico-border-radius); + background: var(--pico-card-background-color); + box-shadow: var(--pico-card-box-shadow); +} +article > header, +article > footer { + margin-right: calc(var(--pico-block-spacing-horizontal) * -1); + margin-left: calc(var(--pico-block-spacing-horizontal) * -1); + padding: calc(var(--pico-block-spacing-vertical) * 0.66) var(--pico-block-spacing-horizontal); + background-color: var(--pico-card-sectioning-background-color); +} +article > header { + margin-top: calc(var(--pico-block-spacing-vertical) * -1); + margin-bottom: var(--pico-block-spacing-vertical); + border-bottom: var(--pico-border-width) solid var(--pico-card-border-color); + border-top-right-radius: var(--pico-border-radius); + border-top-left-radius: var(--pico-border-radius); +} +article > footer { + margin-top: var(--pico-block-spacing-vertical); + margin-bottom: calc(var(--pico-block-spacing-vertical) * -1); + border-top: var(--pico-border-width) solid var(--pico-card-border-color); + border-bottom-right-radius: var(--pico-border-radius); + border-bottom-left-radius: var(--pico-border-radius); +} + +/** + * Dropdown (details.dropdown) + */ +details.dropdown { + position: relative; + border-bottom: none; +} +details.dropdown summary::after, +details.dropdown > button::after, +details.dropdown > a::after { + display: block; + width: 1rem; + height: calc(1rem * var(--pico-line-height, 1.5)); + margin-inline-start: 0.25rem; + float: right; + transform: rotate(0deg) translateX(0.2rem); + background-image: var(--pico-icon-chevron); + background-position: right center; + background-size: 1rem auto; + background-repeat: no-repeat; + content: ""; +} + +nav details.dropdown { + margin-bottom: 0; +} + +details.dropdown summary:not([role]) { + height: calc(1rem * var(--pico-line-height) + var(--pico-form-element-spacing-vertical) * 2 + var(--pico-border-width) * 2); + padding: var(--pico-form-element-spacing-vertical) var(--pico-form-element-spacing-horizontal); + border: var(--pico-border-width) solid var(--pico-form-element-border-color); + border-radius: var(--pico-border-radius); + background-color: var(--pico-form-element-background-color); + color: var(--pico-form-element-placeholder-color); + line-height: inherit; + cursor: pointer; + user-select: none; + transition: background-color var(--pico-transition), border-color var(--pico-transition), color var(--pico-transition), box-shadow var(--pico-transition); +} +details.dropdown summary:not([role]):active, details.dropdown summary:not([role]):focus { + border-color: var(--pico-form-element-active-border-color); + background-color: var(--pico-form-element-active-background-color); +} +details.dropdown summary:not([role]):focus { + box-shadow: 0 0 0 var(--pico-outline-width) var(--pico-form-element-focus-color); +} +details.dropdown summary:not([role]):focus-visible { + outline: none; +} +details.dropdown summary:not([role])[aria-invalid=false] { + --pico-form-element-border-color: var(--pico-form-element-valid-border-color); + --pico-form-element-active-border-color: var(--pico-form-element-valid-focus-color); + --pico-form-element-focus-color: var(--pico-form-element-valid-focus-color); +} +details.dropdown summary:not([role])[aria-invalid=true] { + --pico-form-element-border-color: var(--pico-form-element-invalid-border-color); + --pico-form-element-active-border-color: var(--pico-form-element-invalid-focus-color); + --pico-form-element-focus-color: var(--pico-form-element-invalid-focus-color); +} + +nav details.dropdown { + display: inline; + margin: calc(var(--pico-nav-element-spacing-vertical) * -1) 0; +} +nav details.dropdown summary::after { + transform: rotate(0deg) translateX(0rem); +} +nav details.dropdown summary:not([role]) { + height: calc(1rem * var(--pico-line-height) + var(--pico-nav-link-spacing-vertical) * 2); + padding: calc(var(--pico-nav-link-spacing-vertical) - var(--pico-border-width) * 2) var(--pico-nav-link-spacing-horizontal); +} +nav details.dropdown summary:not([role]):focus-visible { + box-shadow: 0 0 0 var(--pico-outline-width) var(--pico-primary-focus); +} + +details.dropdown summary + ul { + display: flex; + z-index: 99; + position: absolute; + left: 0; + flex-direction: column; + width: 100%; + min-width: fit-content; + margin: 0; + margin-top: var(--pico-outline-width); + padding: 0; + border: var(--pico-border-width) solid var(--pico-dropdown-border-color); + border-radius: var(--pico-border-radius); + background-color: var(--pico-dropdown-background-color); + box-shadow: var(--pico-dropdown-box-shadow); + color: var(--pico-dropdown-color); + white-space: nowrap; + opacity: 0; + transition: opacity var(--pico-transition), transform 0s ease-in-out 1s; +} +details.dropdown summary + ul[dir=rtl] { + right: 0; + left: auto; +} +details.dropdown summary + ul li { + width: 100%; + margin-bottom: 0; + padding: calc(var(--pico-form-element-spacing-vertical) * 0.5) var(--pico-form-element-spacing-horizontal); + list-style: none; +} +details.dropdown summary + ul li:first-of-type { + margin-top: calc(var(--pico-form-element-spacing-vertical) * 0.5); +} +details.dropdown summary + ul li:last-of-type { + margin-bottom: calc(var(--pico-form-element-spacing-vertical) * 0.5); +} +details.dropdown summary + ul li a { + display: block; + margin: calc(var(--pico-form-element-spacing-vertical) * -0.5) calc(var(--pico-form-element-spacing-horizontal) * -1); + padding: calc(var(--pico-form-element-spacing-vertical) * 0.5) var(--pico-form-element-spacing-horizontal); + overflow: hidden; + border-radius: 0; + color: var(--pico-dropdown-color); + text-decoration: none; + text-overflow: ellipsis; +} +details.dropdown summary + ul li a:hover, details.dropdown summary + ul li a:focus, details.dropdown summary + ul li a:active, details.dropdown summary + ul li a:focus-visible, details.dropdown summary + ul li a[aria-current]:not([aria-current=false]) { + background-color: var(--pico-dropdown-hover-background-color); +} +details.dropdown summary + ul li label { + width: 100%; +} +details.dropdown summary + ul li:has(label):hover { + background-color: var(--pico-dropdown-hover-background-color); +} + +details.dropdown[open] summary { + margin-bottom: 0; +} + +details.dropdown[open] summary + ul { + transform: scaleY(1); + opacity: 1; + transition: opacity var(--pico-transition), transform 0s ease-in-out 0s; +} + +details.dropdown[open] summary::before { + display: block; + z-index: 1; + position: fixed; + width: 100vw; + height: 100vh; + inset: 0; + background: none; + content: ""; + cursor: default; +} + +label > details.dropdown { + margin-top: calc(var(--pico-spacing) * 0.25); +} + +/** + * Group ([role="group"], [role="search"]) + */ +[role=search], +[role=group] { + display: inline-flex; + position: relative; + width: 100%; + margin-bottom: var(--pico-spacing); + border-radius: var(--pico-border-radius); + box-shadow: var(--pico-group-box-shadow, 0 0 0 rgba(0, 0, 0, 0)); + vertical-align: middle; + transition: box-shadow var(--pico-transition); +} +[role=search] > *, +[role=search] input:not([type=checkbox], [type=radio]), +[role=search] select, +[role=group] > *, +[role=group] input:not([type=checkbox], [type=radio]), +[role=group] select { + position: relative; + flex: 1 1 auto; + margin-bottom: 0; +} +[role=search] > *:not(:first-child), +[role=search] input:not([type=checkbox], [type=radio]):not(:first-child), +[role=search] select:not(:first-child), +[role=group] > *:not(:first-child), +[role=group] input:not([type=checkbox], [type=radio]):not(:first-child), +[role=group] select:not(:first-child) { + margin-left: 0; + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +[role=search] > *:not(:last-child), +[role=search] input:not([type=checkbox], [type=radio]):not(:last-child), +[role=search] select:not(:last-child), +[role=group] > *:not(:last-child), +[role=group] input:not([type=checkbox], [type=radio]):not(:last-child), +[role=group] select:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +[role=search] > *:focus, +[role=search] input:not([type=checkbox], [type=radio]):focus, +[role=search] select:focus, +[role=group] > *:focus, +[role=group] input:not([type=checkbox], [type=radio]):focus, +[role=group] select:focus { + z-index: 2; +} +[role=search] button:not(:first-child), +[role=search] [type=submit]:not(:first-child), +[role=search] [type=reset]:not(:first-child), +[role=search] [type=button]:not(:first-child), +[role=search] [role=button]:not(:first-child), +[role=search] input:not([type=checkbox], [type=radio]):not(:first-child), +[role=search] select:not(:first-child), +[role=group] button:not(:first-child), +[role=group] [type=submit]:not(:first-child), +[role=group] [type=reset]:not(:first-child), +[role=group] [type=button]:not(:first-child), +[role=group] [role=button]:not(:first-child), +[role=group] input:not([type=checkbox], [type=radio]):not(:first-child), +[role=group] select:not(:first-child) { + margin-left: calc(var(--pico-border-width) * -1); +} +[role=search] button, +[role=search] [type=submit], +[role=search] [type=reset], +[role=search] [type=button], +[role=search] [role=button], +[role=group] button, +[role=group] [type=submit], +[role=group] [type=reset], +[role=group] [type=button], +[role=group] [role=button] { + width: auto; +} +@supports selector(:has(*)) { + [role=search]:has(button:focus, [type=submit]:focus, [type=button]:focus, [role=button]:focus), + [role=group]:has(button:focus, [type=submit]:focus, [type=button]:focus, [role=button]:focus) { + --pico-group-box-shadow: var(--pico-group-box-shadow-focus-with-button); + } + [role=search]:has(button:focus, [type=submit]:focus, [type=button]:focus, [role=button]:focus) input:not([type=checkbox], [type=radio]), + [role=search]:has(button:focus, [type=submit]:focus, [type=button]:focus, [role=button]:focus) select, + [role=group]:has(button:focus, [type=submit]:focus, [type=button]:focus, [role=button]:focus) input:not([type=checkbox], [type=radio]), + [role=group]:has(button:focus, [type=submit]:focus, [type=button]:focus, [role=button]:focus) select { + border-color: transparent; + } + [role=search]:has(input:not([type=submit], [type=button]):focus, select:focus), + [role=group]:has(input:not([type=submit], [type=button]):focus, select:focus) { + --pico-group-box-shadow: var(--pico-group-box-shadow-focus-with-input); + } + [role=search]:has(input:not([type=submit], [type=button]):focus, select:focus) button, + [role=search]:has(input:not([type=submit], [type=button]):focus, select:focus) [type=submit], + [role=search]:has(input:not([type=submit], [type=button]):focus, select:focus) [type=button], + [role=search]:has(input:not([type=submit], [type=button]):focus, select:focus) [role=button], + [role=group]:has(input:not([type=submit], [type=button]):focus, select:focus) button, + [role=group]:has(input:not([type=submit], [type=button]):focus, select:focus) [type=submit], + [role=group]:has(input:not([type=submit], [type=button]):focus, select:focus) [type=button], + [role=group]:has(input:not([type=submit], [type=button]):focus, select:focus) [role=button] { + --pico-button-box-shadow: 0 0 0 var(--pico-border-width) var(--pico-primary-border); + --pico-button-hover-box-shadow: 0 0 0 var(--pico-border-width) var(--pico-primary-hover-border); + } + [role=search] button:focus, + [role=search] [type=submit]:focus, + [role=search] [type=reset]:focus, + [role=search] [type=button]:focus, + [role=search] [role=button]:focus, + [role=group] button:focus, + [role=group] [type=submit]:focus, + [role=group] [type=reset]:focus, + [role=group] [type=button]:focus, + [role=group] [role=button]:focus { + box-shadow: none; + } +} + +[role=search] > *:first-child { + border-top-left-radius: 5rem; + border-bottom-left-radius: 5rem; +} +[role=search] > *:last-child { + border-top-right-radius: 5rem; + border-bottom-right-radius: 5rem; +} + +/** + * Loading ([aria-busy=true]) + */ +[aria-busy=true]:not(input, select, textarea, html) { + white-space: nowrap; +} +[aria-busy=true]:not(input, select, textarea, html)::before { + display: inline-block; + width: 1em; + height: 1em; + background-image: var(--pico-icon-loading); + background-size: 1em auto; + background-repeat: no-repeat; + content: ""; + vertical-align: -0.125em; +} +[aria-busy=true]:not(input, select, textarea, html):not(:empty)::before { + margin-inline-end: calc(var(--pico-spacing) * 0.5); +} +[aria-busy=true]:not(input, select, textarea, html):empty { + text-align: center; +} + +button[aria-busy=true], +[type=submit][aria-busy=true], +[type=button][aria-busy=true], +[type=reset][aria-busy=true], +[role=button][aria-busy=true], +a[aria-busy=true] { + pointer-events: none; +} + +/** + * Modal () + */ +:root { + --pico-scrollbar-width: 0px; +} + +dialog { + display: flex; + z-index: 999; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + align-items: center; + justify-content: center; + width: inherit; + min-width: 100%; + height: inherit; + min-height: 100%; + padding: 0; + border: 0; + backdrop-filter: var(--pico-modal-overlay-backdrop-filter); + background-color: var(--pico-modal-overlay-background-color); + color: var(--pico-color); +} +dialog article { + width: 100%; + max-height: calc(100vh - var(--pico-spacing) * 2); + margin: var(--pico-spacing); + overflow: auto; +} +@media (min-width: 576px) { + dialog article { + max-width: 95%; + } +} +@media (min-width: 768px) { + dialog article { + max-width: 95%; + } +} +dialog article > header > * { + margin-bottom: 0; +} +dialog article > header .close, dialog article > header :is(a, button)[rel=prev] { + margin: 0; + margin-left: var(--pico-spacing); + padding: 0; + float: right; +} +dialog article > footer { + text-align: right; +} +dialog article > footer button, +dialog article > footer [role=button] { + margin-bottom: 0; +} +dialog article > footer button:not(:first-of-type), +dialog article > footer [role=button]:not(:first-of-type) { + margin-left: calc(var(--pico-spacing) * 0.5); +} +dialog article .close, dialog article :is(a, button)[rel=prev] { + display: block; + width: 1rem; + height: 1rem; + margin-top: calc(var(--pico-spacing) * -1); + margin-bottom: var(--pico-spacing); + margin-left: auto; + border: none; + background-image: var(--pico-icon-close); + background-position: center; + background-size: auto 1rem; + background-repeat: no-repeat; + background-color: transparent; + opacity: 0.5; + transition: opacity var(--pico-transition); +} +dialog article .close:is([aria-current]:not([aria-current=false]), :hover, :active, :focus), dialog article :is(a, button)[rel=prev]:is([aria-current]:not([aria-current=false]), :hover, :active, :focus) { + opacity: 1; +} +dialog:not([open]), dialog[open=false] { + display: none; +} + +.modal-is-open { + padding-right: var(--pico-scrollbar-width, 0px); + overflow: hidden; + pointer-events: none; + touch-action: none; +} +.modal-is-open dialog { + pointer-events: auto; + touch-action: auto; +} + +:where(.modal-is-opening, .modal-is-closing) dialog, +:where(.modal-is-opening, .modal-is-closing) dialog > article { + animation-duration: 0.2s; + animation-timing-function: ease-in-out; + animation-fill-mode: both; +} +:where(.modal-is-opening, .modal-is-closing) dialog { + animation-duration: 0.8s; + animation-name: modal-overlay; +} +:where(.modal-is-opening, .modal-is-closing) dialog > article { + animation-delay: 0.2s; + animation-name: modal; +} + +.modal-is-closing dialog, +.modal-is-closing dialog > article { + animation-delay: 0s; + animation-direction: reverse; +} + +@keyframes modal-overlay { + from { + backdrop-filter: none; + background-color: transparent; + } +} +@keyframes modal { + from { + transform: translateY(-100%); + opacity: 0; + } +} +/** + * Nav + */ +:where(nav li)::before { + float: left; + content: "​"; +} + +nav, +nav ul { + display: flex; +} + +nav { + justify-content: space-between; + overflow: visible; +} +nav ol, +nav ul { + align-items: center; + margin-bottom: 0; + padding: 0; + list-style: none; +} +nav ol:first-of-type, +nav ul:first-of-type { + margin-left: calc(var(--pico-nav-element-spacing-horizontal) * -1); +} +nav ol:last-of-type, +nav ul:last-of-type { + margin-right: calc(var(--pico-nav-element-spacing-horizontal) * -1); +} +nav li { + display: inline-block; + margin: 0; + padding: var(--pico-nav-element-spacing-vertical) var(--pico-nav-element-spacing-horizontal); +} +nav li :where(a, [role=link]) { + display: inline-block; + margin: calc(var(--pico-nav-link-spacing-vertical) * -1) calc(var(--pico-nav-link-spacing-horizontal) * -1); + padding: var(--pico-nav-link-spacing-vertical) var(--pico-nav-link-spacing-horizontal); + border-radius: var(--pico-border-radius); +} +nav li :where(a, [role=link]):not(:hover) { + text-decoration: none; +} +nav li button, +nav li [role=button], +nav li [type=button], +nav li input:not([type=checkbox], [type=radio], [type=range], [type=file]), +nav li select { + height: auto; + margin-right: inherit; + margin-bottom: 0; + margin-left: inherit; + padding: calc(var(--pico-nav-link-spacing-vertical) - var(--pico-border-width) * 2) var(--pico-nav-link-spacing-horizontal); +} +nav[aria-label=breadcrumb] { + align-items: center; + justify-content: start; +} +nav[aria-label=breadcrumb] ul li:not(:first-child) { + margin-inline-start: var(--pico-nav-link-spacing-horizontal); +} +nav[aria-label=breadcrumb] ul li a { + margin: calc(var(--pico-nav-link-spacing-vertical) * -1) 0; + margin-inline-start: calc(var(--pico-nav-link-spacing-horizontal) * -1); +} +nav[aria-label=breadcrumb] ul li:not(:last-child)::after { + display: inline-block; + position: absolute; + width: calc(var(--pico-nav-link-spacing-horizontal) * 4); + margin: 0 calc(var(--pico-nav-link-spacing-horizontal) * -1); + content: var(--pico-nav-breadcrumb-divider); + color: var(--pico-muted-color); + text-align: center; + text-decoration: none; + white-space: nowrap; +} +nav[aria-label=breadcrumb] a[aria-current]:not([aria-current=false]) { + background-color: transparent; + color: inherit; + text-decoration: none; + pointer-events: none; +} + +aside nav, +aside ol, +aside ul, +aside li { + display: block; +} +aside li { + padding: calc(var(--pico-nav-element-spacing-vertical) * 0.5) var(--pico-nav-element-spacing-horizontal); +} +aside li a { + display: block; +} +aside li [role=button] { + margin: inherit; +} + +[dir=rtl] nav[aria-label=breadcrumb] ul li:not(:last-child) ::after { + content: "\\"; +} + +/** + * Progress + */ +progress { + display: inline-block; + vertical-align: baseline; +} + +progress { + -webkit-appearance: none; + -moz-appearance: none; + display: inline-block; + appearance: none; + width: 100%; + height: 0.5rem; + margin-bottom: calc(var(--pico-spacing) * 0.5); + overflow: hidden; + border: 0; + border-radius: var(--pico-border-radius); + background-color: var(--pico-progress-background-color); + color: var(--pico-progress-color); +} +progress::-webkit-progress-bar { + border-radius: var(--pico-border-radius); + background: none; +} +progress[value]::-webkit-progress-value { + background-color: var(--pico-progress-color); + transition: inline-size var(--pico-transition); +} +progress::-moz-progress-bar { + background-color: var(--pico-progress-color); +} +@media (prefers-reduced-motion: no-preference) { + progress:indeterminate { + background: var(--pico-progress-background-color) linear-gradient(to right, var(--pico-progress-color) 30%, var(--pico-progress-background-color) 30%) top left/150% 150% no-repeat; + animation: progress-indeterminate 1s linear infinite; + } + progress:indeterminate[value]::-webkit-progress-value { + background-color: transparent; + } + progress:indeterminate::-moz-progress-bar { + background-color: transparent; + } +} + +@media (prefers-reduced-motion: no-preference) { + [dir=rtl] progress:indeterminate { + animation-direction: reverse; + } +} + +@keyframes progress-indeterminate { + 0% { + background-position: 200% 0; + } + 100% { + background-position: -200% 0; + } +} +/** + * Tooltip ([data-tooltip]) + */ +[data-tooltip] { + position: relative; +} +[data-tooltip]:not(a, button, input) { + border-bottom: 1px dotted; + text-decoration: none; + cursor: help; +} +[data-tooltip][data-placement=top]::before, [data-tooltip][data-placement=top]::after, [data-tooltip]::before, [data-tooltip]::after { + display: block; + z-index: 99; + position: absolute; + bottom: 100%; + left: 50%; + padding: 0.25rem 0.5rem; + overflow: hidden; + transform: translate(-50%, -0.25rem); + border-radius: var(--pico-border-radius); + background: var(--pico-tooltip-background-color); + content: attr(data-tooltip); + color: var(--pico-tooltip-color); + font-style: normal; + font-weight: var(--pico-font-weight); + font-size: 0.875rem; + text-decoration: none; + text-overflow: ellipsis; + white-space: nowrap; + opacity: 0; + pointer-events: none; +} +[data-tooltip][data-placement=top]::after, [data-tooltip]::after { + padding: 0; + transform: translate(-50%, 0rem); + border-top: 0.3rem solid; + border-right: 0.3rem solid transparent; + border-left: 0.3rem solid transparent; + border-radius: 0; + background-color: transparent; + content: ""; + color: var(--pico-tooltip-background-color); +} +[data-tooltip][data-placement=bottom]::before, [data-tooltip][data-placement=bottom]::after { + top: 100%; + bottom: auto; + transform: translate(-50%, 0.25rem); +} +[data-tooltip][data-placement=bottom]:after { + transform: translate(-50%, -0.3rem); + border: 0.3rem solid transparent; + border-bottom: 0.3rem solid; +} +[data-tooltip][data-placement=left]::before, [data-tooltip][data-placement=left]::after { + top: 50%; + right: 100%; + bottom: auto; + left: auto; + transform: translate(-0.25rem, -50%); +} +[data-tooltip][data-placement=left]:after { + transform: translate(0.3rem, -50%); + border: 0.3rem solid transparent; + border-left: 0.3rem solid; +} +[data-tooltip][data-placement=right]::before, [data-tooltip][data-placement=right]::after { + top: 50%; + right: auto; + bottom: auto; + left: 100%; + transform: translate(0.25rem, -50%); +} +[data-tooltip][data-placement=right]:after { + transform: translate(-0.3rem, -50%); + border: 0.3rem solid transparent; + border-right: 0.3rem solid; +} +[data-tooltip]:focus::before, [data-tooltip]:focus::after, [data-tooltip]:hover::before, [data-tooltip]:hover::after { + opacity: 1; +} +@media (hover: hover) and (pointer: fine) { + [data-tooltip]:focus::before, [data-tooltip]:focus::after, [data-tooltip]:hover::before, [data-tooltip]:hover::after { + --pico-tooltip-slide-to: translate(-50%, -0.25rem); + transform: translate(-50%, 0.75rem); + animation-duration: 0.2s; + animation-fill-mode: forwards; + animation-name: tooltip-slide; + opacity: 0; + } + [data-tooltip]:focus::after, [data-tooltip]:hover::after { + --pico-tooltip-caret-slide-to: translate(-50%, 0rem); + transform: translate(-50%, -0.25rem); + animation-name: tooltip-caret-slide; + } + [data-tooltip][data-placement=bottom]:focus::before, [data-tooltip][data-placement=bottom]:focus::after, [data-tooltip][data-placement=bottom]:hover::before, [data-tooltip][data-placement=bottom]:hover::after { + --pico-tooltip-slide-to: translate(-50%, 0.25rem); + transform: translate(-50%, -0.75rem); + animation-name: tooltip-slide; + } + [data-tooltip][data-placement=bottom]:focus::after, [data-tooltip][data-placement=bottom]:hover::after { + --pico-tooltip-caret-slide-to: translate(-50%, -0.3rem); + transform: translate(-50%, -0.5rem); + animation-name: tooltip-caret-slide; + } + [data-tooltip][data-placement=left]:focus::before, [data-tooltip][data-placement=left]:focus::after, [data-tooltip][data-placement=left]:hover::before, [data-tooltip][data-placement=left]:hover::after { + --pico-tooltip-slide-to: translate(-0.25rem, -50%); + transform: translate(0.75rem, -50%); + animation-name: tooltip-slide; + } + [data-tooltip][data-placement=left]:focus::after, [data-tooltip][data-placement=left]:hover::after { + --pico-tooltip-caret-slide-to: translate(0.3rem, -50%); + transform: translate(0.05rem, -50%); + animation-name: tooltip-caret-slide; + } + [data-tooltip][data-placement=right]:focus::before, [data-tooltip][data-placement=right]:focus::after, [data-tooltip][data-placement=right]:hover::before, [data-tooltip][data-placement=right]:hover::after { + --pico-tooltip-slide-to: translate(0.25rem, -50%); + transform: translate(-0.75rem, -50%); + animation-name: tooltip-slide; + } + [data-tooltip][data-placement=right]:focus::after, [data-tooltip][data-placement=right]:hover::after { + --pico-tooltip-caret-slide-to: translate(-0.3rem, -50%); + transform: translate(-0.05rem, -50%); + animation-name: tooltip-caret-slide; + } +} +@keyframes tooltip-slide { + to { + transform: var(--pico-tooltip-slide-to); + opacity: 1; + } +} +@keyframes tooltip-caret-slide { + 50% { + opacity: 0; + } + to { + transform: var(--pico-tooltip-caret-slide-to); + opacity: 1; + } +} + +/** + * Accessibility & User interaction + */ +[aria-controls] { + cursor: pointer; +} + +[aria-disabled=true], +[disabled] { + cursor: not-allowed; +} + +[aria-hidden=false][hidden] { + display: initial; +} + +[aria-hidden=false][hidden]:not(:focus) { + clip: rect(0, 0, 0, 0); + position: absolute; +} + +a, +area, +button, +input, +label, +select, +summary, +textarea, +[tabindex] { + -ms-touch-action: manipulation; +} + +[dir=rtl] { + direction: rtl; +} + +/** + * Reduce Motion Features + */ +@media (prefers-reduced-motion: reduce) { + *:not([aria-busy=true]), + :not([aria-busy=true])::before, + :not([aria-busy=true])::after { + background-attachment: initial !important; + animation-duration: 1ms !important; + animation-delay: -1ms !important; + animation-iteration-count: 1 !important; + scroll-behavior: auto !important; + transition-delay: 0s !important; + transition-duration: 0s !important; + } +} +@font-face { + font-family: go; + src: local("Go Regular"), url(../fonts/Go-Regular.woff2) format("woff2"); + font-style: normal; + font-weight: 400; +} +@font-face { + font-family: go; + src: local("Go Italic"), url(../fonts/Go-Italic.woff2) format("woff2"); + font-style: italic; + font-weight: 400; +} +@font-face { + font-family: go medium; + src: local("Go Medium"), url(../fonts/Go-Medium.woff2) format("woff2"); + font-style: normal; + font-weight: 500; +} +@font-face { + font-family: go medium; + src: local("Go Medium Italic"), url(../fonts/Go-Medium-Italic.woff2) format("woff2"); + font-style: italic; + font-weight: 500; +} +@font-face { + font-family: go; + src: local("Go Bold"), url(../fonts/Go-Bold.woff2) format("woff2"); + font-style: normal; + font-weight: 600; +} +@font-face { + font-family: go; + src: local("Go Bold Italic"), url(../fonts/Go-Bold-Italic.woff2) format("woff2"); + font-style: italic; + font-weight: 600; +} +@font-face { + font-family: go smallcaps; + src: local("Go Smallcaps"), url(../fonts/Go-Smallcaps.woff2) format("woff2"); + font-style: normal; + font-weight: 400; +} +@font-face { + font-family: go smallcaps; + src: local("Go Smallcaps Italic"), url(../fonts/Go-Smallcaps-Italic.woff2) format("woff2"); + font-style: italic; + font-weight: 400; +} +@font-face { + font-family: go mono; + src: local("Go Mono"), url(../fonts/Go-Mono.woff2) format("woff2"); + font-style: normal; + font-weight: 400; +} +@font-face { + font-family: go mono; + src: local("Go Mono Italic"), url(../fonts/Go-Mono-Italic.woff2) format("woff2"); + font-style: italic; + font-weight: 400; +} +@font-face { + font-family: go mono; + src: local("Go Mono Bold"), url(../fonts/Go-Mono-Bold.woff2) format("woff2"); + font-style: normal; + font-weight: 600; +} +@font-face { + font-family: go mono; + src: local("Go Mono Bold Italic"), url(../fonts/Go-Mono-Bold-Italic.woff2) format("woff2"); + font-style: italic; + font-weight: 600; +} +:root { + --pico-font-family-sans-serif: "Go", system-ui, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, var(--pico-font-family-emoji); + --pico-form-element-spacing-vertical: .5rem; + --pico-form-element-spacing-horizontal: .5rem; + --pico-border-radius: 0; + --pico-font-size: 12pt; + --pico-line-height: 1.4; +} + +small { + font-size: 0.875rem; + color: var(--pico-muted-color); +} + +mark { + margin-block: calc(var(--pico-spacing) / 4); + display: inline-block; + border-radius: 0.25rem; +} + +pre { + padding: calc(var(--pico-spacing) / 2); +} + +#nav-theme-toggle { + cursor: pointer !important; +} + +.dark { + filter: grayscale(100%); +} + +.hi, .hi a { + font-size: 1.1rem; + --pico-text-decoration: none; +} + +table td article { + margin-bottom: var(--pico-spacing); +} + +table tr { + white-space: nowrap; +} + +table td.created-modified { + background-image: var(--pico-icon-date); + background-position: center right var(--pico-form-element-spacing-vertical); + background-size: 1rem; + padding-inline-end: 2rem; +} + +table td.created-modified, table th.created-modified { + text-align: right; +} + +.no-text-decoration { + text-decoration: none !important; + border-bottom: none !important; +} + +[data-loading] { + display: none; +} + +.help { + cursor: help; +} + +.pointer { + cursor: pointer; +} + +[contenteditable] { + display: inline-block; + border-bottom: 1px dotted #a0acc7; + text-decoration: none; +} + +[contenteditable]:focus { + padding: calc(var(--pico-spacing) / 2); + background: var(--pico-contrast); + color: var(--pico-contrast-inverse); +} + +[role=group] { + --pico-group-box-shadow: none !important; +} + +/* +* Table navigation +*/ +.table-navigation { + user-select: none; +} + +.table-navigation .paging:not(.disabled) { + padding: var(--pico-form-element-spacing-vertical) var(--pico-form-element-spacing-horizontal); + color: var(--pico-color); +} + +.table-navigation button.sorting { + font-size: 0.875rem; + border: 0; +} + +.table-navigation div.filters { + white-space: wrap; +} + +.table-navigation div.filter-buttons button { + font-size: 0.875rem; + padding: calc(var(--pico-form-element-spacing-vertical) / 2) calc(var(--pico-form-element-spacing-horizontal) / 2); + border-color: var(--pico-form-element-border-color); + --pico-border-radius: .5rem; +} + +.table-navigation .paging.disabled { + opacity: 0.5; + cursor: not-allowed; +} + +/* +# Notifications +*/ +#notification-container { + position: fixed; + left: 0.25rem; + bottom: 0.25rem; + z-index: 999; + width: fit-content; +} + +.notification:not(:last-child) { + margin-bottom: 0.25rem; +} + +.notification-text { + white-space: pre-line; +} + +.notification { + cursor: pointer; + padding: var(--pico-form-element-spacing-vertical) 2rem; + color: var(--pico-color); + background-color: var(--pico-background-color); + background-image: var(--pico-icon); + background-position: center left var(--pico-form-element-spacing-vertical); + background-size: calc(var(--pico-spacing) * 1.5); + background-blend-mode: color-burn; + padding-left: calc(var(--pico-form-element-spacing-vertical) * 2 + var(--pico-spacing) * 1.5); +} + +.notification-error { + --pico-background-color: #af291d; + --pico-icon: var(--pico-icon-invalid); + --pico-color: #faeeeb; +} + +.notification-warning { + --pico-background-color: #fdf1b4; + --pico-icon: var(--pico-icon-invalid); + --pico-color: #1f1c02; +} + +.notification-success { + --pico-background-color: #33790f; + --pico-icon: var(--pico-icon-valid); + --pico-color: #eff1f4; +} + +.notification-user { + --pico-background-color: #018cd4; + --pico-icon: var(--pico-icon-chevron); + --pico-color: #eff1f4; +} + +.notification-title { + font-weight: bold; +} + +.notification-system > .notification-title:before { + content: "📢 Broadcast: "; +} + +.notification-system { + --pico-background-color: #5c0d41; + --pico-icon: var(--pico-icon-chevron); + --pico-color: #f9daea; +} + +.login-grid { + display: grid; + grid-template-columns: 20% 60% 20%; + grid-template-rows: 1fr; +} + +.login-register { + grid-column-start: 2; +} + +thead th, thead td, tfoot th, tfoot td { + --pico-font-weight: 400; +} + +button, a { + touch-action: manipulation; +} + +button[type=submit] { + width: auto; +} + +dialog article { + max-width: 65%; +} + +.no-text-wrap { + text-wrap: nowrap; + white-space: nowrap; +} + +.text-wrap { + text-wrap: balance; + white-space: break-spaces; +} + +.split-grid.grid > article:first-child { + grid-column: span 1; +} + +.split-grid.grid > article { + grid-column: span 3; +} + +.grid-end { + display: grid; + justify-content: end; + grid-auto-columns: max-content; + grid-auto-flow: column; + gap: calc(var(--pico-spacing) / 2); + align-items: baseline; + white-space: nowrap; +} + +.grid-space-between { + display: grid; + justify-content: space-between; + grid-auto-columns: max-content; + grid-auto-flow: column; + gap: calc(var(--pico-spacing) / 2); + white-space: nowrap; + align-items: baseline; + margin: calc(var(--pico-spacing) / 2) auto; +} + +.grid-3-cols { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: calc(var(--pico-spacing) / 2); +} + +.grid-3-cols .span-3 { + grid-column: span 3; +} + +.grid-3-cols > article { + margin-bottom: 0; + padding-bottom: var(--pico-form-element-spacing-vertical); + --pico-border-radius: .5rem; +} + +.table-select { + background-color: rgba(128, 128, 128, 0.1); + backdrop-filter: blur(1px); + position: sticky; + bottom: var(--pico-form-element-spacing-vertical); + padding: var(--pico-form-element-spacing-vertical) var(--pico-form-element-spacing-horizontal); +} + +nav details.dropdown { + width: max-content; +} + +fieldset.vault-unlock { + padding: var(--pico-spacing) 0; +} + +@media only screen and (max-width: 600px) { + #notification-container { + left: 0; + bottom: 0; + width: 100%; + } + dialog article { + max-width: 95%; + } + .grid-3-cols { + display: grid; + grid-template-columns: repeat(1, 1fr); + gap: calc(var(--pico-spacing) / 2); + } + .grid-3-cols .span-3 { + grid-column: span 1; + } + .grid-3-cols > article { + margin-bottom: 0; + --pico-border-radius: .5rem; + } +} +@media (max-width: 1024px) { + .split-grid.grid { + gap: calc(var(--pico-spacing) / 2); + } + .split-grid.grid > article { + padding: 0; + background-color: transparent; + box-shadow: none; + } + th, td { + --pico-spacing: 0.75rem; + } +} +.group { + opacity: 0; +} + +textarea.dns-data { + border: 0; + background: transparent; + font-family: monospace; +} + +fieldset.system-field label:before { + content: "🔒 "; +} + +fieldset.keypair { + border: 1px solid var(--pico-form-element-border-color); + padding: var(--pico-spacing); +} + +.color-red-950 { + color: #1c0d06 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-red-950, +[type=reset].button-red-950 { + color: #dfe3eb; + border-color: #1c0d06; + background-color: #1c0d06; +} + +:is(a).color-red-950 { + text-decoration-color: #1c0d06 !important; +} + +.color-red-900 { + color: #30130a !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-red-900, +[type=reset].button-red-900 { + color: #dfe3eb; + border-color: #30130a; + background-color: #30130a; +} + +:is(a).color-red-900 { + text-decoration-color: #30130a !important; +} + +.color-red-850 { + color: #45150c !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-red-850, +[type=reset].button-red-850 { + color: #dfe3eb; + border-color: #45150c; + background-color: #45150c; +} + +:is(a).color-red-850 { + text-decoration-color: #45150c !important; +} + +.color-red-800 { + color: #5c160d !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-red-800, +[type=reset].button-red-800 { + color: #dfe3eb; + border-color: #5c160d; + background-color: #5c160d; +} + +:is(a).color-red-800 { + text-decoration-color: #5c160d !important; +} + +.color-red-750 { + color: #72170f !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-red-750, +[type=reset].button-red-750 { + color: #dfe3eb; + border-color: #72170f; + background-color: #72170f; +} + +:is(a).color-red-750 { + text-decoration-color: #72170f !important; +} + +.color-red-700 { + color: #861d13 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-red-700, +[type=reset].button-red-700 { + color: #dfe3eb; + border-color: #861d13; + background-color: #861d13; +} + +:is(a).color-red-700 { + text-decoration-color: #861d13 !important; +} + +.color-red-650 { + color: #9b2318 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-red-650, +[type=reset].button-red-650 { + color: #dfe3eb; + border-color: #9b2318; + background-color: #9b2318; +} + +:is(a).color-red-650 { + text-decoration-color: #9b2318 !important; +} + +.color-red-600 { + color: #af291d !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-red-600, +[type=reset].button-red-600 { + color: #dfe3eb; + border-color: #af291d; + background-color: #af291d; +} + +:is(a).color-red-600 { + text-decoration-color: #af291d !important; +} + +.color-red-550 { + color: #c52f21 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-red-550, +[type=reset].button-red-550 { + color: #dfe3eb; + border-color: #c52f21; + background-color: #c52f21; +} + +:is(a).color-red-550 { + text-decoration-color: #c52f21 !important; +} + +.color-red-500, .color-red { + color: #d93526 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-red-500, .button-red:is(button, [type=submit], [type=button], [role=button]), +[type=reset].button-red-500, +[type=reset].button-red { + color: #dfe3eb; + border-color: #d93526; + background-color: #d93526; +} + +:is(a).color-red-500, .color-red:is(a) { + text-decoration-color: #d93526 !important; +} + +.color-red-450 { + color: #ee402e !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-red-450, +[type=reset].button-red-450 { + color: #dfe3eb; + border-color: #ee402e; + background-color: #ee402e; +} + +:is(a).color-red-450 { + text-decoration-color: #ee402e !important; +} + +.color-red-400 { + color: #f06048 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-red-400, +[type=reset].button-red-400 { + color: #1b1b1b; + border-color: #f06048; + background-color: #f06048; +} + +:is(a).color-red-400 { + text-decoration-color: #f06048 !important; +} + +.color-red-350 { + color: #f17961 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-red-350, +[type=reset].button-red-350 { + color: #1b1b1b; + border-color: #f17961; + background-color: #f17961; +} + +:is(a).color-red-350 { + text-decoration-color: #f17961 !important; +} + +.color-red-300 { + color: #f38f79 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-red-300, +[type=reset].button-red-300 { + color: #1b1b1b; + border-color: #f38f79; + background-color: #f38f79; +} + +:is(a).color-red-300 { + text-decoration-color: #f38f79 !important; +} + +.color-red-250 { + color: #f5a390 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-red-250, +[type=reset].button-red-250 { + color: #1b1b1b; + border-color: #f5a390; + background-color: #f5a390; +} + +:is(a).color-red-250 { + text-decoration-color: #f5a390 !important; +} + +.color-red-200 { + color: #f5b7a8 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-red-200, +[type=reset].button-red-200 { + color: #1b1b1b; + border-color: #f5b7a8; + background-color: #f5b7a8; +} + +:is(a).color-red-200 { + text-decoration-color: #f5b7a8 !important; +} + +.color-red-150 { + color: #f6cabf !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-red-150, +[type=reset].button-red-150 { + color: #1b1b1b; + border-color: #f6cabf; + background-color: #f6cabf; +} + +:is(a).color-red-150 { + text-decoration-color: #f6cabf !important; +} + +.color-red-100 { + color: #f8dcd6 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-red-100, +[type=reset].button-red-100 { + color: #1b1b1b; + border-color: #f8dcd6; + background-color: #f8dcd6; +} + +:is(a).color-red-100 { + text-decoration-color: #f8dcd6 !important; +} + +.color-red-50 { + color: #faeeeb !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-red-50, +[type=reset].button-red-50 { + color: #1b1b1b; + border-color: #faeeeb; + background-color: #faeeeb; +} + +:is(a).color-red-50 { + text-decoration-color: #faeeeb !important; +} + +.color-red-main { + color: #c52f21 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-red-main, +[type=reset].button-red-main { + color: #dfe3eb; + border-color: #c52f21; + background-color: #c52f21; +} + +:is(a).color-red-main { + text-decoration-color: #c52f21 !important; +} + +.color-pink-950 { + color: #25060c !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pink-950, +[type=reset].button-pink-950 { + color: #dfe3eb; + border-color: #25060c; + background-color: #25060c; +} + +:is(a).color-pink-950 { + text-decoration-color: #25060c !important; +} + +.color-pink-900 { + color: #380916 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pink-900, +[type=reset].button-pink-900 { + color: #dfe3eb; + border-color: #380916; + background-color: #380916; +} + +:is(a).color-pink-900 { + text-decoration-color: #380916 !important; +} + +.color-pink-850 { + color: #4b0c1f !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pink-850, +[type=reset].button-pink-850 { + color: #dfe3eb; + border-color: #4b0c1f; + background-color: #4b0c1f; +} + +:is(a).color-pink-850 { + text-decoration-color: #4b0c1f !important; +} + +.color-pink-800 { + color: #5f0e28 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pink-800, +[type=reset].button-pink-800 { + color: #dfe3eb; + border-color: #5f0e28; + background-color: #5f0e28; +} + +:is(a).color-pink-800 { + text-decoration-color: #5f0e28 !important; +} + +.color-pink-750 { + color: #740f31 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pink-750, +[type=reset].button-pink-750 { + color: #dfe3eb; + border-color: #740f31; + background-color: #740f31; +} + +:is(a).color-pink-750 { + text-decoration-color: #740f31 !important; +} + +.color-pink-700 { + color: #88143b !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pink-700, +[type=reset].button-pink-700 { + color: #dfe3eb; + border-color: #88143b; + background-color: #88143b; +} + +:is(a).color-pink-700 { + text-decoration-color: #88143b !important; +} + +.color-pink-650 { + color: #9d1945 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pink-650, +[type=reset].button-pink-650 { + color: #dfe3eb; + border-color: #9d1945; + background-color: #9d1945; +} + +:is(a).color-pink-650 { + text-decoration-color: #9d1945 !important; +} + +.color-pink-600 { + color: #b21e4f !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pink-600, +[type=reset].button-pink-600 { + color: #dfe3eb; + border-color: #b21e4f; + background-color: #b21e4f; +} + +:is(a).color-pink-600 { + text-decoration-color: #b21e4f !important; +} + +.color-pink-550 { + color: #c72259 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pink-550, +[type=reset].button-pink-550 { + color: #dfe3eb; + border-color: #c72259; + background-color: #c72259; +} + +:is(a).color-pink-550 { + text-decoration-color: #c72259 !important; +} + +.color-pink-500, .color-pink { + color: #d92662 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pink-500, .button-pink:is(button, [type=submit], [type=button], [role=button]), +[type=reset].button-pink-500, +[type=reset].button-pink { + color: #dfe3eb; + border-color: #d92662; + background-color: #d92662; +} + +:is(a).color-pink-500, .color-pink:is(a) { + text-decoration-color: #d92662 !important; +} + +.color-pink-450 { + color: #f42c6f !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pink-450, +[type=reset].button-pink-450 { + color: #dfe3eb; + border-color: #f42c6f; + background-color: #f42c6f; +} + +:is(a).color-pink-450 { + text-decoration-color: #f42c6f !important; +} + +.color-pink-400 { + color: #f6547e !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pink-400, +[type=reset].button-pink-400 { + color: #1b1b1b; + border-color: #f6547e; + background-color: #f6547e; +} + +:is(a).color-pink-400 { + text-decoration-color: #f6547e !important; +} + +.color-pink-350 { + color: #f7708e !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pink-350, +[type=reset].button-pink-350 { + color: #1b1b1b; + border-color: #f7708e; + background-color: #f7708e; +} + +:is(a).color-pink-350 { + text-decoration-color: #f7708e !important; +} + +.color-pink-300 { + color: #f8889e !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pink-300, +[type=reset].button-pink-300 { + color: #1b1b1b; + border-color: #f8889e; + background-color: #f8889e; +} + +:is(a).color-pink-300 { + text-decoration-color: #f8889e !important; +} + +.color-pink-250 { + color: #f99eae !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pink-250, +[type=reset].button-pink-250 { + color: #1b1b1b; + border-color: #f99eae; + background-color: #f99eae; +} + +:is(a).color-pink-250 { + text-decoration-color: #f99eae !important; +} + +.color-pink-200 { + color: #f9b4be !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pink-200, +[type=reset].button-pink-200 { + color: #1b1b1b; + border-color: #f9b4be; + background-color: #f9b4be; +} + +:is(a).color-pink-200 { + text-decoration-color: #f9b4be !important; +} + +.color-pink-150 { + color: #f9c8ce !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pink-150, +[type=reset].button-pink-150 { + color: #1b1b1b; + border-color: #f9c8ce; + background-color: #f9c8ce; +} + +:is(a).color-pink-150 { + text-decoration-color: #f9c8ce !important; +} + +.color-pink-100 { + color: #f9dbdf !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pink-100, +[type=reset].button-pink-100 { + color: #1b1b1b; + border-color: #f9dbdf; + background-color: #f9dbdf; +} + +:is(a).color-pink-100 { + text-decoration-color: #f9dbdf !important; +} + +.color-pink-50 { + color: #fbedef !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pink-50, +[type=reset].button-pink-50 { + color: #1b1b1b; + border-color: #fbedef; + background-color: #fbedef; +} + +:is(a).color-pink-50 { + text-decoration-color: #fbedef !important; +} + +.color-pink-main { + color: #d92662 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pink-main, +[type=reset].button-pink-main { + color: #dfe3eb; + border-color: #d92662; + background-color: #d92662; +} + +:is(a).color-pink-main { + text-decoration-color: #d92662 !important; +} + +.color-fuchsia-950 { + color: #230518 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-fuchsia-950, +[type=reset].button-fuchsia-950 { + color: #dfe3eb; + border-color: #230518; + background-color: #230518; +} + +:is(a).color-fuchsia-950 { + text-decoration-color: #230518 !important; +} + +.color-fuchsia-900 { + color: #360925 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-fuchsia-900, +[type=reset].button-fuchsia-900 { + color: #dfe3eb; + border-color: #360925; + background-color: #360925; +} + +:is(a).color-fuchsia-900 { + text-decoration-color: #360925 !important; +} + +.color-fuchsia-850 { + color: #480b33 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-fuchsia-850, +[type=reset].button-fuchsia-850 { + color: #dfe3eb; + border-color: #480b33; + background-color: #480b33; +} + +:is(a).color-fuchsia-850 { + text-decoration-color: #480b33 !important; +} + +.color-fuchsia-800 { + color: #5c0d41 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-fuchsia-800, +[type=reset].button-fuchsia-800 { + color: #dfe3eb; + border-color: #5c0d41; + background-color: #5c0d41; +} + +:is(a).color-fuchsia-800 { + text-decoration-color: #5c0d41 !important; +} + +.color-fuchsia-750 { + color: #700e4f !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-fuchsia-750, +[type=reset].button-fuchsia-750 { + color: #dfe3eb; + border-color: #700e4f; + background-color: #700e4f; +} + +:is(a).color-fuchsia-750 { + text-decoration-color: #700e4f !important; +} + +.color-fuchsia-700 { + color: #84135e !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-fuchsia-700, +[type=reset].button-fuchsia-700 { + color: #dfe3eb; + border-color: #84135e; + background-color: #84135e; +} + +:is(a).color-fuchsia-700 { + text-decoration-color: #84135e !important; +} + +.color-fuchsia-650 { + color: #98176d !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-fuchsia-650, +[type=reset].button-fuchsia-650 { + color: #dfe3eb; + border-color: #98176d; + background-color: #98176d; +} + +:is(a).color-fuchsia-650 { + text-decoration-color: #98176d !important; +} + +.color-fuchsia-600 { + color: #ac1c7c !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-fuchsia-600, +[type=reset].button-fuchsia-600 { + color: #dfe3eb; + border-color: #ac1c7c; + background-color: #ac1c7c; +} + +:is(a).color-fuchsia-600 { + text-decoration-color: #ac1c7c !important; +} + +.color-fuchsia-550 { + color: #c1208b !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-fuchsia-550, +[type=reset].button-fuchsia-550 { + color: #dfe3eb; + border-color: #c1208b; + background-color: #c1208b; +} + +:is(a).color-fuchsia-550 { + text-decoration-color: #c1208b !important; +} + +.color-fuchsia-500, .color-fuchsia { + color: #d9269d !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-fuchsia-500, .button-fuchsia:is(button, [type=submit], [type=button], [role=button]), +[type=reset].button-fuchsia-500, +[type=reset].button-fuchsia { + color: #dfe3eb; + border-color: #d9269d; + background-color: #d9269d; +} + +:is(a).color-fuchsia-500, .color-fuchsia:is(a) { + text-decoration-color: #d9269d !important; +} + +.color-fuchsia-450 { + color: #ed2aac !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-fuchsia-450, +[type=reset].button-fuchsia-450 { + color: #dfe3eb; + border-color: #ed2aac; + background-color: #ed2aac; +} + +:is(a).color-fuchsia-450 { + text-decoration-color: #ed2aac !important; +} + +.color-fuchsia-400 { + color: #f748b7 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-fuchsia-400, +[type=reset].button-fuchsia-400 { + color: #1b1b1b; + border-color: #f748b7; + background-color: #f748b7; +} + +:is(a).color-fuchsia-400 { + text-decoration-color: #f748b7 !important; +} + +.color-fuchsia-350 { + color: #f869bf !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-fuchsia-350, +[type=reset].button-fuchsia-350 { + color: #1b1b1b; + border-color: #f869bf; + background-color: #f869bf; +} + +:is(a).color-fuchsia-350 { + text-decoration-color: #f869bf !important; +} + +.color-fuchsia-300 { + color: #f983c7 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-fuchsia-300, +[type=reset].button-fuchsia-300 { + color: #1b1b1b; + border-color: #f983c7; + background-color: #f983c7; +} + +:is(a).color-fuchsia-300 { + text-decoration-color: #f983c7 !important; +} + +.color-fuchsia-250 { + color: #fa9acf !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-fuchsia-250, +[type=reset].button-fuchsia-250 { + color: #1b1b1b; + border-color: #fa9acf; + background-color: #fa9acf; +} + +:is(a).color-fuchsia-250 { + text-decoration-color: #fa9acf !important; +} + +.color-fuchsia-200 { + color: #f9b1d8 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-fuchsia-200, +[type=reset].button-fuchsia-200 { + color: #1b1b1b; + border-color: #f9b1d8; + background-color: #f9b1d8; +} + +:is(a).color-fuchsia-200 { + text-decoration-color: #f9b1d8 !important; +} + +.color-fuchsia-150 { + color: #f9c6e1 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-fuchsia-150, +[type=reset].button-fuchsia-150 { + color: #1b1b1b; + border-color: #f9c6e1; + background-color: #f9c6e1; +} + +:is(a).color-fuchsia-150 { + text-decoration-color: #f9c6e1 !important; +} + +.color-fuchsia-100 { + color: #f9daea !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-fuchsia-100, +[type=reset].button-fuchsia-100 { + color: #1b1b1b; + border-color: #f9daea; + background-color: #f9daea; +} + +:is(a).color-fuchsia-100 { + text-decoration-color: #f9daea !important; +} + +.color-fuchsia-50 { + color: #fbedf4 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-fuchsia-50, +[type=reset].button-fuchsia-50 { + color: #1b1b1b; + border-color: #fbedf4; + background-color: #fbedf4; +} + +:is(a).color-fuchsia-50 { + text-decoration-color: #fbedf4 !important; +} + +.color-fuchsia-main { + color: #c1208b !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-fuchsia-main, +[type=reset].button-fuchsia-main { + color: #dfe3eb; + border-color: #c1208b; + background-color: #c1208b; +} + +:is(a).color-fuchsia-main { + text-decoration-color: #c1208b !important; +} + +.color-purple-950 { + color: #1e0820 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-purple-950, +[type=reset].button-purple-950 { + color: #dfe3eb; + border-color: #1e0820; + background-color: #1e0820; +} + +:is(a).color-purple-950 { + text-decoration-color: #1e0820 !important; +} + +.color-purple-900 { + color: #2d0f33 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-purple-900, +[type=reset].button-purple-900 { + color: #dfe3eb; + border-color: #2d0f33; + background-color: #2d0f33; +} + +:is(a).color-purple-900 { + text-decoration-color: #2d0f33 !important; +} + +.color-purple-850 { + color: #3d1545 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-purple-850, +[type=reset].button-purple-850 { + color: #dfe3eb; + border-color: #3d1545; + background-color: #3d1545; +} + +:is(a).color-purple-850 { + text-decoration-color: #3d1545 !important; +} + +.color-purple-800 { + color: #4d1a57 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-purple-800, +[type=reset].button-purple-800 { + color: #dfe3eb; + border-color: #4d1a57; + background-color: #4d1a57; +} + +:is(a).color-purple-800 { + text-decoration-color: #4d1a57 !important; +} + +.color-purple-750 { + color: #5e206b !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-purple-750, +[type=reset].button-purple-750 { + color: #dfe3eb; + border-color: #5e206b; + background-color: #5e206b; +} + +:is(a).color-purple-750 { + text-decoration-color: #5e206b !important; +} + +.color-purple-700 { + color: #6f277d !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-purple-700, +[type=reset].button-purple-700 { + color: #dfe3eb; + border-color: #6f277d; + background-color: #6f277d; +} + +:is(a).color-purple-700 { + text-decoration-color: #6f277d !important; +} + +.color-purple-650 { + color: #802e90 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-purple-650, +[type=reset].button-purple-650 { + color: #dfe3eb; + border-color: #802e90; + background-color: #802e90; +} + +:is(a).color-purple-650 { + text-decoration-color: #802e90 !important; +} + +.color-purple-600 { + color: #9236a4 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-purple-600, +[type=reset].button-purple-600 { + color: #dfe3eb; + border-color: #9236a4; + background-color: #9236a4; +} + +:is(a).color-purple-600 { + text-decoration-color: #9236a4 !important; +} + +.color-purple-550 { + color: #aa40bf !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-purple-550, +[type=reset].button-purple-550 { + color: #dfe3eb; + border-color: #aa40bf; + background-color: #aa40bf; +} + +:is(a).color-purple-550 { + text-decoration-color: #aa40bf !important; +} + +.color-purple-500, .color-purple { + color: #b645cd !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-purple-500, .button-purple:is(button, [type=submit], [type=button], [role=button]), +[type=reset].button-purple-500, +[type=reset].button-purple { + color: #dfe3eb; + border-color: #b645cd; + background-color: #b645cd; +} + +:is(a).color-purple-500, .color-purple:is(a) { + text-decoration-color: #b645cd !important; +} + +.color-purple-450 { + color: #c652dc !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-purple-450, +[type=reset].button-purple-450 { + color: #1b1b1b; + border-color: #c652dc; + background-color: #c652dc; +} + +:is(a).color-purple-450 { + text-decoration-color: #c652dc !important; +} + +.color-purple-400 { + color: #cd68e0 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-purple-400, +[type=reset].button-purple-400 { + color: #1b1b1b; + border-color: #cd68e0; + background-color: #cd68e0; +} + +:is(a).color-purple-400 { + text-decoration-color: #cd68e0 !important; +} + +.color-purple-350 { + color: #d47de4 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-purple-350, +[type=reset].button-purple-350 { + color: #1b1b1b; + border-color: #d47de4; + background-color: #d47de4; +} + +:is(a).color-purple-350 { + text-decoration-color: #d47de4 !important; +} + +.color-purple-300 { + color: #db90e8 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-purple-300, +[type=reset].button-purple-300 { + color: #1b1b1b; + border-color: #db90e8; + background-color: #db90e8; +} + +:is(a).color-purple-300 { + text-decoration-color: #db90e8 !important; +} + +.color-purple-250 { + color: #e2a3eb !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-purple-250, +[type=reset].button-purple-250 { + color: #1b1b1b; + border-color: #e2a3eb; + background-color: #e2a3eb; +} + +:is(a).color-purple-250 { + text-decoration-color: #e2a3eb !important; +} + +.color-purple-200 { + color: #e7b6ee !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-purple-200, +[type=reset].button-purple-200 { + color: #1b1b1b; + border-color: #e7b6ee; + background-color: #e7b6ee; +} + +:is(a).color-purple-200 { + text-decoration-color: #e7b6ee !important; +} + +.color-purple-150 { + color: #edc9f1 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-purple-150, +[type=reset].button-purple-150 { + color: #1b1b1b; + border-color: #edc9f1; + background-color: #edc9f1; +} + +:is(a).color-purple-150 { + text-decoration-color: #edc9f1 !important; +} + +.color-purple-100 { + color: #f2dcf4 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-purple-100, +[type=reset].button-purple-100 { + color: #1b1b1b; + border-color: #f2dcf4; + background-color: #f2dcf4; +} + +:is(a).color-purple-100 { + text-decoration-color: #f2dcf4 !important; +} + +.color-purple-50 { + color: #f8eef9 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-purple-50, +[type=reset].button-purple-50 { + color: #1b1b1b; + border-color: #f8eef9; + background-color: #f8eef9; +} + +:is(a).color-purple-50 { + text-decoration-color: #f8eef9 !important; +} + +.color-purple-main { + color: #9236a4 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-purple-main, +[type=reset].button-purple-main { + color: #dfe3eb; + border-color: #9236a4; + background-color: #9236a4; +} + +:is(a).color-purple-main { + text-decoration-color: #9236a4 !important; +} + +.color-violet-950 { + color: #190928 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-violet-950, +[type=reset].button-violet-950 { + color: #dfe3eb; + border-color: #190928; + background-color: #190928; +} + +:is(a).color-violet-950 { + text-decoration-color: #190928 !important; +} + +.color-violet-900 { + color: #251140 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-violet-900, +[type=reset].button-violet-900 { + color: #dfe3eb; + border-color: #251140; + background-color: #251140; +} + +:is(a).color-violet-900 { + text-decoration-color: #251140 !important; +} + +.color-violet-850 { + color: #321856 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-violet-850, +[type=reset].button-violet-850 { + color: #dfe3eb; + border-color: #321856; + background-color: #321856; +} + +:is(a).color-violet-850 { + text-decoration-color: #321856 !important; +} + +.color-violet-800 { + color: #3f1e6d !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-violet-800, +[type=reset].button-violet-800 { + color: #dfe3eb; + border-color: #3f1e6d; + background-color: #3f1e6d; +} + +:is(a).color-violet-800 { + text-decoration-color: #3f1e6d !important; +} + +.color-violet-750 { + color: #4d2585 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-violet-750, +[type=reset].button-violet-750 { + color: #dfe3eb; + border-color: #4d2585; + background-color: #4d2585; +} + +:is(a).color-violet-750 { + text-decoration-color: #4d2585 !important; +} + +.color-violet-700 { + color: #5b2d9c !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-violet-700, +[type=reset].button-violet-700 { + color: #dfe3eb; + border-color: #5b2d9c; + background-color: #5b2d9c; +} + +:is(a).color-violet-700 { + text-decoration-color: #5b2d9c !important; +} + +.color-violet-650 { + color: #6935b3 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-violet-650, +[type=reset].button-violet-650 { + color: #dfe3eb; + border-color: #6935b3; + background-color: #6935b3; +} + +:is(a).color-violet-650 { + text-decoration-color: #6935b3 !important; +} + +.color-violet-600 { + color: #7540bf !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-violet-600, +[type=reset].button-violet-600 { + color: #dfe3eb; + border-color: #7540bf; + background-color: #7540bf; +} + +:is(a).color-violet-600 { + text-decoration-color: #7540bf !important; +} + +.color-violet-550 { + color: #8352c5 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-violet-550, +[type=reset].button-violet-550 { + color: #dfe3eb; + border-color: #8352c5; + background-color: #8352c5; +} + +:is(a).color-violet-550 { + text-decoration-color: #8352c5 !important; +} + +.color-violet-500, .color-violet { + color: #9062ca !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-violet-500, .button-violet:is(button, [type=submit], [type=button], [role=button]), +[type=reset].button-violet-500, +[type=reset].button-violet { + color: #1b1b1b; + border-color: #9062ca; + background-color: #9062ca; +} + +:is(a).color-violet-500, .color-violet:is(a) { + text-decoration-color: #9062ca !important; +} + +.color-violet-450 { + color: #9b71cf !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-violet-450, +[type=reset].button-violet-450 { + color: #1b1b1b; + border-color: #9b71cf; + background-color: #9b71cf; +} + +:is(a).color-violet-450 { + text-decoration-color: #9b71cf !important; +} + +.color-violet-400 { + color: #a780d4 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-violet-400, +[type=reset].button-violet-400 { + color: #1b1b1b; + border-color: #a780d4; + background-color: #a780d4; +} + +:is(a).color-violet-400 { + text-decoration-color: #a780d4 !important; +} + +.color-violet-350 { + color: #b290d9 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-violet-350, +[type=reset].button-violet-350 { + color: #1b1b1b; + border-color: #b290d9; + background-color: #b290d9; +} + +:is(a).color-violet-350 { + text-decoration-color: #b290d9 !important; +} + +.color-violet-300 { + color: #bd9fdf !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-violet-300, +[type=reset].button-violet-300 { + color: #1b1b1b; + border-color: #bd9fdf; + background-color: #bd9fdf; +} + +:is(a).color-violet-300 { + text-decoration-color: #bd9fdf !important; +} + +.color-violet-250 { + color: #c9afe4 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-violet-250, +[type=reset].button-violet-250 { + color: #1b1b1b; + border-color: #c9afe4; + background-color: #c9afe4; +} + +:is(a).color-violet-250 { + text-decoration-color: #c9afe4 !important; +} + +.color-violet-200 { + color: #d3bfe8 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-violet-200, +[type=reset].button-violet-200 { + color: #1b1b1b; + border-color: #d3bfe8; + background-color: #d3bfe8; +} + +:is(a).color-violet-200 { + text-decoration-color: #d3bfe8 !important; +} + +.color-violet-150 { + color: #decfed !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-violet-150, +[type=reset].button-violet-150 { + color: #1b1b1b; + border-color: #decfed; + background-color: #decfed; +} + +:is(a).color-violet-150 { + text-decoration-color: #decfed !important; +} + +.color-violet-100 { + color: #e8dff2 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-violet-100, +[type=reset].button-violet-100 { + color: #1b1b1b; + border-color: #e8dff2; + background-color: #e8dff2; +} + +:is(a).color-violet-100 { + text-decoration-color: #e8dff2 !important; +} + +.color-violet-50 { + color: #f3eff7 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-violet-50, +[type=reset].button-violet-50 { + color: #1b1b1b; + border-color: #f3eff7; + background-color: #f3eff7; +} + +:is(a).color-violet-50 { + text-decoration-color: #f3eff7 !important; +} + +.color-violet-main { + color: #7540bf !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-violet-main, +[type=reset].button-violet-main { + color: #dfe3eb; + border-color: #7540bf; + background-color: #7540bf; +} + +:is(a).color-violet-main { + text-decoration-color: #7540bf !important; +} + +.color-indigo-950 { + color: #110b31 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-indigo-950, +[type=reset].button-indigo-950 { + color: #dfe3eb; + border-color: #110b31; + background-color: #110b31; +} + +:is(a).color-indigo-950 { + text-decoration-color: #110b31 !important; +} + +.color-indigo-900 { + color: #181546 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-indigo-900, +[type=reset].button-indigo-900 { + color: #dfe3eb; + border-color: #181546; + background-color: #181546; +} + +:is(a).color-indigo-900 { + text-decoration-color: #181546 !important; +} + +.color-indigo-850 { + color: #1f1e5e !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-indigo-850, +[type=reset].button-indigo-850 { + color: #dfe3eb; + border-color: #1f1e5e; + background-color: #1f1e5e; +} + +:is(a).color-indigo-850 { + text-decoration-color: #1f1e5e !important; +} + +.color-indigo-800 { + color: #272678 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-indigo-800, +[type=reset].button-indigo-800 { + color: #dfe3eb; + border-color: #272678; + background-color: #272678; +} + +:is(a).color-indigo-800 { + text-decoration-color: #272678 !important; +} + +.color-indigo-750 { + color: #2f2f92 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-indigo-750, +[type=reset].button-indigo-750 { + color: #dfe3eb; + border-color: #2f2f92; + background-color: #2f2f92; +} + +:is(a).color-indigo-750 { + text-decoration-color: #2f2f92 !important; +} + +.color-indigo-700 { + color: #3838ab !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-indigo-700, +[type=reset].button-indigo-700 { + color: #dfe3eb; + border-color: #3838ab; + background-color: #3838ab; +} + +:is(a).color-indigo-700 { + text-decoration-color: #3838ab !important; +} + +.color-indigo-650 { + color: #4040bf !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-indigo-650, +[type=reset].button-indigo-650 { + color: #dfe3eb; + border-color: #4040bf; + background-color: #4040bf; +} + +:is(a).color-indigo-650 { + text-decoration-color: #4040bf !important; +} + +.color-indigo-600 { + color: #524ed2 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-indigo-600, +[type=reset].button-indigo-600 { + color: #dfe3eb; + border-color: #524ed2; + background-color: #524ed2; +} + +:is(a).color-indigo-600 { + text-decoration-color: #524ed2 !important; +} + +.color-indigo-550 { + color: #655cd6 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-indigo-550, +[type=reset].button-indigo-550 { + color: #dfe3eb; + border-color: #655cd6; + background-color: #655cd6; +} + +:is(a).color-indigo-550 { + text-decoration-color: #655cd6 !important; +} + +.color-indigo-500, .color-indigo { + color: #7569da !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-indigo-500, .button-indigo:is(button, [type=submit], [type=button], [role=button]), +[type=reset].button-indigo-500, +[type=reset].button-indigo { + color: #1b1b1b; + border-color: #7569da; + background-color: #7569da; +} + +:is(a).color-indigo-500, .color-indigo:is(a) { + text-decoration-color: #7569da !important; +} + +.color-indigo-450 { + color: #8577dd !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-indigo-450, +[type=reset].button-indigo-450 { + color: #1b1b1b; + border-color: #8577dd; + background-color: #8577dd; +} + +:is(a).color-indigo-450 { + text-decoration-color: #8577dd !important; +} + +.color-indigo-400 { + color: #9486e1 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-indigo-400, +[type=reset].button-indigo-400 { + color: #1b1b1b; + border-color: #9486e1; + background-color: #9486e1; +} + +:is(a).color-indigo-400 { + text-decoration-color: #9486e1 !important; +} + +.color-indigo-350 { + color: #a294e5 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-indigo-350, +[type=reset].button-indigo-350 { + color: #1b1b1b; + border-color: #a294e5; + background-color: #a294e5; +} + +:is(a).color-indigo-350 { + text-decoration-color: #a294e5 !important; +} + +.color-indigo-300 { + color: #b0a3e8 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-indigo-300, +[type=reset].button-indigo-300 { + color: #1b1b1b; + border-color: #b0a3e8; + background-color: #b0a3e8; +} + +:is(a).color-indigo-300 { + text-decoration-color: #b0a3e8 !important; +} + +.color-indigo-250 { + color: #bdb2ec !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-indigo-250, +[type=reset].button-indigo-250 { + color: #1b1b1b; + border-color: #bdb2ec; + background-color: #bdb2ec; +} + +:is(a).color-indigo-250 { + text-decoration-color: #bdb2ec !important; +} + +.color-indigo-200 { + color: #cac1ee !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-indigo-200, +[type=reset].button-indigo-200 { + color: #1b1b1b; + border-color: #cac1ee; + background-color: #cac1ee; +} + +:is(a).color-indigo-200 { + text-decoration-color: #cac1ee !important; +} + +.color-indigo-150 { + color: #d8d0f1 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-indigo-150, +[type=reset].button-indigo-150 { + color: #1b1b1b; + border-color: #d8d0f1; + background-color: #d8d0f1; +} + +:is(a).color-indigo-150 { + text-decoration-color: #d8d0f1 !important; +} + +.color-indigo-100 { + color: #e5e0f4 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-indigo-100, +[type=reset].button-indigo-100 { + color: #1b1b1b; + border-color: #e5e0f4; + background-color: #e5e0f4; +} + +:is(a).color-indigo-100 { + text-decoration-color: #e5e0f4 !important; +} + +.color-indigo-50 { + color: #f2f0f9 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-indigo-50, +[type=reset].button-indigo-50 { + color: #1b1b1b; + border-color: #f2f0f9; + background-color: #f2f0f9; +} + +:is(a).color-indigo-50 { + text-decoration-color: #f2f0f9 !important; +} + +.color-indigo-main { + color: #524ed2 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-indigo-main, +[type=reset].button-indigo-main { + color: #dfe3eb; + border-color: #524ed2; + background-color: #524ed2; +} + +:is(a).color-indigo-main { + text-decoration-color: #524ed2 !important; +} + +.color-blue-950 { + color: #080f2d !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-blue-950, +[type=reset].button-blue-950 { + color: #dfe3eb; + border-color: #080f2d; + background-color: #080f2d; +} + +:is(a).color-blue-950 { + text-decoration-color: #080f2d !important; +} + +.color-blue-900 { + color: #0c1a41 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-blue-900, +[type=reset].button-blue-900 { + color: #dfe3eb; + border-color: #0c1a41; + background-color: #0c1a41; +} + +:is(a).color-blue-900 { + text-decoration-color: #0c1a41 !important; +} + +.color-blue-850 { + color: #0e2358 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-blue-850, +[type=reset].button-blue-850 { + color: #dfe3eb; + border-color: #0e2358; + background-color: #0e2358; +} + +:is(a).color-blue-850 { + text-decoration-color: #0e2358 !important; +} + +.color-blue-800 { + color: #0f2d70 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-blue-800, +[type=reset].button-blue-800 { + color: #dfe3eb; + border-color: #0f2d70; + background-color: #0f2d70; +} + +:is(a).color-blue-800 { + text-decoration-color: #0f2d70 !important; +} + +.color-blue-750 { + color: #0f3888 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-blue-750, +[type=reset].button-blue-750 { + color: #dfe3eb; + border-color: #0f3888; + background-color: #0f3888; +} + +:is(a).color-blue-750 { + text-decoration-color: #0f3888 !important; +} + +.color-blue-700 { + color: #1343a0 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-blue-700, +[type=reset].button-blue-700 { + color: #dfe3eb; + border-color: #1343a0; + background-color: #1343a0; +} + +:is(a).color-blue-700 { + text-decoration-color: #1343a0 !important; +} + +.color-blue-650 { + color: #184eb8 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-blue-650, +[type=reset].button-blue-650 { + color: #dfe3eb; + border-color: #184eb8; + background-color: #184eb8; +} + +:is(a).color-blue-650 { + text-decoration-color: #184eb8 !important; +} + +.color-blue-600 { + color: #1d59d0 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-blue-600, +[type=reset].button-blue-600 { + color: #dfe3eb; + border-color: #1d59d0; + background-color: #1d59d0; +} + +:is(a).color-blue-600 { + text-decoration-color: #1d59d0 !important; +} + +.color-blue-550 { + color: #2060df !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-blue-550, +[type=reset].button-blue-550 { + color: #dfe3eb; + border-color: #2060df; + background-color: #2060df; +} + +:is(a).color-blue-550 { + text-decoration-color: #2060df !important; +} + +.color-blue-500, .color-blue { + color: #3c71f7 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-blue-500, .button-blue:is(button, [type=submit], [type=button], [role=button]), +[type=reset].button-blue-500, +[type=reset].button-blue { + color: #dfe3eb; + border-color: #3c71f7; + background-color: #3c71f7; +} + +:is(a).color-blue-500, .color-blue:is(a) { + text-decoration-color: #3c71f7 !important; +} + +.color-blue-450 { + color: #5c7ef8 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-blue-450, +[type=reset].button-blue-450 { + color: #1b1b1b; + border-color: #5c7ef8; + background-color: #5c7ef8; +} + +:is(a).color-blue-450 { + text-decoration-color: #5c7ef8 !important; +} + +.color-blue-400 { + color: #748bf8 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-blue-400, +[type=reset].button-blue-400 { + color: #1b1b1b; + border-color: #748bf8; + background-color: #748bf8; +} + +:is(a).color-blue-400 { + text-decoration-color: #748bf8 !important; +} + +.color-blue-350 { + color: #8999f9 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-blue-350, +[type=reset].button-blue-350 { + color: #1b1b1b; + border-color: #8999f9; + background-color: #8999f9; +} + +:is(a).color-blue-350 { + text-decoration-color: #8999f9 !important; +} + +.color-blue-300 { + color: #9ca7fa !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-blue-300, +[type=reset].button-blue-300 { + color: #1b1b1b; + border-color: #9ca7fa; + background-color: #9ca7fa; +} + +:is(a).color-blue-300 { + text-decoration-color: #9ca7fa !important; +} + +.color-blue-250 { + color: #aeb5fb !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-blue-250, +[type=reset].button-blue-250 { + color: #1b1b1b; + border-color: #aeb5fb; + background-color: #aeb5fb; +} + +:is(a).color-blue-250 { + text-decoration-color: #aeb5fb !important; +} + +.color-blue-200 { + color: #bfc3fa !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-blue-200, +[type=reset].button-blue-200 { + color: #1b1b1b; + border-color: #bfc3fa; + background-color: #bfc3fa; +} + +:is(a).color-blue-200 { + text-decoration-color: #bfc3fa !important; +} + +.color-blue-150 { + color: #d0d2fa !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-blue-150, +[type=reset].button-blue-150 { + color: #1b1b1b; + border-color: #d0d2fa; + background-color: #d0d2fa; +} + +:is(a).color-blue-150 { + text-decoration-color: #d0d2fa !important; +} + +.color-blue-100 { + color: #e0e1fa !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-blue-100, +[type=reset].button-blue-100 { + color: #1b1b1b; + border-color: #e0e1fa; + background-color: #e0e1fa; +} + +:is(a).color-blue-100 { + text-decoration-color: #e0e1fa !important; +} + +.color-blue-50 { + color: #f0f0fb !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-blue-50, +[type=reset].button-blue-50 { + color: #1b1b1b; + border-color: #f0f0fb; + background-color: #f0f0fb; +} + +:is(a).color-blue-50 { + text-decoration-color: #f0f0fb !important; +} + +.color-blue-main { + color: #2060df !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-blue-main, +[type=reset].button-blue-main { + color: #dfe3eb; + border-color: #2060df; + background-color: #2060df; +} + +:is(a).color-blue-main { + text-decoration-color: #2060df !important; +} + +.color-azure-950 { + color: #04121d !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-azure-950, +[type=reset].button-azure-950 { + color: #dfe3eb; + border-color: #04121d; + background-color: #04121d; +} + +:is(a).color-azure-950 { + text-decoration-color: #04121d !important; +} + +.color-azure-900 { + color: #061e2f !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-azure-900, +[type=reset].button-azure-900 { + color: #dfe3eb; + border-color: #061e2f; + background-color: #061e2f; +} + +:is(a).color-azure-900 { + text-decoration-color: #061e2f !important; +} + +.color-azure-850 { + color: #052940 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-azure-850, +[type=reset].button-azure-850 { + color: #dfe3eb; + border-color: #052940; + background-color: #052940; +} + +:is(a).color-azure-850 { + text-decoration-color: #052940 !important; +} + +.color-azure-800 { + color: #033452 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-azure-800, +[type=reset].button-azure-800 { + color: #dfe3eb; + border-color: #033452; + background-color: #033452; +} + +:is(a).color-azure-800 { + text-decoration-color: #033452 !important; +} + +.color-azure-750 { + color: #014063 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-azure-750, +[type=reset].button-azure-750 { + color: #dfe3eb; + border-color: #014063; + background-color: #014063; +} + +:is(a).color-azure-750 { + text-decoration-color: #014063 !important; +} + +.color-azure-700 { + color: #014c75 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-azure-700, +[type=reset].button-azure-700 { + color: #dfe3eb; + border-color: #014c75; + background-color: #014c75; +} + +:is(a).color-azure-700 { + text-decoration-color: #014c75 !important; +} + +.color-azure-650 { + color: #015887 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-azure-650, +[type=reset].button-azure-650 { + color: #dfe3eb; + border-color: #015887; + background-color: #015887; +} + +:is(a).color-azure-650 { + text-decoration-color: #015887 !important; +} + +.color-azure-600 { + color: #02659a !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-azure-600, +[type=reset].button-azure-600 { + color: #dfe3eb; + border-color: #02659a; + background-color: #02659a; +} + +:is(a).color-azure-600 { + text-decoration-color: #02659a !important; +} + +.color-azure-550 { + color: #0172ad !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-azure-550, +[type=reset].button-azure-550 { + color: #dfe3eb; + border-color: #0172ad; + background-color: #0172ad; +} + +:is(a).color-azure-550 { + text-decoration-color: #0172ad !important; +} + +.color-azure-500, .color-azure { + color: #017fc0 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-azure-500, .button-azure:is(button, [type=submit], [type=button], [role=button]), +[type=reset].button-azure-500, +[type=reset].button-azure { + color: #dfe3eb; + border-color: #017fc0; + background-color: #017fc0; +} + +:is(a).color-azure-500, .color-azure:is(a) { + text-decoration-color: #017fc0 !important; +} + +.color-azure-450 { + color: #018cd4 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-azure-450, +[type=reset].button-azure-450 { + color: #1b1b1b; + border-color: #018cd4; + background-color: #018cd4; +} + +:is(a).color-azure-450 { + text-decoration-color: #018cd4 !important; +} + +.color-azure-400 { + color: #029ae8 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-azure-400, +[type=reset].button-azure-400 { + color: #1b1b1b; + border-color: #029ae8; + background-color: #029ae8; +} + +:is(a).color-azure-400 { + text-decoration-color: #029ae8 !important; +} + +.color-azure-350 { + color: #01aaff !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-azure-350, +[type=reset].button-azure-350 { + color: #1b1b1b; + border-color: #01aaff; + background-color: #01aaff; +} + +:is(a).color-azure-350 { + text-decoration-color: #01aaff !important; +} + +.color-azure-300 { + color: #51b4ff !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-azure-300, +[type=reset].button-azure-300 { + color: #1b1b1b; + border-color: #51b4ff; + background-color: #51b4ff; +} + +:is(a).color-azure-300 { + text-decoration-color: #51b4ff !important; +} + +.color-azure-250 { + color: #79c0ff !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-azure-250, +[type=reset].button-azure-250 { + color: #1b1b1b; + border-color: #79c0ff; + background-color: #79c0ff; +} + +:is(a).color-azure-250 { + text-decoration-color: #79c0ff !important; +} + +.color-azure-200 { + color: #9bccfd !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-azure-200, +[type=reset].button-azure-200 { + color: #1b1b1b; + border-color: #9bccfd; + background-color: #9bccfd; +} + +:is(a).color-azure-200 { + text-decoration-color: #9bccfd !important; +} + +.color-azure-150 { + color: #b7d9fc !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-azure-150, +[type=reset].button-azure-150 { + color: #1b1b1b; + border-color: #b7d9fc; + background-color: #b7d9fc; +} + +:is(a).color-azure-150 { + text-decoration-color: #b7d9fc !important; +} + +.color-azure-100 { + color: #d1e5fb !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-azure-100, +[type=reset].button-azure-100 { + color: #1b1b1b; + border-color: #d1e5fb; + background-color: #d1e5fb; +} + +:is(a).color-azure-100 { + text-decoration-color: #d1e5fb !important; +} + +.color-azure-50 { + color: #e9f2fc !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-azure-50, +[type=reset].button-azure-50 { + color: #1b1b1b; + border-color: #e9f2fc; + background-color: #e9f2fc; +} + +:is(a).color-azure-50 { + text-decoration-color: #e9f2fc !important; +} + +.color-azure-main { + color: #0172ad !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-azure-main, +[type=reset].button-azure-main { + color: #dfe3eb; + border-color: #0172ad; + background-color: #0172ad; +} + +:is(a).color-azure-main { + text-decoration-color: #0172ad !important; +} + +.color-cyan-950 { + color: #041413 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-cyan-950, +[type=reset].button-cyan-950 { + color: #dfe3eb; + border-color: #041413; + background-color: #041413; +} + +:is(a).color-cyan-950 { + text-decoration-color: #041413 !important; +} + +.color-cyan-900 { + color: #051f1f !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-cyan-900, +[type=reset].button-cyan-900 { + color: #dfe3eb; + border-color: #051f1f; + background-color: #051f1f; +} + +:is(a).color-cyan-900 { + text-decoration-color: #051f1f !important; +} + +.color-cyan-850 { + color: #052b2b !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-cyan-850, +[type=reset].button-cyan-850 { + color: #dfe3eb; + border-color: #052b2b; + background-color: #052b2b; +} + +:is(a).color-cyan-850 { + text-decoration-color: #052b2b !important; +} + +.color-cyan-800 { + color: #043737 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-cyan-800, +[type=reset].button-cyan-800 { + color: #dfe3eb; + border-color: #043737; + background-color: #043737; +} + +:is(a).color-cyan-800 { + text-decoration-color: #043737 !important; +} + +.color-cyan-750 { + color: #014343 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-cyan-750, +[type=reset].button-cyan-750 { + color: #dfe3eb; + border-color: #014343; + background-color: #014343; +} + +:is(a).color-cyan-750 { + text-decoration-color: #014343 !important; +} + +.color-cyan-700 { + color: #015050 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-cyan-700, +[type=reset].button-cyan-700 { + color: #dfe3eb; + border-color: #015050; + background-color: #015050; +} + +:is(a).color-cyan-700 { + text-decoration-color: #015050 !important; +} + +.color-cyan-650 { + color: #025d5d !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-cyan-650, +[type=reset].button-cyan-650 { + color: #dfe3eb; + border-color: #025d5d; + background-color: #025d5d; +} + +:is(a).color-cyan-650 { + text-decoration-color: #025d5d !important; +} + +.color-cyan-600 { + color: #046a6a !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-cyan-600, +[type=reset].button-cyan-600 { + color: #dfe3eb; + border-color: #046a6a; + background-color: #046a6a; +} + +:is(a).color-cyan-600 { + text-decoration-color: #046a6a !important; +} + +.color-cyan-550 { + color: #047878 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-cyan-550, +[type=reset].button-cyan-550 { + color: #dfe3eb; + border-color: #047878; + background-color: #047878; +} + +:is(a).color-cyan-550 { + text-decoration-color: #047878 !important; +} + +.color-cyan-500, .color-cyan { + color: #058686 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-cyan-500, .button-cyan:is(button, [type=submit], [type=button], [role=button]), +[type=reset].button-cyan-500, +[type=reset].button-cyan { + color: #dfe3eb; + border-color: #058686; + background-color: #058686; +} + +:is(a).color-cyan-500, .color-cyan:is(a) { + text-decoration-color: #058686 !important; +} + +.color-cyan-450 { + color: #059494 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-cyan-450, +[type=reset].button-cyan-450 { + color: #1b1b1b; + border-color: #059494; + background-color: #059494; +} + +:is(a).color-cyan-450 { + text-decoration-color: #059494 !important; +} + +.color-cyan-400 { + color: #05a2a2 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-cyan-400, +[type=reset].button-cyan-400 { + color: #1b1b1b; + border-color: #05a2a2; + background-color: #05a2a2; +} + +:is(a).color-cyan-400 { + text-decoration-color: #05a2a2 !important; +} + +.color-cyan-350 { + color: #0ab1b1 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-cyan-350, +[type=reset].button-cyan-350 { + color: #1b1b1b; + border-color: #0ab1b1; + background-color: #0ab1b1; +} + +:is(a).color-cyan-350 { + text-decoration-color: #0ab1b1 !important; +} + +.color-cyan-300 { + color: #0ac2c2 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-cyan-300, +[type=reset].button-cyan-300 { + color: #1b1b1b; + border-color: #0ac2c2; + background-color: #0ac2c2; +} + +:is(a).color-cyan-300 { + text-decoration-color: #0ac2c2 !important; +} + +.color-cyan-250 { + color: #0ccece !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-cyan-250, +[type=reset].button-cyan-250 { + color: #1b1b1b; + border-color: #0ccece; + background-color: #0ccece; +} + +:is(a).color-cyan-250 { + text-decoration-color: #0ccece !important; +} + +.color-cyan-200 { + color: #25dddd !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-cyan-200, +[type=reset].button-cyan-200 { + color: #1b1b1b; + border-color: #25dddd; + background-color: #25dddd; +} + +:is(a).color-cyan-200 { + text-decoration-color: #25dddd !important; +} + +.color-cyan-150 { + color: #3deceb !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-cyan-150, +[type=reset].button-cyan-150 { + color: #1b1b1b; + border-color: #3deceb; + background-color: #3deceb; +} + +:is(a).color-cyan-150 { + text-decoration-color: #3deceb !important; +} + +.color-cyan-100 { + color: #58faf9 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-cyan-100, +[type=reset].button-cyan-100 { + color: #1b1b1b; + border-color: #58faf9; + background-color: #58faf9; +} + +:is(a).color-cyan-100 { + text-decoration-color: #58faf9 !important; +} + +.color-cyan-50 { + color: #c3fcfa !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-cyan-50, +[type=reset].button-cyan-50 { + color: #1b1b1b; + border-color: #c3fcfa; + background-color: #c3fcfa; +} + +:is(a).color-cyan-50 { + text-decoration-color: #c3fcfa !important; +} + +.color-cyan-main { + color: #047878 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-cyan-main, +[type=reset].button-cyan-main { + color: #dfe3eb; + border-color: #047878; + background-color: #047878; +} + +:is(a).color-cyan-main { + text-decoration-color: #047878 !important; +} + +.color-jade-950 { + color: #04140c !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-jade-950, +[type=reset].button-jade-950 { + color: #dfe3eb; + border-color: #04140c; + background-color: #04140c; +} + +:is(a).color-jade-950 { + text-decoration-color: #04140c !important; +} + +.color-jade-900 { + color: #052014 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-jade-900, +[type=reset].button-jade-900 { + color: #dfe3eb; + border-color: #052014; + background-color: #052014; +} + +:is(a).color-jade-900 { + text-decoration-color: #052014 !important; +} + +.color-jade-850 { + color: #042c1b !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-jade-850, +[type=reset].button-jade-850 { + color: #dfe3eb; + border-color: #042c1b; + background-color: #042c1b; +} + +:is(a).color-jade-850 { + text-decoration-color: #042c1b !important; +} + +.color-jade-800 { + color: #033823 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-jade-800, +[type=reset].button-jade-800 { + color: #dfe3eb; + border-color: #033823; + background-color: #033823; +} + +:is(a).color-jade-800 { + text-decoration-color: #033823 !important; +} + +.color-jade-750 { + color: #00452b !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-jade-750, +[type=reset].button-jade-750 { + color: #dfe3eb; + border-color: #00452b; + background-color: #00452b; +} + +:is(a).color-jade-750 { + text-decoration-color: #00452b !important; +} + +.color-jade-700 { + color: #015234 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-jade-700, +[type=reset].button-jade-700 { + color: #dfe3eb; + border-color: #015234; + background-color: #015234; +} + +:is(a).color-jade-700 { + text-decoration-color: #015234 !important; +} + +.color-jade-650 { + color: #005f3d !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-jade-650, +[type=reset].button-jade-650 { + color: #dfe3eb; + border-color: #005f3d; + background-color: #005f3d; +} + +:is(a).color-jade-650 { + text-decoration-color: #005f3d !important; +} + +.color-jade-600 { + color: #006d46 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-jade-600, +[type=reset].button-jade-600 { + color: #dfe3eb; + border-color: #006d46; + background-color: #006d46; +} + +:is(a).color-jade-600 { + text-decoration-color: #006d46 !important; +} + +.color-jade-550 { + color: #007a50 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-jade-550, +[type=reset].button-jade-550 { + color: #dfe3eb; + border-color: #007a50; + background-color: #007a50; +} + +:is(a).color-jade-550 { + text-decoration-color: #007a50 !important; +} + +.color-jade-500, .color-jade { + color: #00895a !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-jade-500, .button-jade:is(button, [type=submit], [type=button], [role=button]), +[type=reset].button-jade-500, +[type=reset].button-jade { + color: #dfe3eb; + border-color: #00895a; + background-color: #00895a; +} + +:is(a).color-jade-500, .color-jade:is(a) { + text-decoration-color: #00895a !important; +} + +.color-jade-450 { + color: #029764 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-jade-450, +[type=reset].button-jade-450 { + color: #1b1b1b; + border-color: #029764; + background-color: #029764; +} + +:is(a).color-jade-450 { + text-decoration-color: #029764 !important; +} + +.color-jade-400 { + color: #00a66e !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-jade-400, +[type=reset].button-jade-400 { + color: #1b1b1b; + border-color: #00a66e; + background-color: #00a66e; +} + +:is(a).color-jade-400 { + text-decoration-color: #00a66e !important; +} + +.color-jade-350 { + color: #00b478 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-jade-350, +[type=reset].button-jade-350 { + color: #1b1b1b; + border-color: #00b478; + background-color: #00b478; +} + +:is(a).color-jade-350 { + text-decoration-color: #00b478 !important; +} + +.color-jade-300 { + color: #00c482 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-jade-300, +[type=reset].button-jade-300 { + color: #1b1b1b; + border-color: #00c482; + background-color: #00c482; +} + +:is(a).color-jade-300 { + text-decoration-color: #00c482 !important; +} + +.color-jade-250 { + color: #00cc88 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-jade-250, +[type=reset].button-jade-250 { + color: #1b1b1b; + border-color: #00cc88; + background-color: #00cc88; +} + +:is(a).color-jade-250 { + text-decoration-color: #00cc88 !important; +} + +.color-jade-200 { + color: #21e299 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-jade-200, +[type=reset].button-jade-200 { + color: #1b1b1b; + border-color: #21e299; + background-color: #21e299; +} + +:is(a).color-jade-200 { + text-decoration-color: #21e299 !important; +} + +.color-jade-150 { + color: #39f1a6 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-jade-150, +[type=reset].button-jade-150 { + color: #1b1b1b; + border-color: #39f1a6; + background-color: #39f1a6; +} + +:is(a).color-jade-150 { + text-decoration-color: #39f1a6 !important; +} + +.color-jade-100 { + color: #70fcba !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-jade-100, +[type=reset].button-jade-100 { + color: #1b1b1b; + border-color: #70fcba; + background-color: #70fcba; +} + +:is(a).color-jade-100 { + text-decoration-color: #70fcba !important; +} + +.color-jade-50 { + color: #cbfce1 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-jade-50, +[type=reset].button-jade-50 { + color: #1b1b1b; + border-color: #cbfce1; + background-color: #cbfce1; +} + +:is(a).color-jade-50 { + text-decoration-color: #cbfce1 !important; +} + +.color-jade-main { + color: #007a50 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-jade-main, +[type=reset].button-jade-main { + color: #dfe3eb; + border-color: #007a50; + background-color: #007a50; +} + +:is(a).color-jade-main { + text-decoration-color: #007a50 !important; +} + +.color-green-950 { + color: #0b1305 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-green-950, +[type=reset].button-green-950 { + color: #dfe3eb; + border-color: #0b1305; + background-color: #0b1305; +} + +:is(a).color-green-950 { + text-decoration-color: #0b1305 !important; +} + +.color-green-900 { + color: #131f07 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-green-900, +[type=reset].button-green-900 { + color: #dfe3eb; + border-color: #131f07; + background-color: #131f07; +} + +:is(a).color-green-900 { + text-decoration-color: #131f07 !important; +} + +.color-green-850 { + color: #152b07 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-green-850, +[type=reset].button-green-850 { + color: #dfe3eb; + border-color: #152b07; + background-color: #152b07; +} + +:is(a).color-green-850 { + text-decoration-color: #152b07 !important; +} + +.color-green-800 { + color: #173806 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-green-800, +[type=reset].button-green-800 { + color: #dfe3eb; + border-color: #173806; + background-color: #173806; +} + +:is(a).color-green-800 { + text-decoration-color: #173806 !important; +} + +.color-green-750 { + color: #1a4405 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-green-750, +[type=reset].button-green-750 { + color: #dfe3eb; + border-color: #1a4405; + background-color: #1a4405; +} + +:is(a).color-green-750 { + text-decoration-color: #1a4405 !important; +} + +.color-green-700 { + color: #205107 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-green-700, +[type=reset].button-green-700 { + color: #dfe3eb; + border-color: #205107; + background-color: #205107; +} + +:is(a).color-green-700 { + text-decoration-color: #205107 !important; +} + +.color-green-650 { + color: #265e09 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-green-650, +[type=reset].button-green-650 { + color: #dfe3eb; + border-color: #265e09; + background-color: #265e09; +} + +:is(a).color-green-650 { + text-decoration-color: #265e09 !important; +} + +.color-green-600 { + color: #2c6c0c !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-green-600, +[type=reset].button-green-600 { + color: #dfe3eb; + border-color: #2c6c0c; + background-color: #2c6c0c; +} + +:is(a).color-green-600 { + text-decoration-color: #2c6c0c !important; +} + +.color-green-550 { + color: #33790f !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-green-550, +[type=reset].button-green-550 { + color: #dfe3eb; + border-color: #33790f; + background-color: #33790f; +} + +:is(a).color-green-550 { + text-decoration-color: #33790f !important; +} + +.color-green-500, .color-green { + color: #398712 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-green-500, .button-green:is(button, [type=submit], [type=button], [role=button]), +[type=reset].button-green-500, +[type=reset].button-green { + color: #dfe3eb; + border-color: #398712; + background-color: #398712; +} + +:is(a).color-green-500, .color-green:is(a) { + text-decoration-color: #398712 !important; +} + +.color-green-450 { + color: #409614 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-green-450, +[type=reset].button-green-450 { + color: #1b1b1b; + border-color: #409614; + background-color: #409614; +} + +:is(a).color-green-450 { + text-decoration-color: #409614 !important; +} + +.color-green-400 { + color: #47a417 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-green-400, +[type=reset].button-green-400 { + color: #1b1b1b; + border-color: #47a417; + background-color: #47a417; +} + +:is(a).color-green-400 { + text-decoration-color: #47a417 !important; +} + +.color-green-350 { + color: #4eb31b !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-green-350, +[type=reset].button-green-350 { + color: #1b1b1b; + border-color: #4eb31b; + background-color: #4eb31b; +} + +:is(a).color-green-350 { + text-decoration-color: #4eb31b !important; +} + +.color-green-300 { + color: #55c21e !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-green-300, +[type=reset].button-green-300 { + color: #1b1b1b; + border-color: #55c21e; + background-color: #55c21e; +} + +:is(a).color-green-300 { + text-decoration-color: #55c21e !important; +} + +.color-green-250 { + color: #5dd121 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-green-250, +[type=reset].button-green-250 { + color: #1b1b1b; + border-color: #5dd121; + background-color: #5dd121; +} + +:is(a).color-green-250 { + text-decoration-color: #5dd121 !important; +} + +.color-green-200 { + color: #62d926 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-green-200, +[type=reset].button-green-200 { + color: #1b1b1b; + border-color: #62d926; + background-color: #62d926; +} + +:is(a).color-green-200 { + text-decoration-color: #62d926 !important; +} + +.color-green-150 { + color: #77ef3d !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-green-150, +[type=reset].button-green-150 { + color: #1b1b1b; + border-color: #77ef3d; + background-color: #77ef3d; +} + +:is(a).color-green-150 { + text-decoration-color: #77ef3d !important; +} + +.color-green-100 { + color: #95fb62 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-green-100, +[type=reset].button-green-100 { + color: #1b1b1b; + border-color: #95fb62; + background-color: #95fb62; +} + +:is(a).color-green-100 { + text-decoration-color: #95fb62 !important; +} + +.color-green-50 { + color: #d7fbc1 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-green-50, +[type=reset].button-green-50 { + color: #1b1b1b; + border-color: #d7fbc1; + background-color: #d7fbc1; +} + +:is(a).color-green-50 { + text-decoration-color: #d7fbc1 !important; +} + +.color-green-main { + color: #398712 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-green-main, +[type=reset].button-green-main { + color: #dfe3eb; + border-color: #398712; + background-color: #398712; +} + +:is(a).color-green-main { + text-decoration-color: #398712 !important; +} + +.color-lime-950 { + color: #101203 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-lime-950, +[type=reset].button-lime-950 { + color: #dfe3eb; + border-color: #101203; + background-color: #101203; +} + +:is(a).color-lime-950 { + text-decoration-color: #101203 !important; +} + +.color-lime-900 { + color: #191d03 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-lime-900, +[type=reset].button-lime-900 { + color: #dfe3eb; + border-color: #191d03; + background-color: #191d03; +} + +:is(a).color-lime-900 { + text-decoration-color: #191d03 !important; +} + +.color-lime-850 { + color: #202902 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-lime-850, +[type=reset].button-lime-850 { + color: #dfe3eb; + border-color: #202902; + background-color: #202902; +} + +:is(a).color-lime-850 { + text-decoration-color: #202902 !important; +} + +.color-lime-800 { + color: #273500 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-lime-800, +[type=reset].button-lime-800 { + color: #dfe3eb; + border-color: #273500; + background-color: #273500; +} + +:is(a).color-lime-800 { + text-decoration-color: #273500 !important; +} + +.color-lime-750 { + color: #304100 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-lime-750, +[type=reset].button-lime-750 { + color: #dfe3eb; + border-color: #304100; + background-color: #304100; +} + +:is(a).color-lime-750 { + text-decoration-color: #304100 !important; +} + +.color-lime-700 { + color: #394d00 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-lime-700, +[type=reset].button-lime-700 { + color: #dfe3eb; + border-color: #394d00; + background-color: #394d00; +} + +:is(a).color-lime-700 { + text-decoration-color: #394d00 !important; +} + +.color-lime-650 { + color: #435a00 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-lime-650, +[type=reset].button-lime-650 { + color: #dfe3eb; + border-color: #435a00; + background-color: #435a00; +} + +:is(a).color-lime-650 { + text-decoration-color: #435a00 !important; +} + +.color-lime-600 { + color: #4d6600 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-lime-600, +[type=reset].button-lime-600 { + color: #dfe3eb; + border-color: #4d6600; + background-color: #4d6600; +} + +:is(a).color-lime-600 { + text-decoration-color: #4d6600 !important; +} + +.color-lime-550 { + color: #577400 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-lime-550, +[type=reset].button-lime-550 { + color: #dfe3eb; + border-color: #577400; + background-color: #577400; +} + +:is(a).color-lime-550 { + text-decoration-color: #577400 !important; +} + +.color-lime-500, .color-lime { + color: #628100 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-lime-500, .button-lime:is(button, [type=submit], [type=button], [role=button]), +[type=reset].button-lime-500, +[type=reset].button-lime { + color: #dfe3eb; + border-color: #628100; + background-color: #628100; +} + +:is(a).color-lime-500, .color-lime:is(a) { + text-decoration-color: #628100 !important; +} + +.color-lime-450 { + color: #6c8f00 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-lime-450, +[type=reset].button-lime-450 { + color: #1b1b1b; + border-color: #6c8f00; + background-color: #6c8f00; +} + +:is(a).color-lime-450 { + text-decoration-color: #6c8f00 !important; +} + +.color-lime-400 { + color: #779c00 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-lime-400, +[type=reset].button-lime-400 { + color: #1b1b1b; + border-color: #779c00; + background-color: #779c00; +} + +:is(a).color-lime-400 { + text-decoration-color: #779c00 !important; +} + +.color-lime-350 { + color: #82ab00 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-lime-350, +[type=reset].button-lime-350 { + color: #1b1b1b; + border-color: #82ab00; + background-color: #82ab00; +} + +:is(a).color-lime-350 { + text-decoration-color: #82ab00 !important; +} + +.color-lime-300 { + color: #8eb901 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-lime-300, +[type=reset].button-lime-300 { + color: #1b1b1b; + border-color: #8eb901; + background-color: #8eb901; +} + +:is(a).color-lime-300 { + text-decoration-color: #8eb901 !important; +} + +.color-lime-250 { + color: #99c801 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-lime-250, +[type=reset].button-lime-250 { + color: #1b1b1b; + border-color: #99c801; + background-color: #99c801; +} + +:is(a).color-lime-250 { + text-decoration-color: #99c801 !important; +} + +.color-lime-200 { + color: #a5d601 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-lime-200, +[type=reset].button-lime-200 { + color: #1b1b1b; + border-color: #a5d601; + background-color: #a5d601; +} + +:is(a).color-lime-200 { + text-decoration-color: #a5d601 !important; +} + +.color-lime-150 { + color: #b2e51a !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-lime-150, +[type=reset].button-lime-150 { + color: #1b1b1b; + border-color: #b2e51a; + background-color: #b2e51a; +} + +:is(a).color-lime-150 { + text-decoration-color: #b2e51a !important; +} + +.color-lime-100 { + color: #c1f335 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-lime-100, +[type=reset].button-lime-100 { + color: #1b1b1b; + border-color: #c1f335; + background-color: #c1f335; +} + +:is(a).color-lime-100 { + text-decoration-color: #c1f335 !important; +} + +.color-lime-50 { + color: #defc85 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-lime-50, +[type=reset].button-lime-50 { + color: #1b1b1b; + border-color: #defc85; + background-color: #defc85; +} + +:is(a).color-lime-50 { + text-decoration-color: #defc85 !important; +} + +.color-lime-main { + color: #a5d601 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-lime-main, +[type=reset].button-lime-main { + color: #1b1b1b; + border-color: #a5d601; + background-color: #a5d601; +} + +:is(a).color-lime-main { + text-decoration-color: #a5d601 !important; +} + +.color-yellow-950 { + color: #141103 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-yellow-950, +[type=reset].button-yellow-950 { + color: #dfe3eb; + border-color: #141103; + background-color: #141103; +} + +:is(a).color-yellow-950 { + text-decoration-color: #141103 !important; +} + +.color-yellow-900 { + color: #1f1c02 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-yellow-900, +[type=reset].button-yellow-900 { + color: #dfe3eb; + border-color: #1f1c02; + background-color: #1f1c02; +} + +:is(a).color-yellow-900 { + text-decoration-color: #1f1c02 !important; +} + +.color-yellow-850 { + color: #2b2600 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-yellow-850, +[type=reset].button-yellow-850 { + color: #dfe3eb; + border-color: #2b2600; + background-color: #2b2600; +} + +:is(a).color-yellow-850 { + text-decoration-color: #2b2600 !important; +} + +.color-yellow-800 { + color: #363100 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-yellow-800, +[type=reset].button-yellow-800 { + color: #dfe3eb; + border-color: #363100; + background-color: #363100; +} + +:is(a).color-yellow-800 { + text-decoration-color: #363100 !important; +} + +.color-yellow-750 { + color: #423c00 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-yellow-750, +[type=reset].button-yellow-750 { + color: #dfe3eb; + border-color: #423c00; + background-color: #423c00; +} + +:is(a).color-yellow-750 { + text-decoration-color: #423c00 !important; +} + +.color-yellow-700 { + color: #4e4700 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-yellow-700, +[type=reset].button-yellow-700 { + color: #dfe3eb; + border-color: #4e4700; + background-color: #4e4700; +} + +:is(a).color-yellow-700 { + text-decoration-color: #4e4700 !important; +} + +.color-yellow-650 { + color: #5b5300 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-yellow-650, +[type=reset].button-yellow-650 { + color: #dfe3eb; + border-color: #5b5300; + background-color: #5b5300; +} + +:is(a).color-yellow-650 { + text-decoration-color: #5b5300 !important; +} + +.color-yellow-600 { + color: #685f00 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-yellow-600, +[type=reset].button-yellow-600 { + color: #dfe3eb; + border-color: #685f00; + background-color: #685f00; +} + +:is(a).color-yellow-600 { + text-decoration-color: #685f00 !important; +} + +.color-yellow-550 { + color: #756b00 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-yellow-550, +[type=reset].button-yellow-550 { + color: #dfe3eb; + border-color: #756b00; + background-color: #756b00; +} + +:is(a).color-yellow-550 { + text-decoration-color: #756b00 !important; +} + +.color-yellow-500, .color-yellow { + color: #827800 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-yellow-500, .button-yellow:is(button, [type=submit], [type=button], [role=button]), +[type=reset].button-yellow-500, +[type=reset].button-yellow { + color: #1b1b1b; + border-color: #827800; + background-color: #827800; +} + +:is(a).color-yellow-500, .color-yellow:is(a) { + text-decoration-color: #827800 !important; +} + +.color-yellow-450 { + color: #908501 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-yellow-450, +[type=reset].button-yellow-450 { + color: #1b1b1b; + border-color: #908501; + background-color: #908501; +} + +:is(a).color-yellow-450 { + text-decoration-color: #908501 !important; +} + +.color-yellow-400 { + color: #9e9200 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-yellow-400, +[type=reset].button-yellow-400 { + color: #1b1b1b; + border-color: #9e9200; + background-color: #9e9200; +} + +:is(a).color-yellow-400 { + text-decoration-color: #9e9200 !important; +} + +.color-yellow-350 { + color: #ad9f00 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-yellow-350, +[type=reset].button-yellow-350 { + color: #1b1b1b; + border-color: #ad9f00; + background-color: #ad9f00; +} + +:is(a).color-yellow-350 { + text-decoration-color: #ad9f00 !important; +} + +.color-yellow-300 { + color: #bbac00 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-yellow-300, +[type=reset].button-yellow-300 { + color: #1b1b1b; + border-color: #bbac00; + background-color: #bbac00; +} + +:is(a).color-yellow-300 { + text-decoration-color: #bbac00 !important; +} + +.color-yellow-250 { + color: #caba01 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-yellow-250, +[type=reset].button-yellow-250 { + color: #1b1b1b; + border-color: #caba01; + background-color: #caba01; +} + +:is(a).color-yellow-250 { + text-decoration-color: #caba01 !important; +} + +.color-yellow-200 { + color: #d9c800 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-yellow-200, +[type=reset].button-yellow-200 { + color: #1b1b1b; + border-color: #d9c800; + background-color: #d9c800; +} + +:is(a).color-yellow-200 { + text-decoration-color: #d9c800 !important; +} + +.color-yellow-150 { + color: #e8d600 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-yellow-150, +[type=reset].button-yellow-150 { + color: #1b1b1b; + border-color: #e8d600; + background-color: #e8d600; +} + +:is(a).color-yellow-150 { + text-decoration-color: #e8d600 !important; +} + +.color-yellow-100 { + color: #f2df0d !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-yellow-100, +[type=reset].button-yellow-100 { + color: #1b1b1b; + border-color: #f2df0d; + background-color: #f2df0d; +} + +:is(a).color-yellow-100 { + text-decoration-color: #f2df0d !important; +} + +.color-yellow-50 { + color: #fdf1b4 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-yellow-50, +[type=reset].button-yellow-50 { + color: #1b1b1b; + border-color: #fdf1b4; + background-color: #fdf1b4; +} + +:is(a).color-yellow-50 { + text-decoration-color: #fdf1b4 !important; +} + +.color-yellow-main { + color: #f2df0d !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-yellow-main, +[type=reset].button-yellow-main { + color: #1b1b1b; + border-color: #f2df0d; + background-color: #f2df0d; +} + +:is(a).color-yellow-main { + text-decoration-color: #f2df0d !important; +} + +.color-amber-950 { + color: #161003 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-amber-950, +[type=reset].button-amber-950 { + color: #dfe3eb; + border-color: #161003; + background-color: #161003; +} + +:is(a).color-amber-950 { + text-decoration-color: #161003 !important; +} + +.color-amber-900 { + color: #231a03 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-amber-900, +[type=reset].button-amber-900 { + color: #dfe3eb; + border-color: #231a03; + background-color: #231a03; +} + +:is(a).color-amber-900 { + text-decoration-color: #231a03 !important; +} + +.color-amber-850 { + color: #312302 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-amber-850, +[type=reset].button-amber-850 { + color: #dfe3eb; + border-color: #312302; + background-color: #312302; +} + +:is(a).color-amber-850 { + text-decoration-color: #312302 !important; +} + +.color-amber-800 { + color: #3f2d00 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-amber-800, +[type=reset].button-amber-800 { + color: #dfe3eb; + border-color: #3f2d00; + background-color: #3f2d00; +} + +:is(a).color-amber-800 { + text-decoration-color: #3f2d00 !important; +} + +.color-amber-750 { + color: #4d3700 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-amber-750, +[type=reset].button-amber-750 { + color: #dfe3eb; + border-color: #4d3700; + background-color: #4d3700; +} + +:is(a).color-amber-750 { + text-decoration-color: #4d3700 !important; +} + +.color-amber-700 { + color: #5b4200 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-amber-700, +[type=reset].button-amber-700 { + color: #dfe3eb; + border-color: #5b4200; + background-color: #5b4200; +} + +:is(a).color-amber-700 { + text-decoration-color: #5b4200 !important; +} + +.color-amber-650 { + color: #694d00 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-amber-650, +[type=reset].button-amber-650 { + color: #dfe3eb; + border-color: #694d00; + background-color: #694d00; +} + +:is(a).color-amber-650 { + text-decoration-color: #694d00 !important; +} + +.color-amber-600 { + color: #785800 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-amber-600, +[type=reset].button-amber-600 { + color: #dfe3eb; + border-color: #785800; + background-color: #785800; +} + +:is(a).color-amber-600 { + text-decoration-color: #785800 !important; +} + +.color-amber-550 { + color: #876400 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-amber-550, +[type=reset].button-amber-550 { + color: #dfe3eb; + border-color: #876400; + background-color: #876400; +} + +:is(a).color-amber-550 { + text-decoration-color: #876400 !important; +} + +.color-amber-500, .color-amber { + color: #977000 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-amber-500, .button-amber:is(button, [type=submit], [type=button], [role=button]), +[type=reset].button-amber-500, +[type=reset].button-amber { + color: #dfe3eb; + border-color: #977000; + background-color: #977000; +} + +:is(a).color-amber-500, .color-amber:is(a) { + text-decoration-color: #977000 !important; +} + +.color-amber-450 { + color: #a77c00 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-amber-450, +[type=reset].button-amber-450 { + color: #1b1b1b; + border-color: #a77c00; + background-color: #a77c00; +} + +:is(a).color-amber-450 { + text-decoration-color: #a77c00 !important; +} + +.color-amber-400 { + color: #b78800 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-amber-400, +[type=reset].button-amber-400 { + color: #1b1b1b; + border-color: #b78800; + background-color: #b78800; +} + +:is(a).color-amber-400 { + text-decoration-color: #b78800 !important; +} + +.color-amber-350 { + color: #c79400 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-amber-350, +[type=reset].button-amber-350 { + color: #1b1b1b; + border-color: #c79400; + background-color: #c79400; +} + +:is(a).color-amber-350 { + text-decoration-color: #c79400 !important; +} + +.color-amber-300 { + color: #d8a100 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-amber-300, +[type=reset].button-amber-300 { + color: #1b1b1b; + border-color: #d8a100; + background-color: #d8a100; +} + +:is(a).color-amber-300 { + text-decoration-color: #d8a100 !important; +} + +.color-amber-250 { + color: #e8ae01 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-amber-250, +[type=reset].button-amber-250 { + color: #1b1b1b; + border-color: #e8ae01; + background-color: #e8ae01; +} + +:is(a).color-amber-250 { + text-decoration-color: #e8ae01 !important; +} + +.color-amber-200 { + color: #ffbf00 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-amber-200, +[type=reset].button-amber-200 { + color: #1b1b1b; + border-color: #ffbf00; + background-color: #ffbf00; +} + +:is(a).color-amber-200 { + text-decoration-color: #ffbf00 !important; +} + +.color-amber-150 { + color: #fecc63 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-amber-150, +[type=reset].button-amber-150 { + color: #1b1b1b; + border-color: #fecc63; + background-color: #fecc63; +} + +:is(a).color-amber-150 { + text-decoration-color: #fecc63 !important; +} + +.color-amber-100 { + color: #fddea6 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-amber-100, +[type=reset].button-amber-100 { + color: #1b1b1b; + border-color: #fddea6; + background-color: #fddea6; +} + +:is(a).color-amber-100 { + text-decoration-color: #fddea6 !important; +} + +.color-amber-50 { + color: #fcefd9 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-amber-50, +[type=reset].button-amber-50 { + color: #1b1b1b; + border-color: #fcefd9; + background-color: #fcefd9; +} + +:is(a).color-amber-50 { + text-decoration-color: #fcefd9 !important; +} + +.color-amber-main { + color: #ffbf00 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-amber-main, +[type=reset].button-amber-main { + color: #1b1b1b; + border-color: #ffbf00; + background-color: #ffbf00; +} + +:is(a).color-amber-main { + text-decoration-color: #ffbf00 !important; +} + +.color-pumpkin-950 { + color: #180f04 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pumpkin-950, +[type=reset].button-pumpkin-950 { + color: #dfe3eb; + border-color: #180f04; + background-color: #180f04; +} + +:is(a).color-pumpkin-950 { + text-decoration-color: #180f04 !important; +} + +.color-pumpkin-900 { + color: #271805 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pumpkin-900, +[type=reset].button-pumpkin-900 { + color: #dfe3eb; + border-color: #271805; + background-color: #271805; +} + +:is(a).color-pumpkin-900 { + text-decoration-color: #271805 !important; +} + +.color-pumpkin-850 { + color: #372004 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pumpkin-850, +[type=reset].button-pumpkin-850 { + color: #dfe3eb; + border-color: #372004; + background-color: #372004; +} + +:is(a).color-pumpkin-850 { + text-decoration-color: #372004 !important; +} + +.color-pumpkin-800 { + color: #482802 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pumpkin-800, +[type=reset].button-pumpkin-800 { + color: #dfe3eb; + border-color: #482802; + background-color: #482802; +} + +:is(a).color-pumpkin-800 { + text-decoration-color: #482802 !important; +} + +.color-pumpkin-750 { + color: #593100 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pumpkin-750, +[type=reset].button-pumpkin-750 { + color: #dfe3eb; + border-color: #593100; + background-color: #593100; +} + +:is(a).color-pumpkin-750 { + text-decoration-color: #593100 !important; +} + +.color-pumpkin-700 { + color: #693a00 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pumpkin-700, +[type=reset].button-pumpkin-700 { + color: #dfe3eb; + border-color: #693a00; + background-color: #693a00; +} + +:is(a).color-pumpkin-700 { + text-decoration-color: #693a00 !important; +} + +.color-pumpkin-650 { + color: #7a4400 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pumpkin-650, +[type=reset].button-pumpkin-650 { + color: #dfe3eb; + border-color: #7a4400; + background-color: #7a4400; +} + +:is(a).color-pumpkin-650 { + text-decoration-color: #7a4400 !important; +} + +.color-pumpkin-600 { + color: #8b4f00 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pumpkin-600, +[type=reset].button-pumpkin-600 { + color: #dfe3eb; + border-color: #8b4f00; + background-color: #8b4f00; +} + +:is(a).color-pumpkin-600 { + text-decoration-color: #8b4f00 !important; +} + +.color-pumpkin-550 { + color: #9c5900 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pumpkin-550, +[type=reset].button-pumpkin-550 { + color: #dfe3eb; + border-color: #9c5900; + background-color: #9c5900; +} + +:is(a).color-pumpkin-550 { + text-decoration-color: #9c5900 !important; +} + +.color-pumpkin-500, .color-pumpkin { + color: #ad6400 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pumpkin-500, .button-pumpkin:is(button, [type=submit], [type=button], [role=button]), +[type=reset].button-pumpkin-500, +[type=reset].button-pumpkin { + color: #dfe3eb; + border-color: #ad6400; + background-color: #ad6400; +} + +:is(a).color-pumpkin-500, .color-pumpkin:is(a) { + text-decoration-color: #ad6400 !important; +} + +.color-pumpkin-450 { + color: #bf6e00 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pumpkin-450, +[type=reset].button-pumpkin-450 { + color: #1b1b1b; + border-color: #bf6e00; + background-color: #bf6e00; +} + +:is(a).color-pumpkin-450 { + text-decoration-color: #bf6e00 !important; +} + +.color-pumpkin-400 { + color: #d27a01 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pumpkin-400, +[type=reset].button-pumpkin-400 { + color: #1b1b1b; + border-color: #d27a01; + background-color: #d27a01; +} + +:is(a).color-pumpkin-400 { + text-decoration-color: #d27a01 !important; +} + +.color-pumpkin-350 { + color: #e48500 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pumpkin-350, +[type=reset].button-pumpkin-350 { + color: #1b1b1b; + border-color: #e48500; + background-color: #e48500; +} + +:is(a).color-pumpkin-350 { + text-decoration-color: #e48500 !important; +} + +.color-pumpkin-300 { + color: #ff9500 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pumpkin-300, +[type=reset].button-pumpkin-300 { + color: #1b1b1b; + border-color: #ff9500; + background-color: #ff9500; +} + +:is(a).color-pumpkin-300 { + text-decoration-color: #ff9500 !important; +} + +.color-pumpkin-250 { + color: #ffa23a !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pumpkin-250, +[type=reset].button-pumpkin-250 { + color: #1b1b1b; + border-color: #ffa23a; + background-color: #ffa23a; +} + +:is(a).color-pumpkin-250 { + text-decoration-color: #ffa23a !important; +} + +.color-pumpkin-200 { + color: #feb670 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pumpkin-200, +[type=reset].button-pumpkin-200 { + color: #1b1b1b; + border-color: #feb670; + background-color: #feb670; +} + +:is(a).color-pumpkin-200 { + text-decoration-color: #feb670 !important; +} + +.color-pumpkin-150 { + color: #fcca9b !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pumpkin-150, +[type=reset].button-pumpkin-150 { + color: #1b1b1b; + border-color: #fcca9b; + background-color: #fcca9b; +} + +:is(a).color-pumpkin-150 { + text-decoration-color: #fcca9b !important; +} + +.color-pumpkin-100 { + color: #fcdcc1 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pumpkin-100, +[type=reset].button-pumpkin-100 { + color: #1b1b1b; + border-color: #fcdcc1; + background-color: #fcdcc1; +} + +:is(a).color-pumpkin-100 { + text-decoration-color: #fcdcc1 !important; +} + +.color-pumpkin-50 { + color: #fceee3 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pumpkin-50, +[type=reset].button-pumpkin-50 { + color: #1b1b1b; + border-color: #fceee3; + background-color: #fceee3; +} + +:is(a).color-pumpkin-50 { + text-decoration-color: #fceee3 !important; +} + +.color-pumpkin-main { + color: #ff9500 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-pumpkin-main, +[type=reset].button-pumpkin-main { + color: #1b1b1b; + border-color: #ff9500; + background-color: #ff9500; +} + +:is(a).color-pumpkin-main { + text-decoration-color: #ff9500 !important; +} + +.color-orange-950 { + color: #1b0d06 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-orange-950, +[type=reset].button-orange-950 { + color: #dfe3eb; + border-color: #1b0d06; + background-color: #1b0d06; +} + +:is(a).color-orange-950 { + text-decoration-color: #1b0d06 !important; +} + +.color-orange-900 { + color: #2d1509 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-orange-900, +[type=reset].button-orange-900 { + color: #dfe3eb; + border-color: #2d1509; + background-color: #2d1509; +} + +:is(a).color-orange-900 { + text-decoration-color: #2d1509 !important; +} + +.color-orange-850 { + color: #411a0a !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-orange-850, +[type=reset].button-orange-850 { + color: #dfe3eb; + border-color: #411a0a; + background-color: #411a0a; +} + +:is(a).color-orange-850 { + text-decoration-color: #411a0a !important; +} + +.color-orange-800 { + color: #561e0a !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-orange-800, +[type=reset].button-orange-800 { + color: #dfe3eb; + border-color: #561e0a; + background-color: #561e0a; +} + +:is(a).color-orange-800 { + text-decoration-color: #561e0a !important; +} + +.color-orange-750 { + color: #6b220a !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-orange-750, +[type=reset].button-orange-750 { + color: #dfe3eb; + border-color: #6b220a; + background-color: #6b220a; +} + +:is(a).color-orange-750 { + text-decoration-color: #6b220a !important; +} + +.color-orange-700 { + color: #7f270b !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-orange-700, +[type=reset].button-orange-700 { + color: #dfe3eb; + border-color: #7f270b; + background-color: #7f270b; +} + +:is(a).color-orange-700 { + text-decoration-color: #7f270b !important; +} + +.color-orange-650 { + color: #942d0d !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-orange-650, +[type=reset].button-orange-650 { + color: #dfe3eb; + border-color: #942d0d; + background-color: #942d0d; +} + +:is(a).color-orange-650 { + text-decoration-color: #942d0d !important; +} + +.color-orange-600 { + color: #a83410 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-orange-600, +[type=reset].button-orange-600 { + color: #dfe3eb; + border-color: #a83410; + background-color: #a83410; +} + +:is(a).color-orange-600 { + text-decoration-color: #a83410 !important; +} + +.color-orange-550 { + color: #bd3c13 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-orange-550, +[type=reset].button-orange-550 { + color: #dfe3eb; + border-color: #bd3c13; + background-color: #bd3c13; +} + +:is(a).color-orange-550 { + text-decoration-color: #bd3c13 !important; +} + +.color-orange-500, .color-orange { + color: #d24317 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-orange-500, .button-orange:is(button, [type=submit], [type=button], [role=button]), +[type=reset].button-orange-500, +[type=reset].button-orange { + color: #dfe3eb; + border-color: #d24317; + background-color: #d24317; +} + +:is(a).color-orange-500, .color-orange:is(a) { + text-decoration-color: #d24317 !important; +} + +.color-orange-450 { + color: #e74b1a !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-orange-450, +[type=reset].button-orange-450 { + color: #dfe3eb; + border-color: #e74b1a; + background-color: #e74b1a; +} + +:is(a).color-orange-450 { + text-decoration-color: #e74b1a !important; +} + +.color-orange-400 { + color: #f45d2c !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-orange-400, +[type=reset].button-orange-400 { + color: #1b1b1b; + border-color: #f45d2c; + background-color: #f45d2c; +} + +:is(a).color-orange-400 { + text-decoration-color: #f45d2c !important; +} + +.color-orange-350 { + color: #f56b3d !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-orange-350, +[type=reset].button-orange-350 { + color: #1b1b1b; + border-color: #f56b3d; + background-color: #f56b3d; +} + +:is(a).color-orange-350 { + text-decoration-color: #f56b3d !important; +} + +.color-orange-300 { + color: #f68e68 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-orange-300, +[type=reset].button-orange-300 { + color: #1b1b1b; + border-color: #f68e68; + background-color: #f68e68; +} + +:is(a).color-orange-300 { + text-decoration-color: #f68e68 !important; +} + +.color-orange-250 { + color: #f8a283 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-orange-250, +[type=reset].button-orange-250 { + color: #1b1b1b; + border-color: #f8a283; + background-color: #f8a283; +} + +:is(a).color-orange-250 { + text-decoration-color: #f8a283 !important; +} + +.color-orange-200 { + color: #f8b79f !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-orange-200, +[type=reset].button-orange-200 { + color: #1b1b1b; + border-color: #f8b79f; + background-color: #f8b79f; +} + +:is(a).color-orange-200 { + text-decoration-color: #f8b79f !important; +} + +.color-orange-150 { + color: #f8cab9 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-orange-150, +[type=reset].button-orange-150 { + color: #1b1b1b; + border-color: #f8cab9; + background-color: #f8cab9; +} + +:is(a).color-orange-150 { + text-decoration-color: #f8cab9 !important; +} + +.color-orange-100 { + color: #f9dcd2 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-orange-100, +[type=reset].button-orange-100 { + color: #1b1b1b; + border-color: #f9dcd2; + background-color: #f9dcd2; +} + +:is(a).color-orange-100 { + text-decoration-color: #f9dcd2 !important; +} + +.color-orange-50 { + color: #faeeea !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-orange-50, +[type=reset].button-orange-50 { + color: #1b1b1b; + border-color: #faeeea; + background-color: #faeeea; +} + +:is(a).color-orange-50 { + text-decoration-color: #faeeea !important; +} + +.color-orange-main { + color: #d24317 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-orange-main, +[type=reset].button-orange-main { + color: #dfe3eb; + border-color: #d24317; + background-color: #d24317; +} + +:is(a).color-orange-main { + text-decoration-color: #d24317 !important; +} + +.color-sand-950 { + color: #111110 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-sand-950, +[type=reset].button-sand-950 { + color: #dfe3eb; + border-color: #111110; + background-color: #111110; +} + +:is(a).color-sand-950 { + text-decoration-color: #111110 !important; +} + +.color-sand-900 { + color: #1c1b19 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-sand-900, +[type=reset].button-sand-900 { + color: #dfe3eb; + border-color: #1c1b19; + background-color: #1c1b19; +} + +:is(a).color-sand-900 { + text-decoration-color: #1c1b19 !important; +} + +.color-sand-850 { + color: #272622 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-sand-850, +[type=reset].button-sand-850 { + color: #dfe3eb; + border-color: #272622; + background-color: #272622; +} + +:is(a).color-sand-850 { + text-decoration-color: #272622 !important; +} + +.color-sand-800 { + color: #32302b !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-sand-800, +[type=reset].button-sand-800 { + color: #dfe3eb; + border-color: #32302b; + background-color: #32302b; +} + +:is(a).color-sand-800 { + text-decoration-color: #32302b !important; +} + +.color-sand-750 { + color: #3d3b35 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-sand-750, +[type=reset].button-sand-750 { + color: #dfe3eb; + border-color: #3d3b35; + background-color: #3d3b35; +} + +:is(a).color-sand-750 { + text-decoration-color: #3d3b35 !important; +} + +.color-sand-700 { + color: #49463f !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-sand-700, +[type=reset].button-sand-700 { + color: #dfe3eb; + border-color: #49463f; + background-color: #49463f; +} + +:is(a).color-sand-700 { + text-decoration-color: #49463f !important; +} + +.color-sand-650 { + color: #55524a !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-sand-650, +[type=reset].button-sand-650 { + color: #dfe3eb; + border-color: #55524a; + background-color: #55524a; +} + +:is(a).color-sand-650 { + text-decoration-color: #55524a !important; +} + +.color-sand-600 { + color: #615e55 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-sand-600, +[type=reset].button-sand-600 { + color: #dfe3eb; + border-color: #615e55; + background-color: #615e55; +} + +:is(a).color-sand-600 { + text-decoration-color: #615e55 !important; +} + +.color-sand-550 { + color: #6e6a60 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-sand-550, +[type=reset].button-sand-550 { + color: #dfe3eb; + border-color: #6e6a60; + background-color: #6e6a60; +} + +:is(a).color-sand-550 { + text-decoration-color: #6e6a60 !important; +} + +.color-sand-500, .color-sand { + color: #7b776b !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-sand-500, .button-sand:is(button, [type=submit], [type=button], [role=button]), +[type=reset].button-sand-500, +[type=reset].button-sand { + color: #1b1b1b; + border-color: #7b776b; + background-color: #7b776b; +} + +:is(a).color-sand-500, .color-sand:is(a) { + text-decoration-color: #7b776b !important; +} + +.color-sand-450 { + color: #888377 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-sand-450, +[type=reset].button-sand-450 { + color: #1b1b1b; + border-color: #888377; + background-color: #888377; +} + +:is(a).color-sand-450 { + text-decoration-color: #888377 !important; +} + +.color-sand-400 { + color: #959082 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-sand-400, +[type=reset].button-sand-400 { + color: #1b1b1b; + border-color: #959082; + background-color: #959082; +} + +:is(a).color-sand-400 { + text-decoration-color: #959082 !important; +} + +.color-sand-350 { + color: #a39e8f !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-sand-350, +[type=reset].button-sand-350 { + color: #1b1b1b; + border-color: #a39e8f; + background-color: #a39e8f; +} + +:is(a).color-sand-350 { + text-decoration-color: #a39e8f !important; +} + +.color-sand-300 { + color: #b0ab9b !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-sand-300, +[type=reset].button-sand-300 { + color: #1b1b1b; + border-color: #b0ab9b; + background-color: #b0ab9b; +} + +:is(a).color-sand-300 { + text-decoration-color: #b0ab9b !important; +} + +.color-sand-250 { + color: #beb8a7 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-sand-250, +[type=reset].button-sand-250 { + color: #1b1b1b; + border-color: #beb8a7; + background-color: #beb8a7; +} + +:is(a).color-sand-250 { + text-decoration-color: #beb8a7 !important; +} + +.color-sand-200 { + color: #ccc6b4 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-sand-200, +[type=reset].button-sand-200 { + color: #1b1b1b; + border-color: #ccc6b4; + background-color: #ccc6b4; +} + +:is(a).color-sand-200 { + text-decoration-color: #ccc6b4 !important; +} + +.color-sand-150 { + color: #dad4c2 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-sand-150, +[type=reset].button-sand-150 { + color: #1b1b1b; + border-color: #dad4c2; + background-color: #dad4c2; +} + +:is(a).color-sand-150 { + text-decoration-color: #dad4c2 !important; +} + +.color-sand-100 { + color: #e8e2d2 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-sand-100, +[type=reset].button-sand-100 { + color: #1b1b1b; + border-color: #e8e2d2; + background-color: #e8e2d2; +} + +:is(a).color-sand-100 { + text-decoration-color: #e8e2d2 !important; +} + +.color-sand-50 { + color: #f2f0ec !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-sand-50, +[type=reset].button-sand-50 { + color: #1b1b1b; + border-color: #f2f0ec; + background-color: #f2f0ec; +} + +:is(a).color-sand-50 { + text-decoration-color: #f2f0ec !important; +} + +.color-sand-main { + color: #ccc6b4 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-sand-main, +[type=reset].button-sand-main { + color: #1b1b1b; + border-color: #ccc6b4; + background-color: #ccc6b4; +} + +:is(a).color-sand-main { + text-decoration-color: #ccc6b4 !important; +} + +.color-grey-950 { + color: #111111 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-grey-950, +[type=reset].button-grey-950 { + color: #dfe3eb; + border-color: #111111; + background-color: #111111; +} + +:is(a).color-grey-950 { + text-decoration-color: #111111 !important; +} + +.color-grey-900 { + color: #1b1b1b !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-grey-900, +[type=reset].button-grey-900 { + color: #dfe3eb; + border-color: #1b1b1b; + background-color: #1b1b1b; +} + +:is(a).color-grey-900 { + text-decoration-color: #1b1b1b !important; +} + +.color-grey-850 { + color: #262626 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-grey-850, +[type=reset].button-grey-850 { + color: #dfe3eb; + border-color: #262626; + background-color: #262626; +} + +:is(a).color-grey-850 { + text-decoration-color: #262626 !important; +} + +.color-grey-800 { + color: #303030 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-grey-800, +[type=reset].button-grey-800 { + color: #dfe3eb; + border-color: #303030; + background-color: #303030; +} + +:is(a).color-grey-800 { + text-decoration-color: #303030 !important; +} + +.color-grey-750 { + color: #3b3b3b !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-grey-750, +[type=reset].button-grey-750 { + color: #dfe3eb; + border-color: #3b3b3b; + background-color: #3b3b3b; +} + +:is(a).color-grey-750 { + text-decoration-color: #3b3b3b !important; +} + +.color-grey-700 { + color: #474747 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-grey-700, +[type=reset].button-grey-700 { + color: #dfe3eb; + border-color: #474747; + background-color: #474747; +} + +:is(a).color-grey-700 { + text-decoration-color: #474747 !important; +} + +.color-grey-650 { + color: #525252 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-grey-650, +[type=reset].button-grey-650 { + color: #dfe3eb; + border-color: #525252; + background-color: #525252; +} + +:is(a).color-grey-650 { + text-decoration-color: #525252 !important; +} + +.color-grey-600 { + color: #5e5e5e !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-grey-600, +[type=reset].button-grey-600 { + color: #dfe3eb; + border-color: #5e5e5e; + background-color: #5e5e5e; +} + +:is(a).color-grey-600 { + text-decoration-color: #5e5e5e !important; +} + +.color-grey-550 { + color: #6a6a6a !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-grey-550, +[type=reset].button-grey-550 { + color: #dfe3eb; + border-color: #6a6a6a; + background-color: #6a6a6a; +} + +:is(a).color-grey-550 { + text-decoration-color: #6a6a6a !important; +} + +.color-grey-500, .color-grey { + color: #777777 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-grey-500, .button-grey:is(button, [type=submit], [type=button], [role=button]), +[type=reset].button-grey-500, +[type=reset].button-grey { + color: #1b1b1b; + border-color: #777777; + background-color: #777777; +} + +:is(a).color-grey-500, .color-grey:is(a) { + text-decoration-color: #777777 !important; +} + +.color-grey-450 { + color: #808080 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-grey-450, +[type=reset].button-grey-450 { + color: #1b1b1b; + border-color: #808080; + background-color: #808080; +} + +:is(a).color-grey-450 { + text-decoration-color: #808080 !important; +} + +.color-grey-400 { + color: #919191 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-grey-400, +[type=reset].button-grey-400 { + color: #1b1b1b; + border-color: #919191; + background-color: #919191; +} + +:is(a).color-grey-400 { + text-decoration-color: #919191 !important; +} + +.color-grey-350 { + color: #9e9e9e !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-grey-350, +[type=reset].button-grey-350 { + color: #1b1b1b; + border-color: #9e9e9e; + background-color: #9e9e9e; +} + +:is(a).color-grey-350 { + text-decoration-color: #9e9e9e !important; +} + +.color-grey-300 { + color: #ababab !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-grey-300, +[type=reset].button-grey-300 { + color: #1b1b1b; + border-color: #ababab; + background-color: #ababab; +} + +:is(a).color-grey-300 { + text-decoration-color: #ababab !important; +} + +.color-grey-250 { + color: #b9b9b9 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-grey-250, +[type=reset].button-grey-250 { + color: #1b1b1b; + border-color: #b9b9b9; + background-color: #b9b9b9; +} + +:is(a).color-grey-250 { + text-decoration-color: #b9b9b9 !important; +} + +.color-grey-200 { + color: #c6c6c6 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-grey-200, +[type=reset].button-grey-200 { + color: #1b1b1b; + border-color: #c6c6c6; + background-color: #c6c6c6; +} + +:is(a).color-grey-200 { + text-decoration-color: #c6c6c6 !important; +} + +.color-grey-150 { + color: #d4d4d4 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-grey-150, +[type=reset].button-grey-150 { + color: #1b1b1b; + border-color: #d4d4d4; + background-color: #d4d4d4; +} + +:is(a).color-grey-150 { + text-decoration-color: #d4d4d4 !important; +} + +.color-grey-100 { + color: #e2e2e2 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-grey-100, +[type=reset].button-grey-100 { + color: #1b1b1b; + border-color: #e2e2e2; + background-color: #e2e2e2; +} + +:is(a).color-grey-100 { + text-decoration-color: #e2e2e2 !important; +} + +.color-grey-50 { + color: #f1f1f1 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-grey-50, +[type=reset].button-grey-50 { + color: #1b1b1b; + border-color: #f1f1f1; + background-color: #f1f1f1; +} + +:is(a).color-grey-50 { + text-decoration-color: #f1f1f1 !important; +} + +.color-grey-main { + color: #ababab !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-grey-main, +[type=reset].button-grey-main { + color: #1b1b1b; + border-color: #ababab; + background-color: #ababab; +} + +:is(a).color-grey-main { + text-decoration-color: #ababab !important; +} + +.color-zinc-950 { + color: #0f1114 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-zinc-950, +[type=reset].button-zinc-950 { + color: #dfe3eb; + border-color: #0f1114; + background-color: #0f1114; +} + +:is(a).color-zinc-950 { + text-decoration-color: #0f1114 !important; +} + +.color-zinc-900 { + color: #191c20 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-zinc-900, +[type=reset].button-zinc-900 { + color: #dfe3eb; + border-color: #191c20; + background-color: #191c20; +} + +:is(a).color-zinc-900 { + text-decoration-color: #191c20 !important; +} + +.color-zinc-850 { + color: #23262c !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-zinc-850, +[type=reset].button-zinc-850 { + color: #dfe3eb; + border-color: #23262c; + background-color: #23262c; +} + +:is(a).color-zinc-850 { + text-decoration-color: #23262c !important; +} + +.color-zinc-800 { + color: #2d3138 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-zinc-800, +[type=reset].button-zinc-800 { + color: #dfe3eb; + border-color: #2d3138; + background-color: #2d3138; +} + +:is(a).color-zinc-800 { + text-decoration-color: #2d3138 !important; +} + +.color-zinc-750 { + color: #373c44 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-zinc-750, +[type=reset].button-zinc-750 { + color: #dfe3eb; + border-color: #373c44; + background-color: #373c44; +} + +:is(a).color-zinc-750 { + text-decoration-color: #373c44 !important; +} + +.color-zinc-700 { + color: #424751 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-zinc-700, +[type=reset].button-zinc-700 { + color: #dfe3eb; + border-color: #424751; + background-color: #424751; +} + +:is(a).color-zinc-700 { + text-decoration-color: #424751 !important; +} + +.color-zinc-650 { + color: #4d535e !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-zinc-650, +[type=reset].button-zinc-650 { + color: #dfe3eb; + border-color: #4d535e; + background-color: #4d535e; +} + +:is(a).color-zinc-650 { + text-decoration-color: #4d535e !important; +} + +.color-zinc-600 { + color: #5c6370 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-zinc-600, +[type=reset].button-zinc-600 { + color: #dfe3eb; + border-color: #5c6370; + background-color: #5c6370; +} + +:is(a).color-zinc-600 { + text-decoration-color: #5c6370 !important; +} + +.color-zinc-550 { + color: #646b79 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-zinc-550, +[type=reset].button-zinc-550 { + color: #dfe3eb; + border-color: #646b79; + background-color: #646b79; +} + +:is(a).color-zinc-550 { + text-decoration-color: #646b79 !important; +} + +.color-zinc-500, .color-zinc { + color: #6f7887 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-zinc-500, .button-zinc:is(button, [type=submit], [type=button], [role=button]), +[type=reset].button-zinc-500, +[type=reset].button-zinc { + color: #1b1b1b; + border-color: #6f7887; + background-color: #6f7887; +} + +:is(a).color-zinc-500, .color-zinc:is(a) { + text-decoration-color: #6f7887 !important; +} + +.color-zinc-450 { + color: #7b8495 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-zinc-450, +[type=reset].button-zinc-450 { + color: #1b1b1b; + border-color: #7b8495; + background-color: #7b8495; +} + +:is(a).color-zinc-450 { + text-decoration-color: #7b8495 !important; +} + +.color-zinc-400 { + color: #8891a4 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-zinc-400, +[type=reset].button-zinc-400 { + color: #1b1b1b; + border-color: #8891a4; + background-color: #8891a4; +} + +:is(a).color-zinc-400 { + text-decoration-color: #8891a4 !important; +} + +.color-zinc-350 { + color: #969eaf !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-zinc-350, +[type=reset].button-zinc-350 { + color: #1b1b1b; + border-color: #969eaf; + background-color: #969eaf; +} + +:is(a).color-zinc-350 { + text-decoration-color: #969eaf !important; +} + +.color-zinc-300 { + color: #a4acba !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-zinc-300, +[type=reset].button-zinc-300 { + color: #1b1b1b; + border-color: #a4acba; + background-color: #a4acba; +} + +:is(a).color-zinc-300 { + text-decoration-color: #a4acba !important; +} + +.color-zinc-250 { + color: #b3b9c5 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-zinc-250, +[type=reset].button-zinc-250 { + color: #1b1b1b; + border-color: #b3b9c5; + background-color: #b3b9c5; +} + +:is(a).color-zinc-250 { + text-decoration-color: #b3b9c5 !important; +} + +.color-zinc-200 { + color: #c2c7d0 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-zinc-200, +[type=reset].button-zinc-200 { + color: #1b1b1b; + border-color: #c2c7d0; + background-color: #c2c7d0; +} + +:is(a).color-zinc-200 { + text-decoration-color: #c2c7d0 !important; +} + +.color-zinc-150 { + color: #d1d5db !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-zinc-150, +[type=reset].button-zinc-150 { + color: #1b1b1b; + border-color: #d1d5db; + background-color: #d1d5db; +} + +:is(a).color-zinc-150 { + text-decoration-color: #d1d5db !important; +} + +.color-zinc-100 { + color: #e0e3e7 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-zinc-100, +[type=reset].button-zinc-100 { + color: #1b1b1b; + border-color: #e0e3e7; + background-color: #e0e3e7; +} + +:is(a).color-zinc-100 { + text-decoration-color: #e0e3e7 !important; +} + +.color-zinc-50 { + color: #f0f1f3 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-zinc-50, +[type=reset].button-zinc-50 { + color: #1b1b1b; + border-color: #f0f1f3; + background-color: #f0f1f3; +} + +:is(a).color-zinc-50 { + text-decoration-color: #f0f1f3 !important; +} + +.color-zinc-main { + color: #646b79 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-zinc-main, +[type=reset].button-zinc-main { + color: #dfe3eb; + border-color: #646b79; + background-color: #646b79; +} + +:is(a).color-zinc-main { + text-decoration-color: #646b79 !important; +} + +.color-slate-950 { + color: #0e1118 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-slate-950, +[type=reset].button-slate-950 { + color: #dfe3eb; + border-color: #0e1118; + background-color: #0e1118; +} + +:is(a).color-slate-950 { + text-decoration-color: #0e1118 !important; +} + +.color-slate-900 { + color: #181c25 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-slate-900, +[type=reset].button-slate-900 { + color: #dfe3eb; + border-color: #181c25; + background-color: #181c25; +} + +:is(a).color-slate-900 { + text-decoration-color: #181c25 !important; +} + +.color-slate-850 { + color: #202632 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-slate-850, +[type=reset].button-slate-850 { + color: #dfe3eb; + border-color: #202632; + background-color: #202632; +} + +:is(a).color-slate-850 { + text-decoration-color: #202632 !important; +} + +.color-slate-800 { + color: #2a3140 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-slate-800, +[type=reset].button-slate-800 { + color: #dfe3eb; + border-color: #2a3140; + background-color: #2a3140; +} + +:is(a).color-slate-800 { + text-decoration-color: #2a3140 !important; +} + +.color-slate-750 { + color: #333c4e !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-slate-750, +[type=reset].button-slate-750 { + color: #dfe3eb; + border-color: #333c4e; + background-color: #333c4e; +} + +:is(a).color-slate-750 { + text-decoration-color: #333c4e !important; +} + +.color-slate-700 { + color: #3d475c !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-slate-700, +[type=reset].button-slate-700 { + color: #dfe3eb; + border-color: #3d475c; + background-color: #3d475c; +} + +:is(a).color-slate-700 { + text-decoration-color: #3d475c !important; +} + +.color-slate-650 { + color: #48536b !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-slate-650, +[type=reset].button-slate-650 { + color: #dfe3eb; + border-color: #48536b; + background-color: #48536b; +} + +:is(a).color-slate-650 { + text-decoration-color: #48536b !important; +} + +.color-slate-600 { + color: #525f7a !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-slate-600, +[type=reset].button-slate-600 { + color: #dfe3eb; + border-color: #525f7a; + background-color: #525f7a; +} + +:is(a).color-slate-600 { + text-decoration-color: #525f7a !important; +} + +.color-slate-550 { + color: #5d6b89 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-slate-550, +[type=reset].button-slate-550 { + color: #dfe3eb; + border-color: #5d6b89; + background-color: #5d6b89; +} + +:is(a).color-slate-550 { + text-decoration-color: #5d6b89 !important; +} + +.color-slate-500, .color-slate { + color: #687899 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-slate-500, .button-slate:is(button, [type=submit], [type=button], [role=button]), +[type=reset].button-slate-500, +[type=reset].button-slate { + color: #1b1b1b; + border-color: #687899; + background-color: #687899; +} + +:is(a).color-slate-500, .color-slate:is(a) { + text-decoration-color: #687899 !important; +} + +.color-slate-450 { + color: #7385a9 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-slate-450, +[type=reset].button-slate-450 { + color: #1b1b1b; + border-color: #7385a9; + background-color: #7385a9; +} + +:is(a).color-slate-450 { + text-decoration-color: #7385a9 !important; +} + +.color-slate-400 { + color: #8191b5 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-slate-400, +[type=reset].button-slate-400 { + color: #1b1b1b; + border-color: #8191b5; + background-color: #8191b5; +} + +:is(a).color-slate-400 { + text-decoration-color: #8191b5 !important; +} + +.color-slate-350 { + color: #909ebe !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-slate-350, +[type=reset].button-slate-350 { + color: #1b1b1b; + border-color: #909ebe; + background-color: #909ebe; +} + +:is(a).color-slate-350 { + text-decoration-color: #909ebe !important; +} + +.color-slate-300 { + color: #a0acc7 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-slate-300, +[type=reset].button-slate-300 { + color: #1b1b1b; + border-color: #a0acc7; + background-color: #a0acc7; +} + +:is(a).color-slate-300 { + text-decoration-color: #a0acc7 !important; +} + +.color-slate-250 { + color: #b0b9d0 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-slate-250, +[type=reset].button-slate-250 { + color: #1b1b1b; + border-color: #b0b9d0; + background-color: #b0b9d0; +} + +:is(a).color-slate-250 { + text-decoration-color: #b0b9d0 !important; +} + +.color-slate-200 { + color: #bfc7d9 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-slate-200, +[type=reset].button-slate-200 { + color: #1b1b1b; + border-color: #bfc7d9; + background-color: #bfc7d9; +} + +:is(a).color-slate-200 { + text-decoration-color: #bfc7d9 !important; +} + +.color-slate-150 { + color: #cfd5e2 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-slate-150, +[type=reset].button-slate-150 { + color: #1b1b1b; + border-color: #cfd5e2; + background-color: #cfd5e2; +} + +:is(a).color-slate-150 { + text-decoration-color: #cfd5e2 !important; +} + +.color-slate-100 { + color: #dfe3eb !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-slate-100, +[type=reset].button-slate-100 { + color: #1b1b1b; + border-color: #dfe3eb; + background-color: #dfe3eb; +} + +:is(a).color-slate-100 { + text-decoration-color: #dfe3eb !important; +} + +.color-slate-50 { + color: #eff1f4 !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-slate-50, +[type=reset].button-slate-50 { + color: #1b1b1b; + border-color: #eff1f4; + background-color: #eff1f4; +} + +:is(a).color-slate-50 { + text-decoration-color: #eff1f4 !important; +} + +.color-slate-main { + color: #525f7a !important; +} + +:is(button, [type=submit], [type=button], [role=button]).button-slate-main, +[type=reset].button-slate-main { + color: #dfe3eb; + border-color: #525f7a; + background-color: #525f7a; +} + +:is(a).color-slate-main { + text-decoration-color: #525f7a !important; +} + +@media (max-width: 576px) { + .hide-below-sm { + display: none; + } + .show-below-sm { + display: block; + } +} +@media (min-width: 577px) { + .show-below-sm { + display: none; + } +} +@media (max-width: 768px) { + .hide-below-md { + display: none; + } + .show-below-md { + display: block; + } +} +@media (min-width: 769px) { + .show-below-md { + display: none; + } +} +@media (max-width: 1024px) { + .hide-below-lg { + display: none; + } + .show-below-lg { + display: block; + } +} +@media (min-width: 1025px) { + .show-below-lg { + display: none; + } +} +@media (max-width: 1280px) { + .hide-below-xl { + display: none; + } + .show-below-xl { + display: block; + } +} +@media (min-width: 1281px) { + .show-below-xl { + display: none; + } +} +@media (max-width: 1536px) { + .hide-below-xxl { + display: none; + } + .show-below-xxl { + display: block; + } +} +@media (min-width: 1537px) { + .show-below-xxl { + display: none; + } +} + +/*# sourceMappingURL=pico-custom.css.map */ diff --git a/components/web/static_files/css/pico-custom.scss b/components/web/static_files/css/pico-custom.scss new file mode 100644 index 0000000..2cee022 --- /dev/null +++ b/components/web/static_files/css/pico-custom.scss @@ -0,0 +1,485 @@ +@use "pico" with ( + $enable-semantic-container: true, + $enable-responsive-spacings: true, + $enable-responsive-typography: false, + $theme-color: "slate", + $breakpoints: ( + sm: (breakpoint: 576px, viewport: 95%), + md: (breakpoint: 768px, viewport: 95%), + lg: (breakpoint: 1024px, viewport: 90%), + xl: (breakpoint: 1280px, viewport: 90%), + xxl: (breakpoint: 1536px, viewport: 85%) + ), +); +@use "colors" as *; +@use "sass:map"; +@use "settings" as *; +@use "sass:math"; + +@font-face { + font-family: go; + src: local("Go Regular"), url(../fonts/Go-Regular.woff2) format("woff2"); + font-style: normal; + font-weight: 400; +} +@font-face { + font-family: go; + src: local("Go Italic"), url(../fonts/Go-Italic.woff2) format("woff2"); + font-style: italic; + font-weight: 400; +} +@font-face { + font-family: go medium; + src: local("Go Medium"), url(../fonts/Go-Medium.woff2) format("woff2"); + font-style: normal; + font-weight: 500; +} +@font-face { + font-family: go medium; + src: local("Go Medium Italic"), url(../fonts/Go-Medium-Italic.woff2) format("woff2"); + font-style: italic; + font-weight: 500; +} +@font-face { + font-family: go; + src: local("Go Bold"), url(../fonts/Go-Bold.woff2) format("woff2"); + font-style: normal; + font-weight: 600; +} +@font-face { + font-family: go; + src: local("Go Bold Italic"), url(../fonts/Go-Bold-Italic.woff2) format("woff2"); + font-style: italic; + font-weight: 600; +} +@font-face { + font-family: go smallcaps; + src: local("Go Smallcaps"), url(../fonts/Go-Smallcaps.woff2) format("woff2"); + font-style: normal; + font-weight: 400; +} +@font-face { + font-family: go smallcaps; + src: local("Go Smallcaps Italic"), url(../fonts/Go-Smallcaps-Italic.woff2) format("woff2"); + font-style: italic; + font-weight: 400; +} +@font-face { + font-family: go mono; + src: local("Go Mono"), url(../fonts/Go-Mono.woff2) format("woff2"); + font-style: normal; + font-weight: 400; +} +@font-face { + font-family: go mono; + src: local("Go Mono Italic"), url(../fonts/Go-Mono-Italic.woff2) format("woff2"); + font-style: italic; + font-weight: 400; +} +@font-face { + font-family: go mono; + src: local("Go Mono Bold"), url(../fonts/Go-Mono-Bold.woff2) format("woff2"); + font-style: normal; + font-weight: 600; +} +@font-face { + font-family: go mono; + src: local("Go Mono Bold Italic"), url(../fonts/Go-Mono-Bold-Italic.woff2) format("woff2"); + font-style: italic; + font-weight: 600; +} + +:root { + --pico-font-family-sans-serif: "Go", system-ui, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, var(--pico-font-family-emoji); + --pico-form-element-spacing-vertical: .5rem; + --pico-form-element-spacing-horizontal: .5rem; + --pico-border-radius: 0; + --pico-font-size: 12pt; + --pico-line-height: 1.4; +} + +small { + font-size: .875rem; + color: var(--pico-muted-color); +} + +mark { + margin-block: calc(var(--pico-spacing)/4); + display: inline-block; + border-radius: .25rem; +} + +pre { + padding: calc(var(--pico-spacing)/2); +} + +#nav-theme-toggle { + cursor:pointer !important; +} +.dark { + filter: grayscale(100%); +} +.hi, .hi a { + font-size:1.1rem; + --pico-text-decoration: none; +} + +table td article { + margin-bottom: var(--pico-spacing); +} +table tr { + white-space: nowrap; +} +table td.created-modified { + background-image: var(--pico-icon-date); + background-position: center right var(--pico-form-element-spacing-vertical); + background-size: 1rem; + padding-inline-end: 2rem; +} +table td.created-modified, table th.created-modified { + text-align: right; +} + +.no-text-decoration { + text-decoration: none !important; + border-bottom: none !important; +} + +[data-loading] { + display: none; +} + +.help { + cursor:help; +} + +.pointer { + cursor:pointer; +} + +[contenteditable] { + display: inline-block; + border-bottom: 1px dotted #{$slate-300}; + text-decoration: none; +} +[contenteditable]:focus { + padding: calc(var(--pico-spacing)/2); + background: var(--pico-contrast); + color: var(--pico-contrast-inverse); +} + +[role="group"] { + --pico-group-box-shadow: none !important; +} + +/* +* Table navigation +*/ +.table-navigation { + user-select: none; +} +.table-navigation .paging:not(.disabled) { + padding: var(--pico-form-element-spacing-vertical) var(--pico-form-element-spacing-horizontal); + color: var(--pico-color); +} +.table-navigation button.sorting { + font-size: .875rem; + border: 0; +} +.table-navigation div.filters { + white-space: wrap; +} +.table-navigation div.filter-buttons button { + font-size: 0.875rem; + padding: calc(var(--pico-form-element-spacing-vertical) / 2) calc(var(--pico-form-element-spacing-horizontal) / 2); + border-color: var(--pico-form-element-border-color); + --pico-border-radius: .5rem; +} +.table-navigation .paging.disabled { + opacity: .5; + cursor: not-allowed; +} + +/* +# Notifications +*/ +#notification-container { + position: fixed; + left: .25rem; + bottom: .25rem; + z-index: 999; + width: fit-content; +} +.notification:not(:last-child) { + margin-bottom: .25rem; +} +.notification-text { + white-space: pre-line; +} +.notification { + cursor: pointer; + padding: var(--pico-form-element-spacing-vertical) 2rem; + color: var(--pico-color); + background-color: var(--pico-background-color); + background-image: var(--pico-icon); + background-position: center left var(--pico-form-element-spacing-vertical); + background-size: calc(var(--pico-spacing) * 1.5); + background-blend-mode: color-burn; + padding-left: calc(var(--pico-form-element-spacing-vertical) * 2 + calc(var(--pico-spacing) * 1.5)); +} +.notification-error { + --pico-background-color: #{$red-600}; + --pico-icon: var(--pico-icon-invalid); + --pico-color: #{$red-50}; +} +.notification-warning { + --pico-background-color: #{$yellow-50}; + --pico-icon: var(--pico-icon-invalid); + --pico-color: #{$yellow-900}; +} +.notification-success { + --pico-background-color: #{$green-550}; + --pico-icon: var(--pico-icon-valid); + --pico-color: #{$slate-50}; +} +.notification-user { + --pico-background-color: #{$azure-450}; + --pico-icon: var(--pico-icon-chevron); + --pico-color: #{$slate-50}; +} +.notification-title { + font-weight: bold; +} +.notification-system > .notification-title:before { + content:"\1F4E2\0020 Broadcast:\0020"; +} +.notification-system { + --pico-background-color: #{$fuchsia-800}; + --pico-icon: var(--pico-icon-chevron); + --pico-color: #{$fuchsia-100}; +} + +.login-grid { + display: grid; + grid-template-columns: 20% 60% 20%; + grid-template-rows: 1fr; +} + +.login-register { grid-column-start: 2; } + + +thead th, thead td, tfoot th, tfoot td { + --pico-font-weight: 400; +} + +button, a { touch-action: manipulation; } + +button[type="submit"] { + width: auto; +} + +dialog article { + max-width: 65%; +} + +.no-text-wrap { + text-wrap: nowrap; + white-space: nowrap; +} +.text-wrap { + text-wrap: balance; + white-space: break-spaces; +} + +.split-grid.grid > article:first-child { + grid-column: span 1; +} +.split-grid.grid > article { + grid-column: span 3; +} + +.grid-end { + display: grid; + justify-content: end; + grid-auto-columns: max-content; + grid-auto-flow: column; + gap: calc(var(--pico-spacing)/2); + align-items: baseline; + white-space: nowrap; +} +.grid-space-between { + display: grid; + justify-content: space-between; + grid-auto-columns: max-content; + grid-auto-flow: column; + gap: calc(var(--pico-spacing) /2); + white-space: nowrap; + align-items: baseline; + margin: calc(var(--pico-spacing) /2) auto; +} +.grid-3-cols { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: calc(var(--pico-spacing) /2); +} +.grid-3-cols .span-3 { + grid-column: span 3; +} +.grid-3-cols > article { + margin-bottom: 0; + padding-bottom: var(--pico-form-element-spacing-vertical); + --pico-border-radius: .5rem; +} + +.table-select { + background-color: rgb(128 128 128 / 10%); + backdrop-filter: blur(1px); + position: sticky; + bottom: var(--pico-form-element-spacing-vertical); + padding: var(--pico-form-element-spacing-vertical) var(--pico-form-element-spacing-horizontal); +} + +nav details.dropdown { + width: max-content; +} + +fieldset.vault-unlock { + padding: var(--pico-spacing) 0; +} + +@media only screen and (max-width: 600px) { + #notification-container { + left: 0; + bottom: 0; + width: 100%; + } + dialog article { + max-width: 95%; + } + .grid-3-cols { + display: grid; + grid-template-columns: repeat(1, 1fr); + gap: calc(var(--pico-spacing)/2); + } + .grid-3-cols .span-3 { + grid-column: span 1; + } + .grid-3-cols > article { + margin-bottom: 0; + --pico-border-radius: .5rem; + } +} +@media (max-width: 1024px) { + .split-grid.grid { + gap: calc(var(--pico-spacing) /2); + } + .split-grid.grid > article { + padding: 0; + background-color: transparent; + box-shadow: none; + } + + th, td { + --pico-spacing: 0.75rem; + } +} + +.group { + opacity: 0; +} + +textarea.dns-data { + border: 0; + background: transparent; + font-family: monospace; +} + +fieldset.system-field label:before { + content:"\1f512\0020"; +} + +fieldset.keypair { + border: 1px solid var(--pico-form-element-border-color); + padding: var(--pico-spacing); +} + + +/////////////////////////////////////// +// Generators for colors and breakpoints +/////////////////////////////////////// + +@function get-luminance($color) { + $red: math.div(red($color), 255); + $green: math.div(green($color), 255); + $blue: math.div(blue($color), 255); + + @return ($red * 0.2126) + ($green * 0.7152) + ($blue * 0.0722); +} + +@function get-contrast-ratio($color1, $color2) { + $l1: get-luminance($color1); + $l2: get-luminance($color2); + + @if $l1 > $l2 { + @return math.div($l1, $l2); + } @else { + @return math.div($l2, $l1); + } +} + +@function get-contrast-color($color) { + $dark-color: $grey-900; + $light-color: $slate-100; + $contrast-with-dark: get-contrast-ratio($color, $dark-color); + $contrast-with-light: get-contrast-ratio($color, $light-color); + + @if $contrast-with-light >= 2.0 { + @return $light-color; + } @else { + @return $dark-color; + } +} + +@each $color-key, $color-var in $colors { + @each $shade, $value in $color-var { + .color-#{"#{$color-key}"}-#{$shade} { + color: $value !important; + } + :is(button, [type="submit"], [type="button"], [role="button"]).button-#{"#{$color-key}"}-#{$shade}, + [type="reset"].button-#{"#{$color-key}"}-#{$shade} { + color: get-contrast-color($value); + border-color: $value; + background-color: $value; + } + :is(a).color-#{"#{$color-key}"}-#{$shade} { + text-decoration-color: $value !important; + } + } + + @if map-has-key($color-var, 500) { + .color-#{"#{$color-key}"} { + @extend .color-#{"#{$color-key}"}-500; + } + :is(button, [type="submit"], [type="button"], [role="button"]).button-#{"#{$color-key}"}, + [type="reset"].button-#{"#{$color-key}"} { + @extend .button-#{"#{$color-key}"}-500; + } + } +} + +@each $size, $data in $breakpoints { + $breakpoint: map-get($data, breakpoint); + @media (max-width: $breakpoint) { + .hide-below-#{$size} { + display: none; + } + .show-below-#{$size} { + display: block; + } + } + @media (min-width: $breakpoint + 1px) { + .show-below-#{$size} { + display: none; + } + } +} diff --git a/components/web/static_files/empty.html b/components/web/static_files/empty.html new file mode 100644 index 0000000..e69de29 diff --git a/components/web/static_files/fonts/Go-Bold-Italic.woff2 b/components/web/static_files/fonts/Go-Bold-Italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..1c6df105df8d9e5e84bceff11e7006ce1d2699da GIT binary patch literal 49992 zcmV({K+?Z=Pew8T0RR910K-TC4gdfE0&e&K0K)A60RR9100000000000000000000 z00006U;v6f2!SvOoD2~N3W%d@hp0~rmLvcHHUcCAmL3Ek1-5YqsW1$IR$D(Mk_6Un zJ4q6H`L^l>Ky$BO!#wK-+%}N@WVW$k^%}NKzlK3~2#U(8mpA+W|NsAgM>3HyORnXT zl!8D-5r61#`+rDt*Dg^aggt>tje!y4rI#q2WUfmoGDkCsYjIWkH7qEk)6i@NNl3yQ zVRHk6qEYp!*BpUJ6}4CdxQC;8dpO*Y zS5r;Kx3s0H371?HLRS2JQVwlGp*BrTO{$(Qj$5W%(h5sLpj-BNM*A)w&`drAgLSB( zpY8Jmo0w3AHgQEKLkB(OlQg^3Q_ud(i>6$Jy3iCg2}fqDDt?veUQ>Fmn!4A{b--Uo zp5wv>Odfwha5j@sssy6!k8~!!o^SN_VS0jp(*k}@KQVJV+-Tgji=p9daLQl4h5F#3 zS!L?Xnxma()mwU>eHidiYN(J%FX_a6hHVjo*8{n%sn((YU3&_Mq) zq^H zgN+e2VDzYwH8MuW0I5+SEg`L7pi&ZoBHE~^7h7#z}>U@Z^>ve7-}|ji6$qA0kuWg{a;hFPu1D(zW$-Ivz$_OQ77k&0EsoA)ew~G z*O3d#1W3Rc-T%Mxs#1Gir#0`B5G=ASOSU6J2<>eCCI_@c-BD3*Q|xuk73JFZpQ>N? zN%!6XD2Y@i0Meu*EXZ%AO$;NeL~Rn6RebadENmKrF79CXCBF@yuGuiKni^GiYQYRN z0<<6`zh{hz-X@uiv;W_m<=fsW*$bH0WHBX#Fa2-J8xMFU10_(R!)@V6kP@;idE&wV z9b3)-0D;Y!wsa%J7u3fWK#JsFnf%n2;+U|3PG^)u2!jEV=c;P}SWV3t0Zab3tI}n8 z5@&=G3aJ4v0eTM3jpfKqCl_)2h~`AI>=uUYZf=F|KepNbGo2O*6mk+o0}-rLbi{7H zs4o_q`=q_=-6xvd?wR{7(8MT;&7B_wOYNf%{>9nQ=}>69-O3RaaPPOnUAM()2myHh z)xBO@4<-K)DeN?~_4MovTQy8e{YPEO!<4cLPyGROfdVec6a=X#<(wPl8)j|Olf$O( zPyLb9EVr*=5k4aV*Pj8xfF&3W>G zO3wIuQ_c48LIIL4;G_%CMe3X&r&Na&nkuCK-|lk%{>74;C@&V$c>&N82wqr#7eMOl zVG;)nmtuy%3k(-R!bWdUubv_=GrQZui&{XrRW!jIr|yqGR}m!ZG}gKPHAP4$Hf$hh4*~L0 zuifvb^(O6FvU}fKEs)YID=G?tVnH1ZY&t`iW3G%vQ%f8_efgtz1U?5~v?t|>1mv6Z zD1euEUkT$kp#@q+urwJY008qX#0TeK^M7#9S&s;8fPb{g#*UrK{#0KHivB$Sb8kM4 z7pOGGQ`{WfR&GZXtq^lEei8@0B%@&h01io#awvClTv4ZLqpapJAQ!*^Q~^!_cK8DL z>JTM}uSgjr0*OZAkt8G;sgE>78YAh*1msC%E3zLsgd9WhqrfOx6dHv`siXW+ji_NX zFIoUCi3Xu%&~j)+vk&3$9RlGU=2N3e`5Q@ ze*~0wjdz3hJ|GuR45$K}1oZLoFb^Q|5&t5=NC*s3Kcb$UiEt_L^5ZF2Xg>aP=uj|u=k|L^lpx$EZa5>lE{&KpX=Gvu|d4pAY) z4Eo_aYqYcKs3@HR)2rX00Ygq3 zHDb)T31>{2GGorHv*w+1(FK<*rjjyIun-aDXtSflizs5=$h^rdnGe z6`Ug#E85lyqNJ4+)`_i%OsKe8C&spN!jMV^^5BM7CS_VSWm^_ysU>UlgnkXHdF58_ z)mJNpBQC45D`)BKA&tH4Vm}8s$UbCb0U#xx0`mAAzXVIj>a59HTN09WSqW&1fP-$3 zxmV=xQ+_*2g^bs03-qou_AIis;lAuG0hNFsjh%fpX*(}gCHLMMy-L(wu6tBNpIAk6 zWKy;uKG@0uTX*p9wx}L{SzhdLc=LV453gh%?oFALx+mvKYvK#>BxMH@db30VTN-8& z45CH%$$|EguRa_y1rx&8pFgqH!lXs_DVxUw&^24M2rb3!pktj5y9{UTbB)OE{I%i7 z=jgMUYyJ6wep{N5lt6oKQWHq_F!{3(Z zsQB3$uWyfvZZvtb+4APiAweRv9Ju7eHU5O1L_*(v=p%kBKgd@6iM42EZ}=;8rF-WF zQe;k-J>sn;ey3D)Ocm!Rxs!`<7fO%l-ASohKcfwf6wWD++=^gMF>Z+xs6gSN1r6?7 z8fIvkQCd&5D5|QcF`~#MqcXriR--EI@ZwMwCP6vUh2ayi{r^8jIvHC~JVf4RTsGqNpn%Mj<(m!hN(=>`Sx-ZKAG>ZP@Nm7nVcr)o97TCth5G z^BWx6Tp=Gaz=V_}63;qH$zEw0h7z!&W6RhKD*9&V8D(MMZ;Q=gEDcQz8Dnyf(&D5trIQ=} z7dx*V_vJ{)76v+6ctQowP|0&t@dDMnL=CUdm^aXbH_?>0w%9-{f_+Jr=>Nm*^wq#76vfV)JHzJy(SL=4QH^L~9S``I&bh za*oDD;a-ZYCRg@f*WtoNJTf4UH&9{MK{nI^)yb3Wf`8J<1NEJ~6gu9jOOeMbXGr#> zO~hV$LF(?Ric2-{M5i*+HxTr#P%^ZgFJ5)E1)k(m<=29saZ8puEGyHsS!b)ZO$ATs zacBsg`f9|9Sd$(?sz8?_Yv6dDKZ!&WYJ4|FdmQS>EXmAPC0|av_ifrdzXlu;XE1tJ zFAY&BS5H6dz0Ht|R(ufvQd2Z8DvyRXwk>J`je$-x6_~$A4|j;XcOCfRCe>VTdRH~1 z1re-?g4SBK6bcUd|~=|W}Z^WXDO?T>%#W-a{*KY@2Kn*T#_+b&|Od3ar8yb(Kt ziWyIu;m0=e&}?MXR|DNnnTTEMfD-uZ?WUw>m_(Kane4jpp*(iQkbxyG353|3|%k`+^tW z4tXWWP{+PRs`V1yTrJc-XS_lONFAhr4nQvf3G4_6abyu410gU0L0FE%HZB)d*t%nL zz}*EBUQXcOId>;;IHALd96>Bkcqb8cQc))p4RW$bP9av5G5}Q$gtbb-A0br(-3~y#{?ZV2wL(7R_UE2GQh$CMARNO0 zz*jPfd?VQNg}_@j;}>|n9G*Glfa1dfPRggJ)JxX$U#^lBlv7sD}@_l_@G5(w+X)ixC9wuSfeti zM@WYeh@U1FQ3wrU8vI%aZ8kPobfu$mX~s3AAxIiC@n{^QGM425VVLSpIBA0{fZ0cU%qUv(ms`H1Jwz{0)q}(qUOHnnt^~2j!Z^P z#;%&1R<*cScs0SaemmKK7aky|LyR#XX+eV99W`Kdyw-geo^L(jJ1im`kf7EGXdP4c zycz772fSq%f@{6NBNF%`*@TpenTm>lVvx6rA`;X1j#5wNo;T_B>M1NOr|7B?Lp%|} z85Ni8O;DCbG!QxfzDXhx<^CiE@iD|;5MbhBIJbRX2*cu#;bM+XvSfE#4Uq1Ieln=O zUy#=aJVJ4ZrDc$(xbRdi`SIyk*7{tex^&c*TSZ1?rX&nA1^YA}pF!rAQV~(WA?Y<0 z>10r$Ku}9cm5e`hD8w5la^3T99Ww__UGlN^f?K2rp2jO0HGTlRJ2a?K;coaN)Xas9 zJCfkDA!9nQF-dQO9Qpb1kex?s`SKpaSaokIu6jY8zJ^@tb@BQWN#4`#K0Wy>T^ab3 zDNQfacK+G|N0WR(zanN%gXJlX1E*c9PR{{1CQ6rd{9dEwA8sx^zXgsxv&h&VN2a6* zI_Pra{EE+vvTp8wInI0(V=(GQdG$Ubs8@Kdib47;cw(?zUqHa5H(ejWAt#CiJit*^ zF9y8idy6GzI1%byWAFe}(EMEB+sp}~jk!!X){`#l>J@#iz&c&Av0 zTs@jIUD%b<_%fPt{O@upV=v9Z_PtqGz%Wjtgt{AJ?h=GR!NCB^gl2%7SxTExhkMjP zcm>#k-5f93Sh+k}<=V!Qmu>K@N16VQhDX3m0mTbEOWdmT!Fr<0m@@y!%EfcSxG^fg z8Avk#f}oUTa;d$xcJg#w3)O4*H1s-RHM|zkB#u4=3m$-Lvn6HhYOunfmMx(eS6)w-15?>Ox$s!!kiOr7&AE$C_6(u`_ns%_2^A4Ezo~NWpzgUU zV_g4A#k}cHi|eZ%b`?d|0`-Pp%0AcsXC2okr1u!7-r)#YAu$jka|}0vZX1p1pgR-; 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 z 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 literal 0 HcmV?d00001 diff --git a/components/web/static_files/fonts/Go-Mono-Bold.woff2 b/components/web/static_files/fonts/Go-Mono-Bold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..856a7cd26a4add067a410399b0df5e313958cf3a GIT binary patch literal 53868 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%0Df0{&P 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�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ⅈjMr@!K7SF_B_f_Uvf)s#delr!t5LOb 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 literal 0 HcmV?d00001 diff --git a/components/web/static_files/fonts/Go-Regular.woff2 b/components/web/static_files/fonts/Go-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..1894c47199c0d759f61606c99bfcd0a790997122 GIT binary patch literal 47924 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 literal 0 HcmV?d00001 diff --git a/components/web/static_files/fonts/Go-Smallcaps.woff2 b/components/web/static_files/fonts/Go-Smallcaps.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..4be5ed5857e55cada2797e9d895abac0f447c634 GIT binary patch literal 43764 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 z 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 in el) + if option == 'all' + set e's @checked to 'true' + set e.checked to true + else if option == 'none' + remove @checked from e + set e.checked to false + else if option == 'invert' + if e.checked + toggle [@checked='false'] on e + set e.checked to false + else + toggle [@checked='true'] on e + set e.checked to true + end + else if option == 'toggle' + toggle [@checked='true'] on e + if e's @checked set e.checked to true else set e.checked to false end + end + end +end + +behavior trCheckboxSelect + on click + document.getSelection().removeAllRanges() + if not event.shiftKey + take .select-tr-element from in closest for me + call setCheckboxes(me, 'toggle') unless event.target.tagName.toLowerCase() === 'a' + else + document.getSelection().removeAllRanges() + get first .select-tr-element in closest
+ if it + set toggleTo to 'none' + if checked of first .multiselect in it + set toggleTo to 'all' + end + set selectedTrElement to it + if it.rowIndex < my.rowIndex + repeat while selectedTrElement.nextElementSibling + set selectedTrElement to selectedTrElement.nextElementSibling + call setCheckboxes(selectedTrElement, toggleTo) + if selectedTrElement is me + break + end + end + else + repeat while selectedTrElement.previousElementSibling + call setCheckboxes(selectedTrElement, toggleTo) + if selectedTrElement is me + break + end + set selectedTrElement to selectedTrElement.previousElementSibling + end + end + end + end + end +end + +behavior buttonCheckHtmxResponse + on htmx:afterRequest from closest to me + if (closest to me) != (event.target) exit end + set :_v to my textContent unless :_v + if event.detail.successful then + put `👍` into me + else + put `🤖 An error occured` into me + end + wait 1s + put :_v into me + set :_v to null + end +end + +behavior confirmButton + init set :inner to my.innerHTML end + on every click + halt the event + end + on click[event.detail==1] from me queue none + set x to 3 + repeat until x == 0 + put `Confirm ${x}x` into me + wait for a click or 1500ms + if the result's type is 'click' + decrement x + else + put :inner into me + exit + end + end + put :inner into me + trigger confirmedButton + end +end + +behavior inlineHtmxRename + init + set :_textContent to my.textContent + end + + on click halt the event end + + on htmx:afterRequest + if event.detail.successful == true + set :_textContent to my.textContent + end + set my.textContent to :_textContent + end + + on htmx:confirm(issueRequest) + halt the event + call confirm(`${:_textContent} to ${my.textContent}?`) + if not result set my.textContent to :_textContent else issueRequest() end + end + + on blur + if my.textContent == '' set my.textContent to :_textContent then exit end + if my.textContent == :_textContent exit end + set @hx-vals to `{"${my @data-patch-parameter}": "${my.textContent}"}` + trigger editContent on me + end + + on keydown[keyCode == 13] + me.blur() + halt the event + end +end + +behavior tresorToggle + def setUnlocked + get #vault-unlock-pin + add @disabled to it + set its @placeholder to 'Tresor is unlocked' + set #vault-unlock's textContent to '🔓' + end + def setLocked + get #vault-unlock-pin + remove @disabled from it + set its @placeholder to 'Tresor password' + set #vault-unlock's textContent to '🔐' + end + def noTresor + get #vault-unlock-pin + add @disabled to it + set its @placeholder to 'No tresor available' + set #vault-unlock's textContent to '⛔' + end + init + if window.vault.isUnlocked() + call setUnlocked() + else + if #vault-unlock's @data-tresor != "" + call setLocked() + else + call noTresor() + end + end + end + on keydown[keyCode == 13] from #vault-unlock-pin + trigger click on #vault-unlock unless #vault-unlock-pin's value is empty + end + on click from #vault-unlock + halt the event + if not window.vault.isUnlocked() + exit unless value of #vault-unlock-pin + call JSON.parse(#vault-unlock's @data-tresor) set keyData to the result + call VaultUnlockPrivateKey(value of #vault-unlock-pin, keyData) + call setUnlocked() + else + call window.vault.lock() + call setLocked() + end + set value of #vault-unlock-pin to '' + on exception(error) + trigger notification( + title: 'Tresor error', + level: 'validationError', + message: 'Could not unlock tresor, check your PIN', + duration: 3000, + locations: ['vault-unlock-pin'] + ) + end +end + +behavior bodydefault + on htmx:wsError or htmx:wsClose + set #ws-indicator's textContent to '⭕' + end + + on keydown + exit unless window.vault.isUnlocked() + if navigator.platform.toUpperCase().indexOf('MAC') >= 0 + set ctrlOrCmd to event.metaKey + else + set ctrlOrCmd to event.ctrlKey + end + if (event.key is "F5" or (ctrlOrCmd and event.key.toLowerCase() === "r")) or ((ctrlOrCmd and event.shiftKey and event.key.toLowerCase() === "r") or (event.shiftKey and e.key === "F5")) + trigger notification( + title: 'Unlocked session', + level: 'user', + message: 'Preventing window reload due to unlocked session', + duration: 2000, + locations: [] + ) + halt the event + end + end + + on htmx:responseError + set status to event.detail.xhr.status + if status >= 500 + trigger notification(title: 'Server error', level: 'error', message: 'The server could not handle the given request', duration: 10000) + else if status == 404 + trigger notification(title: 'Not found', level: 'error', message: `Route not found: ${event.detail.xhr.responseURL}`, duration: 3000) + end + end + + on htmx:configRequest + if window.vault.isUnlocked() + repeat for p in event.detail.parameters + log p + end + end + end + + on htmx:beforeRequest + remove @aria-invalid from <[aria-invalid]/> + end +end + +behavior objectFilters(submitForm) + on click from in me + halt the event + put '' into .generated-filters in me + + repeat for btn in ( in me) + if (btn is event.target and btn does not match .active) or (btn is not event.target and btn matches .active) + render #filter-item with (value: btn's value) + then put the result at the end of .generated-filters in me + end + end + + if length of <.generated-filters input/> is 0 + render #filter-item with (value: '') + then put the result at the end of .generated-filters in me + end + + trigger submit on submitForm unless submitForm == '' + end +end diff --git a/components/web/static_files/js/_hyperscript/_hyperscript.js b/components/web/static_files/js/_hyperscript/_hyperscript.js new file mode 100644 index 0000000..7a61cbc --- /dev/null +++ b/components/web/static_files/js/_hyperscript/_hyperscript.js @@ -0,0 +1,7723 @@ +/** + * @typedef {Object} Hyperscript + */ + +(function (self, factory) { + const _hyperscript = factory(self) + + if (typeof exports === 'object' && typeof exports['nodeName'] !== 'string') { + module.exports = _hyperscript + } else { + self['_hyperscript'] = _hyperscript + if ('document' in self) self['_hyperscript'].browserInit() + } +})(typeof self !== 'undefined' ? self : this, (globalScope) => { + + 'use strict'; + + /** + * @type {Object} + * @property {DynamicConverter[]} dynamicResolvers + * + * @callback DynamicConverter + * @param {String} str + * @param {*} value + * @returns {*} + */ + const conversions = { + dynamicResolvers: [ + function(str, value){ + if (str === "Fixed") { + return Number(value).toFixed(); + } else if (str.indexOf("Fixed:") === 0) { + let num = str.split(":")[1]; + return Number(value).toFixed(parseInt(num)); + } + } + ], + String: function (val) { + if (val.toString) { + return val.toString(); + } else { + return "" + val; + } + }, + Int: function (val) { + return parseInt(val); + }, + Float: function (val) { + return parseFloat(val); + }, + Number: function (val) { + return Number(val); + }, + Date: function (val) { + return new Date(val); + }, + Array: function (val) { + return Array.from(val); + }, + JSON: function (val) { + return JSON.stringify(val); + }, + Object: function (val) { + if (val instanceof String) { + val = val.toString(); + } + if (typeof val === "string") { + return JSON.parse(val); + } else { + return Object.assign({}, val); + } + }, + } + + const config = { + attributes: "_, script, data-script", + defaultTransition: "all 500ms ease-in", + disableSelector: "[disable-scripting], [data-disable-scripting]", + hideShowStrategies: {}, + conversions, + } + + class Lexer { + static OP_TABLE = { + "+": "PLUS", + "-": "MINUS", + "*": "MULTIPLY", + "/": "DIVIDE", + ".": "PERIOD", + "..": "ELLIPSIS", + "\\": "BACKSLASH", + ":": "COLON", + "%": "PERCENT", + "|": "PIPE", + "!": "EXCLAMATION", + "?": "QUESTION", + "#": "POUND", + "&": "AMPERSAND", + $: "DOLLAR", + ";": "SEMI", + ",": "COMMA", + "(": "L_PAREN", + ")": "R_PAREN", + "<": "L_ANG", + ">": "R_ANG", + "<=": "LTE_ANG", + ">=": "GTE_ANG", + "==": "EQ", + "===": "EQQ", + "!=": "NEQ", + "!==": "NEQQ", + "{": "L_BRACE", + "}": "R_BRACE", + "[": "L_BRACKET", + "]": "R_BRACKET", + "=": "EQUALS", + }; + + /** + * isValidCSSClassChar returns `true` if the provided character is valid in a CSS class. + * @param {string} c + * @returns boolean + */ + static isValidCSSClassChar(c) { + return Lexer.isAlpha(c) || Lexer.isNumeric(c) || c === "-" || c === "_" || c === ":"; + } + + /** + * isValidCSSIDChar returns `true` if the provided character is valid in a CSS ID + * @param {string} c + * @returns boolean + */ + static isValidCSSIDChar(c) { + return Lexer.isAlpha(c) || Lexer.isNumeric(c) || c === "-" || c === "_" || c === ":"; + } + + /** + * isWhitespace returns `true` if the provided character is whitespace. + * @param {string} c + * @returns boolean + */ + static isWhitespace(c) { + return c === " " || c === "\t" || Lexer.isNewline(c); + } + + /** + * positionString returns a string representation of a Token's line and column details. + * @param {Token} token + * @returns string + */ + static positionString(token) { + return "[Line: " + token.line + ", Column: " + token.column + "]"; + } + + /** + * isNewline returns `true` if the provided character is a carriage return or newline + * @param {string} c + * @returns boolean + */ + static isNewline(c) { + return c === "\r" || c === "\n"; + } + + /** + * isNumeric returns `true` if the provided character is a number (0-9) + * @param {string} c + * @returns boolean + */ + static isNumeric(c) { + return c >= "0" && c <= "9"; + } + + /** + * isAlpha returns `true` if the provided character is a letter in the alphabet + * @param {string} c + * @returns boolean + */ + static isAlpha(c) { + return (c >= "a" && c <= "z") || (c >= "A" && c <= "Z"); + } + + /** + * @param {string} c + * @param {boolean} [dollarIsOp] + * @returns boolean + */ + static isIdentifierChar(c, dollarIsOp) { + return c === "_" || c === "$"; + } + + /** + * @param {string} c + * @returns boolean + */ + static isReservedChar(c) { + return c === "`" || c === "^"; + } + + /** + * @param {Token[]} tokens + * @returns {boolean} + */ + static isValidSingleQuoteStringStart(tokens) { + if (tokens.length > 0) { + var previousToken = tokens[tokens.length - 1]; + if ( + previousToken.type === "IDENTIFIER" || + previousToken.type === "CLASS_REF" || + previousToken.type === "ID_REF" + ) { + return false; + } + if (previousToken.op && (previousToken.value === ">" || previousToken.value === ")")) { + return false; + } + } + return true; + } + + /** + * @param {string} string + * @param {boolean} [template] + * @returns {Tokens} + */ + static tokenize(string, template) { + var tokens = /** @type {Token[]}*/ []; + var source = string; + var position = 0; + var column = 0; + var line = 1; + var lastToken = ""; + var templateBraceCount = 0; + + function inTemplate() { + return template && templateBraceCount === 0; + } + + while (position < source.length) { + if ((currentChar() === "-" && nextChar() === "-" && (Lexer.isWhitespace(nextCharAt(2)) || nextCharAt(2) === "" || nextCharAt(2) === "-")) + || (currentChar() === "/" && nextChar() === "/" && (Lexer.isWhitespace(nextCharAt(2)) || nextCharAt(2) === "" || nextCharAt(2) === "/"))) { + consumeComment(); + } else if (currentChar() === "/" && nextChar() === "*" && (Lexer.isWhitespace(nextCharAt(2)) || nextCharAt(2) === "" || nextCharAt(2) === "*")) { + consumeCommentMultiline(); + } else { + if (Lexer.isWhitespace(currentChar())) { + tokens.push(consumeWhitespace()); + } else if ( + !possiblePrecedingSymbol() && + currentChar() === "." && + (Lexer.isAlpha(nextChar()) || nextChar() === "{" || nextChar() === "-") + ) { + tokens.push(consumeClassReference()); + } else if ( + !possiblePrecedingSymbol() && + currentChar() === "#" && + (Lexer.isAlpha(nextChar()) || nextChar() === "{") + ) { + tokens.push(consumeIdReference()); + } else if (currentChar() === "[" && nextChar() === "@") { + tokens.push(consumeAttributeReference()); + } else if (currentChar() === "@") { + tokens.push(consumeShortAttributeReference()); + } else if (currentChar() === "*" && Lexer.isAlpha(nextChar())) { + tokens.push(consumeStyleReference()); + } else if (Lexer.isAlpha(currentChar()) || (!inTemplate() && Lexer.isIdentifierChar(currentChar()))) { + tokens.push(consumeIdentifier()); + } else if (Lexer.isNumeric(currentChar())) { + tokens.push(consumeNumber()); + } else if (!inTemplate() && (currentChar() === '"' || currentChar() === "`")) { + tokens.push(consumeString()); + } else if (!inTemplate() && currentChar() === "'") { + if (Lexer.isValidSingleQuoteStringStart(tokens)) { + tokens.push(consumeString()); + } else { + tokens.push(consumeOp()); + } + } else if (Lexer.OP_TABLE[currentChar()]) { + if (lastToken === "$" && currentChar() === "{") { + templateBraceCount++; + } + if (currentChar() === "}") { + templateBraceCount--; + } + tokens.push(consumeOp()); + } else if (inTemplate() || Lexer.isReservedChar(currentChar())) { + tokens.push(makeToken("RESERVED", consumeChar())); + } else { + if (position < source.length) { + throw Error("Unknown token: " + currentChar() + " "); + } + } + } + } + + return new Tokens(tokens, [], source); + + /** + * @param {string} [type] + * @param {string} [value] + * @returns {Token} + */ + function makeOpToken(type, value) { + var token = makeToken(type, value); + token.op = true; + return token; + } + + /** + * @param {string} [type] + * @param {string} [value] + * @returns {Token} + */ + function makeToken(type, value) { + return { + type: type, + value: value || "", + start: position, + end: position + 1, + column: column, + line: line, + }; + } + + function consumeComment() { + while (currentChar() && !Lexer.isNewline(currentChar())) { + consumeChar(); + } + consumeChar(); // Consume newline + } + + function consumeCommentMultiline() { + while (currentChar() && !(currentChar() === '*' && nextChar() === '/')) { + consumeChar(); + } + consumeChar(); // Consume "*/" + consumeChar(); + } + + /** + * @returns Token + */ + function consumeClassReference() { + var classRef = makeToken("CLASS_REF"); + var value = consumeChar(); + if (currentChar() === "{") { + classRef.template = true; + value += consumeChar(); + while (currentChar() && currentChar() !== "}") { + value += consumeChar(); + } + if (currentChar() !== "}") { + throw Error("Unterminated class reference"); + } else { + value += consumeChar(); // consume final curly + } + } else { + while (Lexer.isValidCSSClassChar(currentChar())) { + value += consumeChar(); + } + } + classRef.value = value; + classRef.end = position; + return classRef; + } + + /** + * @returns Token + */ + function consumeAttributeReference() { + var attributeRef = makeToken("ATTRIBUTE_REF"); + var value = consumeChar(); + while (position < source.length && currentChar() !== "]") { + value += consumeChar(); + } + if (currentChar() === "]") { + value += consumeChar(); + } + attributeRef.value = value; + attributeRef.end = position; + return attributeRef; + } + + function consumeShortAttributeReference() { + var attributeRef = makeToken("ATTRIBUTE_REF"); + var value = consumeChar(); + while (Lexer.isValidCSSIDChar(currentChar())) { + value += consumeChar(); + } + if (currentChar() === '=') { + value += consumeChar(); + if (currentChar() === '"' || currentChar() === "'") { + let stringValue = consumeString(); + value += stringValue.value; + } else if(Lexer.isAlpha(currentChar()) || + Lexer.isNumeric(currentChar()) || + Lexer.isIdentifierChar(currentChar())) { + let id = consumeIdentifier(); + value += id.value; + } + } + attributeRef.value = value; + attributeRef.end = position; + return attributeRef; + } + + function consumeStyleReference() { + var styleRef = makeToken("STYLE_REF"); + var value = consumeChar(); + while (Lexer.isAlpha(currentChar()) || currentChar() === "-") { + value += consumeChar(); + } + styleRef.value = value; + styleRef.end = position; + return styleRef; + } + + /** + * @returns Token + */ + function consumeIdReference() { + var idRef = makeToken("ID_REF"); + var value = consumeChar(); + if (currentChar() === "{") { + idRef.template = true; + value += consumeChar(); + while (currentChar() && currentChar() !== "}") { + value += consumeChar(); + } + if (currentChar() !== "}") { + throw Error("Unterminated id reference"); + } else { + consumeChar(); // consume final quote + } + } else { + while (Lexer.isValidCSSIDChar(currentChar())) { + value += consumeChar(); + } + } + idRef.value = value; + idRef.end = position; + return idRef; + } + + /** + * @returns Token + */ + function consumeIdentifier() { + var identifier = makeToken("IDENTIFIER"); + var value = consumeChar(); + while (Lexer.isAlpha(currentChar()) || + Lexer.isNumeric(currentChar()) || + Lexer.isIdentifierChar(currentChar())) { + value += consumeChar(); + } + if (currentChar() === "!" && value === "beep") { + value += consumeChar(); + } + identifier.value = value; + identifier.end = position; + return identifier; + } + + /** + * @returns Token + */ + function consumeNumber() { + var number = makeToken("NUMBER"); + var value = consumeChar(); + + // given possible XXX.YYY(e|E)[-]ZZZ consume XXX + while (Lexer.isNumeric(currentChar())) { + value += consumeChar(); + } + + // consume .YYY + if (currentChar() === "." && Lexer.isNumeric(nextChar())) { + value += consumeChar(); + } + while (Lexer.isNumeric(currentChar())) { + value += consumeChar(); + } + + // consume (e|E)[-] + if (currentChar() === "e" || currentChar() === "E") { + // possible scientific notation, e.g. 1e6 or 1e-6 + if (Lexer.isNumeric(nextChar())) { + // e.g. 1e6 + value += consumeChar(); + } else if (nextChar() === "-") { + // e.g. 1e-6 + value += consumeChar(); + // consume the - as well since otherwise we would stop on the next loop + value += consumeChar(); + } + } + + // consume ZZZ + while (Lexer.isNumeric(currentChar())) { + value += consumeChar(); + } + number.value = value; + number.end = position; + return number; + } + + /** + * @returns Token + */ + function consumeOp() { + var op = makeOpToken(); + var value = consumeChar(); // consume leading char + while (currentChar() && Lexer.OP_TABLE[value + currentChar()]) { + value += consumeChar(); + } + op.type = Lexer.OP_TABLE[value]; + op.value = value; + op.end = position; + return op; + } + + /** + * @returns Token + */ + function consumeString() { + var string = makeToken("STRING"); + var startChar = consumeChar(); // consume leading quote + var value = ""; + while (currentChar() && currentChar() !== startChar) { + if (currentChar() === "\\") { + consumeChar(); // consume escape char and get the next one + let nextChar = consumeChar(); + if (nextChar === "b") { + value += "\b"; + } else if (nextChar === "f") { + value += "\f"; + } else if (nextChar === "n") { + value += "\n"; + } else if (nextChar === "r") { + value += "\r"; + } else if (nextChar === "t") { + value += "\t"; + } else if (nextChar === "v") { + value += "\v"; + } else if (nextChar === "x") { + const hex = consumeHexEscape(); + if (Number.isNaN(hex)) { + throw Error("Invalid hexadecimal escape at " + Lexer.positionString(string)); + } + value += String.fromCharCode(hex); + } else { + value += nextChar; + } + } else { + value += consumeChar(); + } + } + if (currentChar() !== startChar) { + throw Error("Unterminated string at " + Lexer.positionString(string)); + } else { + consumeChar(); // consume final quote + } + string.value = value; + string.end = position; + string.template = startChar === "`"; + return string; + } + + /** + * @returns number + */ + function consumeHexEscape() { + const BASE = 16; + if (!currentChar()) { + return NaN; + } + let result = BASE * Number.parseInt(consumeChar(), BASE); + if (!currentChar()) { + return NaN; + } + result += Number.parseInt(consumeChar(), BASE); + + return result; + } + + /** + * @returns string + */ + function currentChar() { + return source.charAt(position); + } + + /** + * @returns string + */ + function nextChar() { + return source.charAt(position + 1); + } + + function nextCharAt(number = 1) { + return source.charAt(position + number); + } + + /** + * @returns string + */ + function consumeChar() { + lastToken = currentChar(); + position++; + column++; + return lastToken; + } + + /** + * @returns boolean + */ + function possiblePrecedingSymbol() { + return ( + Lexer.isAlpha(lastToken) || + Lexer.isNumeric(lastToken) || + lastToken === ")" || + lastToken === "\"" || + lastToken === "'" || + lastToken === "`" || + lastToken === "}" || + lastToken === "]" + ); + } + + /** + * @returns Token + */ + function consumeWhitespace() { + var whitespace = makeToken("WHITESPACE"); + var value = ""; + while (currentChar() && Lexer.isWhitespace(currentChar())) { + if (Lexer.isNewline(currentChar())) { + column = 0; + line++; + } + value += consumeChar(); + } + whitespace.value = value; + whitespace.end = position; + return whitespace; + } + } + + /** + * @param {string} string + * @param {boolean} [template] + * @returns {Tokens} + */ + tokenize(string, template) { + return Lexer.tokenize(string, template) + } + } + + /** + * @typedef {Object} Token + * @property {string} [type] + * @property {string} value + * @property {number} [start] + * @property {number} [end] + * @property {number} [column] + * @property {number} [line] + * @property {boolean} [op] `true` if this token represents an operator + * @property {boolean} [template] `true` if this token is a template, for class refs, id refs, strings + */ + + class Tokens { + constructor(tokens, consumed, source) { + this.tokens = tokens + this.consumed = consumed + this.source = source + + this.consumeWhitespace(); // consume initial whitespace + } + + get list() { + return this.tokens + } + + /** @type Token | null */ + _lastConsumed = null; + + consumeWhitespace() { + while (this.token(0, true).type === "WHITESPACE") { + this.consumed.push(this.tokens.shift()); + } + } + + /** + * @param {Tokens} tokens + * @param {*} error + * @returns {never} + */ + raiseError(tokens, error) { + Parser.raiseParseError(tokens, error); + } + + /** + * @param {string} value + * @returns {Token} + */ + requireOpToken(value) { + var token = this.matchOpToken(value); + if (token) { + return token; + } else { + this.raiseError(this, "Expected '" + value + "' but found '" + this.currentToken().value + "'"); + } + } + + /** + * @param {string} op1 + * @param {string} [op2] + * @param {string} [op3] + * @returns {Token | void} + */ + matchAnyOpToken(op1, op2, op3) { + for (var i = 0; i < arguments.length; i++) { + var opToken = arguments[i]; + var match = this.matchOpToken(opToken); + if (match) { + return match; + } + } + } + + /** + * @param {string} op1 + * @param {string} [op2] + * @param {string} [op3] + * @returns {Token | void} + */ + matchAnyToken(op1, op2, op3) { + for (var i = 0; i < arguments.length; i++) { + var opToken = arguments[i]; + var match = this.matchToken(opToken); + if (match) { + return match; + } + } + } + + /** + * @param {string} value + * @returns {Token | void} + */ + matchOpToken(value) { + if (this.currentToken() && this.currentToken().op && this.currentToken().value === value) { + return this.consumeToken(); + } + } + + /** + * @param {string} type1 + * @param {string} [type2] + * @param {string} [type3] + * @param {string} [type4] + * @returns {Token} + */ + requireTokenType(type1, type2, type3, type4) { + var token = this.matchTokenType(type1, type2, type3, type4); + if (token) { + return token; + } else { + this.raiseError(this, "Expected one of " + JSON.stringify([type1, type2, type3])); + } + } + + /** + * @param {string} type1 + * @param {string} [type2] + * @param {string} [type3] + * @param {string} [type4] + * @returns {Token | void} + */ + matchTokenType(type1, type2, type3, type4) { + if ( + this.currentToken() && + this.currentToken().type && + [type1, type2, type3, type4].indexOf(this.currentToken().type) >= 0 + ) { + return this.consumeToken(); + } + } + + /** + * @param {string} value + * @param {string} [type] + * @returns {Token} + */ + requireToken(value, type) { + var token = this.matchToken(value, type); + if (token) { + return token; + } else { + this.raiseError(this, "Expected '" + value + "' but found '" + this.currentToken().value + "'"); + } + } + + peekToken(value, peek, type) { + peek = peek || 0; + type = type || "IDENTIFIER"; + if(this.tokens[peek] && this.tokens[peek].value === value && this.tokens[peek].type === type){ + return this.tokens[peek]; + } + } + + /** + * @param {string} value + * @param {string} [type] + * @returns {Token | void} + */ + matchToken(value, type) { + if (this.follows.indexOf(value) !== -1) { + return; // disallowed token here + } + type = type || "IDENTIFIER"; + if (this.currentToken() && this.currentToken().value === value && this.currentToken().type === type) { + return this.consumeToken(); + } + } + + /** + * @returns {Token} + */ + consumeToken() { + var match = this.tokens.shift(); + this.consumed.push(match); + this._lastConsumed = match; + this.consumeWhitespace(); // consume any whitespace + return match; + } + + /** + * @param {string | null} value + * @param {string | null} [type] + * @returns {Token[]} + */ + consumeUntil(value, type) { + /** @type Token[] */ + var tokenList = []; + var currentToken = this.token(0, true); + + while ( + (type == null || currentToken.type !== type) && + (value == null || currentToken.value !== value) && + currentToken.type !== "EOF" + ) { + var match = this.tokens.shift(); + this.consumed.push(match); + tokenList.push(currentToken); + currentToken = this.token(0, true); + } + this.consumeWhitespace(); // consume any whitespace + return tokenList; + } + + /** + * @returns {string} + */ + lastWhitespace() { + if (this.consumed[this.consumed.length - 1] && this.consumed[this.consumed.length - 1].type === "WHITESPACE") { + return this.consumed[this.consumed.length - 1].value; + } else { + return ""; + } + } + + consumeUntilWhitespace() { + return this.consumeUntil(null, "WHITESPACE"); + } + + /** + * @returns {boolean} + */ + hasMore() { + return this.tokens.length > 0; + } + + /** + * @param {number} n + * @param {boolean} [dontIgnoreWhitespace] + * @returns {Token} + */ + token(n, dontIgnoreWhitespace) { + var /**@type {Token}*/ token; + var i = 0; + do { + if (!dontIgnoreWhitespace) { + while (this.tokens[i] && this.tokens[i].type === "WHITESPACE") { + i++; + } + } + token = this.tokens[i]; + n--; + i++; + } while (n > -1); + if (token) { + return token; + } else { + return { + type: "EOF", + value: "<<>>", + }; + } + } + + /** + * @returns {Token} + */ + currentToken() { + return this.token(0); + } + + /** + * @returns {Token | null} + */ + lastMatch() { + return this._lastConsumed; + } + + /** + * @returns {string} + */ + static sourceFor = function () { + return this.programSource.substring(this.startToken.start, this.endToken.end); + } + + /** + * @returns {string} + */ + static lineFor = function () { + return this.programSource.split("\n")[this.startToken.line - 1]; + } + + follows = []; + + pushFollow(str) { + this.follows.push(str); + } + + popFollow() { + this.follows.pop(); + } + + clearFollows() { + var tmp = this.follows; + this.follows = []; + return tmp; + } + + restoreFollows(f) { + this.follows = f; + } + } + + /** + * @callback ParseRule + * @param {Parser} parser + * @param {Runtime} runtime + * @param {Tokens} tokens + * @param {*} [root] + * @returns {ASTNode | undefined} + * + * @typedef {Object} ASTNode + * @member {boolean} isFeature + * @member {string} type + * @member {any[]} args + * @member {(this: ASTNode, ctx:Context, root:any, ...args:any) => any} op + * @member {(this: ASTNode, context?:Context) => any} evaluate + * @member {ASTNode} parent + * @member {Set} children + * @member {ASTNode} root + * @member {String} keyword + * @member {Token} endToken + * @member {ASTNode} next + * @member {(context:Context) => ASTNode} resolveNext + * @member {EventSource} eventSource + * @member {(this: ASTNode) => void} install + * @member {(this: ASTNode, context:Context) => void} execute + * @member {(this: ASTNode, target: object, source: object, args?: Object) => void} apply + * + * + */ + + class Parser { + /** + * + * @param {Runtime} runtime + */ + constructor(runtime) { + this.runtime = runtime + + this.possessivesDisabled = false + + /* ============================================================================================ */ + /* Core hyperscript Grammar Elements */ + /* ============================================================================================ */ + this.addGrammarElement("feature", function (parser, runtime, tokens) { + if (tokens.matchOpToken("(")) { + var featureElement = parser.requireElement("feature", tokens); + tokens.requireOpToken(")"); + return featureElement; + } + + var featureDefinition = parser.FEATURES[tokens.currentToken().value || ""]; + if (featureDefinition) { + return featureDefinition(parser, runtime, tokens); + } + }); + + this.addGrammarElement("command", function (parser, runtime, tokens) { + if (tokens.matchOpToken("(")) { + const commandElement = parser.requireElement("command", tokens); + tokens.requireOpToken(")"); + return commandElement; + } + + var commandDefinition = parser.COMMANDS[tokens.currentToken().value || ""]; + let commandElement; + if (commandDefinition) { + commandElement = commandDefinition(parser, runtime, tokens); + } else if (tokens.currentToken().type === "IDENTIFIER") { + commandElement = parser.parseElement("pseudoCommand", tokens); + } + if (commandElement) { + return parser.parseElement("indirectStatement", tokens, commandElement); + } + + return commandElement; + }); + + this.addGrammarElement("commandList", function (parser, runtime, tokens) { + if (tokens.hasMore()) { + var cmd = parser.parseElement("command", tokens); + if (cmd) { + tokens.matchToken("then"); + const next = parser.parseElement("commandList", tokens); + if (next) cmd.next = next; + return cmd; + } + } + return { + type: "emptyCommandListCommand", + op: function(context){ + return runtime.findNext(this, context); + }, + execute: function (context) { + return runtime.unifiedExec(this, context); + } + } + }); + + this.addGrammarElement("leaf", function (parser, runtime, tokens) { + var result = parser.parseAnyOf(parser.LEAF_EXPRESSIONS, tokens); + // symbol is last so it doesn't consume any constants + if (result == null) { + return parser.parseElement("symbol", tokens); + } + + return result; + }); + + this.addGrammarElement("indirectExpression", function (parser, runtime, tokens, root) { + for (var i = 0; i < parser.INDIRECT_EXPRESSIONS.length; i++) { + var indirect = parser.INDIRECT_EXPRESSIONS[i]; + root.endToken = tokens.lastMatch(); + var result = parser.parseElement(indirect, tokens, root); + if (result) { + return result; + } + } + return root; + }); + + this.addGrammarElement("indirectStatement", function (parser, runtime, tokens, root) { + if (tokens.matchToken("unless")) { + root.endToken = tokens.lastMatch(); + var conditional = parser.requireElement("expression", tokens); + var unless = { + type: "unlessStatementModifier", + args: [conditional], + op: function (context, conditional) { + if (conditional) { + return this.next; + } else { + return root; + } + }, + execute: function (context) { + return runtime.unifiedExec(this, context); + }, + }; + root.parent = unless; + return unless; + } + return root; + }); + + this.addGrammarElement("primaryExpression", function (parser, runtime, tokens) { + var leaf = parser.parseElement("leaf", tokens); + if (leaf) { + return parser.parseElement("indirectExpression", tokens, leaf); + } + parser.raiseParseError(tokens, "Unexpected value: " + tokens.currentToken().value); + }); + } + + use(plugin) { + plugin(this) + return this + } + + /** @type {Object} */ + GRAMMAR = {}; + + /** @type {Object} */ + COMMANDS = {}; + + /** @type {Object} */ + FEATURES = {}; + + /** @type {string[]} */ + LEAF_EXPRESSIONS = []; + /** @type {string[]} */ + INDIRECT_EXPRESSIONS = []; + + /** + * @param {*} parseElement + * @param {*} start + * @param {Tokens} tokens + */ + initElt(parseElement, start, tokens) { + parseElement.startToken = start; + parseElement.sourceFor = Tokens.sourceFor; + parseElement.lineFor = Tokens.lineFor; + parseElement.programSource = tokens.source; + } + + /** + * @param {string} type + * @param {Tokens} tokens + * @param {ASTNode?} root + * @returns {ASTNode} + */ + parseElement(type, tokens, root = undefined) { + var elementDefinition = this.GRAMMAR[type]; + if (elementDefinition) { + var start = tokens.currentToken(); + var parseElement = elementDefinition(this, this.runtime, tokens, root); + if (parseElement) { + this.initElt(parseElement, start, tokens); + parseElement.endToken = parseElement.endToken || tokens.lastMatch(); + var root = parseElement.root; + while (root != null) { + this.initElt(root, start, tokens); + root = root.root; + } + } + return parseElement; + } + } + + /** + * @param {string} type + * @param {Tokens} tokens + * @param {string} [message] + * @param {*} [root] + * @returns {ASTNode} + */ + requireElement(type, tokens, message, root) { + var result = this.parseElement(type, tokens, root); + if (!result) Parser.raiseParseError(tokens, message || "Expected " + type); + // @ts-ignore + return result; + } + + /** + * @param {string[]} types + * @param {Tokens} tokens + * @returns {ASTNode} + */ + parseAnyOf(types, tokens) { + for (var i = 0; i < types.length; i++) { + var type = types[i]; + var expression = this.parseElement(type, tokens); + if (expression) { + return expression; + } + } + } + + /** + * @param {string} name + * @param {ParseRule} definition + */ + addGrammarElement(name, definition) { + this.GRAMMAR[name] = definition; + } + + /** + * @param {string} keyword + * @param {ParseRule} definition + */ + addCommand(keyword, definition) { + var commandGrammarType = keyword + "Command"; + var commandDefinitionWrapper = function (parser, runtime, tokens) { + const commandElement = definition(parser, runtime, tokens); + if (commandElement) { + commandElement.type = commandGrammarType; + commandElement.execute = function (context) { + context.meta.command = commandElement; + return runtime.unifiedExec(this, context); + }; + return commandElement; + } + }; + this.GRAMMAR[commandGrammarType] = commandDefinitionWrapper; + this.COMMANDS[keyword] = commandDefinitionWrapper; + } + + /** + * @param {string} keyword + * @param {ParseRule} definition + */ + addFeature(keyword, definition) { + var featureGrammarType = keyword + "Feature"; + + /** @type {ParseRule} */ + var featureDefinitionWrapper = function (parser, runtime, tokens) { + var featureElement = definition(parser, runtime, tokens); + if (featureElement) { + featureElement.isFeature = true; + featureElement.keyword = keyword; + featureElement.type = featureGrammarType; + return featureElement; + } + }; + this.GRAMMAR[featureGrammarType] = featureDefinitionWrapper; + this.FEATURES[keyword] = featureDefinitionWrapper; + } + + /** + * @param {string} name + * @param {ParseRule} definition + */ + addLeafExpression(name, definition) { + this.LEAF_EXPRESSIONS.push(name); + this.addGrammarElement(name, definition); + } + + /** + * @param {string} name + * @param {ParseRule} definition + */ + addIndirectExpression(name, definition) { + this.INDIRECT_EXPRESSIONS.push(name); + this.addGrammarElement(name, definition); + } + + /** + * + * @param {Tokens} tokens + * @returns string + */ + static createParserContext(tokens) { + var currentToken = tokens.currentToken(); + var source = tokens.source; + var lines = source.split("\n"); + var line = currentToken && currentToken.line ? currentToken.line - 1 : lines.length - 1; + var contextLine = lines[line]; + var offset = /** @type {number} */ ( + currentToken && currentToken.line ? currentToken.column : contextLine.length - 1); + return contextLine + "\n" + " ".repeat(offset) + "^^\n\n"; + } + + /** + * @param {Tokens} tokens + * @param {string} [message] + * @returns {never} + */ + static raiseParseError(tokens, message) { + message = + (message || "Unexpected Token : " + tokens.currentToken().value) + "\n\n" + Parser.createParserContext(tokens); + var error = new Error(message); + error["tokens"] = tokens; + throw error; + } + + /** + * @param {Tokens} tokens + * @param {string} [message] + */ + raiseParseError(tokens, message) { + Parser.raiseParseError(tokens, message) + } + + /** + * @param {Tokens} tokens + * @returns {ASTNode} + */ + parseHyperScript(tokens) { + var result = this.parseElement("hyperscript", tokens); + if (tokens.hasMore()) this.raiseParseError(tokens); + if (result) return result; + } + + /** + * @param {ASTNode | undefined} elt + * @param {ASTNode} parent + */ + setParent(elt, parent) { + if (typeof elt === 'object') { + elt.parent = parent; + if (typeof parent === 'object') { + parent.children = (parent.children || new Set()); + parent.children.add(elt) + } + this.setParent(elt.next, parent); + } + } + + /** + * @param {Token} token + * @returns {ParseRule} + */ + commandStart(token) { + return this.COMMANDS[token.value || ""]; + } + + /** + * @param {Token} token + * @returns {ParseRule} + */ + featureStart(token) { + return this.FEATURES[token.value || ""]; + } + + /** + * @param {Token} token + * @returns {boolean} + */ + commandBoundary(token) { + if ( + token.value == "end" || + token.value == "then" || + token.value == "else" || + token.value == "otherwise" || + token.value == ")" || + this.commandStart(token) || + this.featureStart(token) || + token.type == "EOF" + ) { + return true; + } + return false; + } + + /** + * @param {Tokens} tokens + * @returns {(string | ASTNode)[]} + */ + parseStringTemplate(tokens) { + /** @type {(string | ASTNode)[]} */ + var returnArr = [""]; + do { + returnArr.push(tokens.lastWhitespace()); + if (tokens.currentToken().value === "$") { + tokens.consumeToken(); + var startingBrace = tokens.matchOpToken("{"); + returnArr.push(this.requireElement("expression", tokens)); + if (startingBrace) { + tokens.requireOpToken("}"); + } + returnArr.push(""); + } else if (tokens.currentToken().value === "\\") { + tokens.consumeToken(); // skip next + tokens.consumeToken(); + } else { + var token = tokens.consumeToken(); + returnArr[returnArr.length - 1] += token ? token.value : ""; + } + } while (tokens.hasMore()); + returnArr.push(tokens.lastWhitespace()); + return returnArr; + } + + /** + * @param {ASTNode} commandList + */ + ensureTerminated(commandList) { + const runtime = this.runtime + var implicitReturn = { + type: "implicitReturn", + op: function (context) { + context.meta.returned = true; + if (context.meta.resolve) { + context.meta.resolve(); + } + return runtime.HALT; + }, + execute: function (ctx) { + // do nothing + }, + }; + + var end = commandList; + while (end.next) { + end = end.next; + } + end.next = implicitReturn; + } + } + + class Runtime { + /** + * + * @param {Lexer} [lexer] + * @param {Parser} [parser] + */ + constructor(lexer, parser) { + this.lexer = lexer ?? new Lexer; + this.parser = parser ?? new Parser(this) + .use(hyperscriptCoreGrammar) + .use(hyperscriptWebGrammar); + this.parser.runtime = this + } + + /** + * @param {HTMLElement} elt + * @param {string} selector + * @returns boolean + */ + matchesSelector(elt, selector) { + // noinspection JSUnresolvedVariable + var matchesFunction = + // @ts-ignore + elt.matches || elt.matchesSelector || elt.msMatchesSelector || elt.mozMatchesSelector || elt.webkitMatchesSelector || elt.oMatchesSelector; + return matchesFunction && matchesFunction.call(elt, selector); + } + + /** + * @param {string} eventName + * @param {Object} [detail] + * @returns {Event} + */ + makeEvent(eventName, detail) { + var evt; + if (globalScope.Event && typeof globalScope.Event === "function") { + evt = new Event(eventName, { + bubbles: true, + cancelable: true, + }); + evt['detail'] = detail; + } else { + evt = document.createEvent("CustomEvent"); + evt.initCustomEvent(eventName, true, true, detail); + } + return evt; + } + + /** + * @param {Element} elt + * @param {string} eventName + * @param {Object} [detail] + * @param {Element} [sender] + * @returns {boolean} + */ + triggerEvent(elt, eventName, detail, sender) { + detail = detail || {}; + detail["sender"] = sender; + var event = this.makeEvent(eventName, detail); + var eventResult = elt.dispatchEvent(event); + return eventResult; + } + + /** + * isArrayLike returns `true` if the provided value is an array or + * a NodeList (which is close enough to being an array for our purposes). + * + * @param {any} value + * @returns {value is Array | NodeList} + */ + isArrayLike(value) { + return Array.isArray(value) || + (typeof NodeList !== 'undefined' && (value instanceof NodeList || value instanceof HTMLCollection)); + } + + /** + * isIterable returns `true` if the provided value supports the + * iterator protocol. + * + * @param {any} value + * @returns {value is Iterable} + */ + isIterable(value) { + return typeof value === 'object' + && Symbol.iterator in value + && typeof value[Symbol.iterator] === 'function'; + } + + /** + * shouldAutoIterate returns `true` if the provided value + * should be implicitly iterated over when accessing properties, + * and as the target of some commands. + * + * Currently, this is when the value is an {ElementCollection} + * or {isArrayLike} returns true. + * + * @param {any} value + * @returns {value is (any[] | ElementCollection)} + */ + shouldAutoIterate(value) { + return value != null && value[shouldAutoIterateSymbol] || + this.isArrayLike(value); + } + + /** + * forEach executes the provided `func` on every item in the `value` array. + * if `value` is a single item (and not an array) then `func` is simply called + * once. If `value` is null, then no further actions are taken. + * + * @template T + * @param {T | Iterable} value + * @param {(item: T) => void} func + */ + forEach(value, func) { + if (value == null) { + // do nothing + } else if (this.isIterable(value)) { + for (const nth of value) { + func(nth); + } + } else if (this.isArrayLike(value)) { + for (var i = 0; i < value.length; i++) { + func(value[i]); + } + } else { + func(value); + } + } + + /** + * implicitLoop executes the provided `func` on: + * - every item of {value}, if {value} should be auto-iterated + * (see {shouldAutoIterate}) + * - {value} otherwise + * + * @template T + * @param {ElementCollection | T | T[]} value + * @param {(item: T) => void} func + */ + implicitLoop(value, func) { + if (this.shouldAutoIterate(value)) { + for (const x of value) func(x); + } else { + func(value); + } + } + + wrapArrays(args) { + var arr = []; + for (var i = 0; i < args.length; i++) { + var arg = args[i]; + if (Array.isArray(arg)) { + arr.push(Promise.all(arg)); + } else { + arr.push(arg); + } + } + return arr; + } + + unwrapAsyncs(values) { + for (var i = 0; i < values.length; i++) { + var value = values[i]; + if (value.asyncWrapper) { + values[i] = value.value; + } + if (Array.isArray(value)) { + for (var j = 0; j < value.length; j++) { + var valueElement = value[j]; + if (valueElement.asyncWrapper) { + value[j] = valueElement.value; + } + } + } + } + } + + static HALT = {}; + HALT = Runtime.HALT; + + /** + * @param {ASTNode} command + * @param {Context} ctx + */ + unifiedExec(command, ctx) { + while (true) { + try { + var next = this.unifiedEval(command, ctx); + } catch (e) { + if (ctx.meta.handlingFinally) { + console.error(" Exception in finally block: ", e); + next = Runtime.HALT; + } else { + this.registerHyperTrace(ctx, e); + if (ctx.meta.errorHandler && !ctx.meta.handlingError) { + ctx.meta.handlingError = true; + ctx.locals[ctx.meta.errorSymbol] = e; + command = ctx.meta.errorHandler; + continue; + } else { + ctx.meta.currentException = e; + next = Runtime.HALT; + } + } + } + if (next == null) { + console.error(command, " did not return a next element to execute! context: ", ctx); + return; + } else if (next.then) { + next.then(resolvedNext => { + this.unifiedExec(resolvedNext, ctx); + }).catch(reason => { + this.unifiedExec({ // Anonymous command to simply throw the exception + op: function(){ + throw reason; + } + }, ctx); + }); + return; + } else if (next === Runtime.HALT) { + if (ctx.meta.finallyHandler && !ctx.meta.handlingFinally) { + ctx.meta.handlingFinally = true; + command = ctx.meta.finallyHandler; + } else { + if (ctx.meta.onHalt) { + ctx.meta.onHalt(); + } + if (ctx.meta.currentException) { + if (ctx.meta.reject) { + ctx.meta.reject(ctx.meta.currentException); + return; + } else { + throw ctx.meta.currentException; + } + } else { + return; + } + } + } else { + command = next; // move to the next command + } + } + } + + /** + * @param {*} parseElement + * @param {Context} ctx + * @returns {*} + */ + unifiedEval(parseElement, ctx) { + /** @type any[] */ + var args = [ctx]; + var async = false; + var wrappedAsyncs = false; + + if (parseElement.args) { + for (var i = 0; i < parseElement.args.length; i++) { + var argument = parseElement.args[i]; + if (argument == null) { + args.push(null); + } else if (Array.isArray(argument)) { + var arr = []; + for (var j = 0; j < argument.length; j++) { + var element = argument[j]; + var value = element ? element.evaluate(ctx) : null; // OK + if (value) { + if (value.then) { + async = true; + } else if (value.asyncWrapper) { + wrappedAsyncs = true; + } + } + arr.push(value); + } + args.push(arr); + } else if (argument.evaluate) { + var value = argument.evaluate(ctx); // OK + if (value) { + if (value.then) { + async = true; + } else if (value.asyncWrapper) { + wrappedAsyncs = true; + } + } + args.push(value); + } else { + args.push(argument); + } + } + } + if (async) { + return new Promise((resolve, reject) => { + args = this.wrapArrays(args); + Promise.all(args) + .then(function (values) { + if (wrappedAsyncs) { + this.unwrapAsyncs(values); + } + try { + var apply = parseElement.op.apply(parseElement, values); + resolve(apply); + } catch (e) { + reject(e); + } + }) + .catch(function (reason) { + reject(reason); + }); + }); + } else { + if (wrappedAsyncs) { + this.unwrapAsyncs(args); + } + return parseElement.op.apply(parseElement, args); + } + } + + /** + * @type {string[] | null} + */ + _scriptAttrs = null; + + /** + * getAttributes returns the attribute name(s) to use when + * locating hyperscript scripts in a DOM element. If no value + * has been configured, it defaults to config.attributes + * @returns string[] + */ + getScriptAttributes() { + if (this._scriptAttrs == null) { + this._scriptAttrs = config.attributes.replace(/ /g, "").split(","); + } + return this._scriptAttrs; + } + + /** + * @param {Element} elt + * @returns {string | null} + */ + getScript(elt) { + for (var i = 0; i < this.getScriptAttributes().length; i++) { + var scriptAttribute = this.getScriptAttributes()[i]; + if (elt.hasAttribute && elt.hasAttribute(scriptAttribute)) { + return elt.getAttribute(scriptAttribute); + } + } + if (elt instanceof HTMLScriptElement && elt.type === "text/hyperscript") { + return elt.innerText; + } + return null; + } + + hyperscriptFeaturesMap = new WeakMap + + /** + * @param {*} elt + * @returns {Object} + */ + getHyperscriptFeatures(elt) { + var hyperscriptFeatures = this.hyperscriptFeaturesMap.get(elt); + if (typeof hyperscriptFeatures === 'undefined') { + if (elt) { + // in some rare cases, elt is null and this line crashes + this.hyperscriptFeaturesMap.set(elt, hyperscriptFeatures = {}); + } + } + return hyperscriptFeatures; + } + + /** + * @param {Object} owner + * @param {Context} ctx + */ + addFeatures(owner, ctx) { + if (owner) { + Object.assign(ctx.locals, this.getHyperscriptFeatures(owner)); + this.addFeatures(owner.parentElement, ctx); + } + } + + /** + * @param {*} owner + * @param {*} feature + * @param {*} hyperscriptTarget + * @param {*} event + * @returns {Context} + */ + makeContext(owner, feature, hyperscriptTarget, event) { + return new Context(owner, feature, hyperscriptTarget, event, this) + } + + /** + * @returns string + */ + getScriptSelector() { + return this.getScriptAttributes() + .map(function (attribute) { + return "[" + attribute + "]"; + }) + .join(", "); + } + + /** + * @param {any} value + * @param {string} type + * @returns {any} + */ + convertValue(value, type) { + var dynamicResolvers = conversions.dynamicResolvers; + for (var i = 0; i < dynamicResolvers.length; i++) { + var dynamicResolver = dynamicResolvers[i]; + var converted = dynamicResolver(type, value); + if (converted !== undefined) { + return converted; + } + } + + if (value == null) { + return null; + } + var converter = conversions[type]; + if (converter) { + return converter(value); + } + + throw "Unknown conversion : " + type; + } + + /** + * @param {string} src + * @returns {ASTNode} + */ + parse(src) { + const lexer = this.lexer, parser = this.parser + var tokens = lexer.tokenize(src); + if (this.parser.commandStart(tokens.currentToken())) { + var commandList = parser.requireElement("commandList", tokens); + if (tokens.hasMore()) parser.raiseParseError(tokens); + parser.ensureTerminated(commandList); + return commandList; + } else if (parser.featureStart(tokens.currentToken())) { + var hyperscript = parser.requireElement("hyperscript", tokens); + if (tokens.hasMore()) parser.raiseParseError(tokens); + return hyperscript; + } else { + var expression = parser.requireElement("expression", tokens); + if (tokens.hasMore()) parser.raiseParseError(tokens); + return expression; + } + } + + /** + * + * @param {ASTNode} elt + * @param {Context} ctx + * @returns {any} + */ + evaluateNoPromise(elt, ctx) { + let result = elt.evaluate(ctx); + if (result.next) { + throw new Error(Tokens.sourceFor.call(elt) + " returned a Promise in a context that they are not allowed."); + } + return result; + } + + /** + * @param {string} src + * @param {Partial} [ctx] + * @param {Object} [args] + * @returns {any} + */ + evaluate(src, ctx, args) { + class HyperscriptModule extends EventTarget { + constructor(mod) { + super(); + this.module = mod; + } + toString() { + return this.module.id; + } + } + + var body = 'document' in globalScope + ? globalScope.document.body + : new HyperscriptModule(args && args.module); + ctx = Object.assign(this.makeContext(body, null, body, null), ctx || {}); + var element = this.parse(src); + if (element.execute) { + element.execute(ctx); + if(typeof ctx.meta.returnValue !== 'undefined'){ + return ctx.meta.returnValue; + } else { + return ctx.result; + } + } else if (element.apply) { + element.apply(body, body, args); + return this.getHyperscriptFeatures(body); + } else { + return element.evaluate(ctx); + } + + function makeModule() { + return {} + } + } + + /** + * @param {HTMLElement} elt + */ + processNode(elt) { + var selector = this.getScriptSelector(); + if (this.matchesSelector(elt, selector)) { + this.initElement(elt, elt); + } + if (elt instanceof HTMLScriptElement && elt.type === "text/hyperscript") { + this.initElement(elt, document.body); + } + if (elt.querySelectorAll) { + this.forEach(elt.querySelectorAll(selector + ", [type='text/hyperscript']"), elt => { + this.initElement(elt, elt instanceof HTMLScriptElement && elt.type === "text/hyperscript" ? document.body : elt); + }); + } + } + + /** + * @param {Element} elt + * @param {Element} [target] + */ + initElement(elt, target) { + if (elt.closest && elt.closest(config.disableSelector)) { + return; + } + var internalData = this.getInternalData(elt); + if (!internalData.initialized) { + var src = this.getScript(elt); + if (src) { + try { + internalData.initialized = true; + internalData.script = src; + const lexer = this.lexer, parser = this.parser + var tokens = lexer.tokenize(src); + var hyperScript = parser.parseHyperScript(tokens); + if (!hyperScript) return; + hyperScript.apply(target || elt, elt); + setTimeout(() => { + this.triggerEvent(target || elt, "load", { + hyperscript: true, + }); + }, 1); + } catch (e) { + this.triggerEvent(elt, "exception", { + error: e, + }); + console.error( + "hyperscript errors were found on the following element:", + elt, + "\n\n", + e.message, + e.stack + ); + } + } + } + } + + internalDataMap = new WeakMap + + /** + * @param {Element} elt + * @returns {Object} + */ + getInternalData(elt) { + var internalData = this.internalDataMap.get(elt); + if (typeof internalData === 'undefined') { + this.internalDataMap.set(elt, internalData = {}); + } + return internalData; + } + + /** + * @param {any} value + * @param {string} typeString + * @param {boolean} [nullOk] + * @returns {boolean} + */ + typeCheck(value, typeString, nullOk) { + if (value == null && nullOk) { + return true; + } + var typeName = Object.prototype.toString.call(value).slice(8, -1); + return typeName === typeString; + } + + getElementScope(context) { + var elt = context.meta && context.meta.owner; + if (elt) { + var internalData = this.getInternalData(elt); + var scopeName = "elementScope"; + if (context.meta.feature && context.meta.feature.behavior) { + scopeName = context.meta.feature.behavior + "Scope"; + } + var elementScope = getOrInitObject(internalData, scopeName); + return elementScope; + } else { + return {}; // no element, return empty scope + } + } + + /** + * @param {string} str + * @returns {boolean} + */ + isReservedWord(str) { + return ["meta", "it", "result", "locals", "event", "target", "detail", "sender", "body"].includes(str) + } + + /** + * @param {any} context + * @returns {boolean} + */ + isHyperscriptContext(context) { + return context instanceof Context; + } + + /** + * @param {string} str + * @param {Context} context + * @returns {any} + */ + resolveSymbol(str, context, type) { + if (str === "me" || str === "my" || str === "I") { + return context.me; + } + if (str === "it" || str === "its" || str === "result") { + return context.result; + } + if (str === "you" || str === "your" || str === "yourself") { + return context.you; + } else { + if (type === "global") { + return globalScope[str]; + } else if (type === "element") { + var elementScope = this.getElementScope(context); + return elementScope[str]; + } else if (type === "local") { + return context.locals[str]; + } else { + // meta scope (used for event conditionals) + if (context.meta && context.meta.context) { + var fromMetaContext = context.meta.context[str]; + if (typeof fromMetaContext !== "undefined") { + return fromMetaContext; + } + // resolve against the `detail` object in the meta context as well + if (context.meta.context.detail) { + fromMetaContext = context.meta.context.detail[str]; + if (typeof fromMetaContext !== "undefined") { + return fromMetaContext; + } + } + } + if (this.isHyperscriptContext(context) && !this.isReservedWord(str)) { + // local scope + var fromContext = context.locals[str]; + } else { + // direct get from normal JS object or top-level of context + var fromContext = context[str]; + } + if (typeof fromContext !== "undefined") { + return fromContext; + } else { + // element scope + var elementScope = this.getElementScope(context); + fromContext = elementScope[str]; + if (typeof fromContext !== "undefined") { + return fromContext; + } else { + // global scope + return globalScope[str]; + } + } + } + } + } + + setSymbol(str, context, type, value) { + if (type === "global") { + globalScope[str] = value; + } else if (type === "element") { + var elementScope = this.getElementScope(context); + elementScope[str] = value; + } else if (type === "local") { + context.locals[str] = value; + } else { + if (this.isHyperscriptContext(context) && !this.isReservedWord(str) && typeof context.locals[str] !== "undefined") { + // local scope + context.locals[str] = value; + } else { + // element scope + var elementScope = this.getElementScope(context); + var fromContext = elementScope[str]; + if (typeof fromContext !== "undefined") { + elementScope[str] = value; + } else { + if (this.isHyperscriptContext(context) && !this.isReservedWord(str)) { + // local scope + context.locals[str] = value; + } else { + // direct set on normal JS object or top-level of context + context[str] = value; + } + } + } + } + } + + /** + * @param {ASTNode} command + * @param {Context} context + * @returns {undefined | ASTNode} + */ + findNext(command, context) { + if (command) { + if (command.resolveNext) { + return command.resolveNext(context); + } else if (command.next) { + return command.next; + } else { + return this.findNext(command.parent, context); + } + } + } + + /** + * @param {Object} root + * @param {string} property + * @param {Getter} getter + * @returns {any} + * + * @callback Getter + * @param {Object} root + * @param {string} property + */ + flatGet(root, property, getter) { + if (root != null) { + var val = getter(root, property); + if (typeof val !== "undefined") { + return val; + } + + if (this.shouldAutoIterate(root)) { + // flat map + var result = []; + for (var component of root) { + var componentValue = getter(component, property); + result.push(componentValue); + } + return result; + } + } + } + + resolveProperty(root, property) { + return this.flatGet(root, property, (root, property) => root[property] ) + } + + resolveAttribute(root, property) { + return this.flatGet(root, property, (root, property) => root.getAttribute && root.getAttribute(property) ) + } + + /** + * + * @param {Object} root + * @param {string} property + * @returns {string} + */ + resolveStyle(root, property) { + return this.flatGet(root, property, (root, property) => root.style && root.style[property] ) + } + + /** + * + * @param {Object} root + * @param {string} property + * @returns {string} + */ + resolveComputedStyle(root, property) { + return this.flatGet(root, property, (root, property) => getComputedStyle( + /** @type {Element} */ (root)).getPropertyValue(property) ) + } + + /** + * @param {Element} elt + * @param {string[]} nameSpace + * @param {string} name + * @param {any} value + */ + assignToNamespace(elt, nameSpace, name, value) { + let root + if (typeof document !== "undefined" && elt === document.body) { + root = globalScope; + } else { + root = this.getHyperscriptFeatures(elt); + } + var propertyName; + while ((propertyName = nameSpace.shift()) !== undefined) { + var newRoot = root[propertyName]; + if (newRoot == null) { + newRoot = {}; + root[propertyName] = newRoot; + } + root = newRoot; + } + + root[name] = value; + } + + getHyperTrace(ctx, thrown) { + var trace = []; + var root = ctx; + while (root.meta.caller) { + root = root.meta.caller; + } + if (root.meta.traceMap) { + return root.meta.traceMap.get(thrown, trace); + } + } + + registerHyperTrace(ctx, thrown) { + var trace = []; + var root = null; + while (ctx != null) { + trace.push(ctx); + root = ctx; + ctx = ctx.meta.caller; + } + if (root.meta.traceMap == null) { + root.meta.traceMap = new Map(); // TODO - WeakMap? + } + if (!root.meta.traceMap.get(thrown)) { + var traceEntry = { + trace: trace, + print: function (logger) { + logger = logger || console.error; + logger("hypertrace /// "); + var maxLen = 0; + for (var i = 0; i < trace.length; i++) { + maxLen = Math.max(maxLen, trace[i].meta.feature.displayName.length); + } + for (var i = 0; i < trace.length; i++) { + var traceElt = trace[i]; + logger( + " ->", + traceElt.meta.feature.displayName.padEnd(maxLen + 2), + "-", + traceElt.meta.owner + ); + } + }, + }; + root.meta.traceMap.set(thrown, traceEntry); + } + } + + /** + * @param {string} str + * @returns {string} + */ + escapeSelector(str) { + return str.replace(/:/g, function (str) { + return "\\" + str; + }); + } + + /** + * @param {any} value + * @param {*} elt + */ + nullCheck(value, elt) { + if (value == null) { + throw new Error("'" + elt.sourceFor() + "' is null"); + } + } + + /** + * @param {any} value + * @returns {boolean} + */ + isEmpty(value) { + return value == undefined || value.length === 0; + } + + /** + * @param {any} value + * @returns {boolean} + */ + doesExist(value) { + if(value == null){ + return false; + } + if (this.shouldAutoIterate(value)) { + for (const elt of value) { + return true; + } + return false; + } + return true; + } + + /** + * @param {Node} node + * @returns {Document|ShadowRoot} + */ + getRootNode(node) { + if (node && node instanceof Node) { + var rv = node.getRootNode(); + if (rv instanceof Document || rv instanceof ShadowRoot) return rv; + } + return document; + } + + /** + * + * @param {Element} elt + * @param {ASTNode} onFeature + * @returns {EventQueue} + * + * @typedef {{queue:Array, executing:boolean}} EventQueue + */ + getEventQueueFor(elt, onFeature) { + let internalData = this.getInternalData(elt); + var eventQueuesForElt = internalData.eventQueues; + if (eventQueuesForElt == null) { + eventQueuesForElt = new Map(); + internalData.eventQueues = eventQueuesForElt; + } + var eventQueueForFeature = eventQueuesForElt.get(onFeature); + if (eventQueueForFeature == null) { + eventQueueForFeature = {queue:[], executing:false}; + eventQueuesForElt.set(onFeature, eventQueueForFeature); + } + return eventQueueForFeature; + } + + beepValueToConsole(element, expression, value) { + if (this.triggerEvent(element, "hyperscript:beep", {element, expression, value})) { + var typeName; + if (value) { + if (value instanceof ElementCollection) { + typeName = "ElementCollection"; + } else if (value.constructor) { + typeName = value.constructor.name; + } else { + typeName = "unknown"; + } + } else { + typeName = "object (null)" + } + var logValue = value; + if (typeName === "String") { + logValue = '"' + logValue + '"'; + } else if (value instanceof ElementCollection) { + logValue = Array.from(value); + } + console.log("///_ BEEP! The expression (" + Tokens.sourceFor.call(expression).replace("beep! ", "") + ") evaluates to:", logValue, "of type " + typeName); + } + } + + + /** @type string | null */ + // @ts-ignore + hyperscriptUrl = "document" in globalScope && document.currentScript ? document.currentScript.src : null; + } + + + function getCookiesAsArray() { + let cookiesAsArray = document.cookie + .split("; ") + .map(cookieEntry => { + let strings = cookieEntry.split("="); + return {name: strings[0], value: decodeURIComponent(strings[1])} + }); + return cookiesAsArray; + } + + function clearCookie(name) { + document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:00 GMT"; + } + + function clearAllCookies() { + for (const cookie of getCookiesAsArray()) { + clearCookie(cookie.name); + } + } + + const CookieJar = new Proxy({}, { + get(target, prop) { + if (prop === 'then' || prop === 'asyncWrapper') { // ignore special symbols + return null; + } else if (prop === 'length') { + return getCookiesAsArray().length + } else if (prop === 'clear') { + return clearCookie; + } else if (prop === 'clearAll') { + return clearAllCookies; + } else if (typeof prop === "string") { + if (!isNaN(prop)) { + return getCookiesAsArray()[parseInt(prop)]; + + } else { + let value = document.cookie + .split("; ") + .find((row) => row.startsWith(prop + "=")) + ?.split("=")[1]; + if(value) { + return decodeURIComponent(value); + } + } + } else if (prop === Symbol.iterator) { + return getCookiesAsArray()[prop]; + } + }, + set(target, prop, value) { + var finalValue = null; + if ('string' === typeof value) { + finalValue = encodeURIComponent(value) + finalValue += ";samesite=lax" + } else { + finalValue = encodeURIComponent(value.value); + if (value.expires) { + finalValue+=";expires=" + value.maxAge; + } + if (value.maxAge) { + finalValue+=";max-age=" + value.maxAge; + } + if (value.partitioned) { + finalValue+=";partitioned=" + value.partitioned; + } + if (value.path) { + finalValue+=";path=" + value.path; + } + if (value.samesite) { + finalValue+=";samesite=" + value.path; + } + if (value.secure) { + finalValue+=";secure=" + value.path; + } + } + document.cookie= prop + "=" + finalValue; + return true; + } + }) + + class Context { + /** + * @param {*} owner + * @param {*} feature + * @param {*} hyperscriptTarget + * @param {*} event + */ + constructor(owner, feature, hyperscriptTarget, event, runtime) { + this.meta = { + parser: runtime.parser, + lexer: runtime.lexer, + runtime, + owner: owner, + feature: feature, + iterators: {}, + ctx: this + } + this.locals = { + cookies:CookieJar + }; + this.me = hyperscriptTarget, + this.you = undefined + this.result = undefined + this.event = event; + this.target = event ? event.target : null; + this.detail = event ? event.detail : null; + this.sender = event ? event.detail ? event.detail.sender : null : null; + this.body = "document" in globalScope ? document.body : null; + runtime.addFeatures(owner, this); + } + } + + class ElementCollection { + constructor(css, relativeToElement, escape) { + this._css = css; + this.relativeToElement = relativeToElement; + this.escape = escape; + this[shouldAutoIterateSymbol] = true; + } + + get css() { + if (this.escape) { + return Runtime.prototype.escapeSelector(this._css); + } else { + return this._css; + } + } + + get className() { + return this._css.substr(1); + } + + get id() { + return this.className(); + } + + contains(elt) { + for (let element of this) { + if (element.contains(elt)) { + return true; + } + } + return false; + } + + get length() { + return this.selectMatches().length; + } + + [Symbol.iterator]() { + let query = this.selectMatches(); + return query [Symbol.iterator](); + } + + selectMatches() { + let query = Runtime.prototype.getRootNode(this.relativeToElement).querySelectorAll(this.css); + return query; + } + } + + /** + * @type {symbol} + */ + const shouldAutoIterateSymbol = Symbol() + + function getOrInitObject(root, prop) { + var value = root[prop]; + if (value) { + return value; + } else { + var newObj = {}; + root[prop] = newObj; + return newObj; + } + } + + /** + * parseJSON parses a JSON string into a corresponding value. If the + * value passed in is not valid JSON, then it logs an error and returns `null`. + * + * @param {string} jString + * @returns any + */ + function parseJSON(jString) { + try { + return JSON.parse(jString); + } catch (error) { + logError(error); + return null; + } + } + + /** + * logError writes an error message to the Javascript console. It can take any + * value, but msg should commonly be a simple string. + * @param {*} msg + */ + function logError(msg) { + if (console.error) { + console.error(msg); + } else if (console.log) { + console.log("ERROR: ", msg); + } + } + + // TODO: JSDoc description of what's happening here + function varargConstructor(Cls, args) { + return new (Cls.bind.apply(Cls, [Cls].concat(args)))(); + } + + // Grammar + + /** + * @param {Parser} parser + */ + function hyperscriptCoreGrammar(parser) { + parser.addLeafExpression("parenthesized", function (parser, _runtime, tokens) { + if (tokens.matchOpToken("(")) { + var follows = tokens.clearFollows(); + try { + var expr = parser.requireElement("expression", tokens); + } finally { + tokens.restoreFollows(follows); + } + tokens.requireOpToken(")"); + return expr; + } + }); + + parser.addLeafExpression("string", function (parser, runtime, tokens) { + var stringToken = tokens.matchTokenType("STRING"); + if (!stringToken) return; + var rawValue = /** @type {string} */ (stringToken.value); + /** @type {any[]} */ + var args; + if (stringToken.template) { + var innerTokens = Lexer.tokenize(rawValue, true); + args = parser.parseStringTemplate(innerTokens); + } else { + args = []; + } + return { + type: "string", + token: stringToken, + args: args, + op: function (context) { + var returnStr = ""; + for (var i = 1; i < arguments.length; i++) { + var val = arguments[i]; + if (val !== undefined) { + returnStr += val; + } + } + return returnStr; + }, + evaluate: function (context) { + if (args.length === 0) { + return rawValue; + } else { + return runtime.unifiedEval(this, context); + } + }, + }; + }); + + parser.addGrammarElement("nakedString", function (parser, runtime, tokens) { + if (tokens.hasMore()) { + var tokenArr = tokens.consumeUntilWhitespace(); + tokens.matchTokenType("WHITESPACE"); + return { + type: "nakedString", + tokens: tokenArr, + evaluate: function (context) { + return tokenArr + .map(function (t) { + return t.value; + }) + .join(""); + }, + }; + } + }); + + parser.addLeafExpression("number", function (parser, runtime, tokens) { + var number = tokens.matchTokenType("NUMBER"); + if (!number) return; + var numberToken = number; + var value = parseFloat(/** @type {string} */ (number.value)); + return { + type: "number", + value: value, + numberToken: numberToken, + evaluate: function () { + return value; + }, + }; + }); + + parser.addLeafExpression("idRef", function (parser, runtime, tokens) { + var elementId = tokens.matchTokenType("ID_REF"); + if (!elementId) return; + if (!elementId.value) return; + // TODO - unify these two expression types + if (elementId.template) { + var templateValue = elementId.value.substring(2); + var innerTokens = Lexer.tokenize(templateValue); + var innerExpression = parser.requireElement("expression", innerTokens); + return { + type: "idRefTemplate", + args: [innerExpression], + op: function (context, arg) { + return runtime.getRootNode(context.me).getElementById(arg); + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + } else { + const value = elementId.value.substring(1); + return { + type: "idRef", + css: elementId.value, + value: value, + evaluate: function (context) { + return ( + runtime.getRootNode(context.me).getElementById(value) + ); + }, + }; + } + }); + + parser.addLeafExpression("classRef", function (parser, runtime, tokens) { + var classRef = tokens.matchTokenType("CLASS_REF"); + + if (!classRef) return; + if (!classRef.value) return; + + // TODO - unify these two expression types + if (classRef.template) { + var templateValue = classRef.value.substring(2); + var innerTokens = Lexer.tokenize(templateValue); + var innerExpression = parser.requireElement("expression", innerTokens); + return { + type: "classRefTemplate", + args: [innerExpression], + op: function (context, arg) { + return new ElementCollection("." + arg, context.me, true) + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + } else { + const css = classRef.value; + return { + type: "classRef", + css: css, + evaluate: function (context) { + return new ElementCollection(css, context.me, true) + }, + }; + } + }); + + class TemplatedQueryElementCollection extends ElementCollection { + constructor(css, relativeToElement, templateParts) { + super(css, relativeToElement); + this.templateParts = templateParts; + this.elements = templateParts.filter(elt => elt instanceof Element); + } + + get css() { + let rv = "", i = 0 + for (const val of this.templateParts) { + if (val instanceof Element) { + rv += "[data-hs-query-id='" + i++ + "']"; + } else rv += val; + } + return rv; + } + + [Symbol.iterator]() { + this.elements.forEach((el, i) => el.dataset.hsQueryId = i); + const rv = super[Symbol.iterator](); + this.elements.forEach(el => el.removeAttribute('data-hs-query-id')); + return rv; + } + } + + parser.addLeafExpression("queryRef", function (parser, runtime, tokens) { + var queryStart = tokens.matchOpToken("<"); + if (!queryStart) return; + var queryTokens = tokens.consumeUntil("/"); + tokens.requireOpToken("/"); + tokens.requireOpToken(">"); + var queryValue = queryTokens + .map(function (t) { + if (t.type === "STRING") { + return '"' + t.value + '"'; + } else { + return t.value; + } + }) + .join(""); + + var template, innerTokens, args; + if (queryValue.indexOf("$") >= 0) { + template = true; + innerTokens = Lexer.tokenize(queryValue, true); + args = parser.parseStringTemplate(innerTokens); + } + + return { + type: "queryRef", + css: queryValue, + args: args, + op: function (context, ...args) { + if (template) { + return new TemplatedQueryElementCollection(queryValue, context.me, args) + } else { + return new ElementCollection(queryValue, context.me) + } + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + }); + + parser.addLeafExpression("attributeRef", function (parser, runtime, tokens) { + var attributeRef = tokens.matchTokenType("ATTRIBUTE_REF"); + if (!attributeRef) return; + if (!attributeRef.value) return; + var outerVal = attributeRef.value; + if (outerVal.indexOf("[") === 0) { + var innerValue = outerVal.substring(2, outerVal.length - 1); + } else { + var innerValue = outerVal.substring(1); + } + var css = "[" + innerValue + "]"; + var split = innerValue.split("="); + var name = split[0]; + var value = split[1]; + if (value) { + // strip quotes + if (value.indexOf('"') === 0) { + value = value.substring(1, value.length - 1); + } + } + return { + type: "attributeRef", + name: name, + css: css, + value: value, + op: function (context) { + var target = context.you || context.me; + if (target) { + return target.getAttribute(name); + } + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + }); + + parser.addLeafExpression("styleRef", function (parser, runtime, tokens) { + var styleRef = tokens.matchTokenType("STYLE_REF"); + if (!styleRef) return; + if (!styleRef.value) return; + var styleProp = styleRef.value.substr(1); + if (styleProp.startsWith("computed-")) { + styleProp = styleProp.substr("computed-".length); + return { + type: "computedStyleRef", + name: styleProp, + op: function (context) { + var target = context.you || context.me; + if (target) { + return runtime.resolveComputedStyle(target, styleProp); + } + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + } else { + return { + type: "styleRef", + name: styleProp, + op: function (context) { + var target = context.you || context.me; + if (target) { + return runtime.resolveStyle(target, styleProp); + } + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + } + }); + + parser.addGrammarElement("objectKey", function (parser, runtime, tokens) { + var token; + if ((token = tokens.matchTokenType("STRING"))) { + return { + type: "objectKey", + key: token.value, + evaluate: function () { + return token.value; + }, + }; + } else if (tokens.matchOpToken("[")) { + var expr = parser.parseElement("expression", tokens); + tokens.requireOpToken("]"); + return { + type: "objectKey", + expr: expr, + args: [expr], + op: function (ctx, expr) { + return expr; + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + } else { + var key = ""; + do { + token = tokens.matchTokenType("IDENTIFIER") || tokens.matchOpToken("-"); + if (token) key += token.value; + } while (token); + return { + type: "objectKey", + key: key, + evaluate: function () { + return key; + }, + }; + } + }); + + parser.addLeafExpression("objectLiteral", function (parser, runtime, tokens) { + if (!tokens.matchOpToken("{")) return; + var keyExpressions = []; + var valueExpressions = []; + if (!tokens.matchOpToken("}")) { + do { + var name = parser.requireElement("objectKey", tokens); + tokens.requireOpToken(":"); + var value = parser.requireElement("expression", tokens); + valueExpressions.push(value); + keyExpressions.push(name); + } while (tokens.matchOpToken(",")); + tokens.requireOpToken("}"); + } + return { + type: "objectLiteral", + args: [keyExpressions, valueExpressions], + op: function (context, keys, values) { + var returnVal = {}; + for (var i = 0; i < keys.length; i++) { + returnVal[keys[i]] = values[i]; + } + return returnVal; + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + }); + + parser.addGrammarElement("nakedNamedArgumentList", function (parser, runtime, tokens) { + var fields = []; + var valueExpressions = []; + if (tokens.currentToken().type === "IDENTIFIER") { + do { + var name = tokens.requireTokenType("IDENTIFIER"); + tokens.requireOpToken(":"); + var value = parser.requireElement("expression", tokens); + valueExpressions.push(value); + fields.push({ name: name, value: value }); + } while (tokens.matchOpToken(",")); + } + return { + type: "namedArgumentList", + fields: fields, + args: [valueExpressions], + op: function (context, values) { + var returnVal = { _namedArgList_: true }; + for (var i = 0; i < values.length; i++) { + var field = fields[i]; + returnVal[field.name.value] = values[i]; + } + return returnVal; + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + }); + + parser.addGrammarElement("namedArgumentList", function (parser, runtime, tokens) { + if (!tokens.matchOpToken("(")) return; + var elt = parser.requireElement("nakedNamedArgumentList", tokens); + tokens.requireOpToken(")"); + return elt; + }); + + parser.addGrammarElement("symbol", function (parser, runtime, tokens) { + /** @scope {SymbolScope} */ + var scope = "default"; + if (tokens.matchToken("global")) { + scope = "global"; + } else if (tokens.matchToken("element") || tokens.matchToken("module")) { + scope = "element"; + // optional possessive + if (tokens.matchOpToken("'")) { + tokens.requireToken("s"); + } + } else if (tokens.matchToken("local")) { + scope = "local"; + } + + // TODO better look ahead here + let eltPrefix = tokens.matchOpToken(":"); + let identifier = tokens.matchTokenType("IDENTIFIER"); + if (identifier && identifier.value) { + var name = identifier.value; + if (eltPrefix) { + name = ":" + name; + } + if (scope === "default") { + if (name.indexOf("$") === 0) { + scope = "global"; + } + if (name.indexOf(":") === 0) { + scope = "element"; + } + } + return { + type: "symbol", + token: identifier, + scope: scope, + name: name, + evaluate: function (context) { + return runtime.resolveSymbol(name, context, scope); + }, + }; + } + }); + + parser.addGrammarElement("implicitMeTarget", function (parser, runtime, tokens) { + return { + type: "implicitMeTarget", + evaluate: function (context) { + return context.you || context.me; + }, + }; + }); + + parser.addLeafExpression("boolean", function (parser, runtime, tokens) { + var booleanLiteral = tokens.matchToken("true") || tokens.matchToken("false"); + if (!booleanLiteral) return; + const value = booleanLiteral.value === "true"; + return { + type: "boolean", + evaluate: function (context) { + return value; + }, + }; + }); + + parser.addLeafExpression("null", function (parser, runtime, tokens) { + if (tokens.matchToken("null")) { + return { + type: "null", + evaluate: function (context) { + return null; + }, + }; + } + }); + + parser.addLeafExpression("arrayLiteral", function (parser, runtime, tokens) { + if (!tokens.matchOpToken("[")) return; + var values = []; + if (!tokens.matchOpToken("]")) { + do { + var expr = parser.requireElement("expression", tokens); + values.push(expr); + } while (tokens.matchOpToken(",")); + tokens.requireOpToken("]"); + } + return { + type: "arrayLiteral", + values: values, + args: [values], + op: function (context, values) { + return values; + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + }); + + parser.addLeafExpression("blockLiteral", function (parser, runtime, tokens) { + if (!tokens.matchOpToken("\\")) return; + var args = []; + var arg1 = tokens.matchTokenType("IDENTIFIER"); + if (arg1) { + args.push(arg1); + while (tokens.matchOpToken(",")) { + args.push(tokens.requireTokenType("IDENTIFIER")); + } + } + // TODO compound op token + tokens.requireOpToken("-"); + tokens.requireOpToken(">"); + var expr = parser.requireElement("expression", tokens); + return { + type: "blockLiteral", + args: args, + expr: expr, + evaluate: function (ctx) { + var returnFunc = function () { + //TODO - push scope + for (var i = 0; i < args.length; i++) { + ctx.locals[args[i].value] = arguments[i]; + } + return expr.evaluate(ctx); //OK + }; + return returnFunc; + }, + }; + }); + + parser.addIndirectExpression("propertyAccess", function (parser, runtime, tokens, root) { + if (!tokens.matchOpToken(".")) return; + var prop = tokens.requireTokenType("IDENTIFIER"); + var propertyAccess = { + type: "propertyAccess", + root: root, + prop: prop, + args: [root], + op: function (_context, rootVal) { + var value = runtime.resolveProperty(rootVal, prop.value); + return value; + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + return parser.parseElement("indirectExpression", tokens, propertyAccess); + }); + + parser.addIndirectExpression("of", function (parser, runtime, tokens, root) { + if (!tokens.matchToken("of")) return; + var newRoot = parser.requireElement("unaryExpression", tokens); + // find the urroot + var childOfUrRoot = null; + var urRoot = root; + while (urRoot.root) { + childOfUrRoot = urRoot; + urRoot = urRoot.root; + } + if (urRoot.type !== "symbol" && urRoot.type !== "attributeRef" && urRoot.type !== "styleRef" && urRoot.type !== "computedStyleRef") { + parser.raiseParseError(tokens, "Cannot take a property of a non-symbol: " + urRoot.type); + } + var attribute = urRoot.type === "attributeRef"; + var style = urRoot.type === "styleRef" || urRoot.type === "computedStyleRef"; + if (attribute || style) { + var attributeElt = urRoot + } + var prop = urRoot.name; + + var propertyAccess = { + type: "ofExpression", + prop: urRoot.token, + root: newRoot, + attribute: attributeElt, + expression: root, + args: [newRoot], + op: function (context, rootVal) { + if (attribute) { + return runtime.resolveAttribute(rootVal, prop); + } else if (style) { + if (urRoot.type === "computedStyleRef") { + return runtime.resolveComputedStyle(rootVal, prop); + } else { + return runtime.resolveStyle(rootVal, prop); + } + } else { + return runtime.resolveProperty(rootVal, prop); + } + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + + if (urRoot.type === "attributeRef") { + propertyAccess.attribute = urRoot; + } + if (childOfUrRoot) { + childOfUrRoot.root = propertyAccess; + childOfUrRoot.args = [propertyAccess]; + } else { + root = propertyAccess; + } + + return parser.parseElement("indirectExpression", tokens, root); + }); + + parser.addIndirectExpression("possessive", function (parser, runtime, tokens, root) { + if (parser.possessivesDisabled) { + return; + } + var apostrophe = tokens.matchOpToken("'"); + if ( + apostrophe || + (root.type === "symbol" && + (root.name === "my" || root.name === "its" || root.name === "your") && + (tokens.currentToken().type === "IDENTIFIER" || tokens.currentToken().type === "ATTRIBUTE_REF" || tokens.currentToken().type === "STYLE_REF")) + ) { + if (apostrophe) { + tokens.requireToken("s"); + } + + var attribute, style, prop; + attribute = parser.parseElement("attributeRef", tokens); + if (attribute == null) { + style = parser.parseElement("styleRef", tokens); + if (style == null) { + prop = tokens.requireTokenType("IDENTIFIER"); + } + } + var propertyAccess = { + type: "possessive", + root: root, + attribute: attribute || style, + prop: prop, + args: [root], + op: function (context, rootVal) { + if (attribute) { + // @ts-ignore + var value = runtime.resolveAttribute(rootVal, attribute.name); + } else if (style) { + var value + if (style.type === 'computedStyleRef') { + value = runtime.resolveComputedStyle(rootVal, style['name']); + } else { + value = runtime.resolveStyle(rootVal, style['name']); + } + } else { + var value = runtime.resolveProperty(rootVal, prop.value); + } + return value; + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + return parser.parseElement("indirectExpression", tokens, propertyAccess); + } + }); + + parser.addIndirectExpression("inExpression", function (parser, runtime, tokens, root) { + if (!tokens.matchToken("in")) return; + var target = parser.requireElement("unaryExpression", tokens); + var propertyAccess = { + type: "inExpression", + root: root, + args: [root, target], + op: function (context, rootVal, target) { + var returnArr = []; + if (rootVal.css) { + runtime.implicitLoop(target, function (targetElt) { + var results = targetElt.querySelectorAll(rootVal.css); + for (var i = 0; i < results.length; i++) { + returnArr.push(results[i]); + } + }); + } else if (rootVal instanceof Element) { + var within = false; + runtime.implicitLoop(target, function (targetElt) { + if (targetElt.contains(rootVal)) { + within = true; + } + }); + if(within) { + return rootVal; + } + } else { + runtime.implicitLoop(rootVal, function (rootElt) { + runtime.implicitLoop(target, function (targetElt) { + if (rootElt === targetElt) { + returnArr.push(rootElt); + } + }); + }); + } + return returnArr; + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + return parser.parseElement("indirectExpression", tokens, propertyAccess); + }); + + parser.addIndirectExpression("asExpression", function (parser, runtime, tokens, root) { + if (!tokens.matchToken("as")) return; + tokens.matchToken("a") || tokens.matchToken("an"); + var conversion = parser.requireElement("dotOrColonPath", tokens).evaluate(); // OK No promise + var propertyAccess = { + type: "asExpression", + root: root, + args: [root], + op: function (context, rootVal) { + return runtime.convertValue(rootVal, conversion); + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + return parser.parseElement("indirectExpression", tokens, propertyAccess); + }); + + parser.addIndirectExpression("functionCall", function (parser, runtime, tokens, root) { + if (!tokens.matchOpToken("(")) return; + var args = []; + if (!tokens.matchOpToken(")")) { + do { + args.push(parser.requireElement("expression", tokens)); + } while (tokens.matchOpToken(",")); + tokens.requireOpToken(")"); + } + + if (root.root) { + var functionCall = { + type: "functionCall", + root: root, + argExressions: args, + args: [root.root, args], + op: function (context, rootRoot, args) { + runtime.nullCheck(rootRoot, root.root); + var func = rootRoot[root.prop.value]; + runtime.nullCheck(func, root); + if (func.hyperfunc) { + args.push(context); + } + return func.apply(rootRoot, args); + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + } else { + var functionCall = { + type: "functionCall", + root: root, + argExressions: args, + args: [root, args], + op: function (context, func, argVals) { + runtime.nullCheck(func, root); + if (func.hyperfunc) { + argVals.push(context); + } + var apply = func.apply(null, argVals); + return apply; + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + } + return parser.parseElement("indirectExpression", tokens, functionCall); + }); + + parser.addIndirectExpression("attributeRefAccess", function (parser, runtime, tokens, root) { + var attribute = parser.parseElement("attributeRef", tokens); + if (!attribute) return; + var attributeAccess = { + type: "attributeRefAccess", + root: root, + attribute: attribute, + args: [root], + op: function (_ctx, rootVal) { + // @ts-ignore + var value = runtime.resolveAttribute(rootVal, attribute.name); + return value; + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + return attributeAccess; + }); + + parser.addIndirectExpression("arrayIndex", function (parser, runtime, tokens, root) { + if (!tokens.matchOpToken("[")) return; + var andBefore = false; + var andAfter = false; + var firstIndex = null; + var secondIndex = null; + + if (tokens.matchOpToken("..")) { + andBefore = true; + firstIndex = parser.requireElement("expression", tokens); + } else { + firstIndex = parser.requireElement("expression", tokens); + + if (tokens.matchOpToken("..")) { + andAfter = true; + var current = tokens.currentToken(); + if (current.type !== "R_BRACKET") { + secondIndex = parser.parseElement("expression", tokens); + } + } + } + tokens.requireOpToken("]"); + + var arrayIndex = { + type: "arrayIndex", + root: root, + prop: firstIndex, + firstIndex: firstIndex, + secondIndex: secondIndex, + args: [root, firstIndex, secondIndex], + op: function (_ctx, root, firstIndex, secondIndex) { + if (root == null) { + return null; + } + if (andBefore) { + if (firstIndex < 0) { + firstIndex = root.length + firstIndex; + } + return root.slice(0, firstIndex + 1); // returns all items from beginning to firstIndex (inclusive) + } else if (andAfter) { + if (secondIndex != null) { + if (secondIndex < 0) { + secondIndex = root.length + secondIndex; + } + return root.slice(firstIndex, secondIndex + 1); // returns all items from firstIndex to secondIndex (inclusive) + } else { + return root.slice(firstIndex); // returns from firstIndex to end of array + } + } else { + return root[firstIndex]; + } + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + + return parser.parseElement("indirectExpression", tokens, arrayIndex); + }); + + // taken from https://drafts.csswg.org/css-values-4/#relative-length + // and https://drafts.csswg.org/css-values-4/#absolute-length + // (NB: we do not support `in` dues to conflicts w/ the hyperscript grammar) + var STRING_POSTFIXES = [ + 'em', 'ex', 'cap', 'ch', 'ic', 'rem', 'lh', 'rlh', 'vw', 'vh', 'vi', 'vb', 'vmin', 'vmax', + 'cm', 'mm', 'Q', 'pc', 'pt', 'px' + ]; + parser.addGrammarElement("postfixExpression", function (parser, runtime, tokens) { + var root = parser.parseElement("primaryExpression", tokens); + + let stringPosfix = tokens.matchAnyToken.apply(tokens, STRING_POSTFIXES) || tokens.matchOpToken("%"); + if (stringPosfix) { + return { + type: "stringPostfix", + postfix: stringPosfix.value, + args: [root], + op: function (context, val) { + return "" + val + stringPosfix.value; + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + } + + var timeFactor = null; + if (tokens.matchToken("s") || tokens.matchToken("seconds")) { + timeFactor = 1000; + } else if (tokens.matchToken("ms") || tokens.matchToken("milliseconds")) { + timeFactor = 1; + } + if (timeFactor) { + return { + type: "timeExpression", + time: root, + factor: timeFactor, + args: [root], + op: function (_context, val) { + return val * timeFactor; + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + } + + if (tokens.matchOpToken(":")) { + var typeName = tokens.requireTokenType("IDENTIFIER"); + if (!typeName.value) return; + var nullOk = !tokens.matchOpToken("!"); + return { + type: "typeCheck", + typeName: typeName, + nullOk: nullOk, + args: [root], + op: function (context, val) { + var passed = runtime.typeCheck(val, this.typeName.value, nullOk); + if (passed) { + return val; + } else { + throw new Error("Typecheck failed! Expected: " + typeName.value); + } + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + } else { + return root; + } + }); + + parser.addGrammarElement("logicalNot", function (parser, runtime, tokens) { + if (!tokens.matchToken("not")) return; + var root = parser.requireElement("unaryExpression", tokens); + return { + type: "logicalNot", + root: root, + args: [root], + op: function (context, val) { + return !val; + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + }); + + parser.addGrammarElement("noExpression", function (parser, runtime, tokens) { + if (!tokens.matchToken("no")) return; + var root = parser.requireElement("unaryExpression", tokens); + return { + type: "noExpression", + root: root, + args: [root], + op: function (_context, val) { + return runtime.isEmpty(val); + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + }); + + parser.addLeafExpression("some", function (parser, runtime, tokens) { + if (!tokens.matchToken("some")) return; + var root = parser.requireElement("expression", tokens); + return { + type: "noExpression", + root: root, + args: [root], + op: function (_context, val) { + return !runtime.isEmpty(val); + }, + evaluate(context) { + return runtime.unifiedEval(this, context); + }, + }; + }); + + parser.addGrammarElement("negativeNumber", function (parser, runtime, tokens) { + if (!tokens.matchOpToken("-")) return; + var root = parser.requireElement("unaryExpression", tokens); + return { + type: "negativeNumber", + root: root, + args: [root], + op: function (context, value) { + return -1 * value; + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + }); + + parser.addGrammarElement("unaryExpression", function (parser, runtime, tokens) { + tokens.matchToken("the"); // optional "the" + return parser.parseAnyOf( + ["beepExpression", "logicalNot", "relativePositionalExpression", "positionalExpression", "noExpression", "negativeNumber", "postfixExpression"], + tokens + ); + }); + + parser.addGrammarElement("beepExpression", function (parser, runtime, tokens) { + if (!tokens.matchToken("beep!")) return; + var expression = parser.parseElement("unaryExpression", tokens); + if (expression) { + expression['booped'] = true; + var originalEvaluate = expression.evaluate; + expression.evaluate = function(ctx){ + let value = originalEvaluate.apply(expression, arguments); + let element = ctx.me; + runtime.beepValueToConsole(element, expression, value); + return value; + } + return expression; + } + }); + + var scanForwardQuery = function(start, root, match, wrap) { + var results = root.querySelectorAll(match); + for (var i = 0; i < results.length; i++) { + var elt = results[i]; + if (elt.compareDocumentPosition(start) === Node.DOCUMENT_POSITION_PRECEDING) { + return elt; + } + } + if (wrap) { + return results[0]; + } + } + + var scanBackwardsQuery = function(start, root, match, wrap) { + var results = root.querySelectorAll(match); + for (var i = results.length - 1; i >= 0; i--) { + var elt = results[i]; + if (elt.compareDocumentPosition(start) === Node.DOCUMENT_POSITION_FOLLOWING) { + return elt; + } + } + if (wrap) { + return results[results.length - 1]; + } + } + + var scanForwardArray = function(start, array, match, wrap) { + var matches = []; + Runtime.prototype.forEach(array, function(elt){ + if (elt.matches(match) || elt === start) { + matches.push(elt); + } + }) + for (var i = 0; i < matches.length - 1; i++) { + var elt = matches[i]; + if (elt === start) { + return matches[i + 1]; + } + } + if (wrap) { + var first = matches[0]; + if (first && first.matches(match)) { + return first; + } + } + } + + var scanBackwardsArray = function(start, array, match, wrap) { + return scanForwardArray(start, Array.from(array).reverse(), match, wrap); + } + + parser.addGrammarElement("relativePositionalExpression", function (parser, runtime, tokens) { + var op = tokens.matchAnyToken("next", "previous"); + if (!op) return; + var forwardSearch = op.value === "next"; + + var thingElt = parser.parseElement("expression", tokens); + + if (tokens.matchToken("from")) { + tokens.pushFollow("in"); + try { + var from = parser.requireElement("unaryExpression", tokens); + } finally { + tokens.popFollow(); + } + } else { + var from = parser.requireElement("implicitMeTarget", tokens); + } + + var inSearch = false; + var withinElt; + if (tokens.matchToken("in")) { + inSearch = true; + var inElt = parser.requireElement("unaryExpression", tokens); + } else if (tokens.matchToken("within")) { + withinElt = parser.requireElement("unaryExpression", tokens); + } else { + withinElt = document.body; + } + + var wrapping = false; + if (tokens.matchToken("with")) { + tokens.requireToken("wrapping") + wrapping = true; + } + + return { + type: "relativePositionalExpression", + from: from, + forwardSearch: forwardSearch, + inSearch: inSearch, + wrapping: wrapping, + inElt: inElt, + withinElt: withinElt, + operator: op.value, + args: [thingElt, from, inElt, withinElt], + op: function (context, thing, from, inElt, withinElt) { + + var css = thing.css; + if (css == null) { + throw "Expected a CSS value to be returned by " + Tokens.sourceFor.apply(thingElt); + } + + if(inSearch) { + if (inElt) { + if (forwardSearch) { + return scanForwardArray(from, inElt, css, wrapping); + } else { + return scanBackwardsArray(from, inElt, css, wrapping); + } + } + } else { + if (withinElt) { + if (forwardSearch) { + return scanForwardQuery(from, withinElt, css, wrapping); + } else { + return scanBackwardsQuery(from, withinElt, css, wrapping); + } + } + } + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + } + + }); + + parser.addGrammarElement("positionalExpression", function (parser, runtime, tokens) { + var op = tokens.matchAnyToken("first", "last", "random"); + if (!op) return; + tokens.matchAnyToken("in", "from", "of"); + var rhs = parser.requireElement("unaryExpression", tokens); + const operator = op.value; + return { + type: "positionalExpression", + rhs: rhs, + operator: op.value, + args: [rhs], + op: function (context, rhsVal) { + if (rhsVal && !Array.isArray(rhsVal)) { + if (rhsVal.children) { + rhsVal = rhsVal.children; + } else { + rhsVal = Array.from(rhsVal); + } + } + if (rhsVal) { + if (operator === "first") { + return rhsVal[0]; + } else if (operator === "last") { + return rhsVal[rhsVal.length - 1]; + } else if (operator === "random") { + return rhsVal[Math.floor(Math.random() * rhsVal.length)]; + } + } + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + }); + + parser.addGrammarElement("mathOperator", function (parser, runtime, tokens) { + var expr = parser.parseElement("unaryExpression", tokens); + var mathOp, + initialMathOp = null; + mathOp = tokens.matchAnyOpToken("+", "-", "*", "/") || tokens.matchToken('mod'); + while (mathOp) { + initialMathOp = initialMathOp || mathOp; + var operator = mathOp.value; + if (initialMathOp.value !== operator) { + parser.raiseParseError(tokens, "You must parenthesize math operations with different operators"); + } + var rhs = parser.parseElement("unaryExpression", tokens); + expr = { + type: "mathOperator", + lhs: expr, + rhs: rhs, + operator: operator, + args: [expr, rhs], + op: function (context, lhsVal, rhsVal) { + if (operator === "+") { + return lhsVal + rhsVal; + } else if (operator === "-") { + return lhsVal - rhsVal; + } else if (operator === "*") { + return lhsVal * rhsVal; + } else if (operator === "/") { + return lhsVal / rhsVal; + } else if (operator === "mod") { + return lhsVal % rhsVal; + } + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + mathOp = tokens.matchAnyOpToken("+", "-", "*", "/") || tokens.matchToken('mod'); + } + return expr; + }); + + parser.addGrammarElement("mathExpression", function (parser, runtime, tokens) { + return parser.parseAnyOf(["mathOperator", "unaryExpression"], tokens); + }); + + function sloppyContains(src, container, value){ + if (container['contains']) { + return container.contains(value); + } else if (container['includes']) { + return container.includes(value); + } else { + throw Error("The value of " + src.sourceFor() + " does not have a contains or includes method on it"); + } + } + function sloppyMatches(src, target, toMatch){ + if (target['match']) { + return !!target.match(toMatch); + } else if (target['matches']) { + return target.matches(toMatch); + } else { + throw Error("The value of " + src.sourceFor() + " does not have a match or matches method on it"); + } + } + + parser.addGrammarElement("comparisonOperator", function (parser, runtime, tokens) { + var expr = parser.parseElement("mathExpression", tokens); + var comparisonToken = tokens.matchAnyOpToken("<", ">", "<=", ">=", "==", "===", "!=", "!=="); + var operator = comparisonToken ? comparisonToken.value : null; + var hasRightValue = true; // By default, most comparisons require two values, but there are some exceptions. + var typeCheck = false; + + if (operator == null) { + if (tokens.matchToken("is") || tokens.matchToken("am")) { + if (tokens.matchToken("not")) { + if (tokens.matchToken("in")) { + operator = "not in"; + } else if (tokens.matchToken("a")) { + operator = "not a"; + typeCheck = true; + } else if (tokens.matchToken("empty")) { + operator = "not empty"; + hasRightValue = false; + } else { + if (tokens.matchToken("really")) { + operator = "!=="; + } else { + operator = "!="; + } + // consume additional optional syntax + if (tokens.matchToken("equal")) { + tokens.matchToken("to"); + } + } + } else if (tokens.matchToken("in")) { + operator = "in"; + } else if (tokens.matchToken("a")) { + operator = "a"; + typeCheck = true; + } else if (tokens.matchToken("empty")) { + operator = "empty"; + hasRightValue = false; + } else if (tokens.matchToken("less")) { + tokens.requireToken("than"); + if (tokens.matchToken("or")) { + tokens.requireToken("equal"); + tokens.requireToken("to"); + operator = "<="; + } else { + operator = "<"; + } + } else if (tokens.matchToken("greater")) { + tokens.requireToken("than"); + if (tokens.matchToken("or")) { + tokens.requireToken("equal"); + tokens.requireToken("to"); + operator = ">="; + } else { + operator = ">"; + } + } else { + if (tokens.matchToken("really")) { + operator = "==="; + } else { + operator = "=="; + } + if (tokens.matchToken("equal")) { + tokens.matchToken("to"); + } + } + } else if (tokens.matchToken("equals")) { + operator = "=="; + } else if (tokens.matchToken("really")) { + tokens.requireToken("equals") + operator = "==="; + } else if (tokens.matchToken("exist") || tokens.matchToken("exists")) { + operator = "exist"; + hasRightValue = false; + } else if (tokens.matchToken("matches") || tokens.matchToken("match")) { + operator = "match"; + } else if (tokens.matchToken("contains") || tokens.matchToken("contain")) { + operator = "contain"; + } else if (tokens.matchToken("includes") || tokens.matchToken("include")) { + operator = "include"; + } else if (tokens.matchToken("do") || tokens.matchToken("does")) { + tokens.requireToken("not"); + if (tokens.matchToken("matches") || tokens.matchToken("match")) { + operator = "not match"; + } else if (tokens.matchToken("contains") || tokens.matchToken("contain")) { + operator = "not contain"; + } else if (tokens.matchToken("exist") || tokens.matchToken("exist")) { + operator = "not exist"; + hasRightValue = false; + } else if (tokens.matchToken("include")) { + operator = "not include"; + } else { + parser.raiseParseError(tokens, "Expected matches or contains"); + } + } + } + + if (operator) { + // Do not allow chained comparisons, which is dumb + var typeName, nullOk, rhs + if (typeCheck) { + typeName = tokens.requireTokenType("IDENTIFIER"); + nullOk = !tokens.matchOpToken("!"); + } else if (hasRightValue) { + rhs = parser.requireElement("mathExpression", tokens); + if (operator === "match" || operator === "not match") { + rhs = rhs.css ? rhs.css : rhs; + } + } + var lhs = expr; + expr = { + type: "comparisonOperator", + operator: operator, + typeName: typeName, + nullOk: nullOk, + lhs: expr, + rhs: rhs, + args: [expr, rhs], + op: function (context, lhsVal, rhsVal) { + if (operator === "==") { + return lhsVal == rhsVal; + } else if (operator === "!=") { + return lhsVal != rhsVal; + } + if (operator === "===") { + return lhsVal === rhsVal; + } else if (operator === "!==") { + return lhsVal !== rhsVal; + } + if (operator === "match") { + return lhsVal != null && sloppyMatches(lhs, lhsVal, rhsVal); + } + if (operator === "not match") { + return lhsVal == null || !sloppyMatches(lhs, lhsVal, rhsVal); + } + if (operator === "in") { + return rhsVal != null && sloppyContains(rhs, rhsVal, lhsVal); + } + if (operator === "not in") { + return rhsVal == null || !sloppyContains(rhs, rhsVal, lhsVal); + } + if (operator === "contain") { + return lhsVal != null && sloppyContains(lhs, lhsVal, rhsVal); + } + if (operator === "not contain") { + return lhsVal == null || !sloppyContains(lhs, lhsVal, rhsVal); + } + if (operator === "include") { + return lhsVal != null && sloppyContains(lhs, lhsVal, rhsVal); + } + if (operator === "not include") { + return lhsVal == null || !sloppyContains(lhs, lhsVal, rhsVal); + } + if (operator === "===") { + return lhsVal === rhsVal; + } else if (operator === "!==") { + return lhsVal !== rhsVal; + } else if (operator === "<") { + return lhsVal < rhsVal; + } else if (operator === ">") { + return lhsVal > rhsVal; + } else if (operator === "<=") { + return lhsVal <= rhsVal; + } else if (operator === ">=") { + return lhsVal >= rhsVal; + } else if (operator === "empty") { + return runtime.isEmpty(lhsVal); + } else if (operator === "not empty") { + return !runtime.isEmpty(lhsVal); + } else if (operator === "exist") { + return runtime.doesExist(lhsVal); + } else if (operator === "not exist") { + return !runtime.doesExist(lhsVal); + } else if (operator === "a") { + return runtime.typeCheck(lhsVal, typeName.value, nullOk); + } else if (operator === "not a") { + return !runtime.typeCheck(lhsVal, typeName.value, nullOk); + } else { + throw "Unknown comparison : " + operator; + } + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + } + return expr; + }); + + parser.addGrammarElement("comparisonExpression", function (parser, runtime, tokens) { + return parser.parseAnyOf(["comparisonOperator", "mathExpression"], tokens); + }); + + parser.addGrammarElement("logicalOperator", function (parser, runtime, tokens) { + var expr = parser.parseElement("comparisonExpression", tokens); + var logicalOp, + initialLogicalOp = null; + logicalOp = tokens.matchToken("and") || tokens.matchToken("or"); + while (logicalOp) { + initialLogicalOp = initialLogicalOp || logicalOp; + if (initialLogicalOp.value !== logicalOp.value) { + parser.raiseParseError(tokens, "You must parenthesize logical operations with different operators"); + } + var rhs = parser.requireElement("comparisonExpression", tokens); + const operator = logicalOp.value; + expr = { + type: "logicalOperator", + operator: operator, + lhs: expr, + rhs: rhs, + args: [expr, rhs], + op: function (context, lhsVal, rhsVal) { + if (operator === "and") { + return lhsVal && rhsVal; + } else { + return lhsVal || rhsVal; + } + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + logicalOp = tokens.matchToken("and") || tokens.matchToken("or"); + } + return expr; + }); + + parser.addGrammarElement("logicalExpression", function (parser, runtime, tokens) { + return parser.parseAnyOf(["logicalOperator", "mathExpression"], tokens); + }); + + parser.addGrammarElement("asyncExpression", function (parser, runtime, tokens) { + if (tokens.matchToken("async")) { + var value = parser.requireElement("logicalExpression", tokens); + var expr = { + type: "asyncExpression", + value: value, + evaluate: function (context) { + return { + asyncWrapper: true, + value: this.value.evaluate(context), //OK + }; + }, + }; + return expr; + } else { + return parser.parseElement("logicalExpression", tokens); + } + }); + + parser.addGrammarElement("expression", function (parser, runtime, tokens) { + tokens.matchToken("the"); // optional the + return parser.parseElement("asyncExpression", tokens); + }); + + parser.addGrammarElement("assignableExpression", function (parser, runtime, tokens) { + tokens.matchToken("the"); // optional the + + // TODO obviously we need to generalize this as a left hand side / targetable concept + var expr = parser.parseElement("primaryExpression", tokens); + if (expr && ( + expr.type === "symbol" || + expr.type === "ofExpression" || + expr.type === "propertyAccess" || + expr.type === "attributeRefAccess" || + expr.type === "attributeRef" || + expr.type === "styleRef" || + expr.type === "arrayIndex" || + expr.type === "possessive") + ) { + return expr; + } else { + parser.raiseParseError( + tokens, + "A target expression must be writable. The expression type '" + (expr && expr.type) + "' is not." + ); + } + return expr; + }); + + parser.addGrammarElement("hyperscript", function (parser, runtime, tokens) { + var features = []; + + if (tokens.hasMore()) { + while (parser.featureStart(tokens.currentToken()) || tokens.currentToken().value === "(") { + var feature = parser.requireElement("feature", tokens); + features.push(feature); + tokens.matchToken("end"); // optional end + } + } + return { + type: "hyperscript", + features: features, + apply: function (target, source, args) { + // no op + for (const feature of features) { + feature.install(target, source, args); + } + }, + }; + }); + + var parseEventArgs = function (tokens) { + var args = []; + // handle argument list (look ahead 3) + if ( + tokens.token(0).value === "(" && + (tokens.token(1).value === ")" || tokens.token(2).value === "," || tokens.token(2).value === ")") + ) { + tokens.matchOpToken("("); + do { + args.push(tokens.requireTokenType("IDENTIFIER")); + } while (tokens.matchOpToken(",")); + tokens.requireOpToken(")"); + } + return args; + }; + + parser.addFeature("on", function (parser, runtime, tokens) { + if (!tokens.matchToken("on")) return; + var every = false; + if (tokens.matchToken("every")) { + every = true; + } + var events = []; + var displayName = null; + do { + var on = parser.requireElement("eventName", tokens, "Expected event name"); + + var eventName = on.evaluate(); // OK No Promise + + if (displayName) { + displayName = displayName + " or " + eventName; + } else { + displayName = "on " + eventName; + } + var args = parseEventArgs(tokens); + + var filter = null; + if (tokens.matchOpToken("[")) { + filter = parser.requireElement("expression", tokens); + tokens.requireOpToken("]"); + } + + var startCount, endCount ,unbounded; + if (tokens.currentToken().type === "NUMBER") { + var startCountToken = tokens.consumeToken(); + if (!startCountToken.value) return; + startCount = parseInt(startCountToken.value); + if (tokens.matchToken("to")) { + var endCountToken = tokens.consumeToken(); + if (!endCountToken.value) return; + endCount = parseInt(endCountToken.value); + } else if (tokens.matchToken("and")) { + unbounded = true; + tokens.requireToken("on"); + } + } + + var intersectionSpec, mutationSpec; + if (eventName === "intersection") { + intersectionSpec = {}; + if (tokens.matchToken("with")) { + intersectionSpec["with"] = parser.requireElement("expression", tokens).evaluate(); + } + if (tokens.matchToken("having")) { + do { + if (tokens.matchToken("margin")) { + intersectionSpec["rootMargin"] = parser.requireElement("stringLike", tokens).evaluate(); + } else if (tokens.matchToken("threshold")) { + intersectionSpec["threshold"] = parser.requireElement("expression", tokens).evaluate(); + } else { + parser.raiseParseError(tokens, "Unknown intersection config specification"); + } + } while (tokens.matchToken("and")); + } + } else if (eventName === "mutation") { + mutationSpec = {}; + if (tokens.matchToken("of")) { + do { + if (tokens.matchToken("anything")) { + mutationSpec["attributes"] = true; + mutationSpec["subtree"] = true; + mutationSpec["characterData"] = true; + mutationSpec["childList"] = true; + } else if (tokens.matchToken("childList")) { + mutationSpec["childList"] = true; + } else if (tokens.matchToken("attributes")) { + mutationSpec["attributes"] = true; + mutationSpec["attributeOldValue"] = true; + } else if (tokens.matchToken("subtree")) { + mutationSpec["subtree"] = true; + } else if (tokens.matchToken("characterData")) { + mutationSpec["characterData"] = true; + mutationSpec["characterDataOldValue"] = true; + } else if (tokens.currentToken().type === "ATTRIBUTE_REF") { + var attribute = tokens.consumeToken(); + if (mutationSpec["attributeFilter"] == null) { + mutationSpec["attributeFilter"] = []; + } + if (attribute.value.indexOf("@") == 0) { + mutationSpec["attributeFilter"].push(attribute.value.substring(1)); + } else { + parser.raiseParseError( + tokens, + "Only shorthand attribute references are allowed here" + ); + } + } else { + parser.raiseParseError(tokens, "Unknown mutation config specification"); + } + } while (tokens.matchToken("or")); + } else { + mutationSpec["attributes"] = true; + mutationSpec["characterData"] = true; + mutationSpec["childList"] = true; + } + } + + var from = null; + var elsewhere = false; + if (tokens.matchToken("from")) { + if (tokens.matchToken("elsewhere")) { + elsewhere = true; + } else { + tokens.pushFollow("or"); + try { + from = parser.requireElement("expression", tokens) + } finally { + tokens.popFollow(); + } + if (!from) { + parser.raiseParseError(tokens, 'Expected either target value or "elsewhere".'); + } + } + } + // support both "elsewhere" and "from elsewhere" + if (from === null && elsewhere === false && tokens.matchToken("elsewhere")) { + elsewhere = true; + } + + if (tokens.matchToken("in")) { + var inExpr = parser.parseElement('unaryExpression', tokens); + } + + if (tokens.matchToken("debounced")) { + tokens.requireToken("at"); + var timeExpr = parser.requireElement("unaryExpression", tokens); + // @ts-ignore + var debounceTime = timeExpr.evaluate({}); // OK No promise TODO make a literal time expr + } else if (tokens.matchToken("throttled")) { + tokens.requireToken("at"); + var timeExpr = parser.requireElement("unaryExpression", tokens); + // @ts-ignore + var throttleTime = timeExpr.evaluate({}); // OK No promise TODO make a literal time expr + } + + events.push({ + execCount: 0, + every: every, + on: eventName, + args: args, + filter: filter, + from: from, + inExpr: inExpr, + elsewhere: elsewhere, + startCount: startCount, + endCount: endCount, + unbounded: unbounded, + debounceTime: debounceTime, + throttleTime: throttleTime, + mutationSpec: mutationSpec, + intersectionSpec: intersectionSpec, + debounced: undefined, + lastExec: undefined, + }); + } while (tokens.matchToken("or")); + + var queueLast = true; + if (!every) { + if (tokens.matchToken("queue")) { + if (tokens.matchToken("all")) { + var queueAll = true; + var queueLast = false; + } else if (tokens.matchToken("first")) { + var queueFirst = true; + } else if (tokens.matchToken("none")) { + var queueNone = true; + } else { + tokens.requireToken("last"); + } + } + } + + var start = parser.requireElement("commandList", tokens); + parser.ensureTerminated(start); + + var errorSymbol, errorHandler; + if (tokens.matchToken("catch")) { + errorSymbol = tokens.requireTokenType("IDENTIFIER").value; + errorHandler = parser.requireElement("commandList", tokens); + parser.ensureTerminated(errorHandler); + } + + if (tokens.matchToken("finally")) { + var finallyHandler = parser.requireElement("commandList", tokens); + parser.ensureTerminated(finallyHandler); + } + + var onFeature = { + displayName: displayName, + events: events, + start: start, + every: every, + execCount: 0, + errorHandler: errorHandler, + errorSymbol: errorSymbol, + execute: function (/** @type {Context} */ ctx) { + let eventQueueInfo = runtime.getEventQueueFor(ctx.me, onFeature); + if (eventQueueInfo.executing && every === false) { + if (queueNone || (queueFirst && eventQueueInfo.queue.length > 0)) { + return; + } + if (queueLast) { + eventQueueInfo.queue.length = 0; + } + eventQueueInfo.queue.push(ctx); + return; + } + onFeature.execCount++; + eventQueueInfo.executing = true; + ctx.meta.onHalt = function () { + eventQueueInfo.executing = false; + var queued = eventQueueInfo.queue.shift(); + if (queued) { + setTimeout(function () { + onFeature.execute(queued); + }, 1); + } + }; + ctx.meta.reject = function (err) { + console.error(err.message ? err.message : err); + var hypertrace = runtime.getHyperTrace(ctx, err); + if (hypertrace) { + hypertrace.print(); + } + runtime.triggerEvent(ctx.me, "exception", { + error: err, + }); + }; + start.execute(ctx); + }, + install: function (elt, source) { + for (const eventSpec of onFeature.events) { + var targets; + if (eventSpec.elsewhere) { + targets = [document]; + } else if (eventSpec.from) { + targets = eventSpec.from.evaluate(runtime.makeContext(elt, onFeature, elt, null)); + } else { + targets = [elt]; + } + runtime.implicitLoop(targets, function (target) { + // OK NO PROMISE + + var eventName = eventSpec.on; + if (target == null) { + console.warn("'%s' feature ignored because target does not exists:", displayName, elt); + return; + } + + if (eventSpec.mutationSpec) { + eventName = "hyperscript:mutation"; + const observer = new MutationObserver(function (mutationList, observer) { + if (!onFeature.executing) { + runtime.triggerEvent(target, eventName, { + mutationList: mutationList, + observer: observer, + }); + } + }); + observer.observe(target, eventSpec.mutationSpec); + } + + if (eventSpec.intersectionSpec) { + eventName = "hyperscript:intersection"; + const observer = new IntersectionObserver(function (entries) { + for (const entry of entries) { + var detail = { + observer: observer, + }; + detail = Object.assign(detail, entry); + detail["intersecting"] = entry.isIntersecting; + runtime.triggerEvent(target, eventName, detail); + } + }, eventSpec.intersectionSpec); + observer.observe(target); + } + + var addEventListener = target.addEventListener || target.on; + addEventListener.call(target, eventName, function listener(evt) { + // OK NO PROMISE + if (typeof Node !== 'undefined' && elt instanceof Node && target !== elt && !elt.isConnected) { + target.removeEventListener(eventName, listener); + return; + } + + var ctx = runtime.makeContext(elt, onFeature, elt, evt); + if (eventSpec.elsewhere && elt.contains(evt.target)) { + return; + } + if (eventSpec.from) { + ctx.result = target; + } + + // establish context + for (const arg of eventSpec.args) { + let eventValue = ctx.event[arg.value]; + if (eventValue !== undefined) { + ctx.locals[arg.value] = eventValue; + } else if ('detail' in ctx.event) { + ctx.locals[arg.value] = ctx.event['detail'][arg.value]; + } + } + + // install error handler if any + ctx.meta.errorHandler = errorHandler; + ctx.meta.errorSymbol = errorSymbol; + ctx.meta.finallyHandler = finallyHandler; + + // apply filter + if (eventSpec.filter) { + var initialCtx = ctx.meta.context; + ctx.meta.context = ctx.event; + try { + var value = eventSpec.filter.evaluate(ctx); //OK NO PROMISE + if (value) { + // match the javascript semantics for if statements + } else { + return; + } + } finally { + ctx.meta.context = initialCtx; + } + } + + if (eventSpec.inExpr) { + var inElement = evt.target; + while (true) { + if (inElement.matches && inElement.matches(eventSpec.inExpr.css)) { + ctx.result = inElement; + break; + } else { + inElement = inElement.parentElement; + if (inElement == null) { + return; // no match found + } + } + } + } + + // verify counts + eventSpec.execCount++; + if (eventSpec.startCount) { + if (eventSpec.endCount) { + if ( + eventSpec.execCount < eventSpec.startCount || + eventSpec.execCount > eventSpec.endCount + ) { + return; + } + } else if (eventSpec.unbounded) { + if (eventSpec.execCount < eventSpec.startCount) { + return; + } + } else if (eventSpec.execCount !== eventSpec.startCount) { + return; + } + } + + //debounce + if (eventSpec.debounceTime) { + if (eventSpec.debounced) { + clearTimeout(eventSpec.debounced); + } + eventSpec.debounced = setTimeout(function () { + onFeature.execute(ctx); + }, eventSpec.debounceTime); + return; + } + + // throttle + if (eventSpec.throttleTime) { + if ( + eventSpec.lastExec && + Date.now() < (eventSpec.lastExec + eventSpec.throttleTime) + ) { + return; + } else { + eventSpec.lastExec = Date.now(); + } + } + + // apply execute + onFeature.execute(ctx); + }); + }); + } + }, + }; + parser.setParent(start, onFeature); + return onFeature; + }); + + parser.addFeature("def", function (parser, runtime, tokens) { + if (!tokens.matchToken("def")) return; + var functionName = parser.requireElement("dotOrColonPath", tokens); + var nameVal = functionName.evaluate(); // OK + var nameSpace = nameVal.split("."); + var funcName = nameSpace.pop(); + + var args = []; + if (tokens.matchOpToken("(")) { + if (tokens.matchOpToken(")")) { + // empty args list + } else { + do { + args.push(tokens.requireTokenType("IDENTIFIER")); + } while (tokens.matchOpToken(",")); + tokens.requireOpToken(")"); + } + } + + var start = parser.requireElement("commandList", tokens); + + var errorSymbol, errorHandler; + if (tokens.matchToken("catch")) { + errorSymbol = tokens.requireTokenType("IDENTIFIER").value; + errorHandler = parser.parseElement("commandList", tokens); + } + + if (tokens.matchToken("finally")) { + var finallyHandler = parser.requireElement("commandList", tokens); + parser.ensureTerminated(finallyHandler); + } + + var functionFeature = { + displayName: + funcName + + "(" + + args + .map(function (arg) { + return arg.value; + }) + .join(", ") + + ")", + name: funcName, + args: args, + start: start, + errorHandler: errorHandler, + errorSymbol: errorSymbol, + finallyHandler: finallyHandler, + install: function (target, source) { + var func = function () { + // null, worker + var ctx = runtime.makeContext(source, functionFeature, target, null); + + // install error handler if any + ctx.meta.errorHandler = errorHandler; + ctx.meta.errorSymbol = errorSymbol; + ctx.meta.finallyHandler = finallyHandler; + + for (var i = 0; i < args.length; i++) { + var name = args[i]; + var argumentVal = arguments[i]; + if (name) { + ctx.locals[name.value] = argumentVal; + } + } + ctx.meta.caller = arguments[args.length]; + if (ctx.meta.caller) { + ctx.meta.callingCommand = ctx.meta.caller.meta.command; + } + var resolve, + reject = null; + var promise = new Promise(function (theResolve, theReject) { + resolve = theResolve; + reject = theReject; + }); + start.execute(ctx); + if (ctx.meta.returned) { + return ctx.meta.returnValue; + } else { + ctx.meta.resolve = resolve; + ctx.meta.reject = reject; + return promise; + } + }; + func.hyperfunc = true; + func.hypername = nameVal; + runtime.assignToNamespace(target, nameSpace, funcName, func); + }, + }; + + parser.ensureTerminated(start); + + // terminate error handler if any + if (errorHandler) { + parser.ensureTerminated(errorHandler); + } + + parser.setParent(start, functionFeature); + return functionFeature; + }); + + parser.addFeature("set", function (parser, runtime, tokens) { + let setCmd = parser.parseElement("setCommand", tokens); + if (setCmd) { + if (setCmd.target.scope !== "element") { + parser.raiseParseError(tokens, "variables declared at the feature level must be element scoped."); + } + let setFeature = { + start: setCmd, + install: function (target, source) { + setCmd && setCmd.execute(runtime.makeContext(target, setFeature, target, null)); + }, + }; + parser.ensureTerminated(setCmd); + return setFeature; + } + }); + + parser.addFeature("init", function (parser, runtime, tokens) { + if (!tokens.matchToken("init")) return; + + var immediately = tokens.matchToken("immediately"); + + var start = parser.requireElement("commandList", tokens); + var initFeature = { + start: start, + install: function (target, source) { + let handler = function () { + start && start.execute(runtime.makeContext(target, initFeature, target, null)); + }; + if (immediately) { + handler(); + } else { + setTimeout(handler, 0); + } + }, + }; + + // terminate body + parser.ensureTerminated(start); + parser.setParent(start, initFeature); + return initFeature; + }); + + parser.addFeature("worker", function (parser, runtime, tokens) { + if (tokens.matchToken("worker")) { + parser.raiseParseError( + tokens, + "In order to use the 'worker' feature, include " + + "the _hyperscript worker plugin. See " + + "https://hyperscript.org/features/worker/ for " + + "more info." + ); + return undefined + } + }); + + parser.addFeature("behavior", function (parser, runtime, tokens) { + if (!tokens.matchToken("behavior")) return; + var path = parser.requireElement("dotOrColonPath", tokens).evaluate(); + var nameSpace = path.split("."); + var name = nameSpace.pop(); + + var formalParams = []; + if (tokens.matchOpToken("(") && !tokens.matchOpToken(")")) { + do { + formalParams.push(tokens.requireTokenType("IDENTIFIER").value); + } while (tokens.matchOpToken(",")); + tokens.requireOpToken(")"); + } + var hs = parser.requireElement("hyperscript", tokens); + for (var i = 0; i < hs.features.length; i++) { + var feature = hs.features[i]; + feature.behavior = path; + } + + return { + install: function (target, source) { + runtime.assignToNamespace( + globalScope.document && globalScope.document.body, + nameSpace, + name, + function (target, source, innerArgs) { + var internalData = runtime.getInternalData(target); + var elementScope = getOrInitObject(internalData, path + "Scope"); + for (var i = 0; i < formalParams.length; i++) { + elementScope[formalParams[i]] = innerArgs[formalParams[i]]; + } + hs.apply(target, source); + } + ); + }, + }; + }); + + parser.addFeature("install", function (parser, runtime, tokens) { + if (!tokens.matchToken("install")) return; + var behaviorPath = parser.requireElement("dotOrColonPath", tokens).evaluate(); + var behaviorNamespace = behaviorPath.split("."); + var args = parser.parseElement("namedArgumentList", tokens); + + var installFeature; + return (installFeature = { + install: function (target, source) { + runtime.unifiedEval( + { + args: [args], + op: function (ctx, args) { + var behavior = globalScope; + for (var i = 0; i < behaviorNamespace.length; i++) { + behavior = behavior[behaviorNamespace[i]]; + if (typeof behavior !== "object" && typeof behavior !== "function") + throw new Error("No such behavior defined as " + behaviorPath); + } + + if (!(behavior instanceof Function)) + throw new Error(behaviorPath + " is not a behavior"); + + behavior(target, source, args); + }, + }, + runtime.makeContext(target, installFeature, target, null) + ); + }, + }); + }); + + parser.addGrammarElement("jsBody", function (parser, runtime, tokens) { + var jsSourceStart = tokens.currentToken().start; + var jsLastToken = tokens.currentToken(); + + var funcNames = []; + var funcName = ""; + var expectFunctionDeclaration = false; + while (tokens.hasMore()) { + jsLastToken = tokens.consumeToken(); + var peek = tokens.token(0, true); + if (peek.type === "IDENTIFIER" && peek.value === "end") { + break; + } + if (expectFunctionDeclaration) { + if (jsLastToken.type === "IDENTIFIER" || jsLastToken.type === "NUMBER") { + funcName += jsLastToken.value; + } else { + if (funcName !== "") funcNames.push(funcName); + funcName = ""; + expectFunctionDeclaration = false; + } + } else if (jsLastToken.type === "IDENTIFIER" && jsLastToken.value === "function") { + expectFunctionDeclaration = true; + } + } + var jsSourceEnd = jsLastToken.end + 1; + + return { + type: "jsBody", + exposedFunctionNames: funcNames, + jsSource: tokens.source.substring(jsSourceStart, jsSourceEnd), + }; + }); + + parser.addFeature("js", function (parser, runtime, tokens) { + if (!tokens.matchToken("js")) return; + var jsBody = parser.requireElement("jsBody", tokens); + + var jsSource = + jsBody.jsSource + + "\nreturn { " + + jsBody.exposedFunctionNames + .map(function (name) { + return name + ":" + name; + }) + .join(",") + + " } "; + var func = new Function(jsSource); + + return { + jsSource: jsSource, + function: func, + exposedFunctionNames: jsBody.exposedFunctionNames, + install: function () { + Object.assign(globalScope, func()); + }, + }; + }); + + parser.addCommand("js", function (parser, runtime, tokens) { + if (!tokens.matchToken("js")) return; + // Parse inputs + var inputs = []; + if (tokens.matchOpToken("(")) { + if (tokens.matchOpToken(")")) { + // empty input list + } else { + do { + var inp = tokens.requireTokenType("IDENTIFIER"); + inputs.push(inp.value); + } while (tokens.matchOpToken(",")); + tokens.requireOpToken(")"); + } + } + + var jsBody = parser.requireElement("jsBody", tokens); + tokens.matchToken("end"); + + var func = varargConstructor(Function, inputs.concat([jsBody.jsSource])); + + var command = { + jsSource: jsBody.jsSource, + function: func, + inputs: inputs, + op: function (context) { + var args = []; + inputs.forEach(function (input) { + args.push(runtime.resolveSymbol(input, context, 'default')); + }); + var result = func.apply(globalScope, args); + if (result && typeof result.then === "function") { + return new Promise(function (resolve) { + result.then(function (actualResult) { + context.result = actualResult; + resolve(runtime.findNext(this, context)); + }); + }); + } else { + context.result = result; + return runtime.findNext(this, context); + } + }, + }; + return command; + }); + + parser.addCommand("async", function (parser, runtime, tokens) { + if (!tokens.matchToken("async")) return; + if (tokens.matchToken("do")) { + var body = parser.requireElement("commandList", tokens); + + // Append halt + var end = body; + while (end.next) end = end.next; + end.next = runtime.HALT; + + tokens.requireToken("end"); + } else { + var body = parser.requireElement("command", tokens); + } + var command = { + body: body, + op: function (context) { + setTimeout(function () { + body.execute(context); + }); + return runtime.findNext(this, context); + }, + }; + parser.setParent(body, command); + return command; + }); + + parser.addCommand("tell", function (parser, runtime, tokens) { + var startToken = tokens.currentToken(); + if (!tokens.matchToken("tell")) return; + var value = parser.requireElement("expression", tokens); + var body = parser.requireElement("commandList", tokens); + if (tokens.hasMore() && !parser.featureStart(tokens.currentToken())) { + tokens.requireToken("end"); + } + var slot = "tell_" + startToken.start; + var tellCmd = { + value: value, + body: body, + args: [value], + resolveNext: function (context) { + var iterator = context.meta.iterators[slot]; + if (iterator.index < iterator.value.length) { + context.you = iterator.value[iterator.index++]; + return body; + } else { + // restore original me + context.you = iterator.originalYou; + if (this.next) { + return this.next; + } else { + return runtime.findNext(this.parent, context); + } + } + }, + op: function (context, value) { + if (value == null) { + value = []; + } else if (!(Array.isArray(value) || value instanceof NodeList)) { + value = [value]; + } + context.meta.iterators[slot] = { + originalYou: context.you, + index: 0, + value: value, + }; + return this.resolveNext(context); + }, + }; + parser.setParent(body, tellCmd); + return tellCmd; + }); + + parser.addCommand("wait", function (parser, runtime, tokens) { + if (!tokens.matchToken("wait")) return; + var command; + + // wait on event + if (tokens.matchToken("for")) { + tokens.matchToken("a"); // optional "a" + var events = []; + do { + var lookahead = tokens.token(0); + if (lookahead.type === 'NUMBER' || lookahead.type === 'L_PAREN') { + events.push({ + time: parser.requireElement('expression', tokens).evaluate() // TODO: do we want to allow async here? + }) + } else { + events.push({ + name: parser.requireElement("dotOrColonPath", tokens, "Expected event name").evaluate(), + args: parseEventArgs(tokens), + }); + } + } while (tokens.matchToken("or")); + + if (tokens.matchToken("from")) { + var on = parser.requireElement("expression", tokens); + } + + // wait on event + command = { + event: events, + on: on, + args: [on], + op: function (context, on) { + var target = on ? on : context.me; + if (!(target instanceof EventTarget)) + throw new Error("Not a valid event target: " + this.on.sourceFor()); + return new Promise((resolve) => { + var resolved = false; + for (const eventInfo of events) { + var listener = (event) => { + context.result = event; + if (eventInfo.args) { + for (const arg of eventInfo.args) { + context.locals[arg.value] = + event[arg.value] || (event.detail ? event.detail[arg.value] : null); + } + } + if (!resolved) { + resolved = true; + resolve(runtime.findNext(this, context)); + } + }; + if (eventInfo.name){ + target.addEventListener(eventInfo.name, listener, {once: true}); + } else if (eventInfo.time != null) { + setTimeout(listener, eventInfo.time, eventInfo.time) + } + } + }); + }, + }; + return command; + } else { + var time; + if (tokens.matchToken("a")) { + tokens.requireToken("tick"); + time = 0; + } else { + time = parser.requireElement("expression", tokens); + } + + command = { + type: "waitCmd", + time: time, + args: [time], + op: function (context, timeValue) { + return new Promise((resolve) => { + setTimeout(() => { + resolve(runtime.findNext(this, context)); + }, timeValue); + }); + }, + execute: function (context) { + return runtime.unifiedExec(this, context); + }, + }; + return command; + } + }); + + // TODO - colon path needs to eventually become part of ruby-style symbols + parser.addGrammarElement("dotOrColonPath", function (parser, runtime, tokens) { + var root = tokens.matchTokenType("IDENTIFIER"); + if (root) { + var path = [root.value]; + + var separator = tokens.matchOpToken(".") || tokens.matchOpToken(":"); + if (separator) { + do { + path.push(tokens.requireTokenType("IDENTIFIER", "NUMBER").value); + } while (tokens.matchOpToken(separator.value)); + } + + return { + type: "dotOrColonPath", + path: path, + evaluate: function () { + return path.join(separator ? separator.value : ""); + }, + }; + } + }); + + + parser.addGrammarElement("eventName", function (parser, runtime, tokens) { + var token; + if ((token = tokens.matchTokenType("STRING"))) { + return { + evaluate: function() { + return token.value; + }, + }; + } + + return parser.parseElement("dotOrColonPath", tokens); + }); + + function parseSendCmd(cmdType, parser, runtime, tokens) { + var eventName = parser.requireElement("eventName", tokens); + + var details = parser.parseElement("namedArgumentList", tokens); + if ((cmdType === "send" && tokens.matchToken("to")) || + (cmdType === "trigger" && tokens.matchToken("on"))) { + var toExpr = parser.requireElement("expression", tokens); + } else { + var toExpr = parser.requireElement("implicitMeTarget", tokens); + } + + var sendCmd = { + eventName: eventName, + details: details, + to: toExpr, + args: [toExpr, eventName, details], + op: function (context, to, eventName, details) { + runtime.nullCheck(to, toExpr); + runtime.implicitLoop(to, function (target) { + runtime.triggerEvent(target, eventName, details, context.me); + }); + return runtime.findNext(sendCmd, context); + }, + }; + return sendCmd; + } + + parser.addCommand("trigger", function (parser, runtime, tokens) { + if (tokens.matchToken("trigger")) { + return parseSendCmd("trigger", parser, runtime, tokens); + } + }); + + parser.addCommand("send", function (parser, runtime, tokens) { + if (tokens.matchToken("send")) { + return parseSendCmd("send", parser, runtime, tokens); + } + }); + + var parseReturnFunction = function (parser, runtime, tokens, returnAValue) { + if (returnAValue) { + if (parser.commandBoundary(tokens.currentToken())) { + parser.raiseParseError(tokens, "'return' commands must return a value. If you do not wish to return a value, use 'exit' instead."); + } else { + var value = parser.requireElement("expression", tokens); + } + } + + var returnCmd = { + value: value, + args: [value], + op: function (context, value) { + var resolve = context.meta.resolve; + context.meta.returned = true; + context.meta.returnValue = value; + if (resolve) { + if (value) { + resolve(value); + } else { + resolve(); + } + } + return runtime.HALT; + }, + }; + return returnCmd; + }; + + parser.addCommand("return", function (parser, runtime, tokens) { + if (tokens.matchToken("return")) { + return parseReturnFunction(parser, runtime, tokens, true); + } + }); + + parser.addCommand("exit", function (parser, runtime, tokens) { + if (tokens.matchToken("exit")) { + return parseReturnFunction(parser, runtime, tokens, false); + } + }); + + parser.addCommand("halt", function (parser, runtime, tokens) { + if (tokens.matchToken("halt")) { + if (tokens.matchToken("the")) { + tokens.requireToken("event"); + // optional possessive + if (tokens.matchOpToken("'")) { + tokens.requireToken("s"); + } + var keepExecuting = true; + } + if (tokens.matchToken("bubbling")) { + var bubbling = true; + } else if (tokens.matchToken("default")) { + var haltDefault = true; + } + var exit = parseReturnFunction(parser, runtime, tokens, false); + + var haltCmd = { + keepExecuting: true, + bubbling: bubbling, + haltDefault: haltDefault, + exit: exit, + op: function (ctx) { + if (ctx.event) { + if (bubbling) { + ctx.event.stopPropagation(); + } else if (haltDefault) { + ctx.event.preventDefault(); + } else { + ctx.event.stopPropagation(); + ctx.event.preventDefault(); + } + if (keepExecuting) { + return runtime.findNext(this, ctx); + } else { + return exit; + } + } + }, + }; + return haltCmd; + } + }); + + parser.addCommand("log", function (parser, runtime, tokens) { + if (!tokens.matchToken("log")) return; + var exprs = [parser.parseElement("expression", tokens)]; + while (tokens.matchOpToken(",")) { + exprs.push(parser.requireElement("expression", tokens)); + } + if (tokens.matchToken("with")) { + var withExpr = parser.requireElement("expression", tokens); + } + var logCmd = { + exprs: exprs, + withExpr: withExpr, + args: [withExpr, exprs], + op: function (ctx, withExpr, values) { + if (withExpr) { + withExpr.apply(null, values); + } else { + console.log.apply(null, values); + } + return runtime.findNext(this, ctx); + }, + }; + return logCmd; + }); + + parser.addCommand("beep!", function (parser, runtime, tokens) { + if (!tokens.matchToken("beep!")) return; + var exprs = [parser.parseElement("expression", tokens)]; + while (tokens.matchOpToken(",")) { + exprs.push(parser.requireElement("expression", tokens)); + } + var beepCmd = { + exprs: exprs, + args: [exprs], + op: function (ctx, values) { + for (let i = 0; i < exprs.length; i++) { + const expr = exprs[i]; + const val = values[i]; + runtime.beepValueToConsole(ctx.me, expr, val); + } + return runtime.findNext(this, ctx); + }, + }; + return beepCmd; + }); + + parser.addCommand("throw", function (parser, runtime, tokens) { + if (!tokens.matchToken("throw")) return; + var expr = parser.requireElement("expression", tokens); + var throwCmd = { + expr: expr, + args: [expr], + op: function (ctx, expr) { + runtime.registerHyperTrace(ctx, expr); + throw expr; + }, + }; + return throwCmd; + }); + + var parseCallOrGet = function (parser, runtime, tokens) { + var expr = parser.requireElement("expression", tokens); + var callCmd = { + expr: expr, + args: [expr], + op: function (context, result) { + context.result = result; + return runtime.findNext(callCmd, context); + }, + }; + return callCmd; + }; + parser.addCommand("call", function (parser, runtime, tokens) { + if (!tokens.matchToken("call")) return; + var call = parseCallOrGet(parser, runtime, tokens); + if (call.expr && call.expr.type !== "functionCall") { + parser.raiseParseError(tokens, "Must be a function invocation"); + } + return call; + }); + parser.addCommand("get", function (parser, runtime, tokens) { + if (tokens.matchToken("get")) { + return parseCallOrGet(parser, runtime, tokens); + } + }); + + parser.addCommand("make", function (parser, runtime, tokens) { + if (!tokens.matchToken("make")) return; + tokens.matchToken("a") || tokens.matchToken("an"); + + var expr = parser.requireElement("expression", tokens); + + var args = []; + if (expr.type !== "queryRef" && tokens.matchToken("from")) { + do { + args.push(parser.requireElement("expression", tokens)); + } while (tokens.matchOpToken(",")); + } + + if (tokens.matchToken("called")) { + var target = parser.requireElement("symbol", tokens); + } + + var command; + if (expr.type === "queryRef") { + command = { + op: function (ctx) { + var match, + tagname = "div", + id, + classes = []; + var re = /(?:(^|#|\.)([^#\. ]+))/g; + while ((match = re.exec(expr.css))) { + if (match[1] === "") tagname = match[2].trim(); + else if (match[1] === "#") id = match[2].trim(); + else classes.push(match[2].trim()); + } + + var result = document.createElement(tagname); + if (id !== undefined) result.id = id; + for (var i = 0; i < classes.length; i++) { + var cls = classes[i]; + result.classList.add(cls) + } + + ctx.result = result; + if (target){ + runtime.setSymbol(target.name, ctx, target.scope, result); + } + + return runtime.findNext(this, ctx); + }, + }; + return command; + } else { + command = { + args: [expr, args], + op: function (ctx, expr, args) { + ctx.result = varargConstructor(expr, args); + if (target){ + runtime.setSymbol(target.name, ctx, target.scope, ctx.result); + } + + return runtime.findNext(this, ctx); + }, + }; + return command; + } + }); + + parser.addGrammarElement("pseudoCommand", function (parser, runtime, tokens) { + + let lookAhead = tokens.token(1); + if (!(lookAhead && lookAhead.op && (lookAhead.value === '.' || lookAhead.value === "("))) { + return null; + } + + var expr = parser.requireElement("primaryExpression", tokens); + + var rootRoot = expr.root; + var root = expr; + while (rootRoot.root != null) { + root = root.root; + rootRoot = rootRoot.root; + } + + if (expr.type !== "functionCall") { + parser.raiseParseError(tokens, "Pseudo-commands must be function calls"); + } + + if (root.type === "functionCall" && root.root.root == null) { + if (tokens.matchAnyToken("the", "to", "on", "with", "into", "from", "at")) { + var realRoot = parser.requireElement("expression", tokens); + } else if (tokens.matchToken("me")) { + var realRoot = parser.requireElement("implicitMeTarget", tokens); + } + } + + /** @type {ASTNode} */ + + var pseudoCommand + if(realRoot){ + pseudoCommand = { + type: "pseudoCommand", + root: realRoot, + argExressions: root.argExressions, + args: [realRoot, root.argExressions], + op: function (context, rootRoot, args) { + runtime.nullCheck(rootRoot, realRoot); + var func = rootRoot[root.root.name]; + runtime.nullCheck(func, root); + if (func.hyperfunc) { + args.push(context); + } + context.result = func.apply(rootRoot, args); + return runtime.findNext(pseudoCommand, context); + }, + execute: function (context) { + return runtime.unifiedExec(this, context); + }, + } + } else { + pseudoCommand = { + type: "pseudoCommand", + expr: expr, + args: [expr], + op: function (context, result) { + context.result = result; + return runtime.findNext(pseudoCommand, context); + }, + execute: function (context) { + return runtime.unifiedExec(this, context); + }, + }; + } + + return pseudoCommand; + }); + + /** + * @param {Parser} parser + * @param {Runtime} runtime + * @param {Tokens} tokens + * @param {*} target + * @param {*} value + * @returns + */ + var makeSetter = function (parser, runtime, tokens, target, value) { + + var symbolWrite = target.type === "symbol"; + var attributeWrite = target.type === "attributeRef"; + var styleWrite = target.type === "styleRef"; + var arrayWrite = target.type === "arrayIndex"; + + if (!(attributeWrite || styleWrite || symbolWrite) && target.root == null) { + parser.raiseParseError(tokens, "Can only put directly into symbols, not references"); + } + + var rootElt = null; + var prop = null; + if (symbolWrite) { + // rootElt is null + } else if (attributeWrite || styleWrite) { + rootElt = parser.requireElement("implicitMeTarget", tokens); + var attribute = target; + } else if(arrayWrite) { + prop = target.firstIndex; + rootElt = target.root; + } else { + prop = target.prop ? target.prop.value : null; + var attribute = target.attribute; + rootElt = target.root; + } + + /** @type {ASTNode} */ + var setCmd = { + target: target, + symbolWrite: symbolWrite, + value: value, + args: [rootElt, prop, value], + op: function (context, root, prop, valueToSet) { + if (symbolWrite) { + runtime.setSymbol(target.name, context, target.scope, valueToSet); + } else { + runtime.nullCheck(root, rootElt); + if (arrayWrite) { + root[prop] = valueToSet; + } else { + runtime.implicitLoop(root, function (elt) { + if (attribute) { + if (attribute.type === "attributeRef") { + if (valueToSet == null) { + elt.removeAttribute(attribute.name); + } else { + elt.setAttribute(attribute.name, valueToSet); + } + } else { + elt.style[attribute.name] = valueToSet; + } + } else { + elt[prop] = valueToSet; + } + }); + } + } + return runtime.findNext(this, context); + }, + }; + return setCmd; + }; + + parser.addCommand("default", function (parser, runtime, tokens) { + if (!tokens.matchToken("default")) return; + var target = parser.requireElement("assignableExpression", tokens); + tokens.requireToken("to"); + + var value = parser.requireElement("expression", tokens); + + /** @type {ASTNode} */ + var setter = makeSetter(parser, runtime, tokens, target, value); + var defaultCmd = { + target: target, + value: value, + setter: setter, + args: [target], + op: function (context, target) { + if (target) { + return runtime.findNext(this, context); + } else { + return setter; + } + }, + }; + setter.parent = defaultCmd; + return defaultCmd; + }); + + parser.addCommand("set", function (parser, runtime, tokens) { + if (!tokens.matchToken("set")) return; + if (tokens.currentToken().type === "L_BRACE") { + var obj = parser.requireElement("objectLiteral", tokens); + tokens.requireToken("on"); + var target = parser.requireElement("expression", tokens); + + var command = { + objectLiteral: obj, + target: target, + args: [obj, target], + op: function (ctx, obj, target) { + Object.assign(target, obj); + return runtime.findNext(this, ctx); + }, + }; + return command; + } + + try { + tokens.pushFollow("to"); + var target = parser.requireElement("assignableExpression", tokens); + } finally { + tokens.popFollow(); + } + tokens.requireToken("to"); + var value = parser.requireElement("expression", tokens); + return makeSetter(parser, runtime, tokens, target, value); + }); + + parser.addCommand("if", function (parser, runtime, tokens) { + if (!tokens.matchToken("if")) return; + var expr = parser.requireElement("expression", tokens); + tokens.matchToken("then"); // optional 'then' + var trueBranch = parser.parseElement("commandList", tokens); + var nestedIfStmt = false; + let elseToken = tokens.matchToken("else") || tokens.matchToken("otherwise"); + if (elseToken) { + let elseIfIfToken = tokens.peekToken("if"); + nestedIfStmt = elseIfIfToken != null && elseIfIfToken.line === elseToken.line; + if (nestedIfStmt) { + var falseBranch = parser.parseElement("command", tokens); + } else { + var falseBranch = parser.parseElement("commandList", tokens); + } + } + if (tokens.hasMore() && !nestedIfStmt) { + tokens.requireToken("end"); + } + + /** @type {ASTNode} */ + var ifCmd = { + expr: expr, + trueBranch: trueBranch, + falseBranch: falseBranch, + args: [expr], + op: function (context, exprValue) { + if (exprValue) { + return trueBranch; + } else if (falseBranch) { + return falseBranch; + } else { + return runtime.findNext(this, context); + } + }, + }; + parser.setParent(trueBranch, ifCmd); + parser.setParent(falseBranch, ifCmd); + return ifCmd; + }); + + var parseRepeatExpression = function (parser, tokens, runtime, startedWithForToken) { + var innerStartToken = tokens.currentToken(); + var identifier; + if (tokens.matchToken("for") || startedWithForToken) { + var identifierToken = tokens.requireTokenType("IDENTIFIER"); + identifier = identifierToken.value; + tokens.requireToken("in"); + var expression = parser.requireElement("expression", tokens); + } else if (tokens.matchToken("in")) { + identifier = "it"; + var expression = parser.requireElement("expression", tokens); + } else if (tokens.matchToken("while")) { + var whileExpr = parser.requireElement("expression", tokens); + } else if (tokens.matchToken("until")) { + var isUntil = true; + if (tokens.matchToken("event")) { + var evt = parser.requireElement("dotOrColonPath", tokens, "Expected event name"); + if (tokens.matchToken("from")) { + var on = parser.requireElement("expression", tokens); + } + } else { + var whileExpr = parser.requireElement("expression", tokens); + } + } else { + if (!parser.commandBoundary(tokens.currentToken()) && + tokens.currentToken().value !== 'forever') { + var times = parser.requireElement("expression", tokens); + tokens.requireToken("times"); + } else { + tokens.matchToken("forever"); // consume optional forever + var forever = true; + } + } + + if (tokens.matchToken("index")) { + var identifierToken = tokens.requireTokenType("IDENTIFIER"); + var indexIdentifier = identifierToken.value; + } + + var loop = parser.parseElement("commandList", tokens); + if (loop && evt) { + // if this is an event based loop, wait a tick at the end of the loop so that + // events have a chance to trigger in the loop condition o_O))) + var last = loop; + while (last.next) { + last = last.next; + } + var waitATick = { + type: "waitATick", + op: function () { + return new Promise(function (resolve) { + setTimeout(function () { + resolve(runtime.findNext(waitATick)); + }, 0); + }); + }, + }; + last.next = waitATick; + } + if (tokens.hasMore()) { + tokens.requireToken("end"); + } + + if (identifier == null) { + identifier = "_implicit_repeat_" + innerStartToken.start; + var slot = identifier; + } else { + var slot = identifier + "_" + innerStartToken.start; + } + + var repeatCmd = { + identifier: identifier, + indexIdentifier: indexIdentifier, + slot: slot, + expression: expression, + forever: forever, + times: times, + until: isUntil, + event: evt, + on: on, + whileExpr: whileExpr, + resolveNext: function () { + return this; + }, + loop: loop, + args: [whileExpr, times], + op: function (context, whileValue, times) { + var iteratorInfo = context.meta.iterators[slot]; + var keepLooping = false; + var loopVal = null; + if (this.forever) { + keepLooping = true; + } else if (this.until) { + if (evt) { + keepLooping = context.meta.iterators[slot].eventFired === false; + } else { + keepLooping = whileValue !== true; + } + } else if (whileExpr) { + keepLooping = whileValue; + } else if (times) { + keepLooping = iteratorInfo.index < times; + } else { + var nextValFromIterator = iteratorInfo.iterator.next(); + keepLooping = !nextValFromIterator.done; + loopVal = nextValFromIterator.value; + } + + if (keepLooping) { + if (iteratorInfo.value) { + context.result = context.locals[identifier] = loopVal; + } else { + context.result = iteratorInfo.index; + } + if (indexIdentifier) { + context.locals[indexIdentifier] = iteratorInfo.index; + } + iteratorInfo.index++; + return loop; + } else { + context.meta.iterators[slot] = null; + return runtime.findNext(this.parent, context); + } + }, + }; + parser.setParent(loop, repeatCmd); + var repeatInit = { + name: "repeatInit", + args: [expression, evt, on], + op: function (context, value, event, on) { + var iteratorInfo = { + index: 0, + value: value, + eventFired: false, + }; + context.meta.iterators[slot] = iteratorInfo; + if (value && value[Symbol.iterator]) { + iteratorInfo.iterator = value[Symbol.iterator](); + } + if (evt) { + var target = on || context.me; + target.addEventListener( + event, + function (e) { + context.meta.iterators[slot].eventFired = true; + }, + { once: true } + ); + } + return repeatCmd; // continue to loop + }, + execute: function (context) { + return runtime.unifiedExec(this, context); + }, + }; + parser.setParent(repeatCmd, repeatInit); + return repeatInit; + }; + + parser.addCommand("repeat", function (parser, runtime, tokens) { + if (tokens.matchToken("repeat")) { + return parseRepeatExpression(parser, tokens, runtime, false); + } + }); + + parser.addCommand("for", function (parser, runtime, tokens) { + if (tokens.matchToken("for")) { + return parseRepeatExpression(parser, tokens, runtime, true); + } + }); + + parser.addCommand("continue", function (parser, runtime, tokens) { + + if (!tokens.matchToken("continue")) return; + + var command = { + op: function (context) { + + // scan for the closest repeat statement + for (var parent = this.parent ; true ; parent = parent.parent) { + + if (parent == undefined) { + parser.raiseParseError(tokens, "Command `continue` cannot be used outside of a `repeat` loop.") + } + if (parent.loop != undefined) { + return parent.resolveNext(context) + } + } + } + }; + return command; + }); + + parser.addCommand("break", function (parser, runtime, tokens) { + + if (!tokens.matchToken("break")) return; + + var command = { + op: function (context) { + + // scan for the closest repeat statement + for (var parent = this.parent ; true ; parent = parent.parent) { + + if (parent == undefined) { + parser.raiseParseError(tokens, "Command `continue` cannot be used outside of a `repeat` loop.") + } + if (parent.loop != undefined) { + return runtime.findNext(parent.parent, context); + } + } + } + }; + return command; + }); + + parser.addGrammarElement("stringLike", function (parser, runtime, tokens) { + return parser.parseAnyOf(["string", "nakedString"], tokens); + }); + + parser.addCommand("append", function (parser, runtime, tokens) { + if (!tokens.matchToken("append")) return; + var targetExpr = null; + + var value = parser.requireElement("expression", tokens); + + /** @type {ASTNode} */ + var implicitResultSymbol = { + type: "symbol", + evaluate: function (context) { + return runtime.resolveSymbol("result", context); + }, + }; + + if (tokens.matchToken("to")) { + targetExpr = parser.requireElement("expression", tokens); + } else { + targetExpr = implicitResultSymbol; + } + + var setter = null; + if (targetExpr.type === "symbol" || targetExpr.type === "attributeRef" || targetExpr.root != null) { + setter = makeSetter(parser, runtime, tokens, targetExpr, implicitResultSymbol); + } + + var command = { + value: value, + target: targetExpr, + args: [targetExpr, value], + op: function (context, target, value) { + if (Array.isArray(target)) { + target.push(value); + return runtime.findNext(this, context); + } else if (target instanceof Element) { + target.innerHTML += value; + return runtime.findNext(this, context); + } else if(setter) { + context.result = (target || "") + value; + return setter; + } else { + throw Error("Unable to append a value!") + } + }, + execute: function (context) { + return runtime.unifiedExec(this, context/*, value, target*/); + }, + }; + + if (setter != null) { + setter.parent = command; + } + + return command; + }); + + function parsePickRange(parser, runtime, tokens) { + tokens.matchToken("at") || tokens.matchToken("from"); + const rv = { includeStart: true, includeEnd: false } + + rv.from = tokens.matchToken("start") ? 0 : parser.requireElement("expression", tokens) + + if (tokens.matchToken("to") || tokens.matchOpToken("..")) { + if (tokens.matchToken("end")) { + rv.toEnd = true; + } else { + rv.to = parser.requireElement("expression", tokens); + } + } + + if (tokens.matchToken("inclusive")) rv.includeEnd = true; + else if (tokens.matchToken("exclusive")) rv.includeStart = false; + + return rv; + } + + class RegExpIterator { + constructor(re, str) { + this.re = re; + this.str = str; + } + + next() { + const match = this.re.exec(this.str); + if (match === null) return { done: true }; + else return { value: match }; + } + } + + class RegExpIterable { + constructor(re, flags, str) { + this.re = re; + this.flags = flags; + this.str = str; + } + + [Symbol.iterator]() { + return new RegExpIterator(new RegExp(this.re, this.flags), this.str); + } + } + + parser.addCommand("pick", (parser, runtime, tokens) => { + if (!tokens.matchToken("pick")) return; + + tokens.matchToken("the"); + + if (tokens.matchToken("item") || tokens.matchToken("items") + || tokens.matchToken("character") || tokens.matchToken("characters")) { + const range = parsePickRange(parser, runtime, tokens); + + tokens.requireToken("from"); + const root = parser.requireElement("expression", tokens); + + return { + args: [root, range.from, range.to], + op(ctx, root, from, to) { + if (range.toEnd) to = root.length; + if (!range.includeStart) from++; + if (range.includeEnd) to++; + if (to == null || to == undefined) to = from + 1; + ctx.result = root.slice(from, to); + return runtime.findNext(this, ctx); + } + } + } + + if (tokens.matchToken("match")) { + tokens.matchToken("of"); + const re = parser.parseElement("expression", tokens); + let flags = "" + if (tokens.matchOpToken("|")) { + flags = tokens.requireToken("identifier").value; + } + + tokens.requireToken("from"); + const root = parser.parseElement("expression", tokens); + + return { + args: [root, re], + op(ctx, root, re) { + ctx.result = new RegExp(re, flags).exec(root); + return runtime.findNext(this, ctx); + } + } + } + + if (tokens.matchToken("matches")) { + tokens.matchToken("of"); + const re = parser.parseElement("expression", tokens); + let flags = "gu" + if (tokens.matchOpToken("|")) { + flags = 'g' + tokens.requireToken("identifier").value.replace('g', ''); + } + console.log('flags', flags) + + tokens.requireToken("from"); + const root = parser.parseElement("expression", tokens); + + return { + args: [root, re], + op(ctx, root, re) { + ctx.result = new RegExpIterable(re, flags, root); + return runtime.findNext(this, ctx); + } + } + } + }); + + parser.addCommand("increment", function (parser, runtime, tokens) { + if (!tokens.matchToken("increment")) return; + var amountExpr; + + // This is optional. Defaults to "result" + var target = parser.parseElement("assignableExpression", tokens); + + // This is optional. Defaults to 1. + if (tokens.matchToken("by")) { + amountExpr = parser.requireElement("expression", tokens); + } + + var implicitIncrementOp = { + type: "implicitIncrementOp", + target: target, + args: [target, amountExpr], + op: function (context, targetValue, amount) { + targetValue = targetValue ? parseFloat(targetValue) : 0; + amount = amountExpr ? parseFloat(amount) : 1; + var newValue = targetValue + amount; + context.result = newValue; + return newValue; + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + } + }; + + return makeSetter(parser, runtime, tokens, target, implicitIncrementOp); + }); + + parser.addCommand("decrement", function (parser, runtime, tokens) { + if (!tokens.matchToken("decrement")) return; + var amountExpr; + + // This is optional. Defaults to "result" + var target = parser.parseElement("assignableExpression", tokens); + + // This is optional. Defaults to 1. + if (tokens.matchToken("by")) { + amountExpr = parser.requireElement("expression", tokens); + } + + var implicitDecrementOp = { + type: "implicitDecrementOp", + target: target, + args: [target, amountExpr], + op: function (context, targetValue, amount) { + targetValue = targetValue ? parseFloat(targetValue) : 0; + amount = amountExpr ? parseFloat(amount) : 1; + var newValue = targetValue - amount; + context.result = newValue; + return newValue; + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + } + }; + + return makeSetter(parser, runtime, tokens, target, implicitDecrementOp); + }); + + function parseConversionInfo(tokens, parser) { + var type = "text"; + var conversion; + tokens.matchToken("a") || tokens.matchToken("an"); + if (tokens.matchToken("json") || tokens.matchToken("Object")) { + type = "json"; + } else if (tokens.matchToken("response")) { + type = "response"; + } else if (tokens.matchToken("html")) { + type = "html"; + } else if (tokens.matchToken("text")) { + // default, ignore + } else { + conversion = parser.requireElement("dotOrColonPath", tokens).evaluate(); + } + return {type, conversion}; + } + + parser.addCommand("fetch", function (parser, runtime, tokens) { + if (!tokens.matchToken("fetch")) return; + var url = parser.requireElement("stringLike", tokens); + + if (tokens.matchToken("as")) { + var conversionInfo = parseConversionInfo(tokens, parser); + } + + if (tokens.matchToken("with") && tokens.currentToken().value !== "{") { + var args = parser.parseElement("nakedNamedArgumentList", tokens); + } else { + var args = parser.parseElement("objectLiteral", tokens); + } + + if (conversionInfo == null && tokens.matchToken("as")) { + conversionInfo = parseConversionInfo(tokens, parser); + } + + var type = conversionInfo ? conversionInfo.type : "text"; + var conversion = conversionInfo ? conversionInfo.conversion : null + + /** @type {ASTNode} */ + var fetchCmd = { + url: url, + argExpressions: args, + args: [url, args], + op: function (context, url, args) { + var detail = args || {}; + detail["sender"] = context.me; + detail["headers"] = detail["headers"] || {} + var abortController = new AbortController(); + let abortListener = context.me.addEventListener('fetch:abort', function(){ + abortController.abort(); + }, {once: true}); + detail['signal'] = abortController.signal; + runtime.triggerEvent(context.me, "hyperscript:beforeFetch", detail); + runtime.triggerEvent(context.me, "fetch:beforeRequest", detail); + args = detail; + var finished = false; + if (args.timeout) { + setTimeout(function () { + if (!finished) { + abortController.abort(); + } + }, args.timeout); + } + return fetch(url, args) + .then(function (resp) { + let resultDetails = {response:resp}; + runtime.triggerEvent(context.me, "fetch:afterResponse", resultDetails); + resp = resultDetails.response; + + if (type === "response") { + context.result = resp; + runtime.triggerEvent(context.me, "fetch:afterRequest", {result:resp}); + finished = true; + return runtime.findNext(fetchCmd, context); + } + if (type === "json") { + return resp.json().then(function (result) { + context.result = result; + runtime.triggerEvent(context.me, "fetch:afterRequest", {result}); + finished = true; + return runtime.findNext(fetchCmd, context); + }); + } + return resp.text().then(function (result) { + if (conversion) result = runtime.convertValue(result, conversion); + + if (type === "html") result = runtime.convertValue(result, "Fragment"); + + context.result = result; + runtime.triggerEvent(context.me, "fetch:afterRequest", {result}); + finished = true; + return runtime.findNext(fetchCmd, context); + }); + }) + .catch(function (reason) { + runtime.triggerEvent(context.me, "fetch:error", { + reason: reason, + }); + throw reason; + }).finally(function(){ + context.me.removeEventListener('fetch:abort', abortListener); + }); + }, + }; + return fetchCmd; + }); + } + + function hyperscriptWebGrammar(parser) { + parser.addCommand("settle", function (parser, runtime, tokens) { + if (tokens.matchToken("settle")) { + if (!parser.commandBoundary(tokens.currentToken())) { + var onExpr = parser.requireElement("expression", tokens); + } else { + var onExpr = parser.requireElement("implicitMeTarget", tokens); + } + + var settleCommand = { + type: "settleCmd", + args: [onExpr], + op: function (context, on) { + runtime.nullCheck(on, onExpr); + var resolve = null; + var resolved = false; + var transitionStarted = false; + + var promise = new Promise(function (r) { + resolve = r; + }); + + // listen for a transition begin + on.addEventListener( + "transitionstart", + function () { + transitionStarted = true; + }, + { once: true } + ); + + // if no transition begins in 500ms, cancel + setTimeout(function () { + if (!transitionStarted && !resolved) { + resolve(runtime.findNext(settleCommand, context)); + } + }, 500); + + // continue on a transition emd + on.addEventListener( + "transitionend", + function () { + if (!resolved) { + resolve(runtime.findNext(settleCommand, context)); + } + }, + { once: true } + ); + return promise; + }, + execute: function (context) { + return runtime.unifiedExec(this, context); + }, + }; + return settleCommand; + } + }); + + parser.addCommand("add", function (parser, runtime, tokens) { + if (tokens.matchToken("add")) { + var classRef = parser.parseElement("classRef", tokens); + var attributeRef = null; + var cssDeclaration = null; + if (classRef == null) { + attributeRef = parser.parseElement("attributeRef", tokens); + if (attributeRef == null) { + cssDeclaration = parser.parseElement("styleLiteral", tokens); + if (cssDeclaration == null) { + parser.raiseParseError(tokens, "Expected either a class reference or attribute expression"); + } + } + } else { + var classRefs = [classRef]; + while ((classRef = parser.parseElement("classRef", tokens))) { + classRefs.push(classRef); + } + } + + if (tokens.matchToken("to")) { + var toExpr = parser.requireElement("expression", tokens); + } else { + var toExpr = parser.requireElement("implicitMeTarget", tokens); + } + + if (tokens.matchToken("when")) { + if (cssDeclaration) { + parser.raiseParseError(tokens, "Only class and properties are supported with a when clause") + } + var when = parser.requireElement("expression", tokens); + } + + if (classRefs) { + return { + classRefs: classRefs, + to: toExpr, + args: [toExpr, classRefs], + op: function (context, to, classRefs) { + runtime.nullCheck(to, toExpr); + runtime.forEach(classRefs, function (classRef) { + runtime.implicitLoop(to, function (target) { + if (when) { + context.result = target; + let whenResult = runtime.evaluateNoPromise(when, context); + if (whenResult) { + if (target instanceof Element) target.classList.add(classRef.className); + } else { + if (target instanceof Element) target.classList.remove(classRef.className); + } + context.result = null; + } else { + if (target instanceof Element) target.classList.add(classRef.className); + } + }); + }); + return runtime.findNext(this, context); + }, + }; + } else if (attributeRef) { + return { + type: "addCmd", + attributeRef: attributeRef, + to: toExpr, + args: [toExpr], + op: function (context, to, attrRef) { + runtime.nullCheck(to, toExpr); + runtime.implicitLoop(to, function (target) { + if (when) { + context.result = target; + let whenResult = runtime.evaluateNoPromise(when, context); + if (whenResult) { + target.setAttribute(attributeRef.name, attributeRef.value); + } else { + target.removeAttribute(attributeRef.name); + } + context.result = null; + } else { + target.setAttribute(attributeRef.name, attributeRef.value); + } + }); + return runtime.findNext(this, context); + }, + execute: function (ctx) { + return runtime.unifiedExec(this, ctx); + }, + }; + } else { + return { + type: "addCmd", + cssDeclaration: cssDeclaration, + to: toExpr, + args: [toExpr, cssDeclaration], + op: function (context, to, css) { + runtime.nullCheck(to, toExpr); + runtime.implicitLoop(to, function (target) { + target.style.cssText += css; + }); + return runtime.findNext(this, context); + }, + execute: function (ctx) { + return runtime.unifiedExec(this, ctx); + }, + }; + } + } + }); + + parser.addGrammarElement("styleLiteral", function (parser, runtime, tokens) { + if (!tokens.matchOpToken("{")) return; + + var stringParts = [""] + var exprs = [] + + while (tokens.hasMore()) { + if (tokens.matchOpToken("\\")) { + tokens.consumeToken(); + } else if (tokens.matchOpToken("}")) { + break; + } else if (tokens.matchToken("$")) { + var opencurly = tokens.matchOpToken("{"); + var expr = parser.parseElement("expression", tokens); + if (opencurly) tokens.requireOpToken("}"); + + exprs.push(expr) + stringParts.push("") + } else { + var tok = tokens.consumeToken(); + stringParts[stringParts.length-1] += tokens.source.substring(tok.start, tok.end); + } + + stringParts[stringParts.length-1] += tokens.lastWhitespace(); + } + + return { + type: "styleLiteral", + args: [exprs], + op: function (ctx, exprs) { + var rv = ""; + + stringParts.forEach(function (part, idx) { + rv += part; + if (idx in exprs) rv += exprs[idx]; + }); + + return rv; + }, + evaluate: function(ctx) { + return runtime.unifiedEval(this, ctx); + } + } + }) + + parser.addCommand("remove", function (parser, runtime, tokens) { + if (tokens.matchToken("remove")) { + var classRef = parser.parseElement("classRef", tokens); + var attributeRef = null; + var elementExpr = null; + if (classRef == null) { + attributeRef = parser.parseElement("attributeRef", tokens); + if (attributeRef == null) { + elementExpr = parser.parseElement("expression", tokens); + if (elementExpr == null) { + parser.raiseParseError( + tokens, + "Expected either a class reference, attribute expression or value expression" + ); + } + } + } else { + var classRefs = [classRef]; + while ((classRef = parser.parseElement("classRef", tokens))) { + classRefs.push(classRef); + } + } + + if (tokens.matchToken("from")) { + var fromExpr = parser.requireElement("expression", tokens); + } else { + if (elementExpr == null) { + var fromExpr = parser.requireElement("implicitMeTarget", tokens); + } + } + + if (elementExpr) { + return { + elementExpr: elementExpr, + from: fromExpr, + args: [elementExpr, fromExpr], + op: function (context, element, from) { + runtime.nullCheck(element, elementExpr); + runtime.implicitLoop(element, function (target) { + if (target.parentElement && (from == null || from.contains(target))) { + target.parentElement.removeChild(target); + } + }); + return runtime.findNext(this, context); + }, + }; + } else { + return { + classRefs: classRefs, + attributeRef: attributeRef, + elementExpr: elementExpr, + from: fromExpr, + args: [classRefs, fromExpr], + op: function (context, classRefs, from) { + runtime.nullCheck(from, fromExpr); + if (classRefs) { + runtime.forEach(classRefs, function (classRef) { + runtime.implicitLoop(from, function (target) { + target.classList.remove(classRef.className); + }); + }); + } else { + runtime.implicitLoop(from, function (target) { + target.removeAttribute(attributeRef.name); + }); + } + return runtime.findNext(this, context); + }, + }; + } + } + }); + + parser.addCommand("toggle", function (parser, runtime, tokens) { + if (tokens.matchToken("toggle")) { + tokens.matchAnyToken("the", "my"); + if (tokens.currentToken().type === "STYLE_REF") { + let styleRef = tokens.consumeToken(); + var name = styleRef.value.substr(1); + var visibility = true; + var hideShowStrategy = resolveHideShowStrategy(parser, tokens, name); + if (tokens.matchToken("of")) { + tokens.pushFollow("with"); + try { + var onExpr = parser.requireElement("expression", tokens); + } finally { + tokens.popFollow(); + } + } else { + var onExpr = parser.requireElement("implicitMeTarget", tokens); + } + } else if (tokens.matchToken("between")) { + var between = true; + var classRef = parser.parseElement("classRef", tokens); + tokens.requireToken("and"); + var classRef2 = parser.requireElement("classRef", tokens); + } else { + var classRef = parser.parseElement("classRef", tokens); + var attributeRef = null; + if (classRef == null) { + attributeRef = parser.parseElement("attributeRef", tokens); + if (attributeRef == null) { + parser.raiseParseError(tokens, "Expected either a class reference or attribute expression"); + } + } else { + var classRefs = [classRef]; + while ((classRef = parser.parseElement("classRef", tokens))) { + classRefs.push(classRef); + } + } + } + + if (visibility !== true) { + if (tokens.matchToken("on")) { + var onExpr = parser.requireElement("expression", tokens); + } else { + var onExpr = parser.requireElement("implicitMeTarget", tokens); + } + } + + if (tokens.matchToken("for")) { + var time = parser.requireElement("expression", tokens); + } else if (tokens.matchToken("until")) { + var evt = parser.requireElement("dotOrColonPath", tokens, "Expected event name"); + if (tokens.matchToken("from")) { + var from = parser.requireElement("expression", tokens); + } + } + + var toggleCmd = { + classRef: classRef, + classRef2: classRef2, + classRefs: classRefs, + attributeRef: attributeRef, + on: onExpr, + time: time, + evt: evt, + from: from, + toggle: function (on, classRef, classRef2, classRefs) { + runtime.nullCheck(on, onExpr); + if (visibility) { + runtime.implicitLoop(on, function (target) { + hideShowStrategy("toggle", target); + }); + } else if (between) { + runtime.implicitLoop(on, function (target) { + if (target.classList.contains(classRef.className)) { + target.classList.remove(classRef.className); + target.classList.add(classRef2.className); + } else { + target.classList.add(classRef.className); + target.classList.remove(classRef2.className); + } + }); + } else if (classRefs) { + runtime.forEach(classRefs, function (classRef) { + runtime.implicitLoop(on, function (target) { + target.classList.toggle(classRef.className); + }); + }); + } else { + runtime.forEach(on, function (target) { + if (target.hasAttribute(attributeRef.name)) { + target.removeAttribute(attributeRef.name); + } else { + target.setAttribute(attributeRef.name, attributeRef.value); + } + }); + } + }, + args: [onExpr, time, evt, from, classRef, classRef2, classRefs], + op: function (context, on, time, evt, from, classRef, classRef2, classRefs) { + if (time) { + return new Promise(function (resolve) { + toggleCmd.toggle(on, classRef, classRef2, classRefs); + setTimeout(function () { + toggleCmd.toggle(on, classRef, classRef2, classRefs); + resolve(runtime.findNext(toggleCmd, context)); + }, time); + }); + } else if (evt) { + return new Promise(function (resolve) { + var target = from || context.me; + target.addEventListener( + evt, + function () { + toggleCmd.toggle(on, classRef, classRef2, classRefs); + resolve(runtime.findNext(toggleCmd, context)); + }, + { once: true } + ); + toggleCmd.toggle(on, classRef, classRef2, classRefs); + }); + } else { + this.toggle(on, classRef, classRef2, classRefs); + return runtime.findNext(toggleCmd, context); + } + }, + }; + return toggleCmd; + } + }); + + var HIDE_SHOW_STRATEGIES = { + display: function (op, element, arg) { + if (arg) { + element.style.display = arg; + } else if (op === "toggle") { + if (getComputedStyle(element).display === "none") { + HIDE_SHOW_STRATEGIES.display("show", element, arg); + } else { + HIDE_SHOW_STRATEGIES.display("hide", element, arg); + } + } else if (op === "hide") { + const internalData = parser.runtime.getInternalData(element); + if (internalData.originalDisplay == null) { + internalData.originalDisplay = element.style.display; + } + element.style.display = "none"; + } else { + const internalData = parser.runtime.getInternalData(element); + if (internalData.originalDisplay && internalData.originalDisplay !== 'none') { + element.style.display = internalData.originalDisplay; + } else { + element.style.removeProperty('display'); + } + } + }, + visibility: function (op, element, arg) { + if (arg) { + element.style.visibility = arg; + } else if (op === "toggle") { + if (getComputedStyle(element).visibility === "hidden") { + HIDE_SHOW_STRATEGIES.visibility("show", element, arg); + } else { + HIDE_SHOW_STRATEGIES.visibility("hide", element, arg); + } + } else if (op === "hide") { + element.style.visibility = "hidden"; + } else { + element.style.visibility = "visible"; + } + }, + opacity: function (op, element, arg) { + if (arg) { + element.style.opacity = arg; + } else if (op === "toggle") { + if (getComputedStyle(element).opacity === "0") { + HIDE_SHOW_STRATEGIES.opacity("show", element, arg); + } else { + HIDE_SHOW_STRATEGIES.opacity("hide", element, arg); + } + } else if (op === "hide") { + element.style.opacity = "0"; + } else { + element.style.opacity = "1"; + } + }, + }; + + var parseShowHideTarget = function (parser, runtime, tokens) { + var target; + var currentTokenValue = tokens.currentToken(); + if (currentTokenValue.value === "when" || currentTokenValue.value === "with" || parser.commandBoundary(currentTokenValue)) { + target = parser.parseElement("implicitMeTarget", tokens); + } else { + target = parser.parseElement("expression", tokens); + } + return target; + }; + + var resolveHideShowStrategy = function (parser, tokens, name) { + var configDefault = config.defaultHideShowStrategy; + var strategies = HIDE_SHOW_STRATEGIES; + if (config.hideShowStrategies) { + strategies = Object.assign(strategies, config.hideShowStrategies); // merge in user provided strategies + } + name = name || configDefault || "display"; + var value = strategies[name]; + if (value == null) { + parser.raiseParseError(tokens, "Unknown show/hide strategy : " + name); + } + return value; + }; + + parser.addCommand("hide", function (parser, runtime, tokens) { + if (tokens.matchToken("hide")) { + var targetExpr = parseShowHideTarget(parser, runtime, tokens); + + var name = null; + if (tokens.matchToken("with")) { + name = tokens.requireTokenType("IDENTIFIER", "STYLE_REF").value; + if (name.indexOf("*") === 0) { + name = name.substr(1); + } + } + var hideShowStrategy = resolveHideShowStrategy(parser, tokens, name); + + return { + target: targetExpr, + args: [targetExpr], + op: function (ctx, target) { + runtime.nullCheck(target, targetExpr); + runtime.implicitLoop(target, function (elt) { + hideShowStrategy("hide", elt); + }); + return runtime.findNext(this, ctx); + }, + }; + } + }); + + parser.addCommand("show", function (parser, runtime, tokens) { + if (tokens.matchToken("show")) { + var targetExpr = parseShowHideTarget(parser, runtime, tokens); + + var name = null; + if (tokens.matchToken("with")) { + name = tokens.requireTokenType("IDENTIFIER", "STYLE_REF").value; + if (name.indexOf("*") === 0) { + name = name.substr(1); + } + } + var arg = null; + if (tokens.matchOpToken(":")) { + var tokenArr = tokens.consumeUntilWhitespace(); + tokens.matchTokenType("WHITESPACE"); + arg = tokenArr + .map(function (t) { + return t.value; + }) + .join(""); + } + + if (tokens.matchToken("when")) { + var when = parser.requireElement("expression", tokens); + } + + var hideShowStrategy = resolveHideShowStrategy(parser, tokens, name); + + return { + target: targetExpr, + when: when, + args: [targetExpr], + op: function (ctx, target) { + runtime.nullCheck(target, targetExpr); + runtime.implicitLoop(target, function (elt) { + if (when) { + ctx.result = elt; + let whenResult = runtime.evaluateNoPromise(when, ctx); + if (whenResult) { + hideShowStrategy("show", elt, arg); + } else { + hideShowStrategy("hide", elt); + } + ctx.result = null; + } else { + hideShowStrategy("show", elt, arg); + } + }); + return runtime.findNext(this, ctx); + }, + }; + } + }); + + parser.addCommand("take", function (parser, runtime, tokens) { + if (tokens.matchToken("take")) { + let classRef = null; + let classRefs = []; + while ((classRef = parser.parseElement("classRef", tokens))) { + classRefs.push(classRef); + } + + var attributeRef = null; + var replacementValue = null; + + let weAreTakingClasses = classRefs.length > 0; + if (!weAreTakingClasses) { + attributeRef = parser.parseElement("attributeRef", tokens); + if (attributeRef == null) { + parser.raiseParseError(tokens, "Expected either a class reference or attribute expression"); + } + + if (tokens.matchToken("with")) { + replacementValue = parser.requireElement("expression", tokens); + } + } + + if (tokens.matchToken("from")) { + var fromExpr = parser.requireElement("expression", tokens); + } + + if (tokens.matchToken("for")) { + var forExpr = parser.requireElement("expression", tokens); + } else { + var forExpr = parser.requireElement("implicitMeTarget", tokens); + } + + if (weAreTakingClasses) { + var takeCmd = { + classRefs: classRefs, + from: fromExpr, + forElt: forExpr, + args: [classRefs, fromExpr, forExpr], + op: function (context, classRefs, from, forElt) { + runtime.nullCheck(forElt, forExpr); + runtime.implicitLoop(classRefs, function(classRef){ + var clazz = classRef.className; + if (from) { + runtime.implicitLoop(from, function (target) { + target.classList.remove(clazz); + }); + } else { + runtime.implicitLoop(classRef, function (target) { + target.classList.remove(clazz); + }); + } + runtime.implicitLoop(forElt, function (target) { + target.classList.add(clazz); + }); + }) + return runtime.findNext(this, context); + }, + }; + return takeCmd; + } else { + var takeCmd = { + attributeRef: attributeRef, + from: fromExpr, + forElt: forExpr, + args: [fromExpr, forExpr, replacementValue], + op: function (context, from, forElt, replacementValue) { + runtime.nullCheck(from, fromExpr); + runtime.nullCheck(forElt, forExpr); + runtime.implicitLoop(from, function (target) { + if (!replacementValue) { + target.removeAttribute(attributeRef.name); + } else { + target.setAttribute(attributeRef.name, replacementValue) + } + }); + runtime.implicitLoop(forElt, function (target) { + target.setAttribute(attributeRef.name, attributeRef.value || "") + }); + return runtime.findNext(this, context); + }, + }; + return takeCmd; + } + } + }); + + function putInto(runtime, context, prop, valueToPut) { + if (prop != null) { + var value = runtime.resolveSymbol(prop, context); + } else { + var value = context; + } + if (value instanceof Element || value instanceof HTMLDocument) { + while (value.firstChild) value.removeChild(value.firstChild); + value.append(parser.runtime.convertValue(valueToPut, "Fragment")); + runtime.processNode(value); + } else { + if (prop != null) { + runtime.setSymbol(prop, context, null, valueToPut); + } else { + throw "Don't know how to put a value into " + typeof context; + } + } + } + + parser.addCommand("put", function (parser, runtime, tokens) { + if (tokens.matchToken("put")) { + var value = parser.requireElement("expression", tokens); + + var operationToken = tokens.matchAnyToken("into", "before", "after"); + + if (operationToken == null && tokens.matchToken("at")) { + tokens.matchToken("the"); // optional "the" + operationToken = tokens.matchAnyToken("start", "end"); + tokens.requireToken("of"); + } + + if (operationToken == null) { + parser.raiseParseError(tokens, "Expected one of 'into', 'before', 'at start of', 'at end of', 'after'"); + } + var target = parser.requireElement("expression", tokens); + + var operation = operationToken.value; + + var arrayIndex = false; + var symbolWrite = false; + var rootExpr = null; + var prop = null; + + if (target.type === "arrayIndex" && operation === "into") { + arrayIndex = true; + prop = target.prop; + rootExpr = target.root; + } else if (target.prop && target.root && operation === "into") { + prop = target.prop.value; + rootExpr = target.root; + } else if (target.type === "symbol" && operation === "into") { + symbolWrite = true; + prop = target.name; + } else if (target.type === "attributeRef" && operation === "into") { + var attributeWrite = true; + prop = target.name; + rootExpr = parser.requireElement("implicitMeTarget", tokens); + } else if (target.type === "styleRef" && operation === "into") { + var styleWrite = true; + prop = target.name; + rootExpr = parser.requireElement("implicitMeTarget", tokens); + } else if (target.attribute && operation === "into") { + var attributeWrite = target.attribute.type === "attributeRef"; + var styleWrite = target.attribute.type === "styleRef"; + prop = target.attribute.name; + rootExpr = target.root; + } else { + rootExpr = target; + } + + var putCmd = { + target: target, + operation: operation, + symbolWrite: symbolWrite, + value: value, + args: [rootExpr, prop, value], + op: function (context, root, prop, valueToPut) { + if (symbolWrite) { + putInto(runtime, context, prop, valueToPut); + } else { + runtime.nullCheck(root, rootExpr); + if (operation === "into") { + if (attributeWrite) { + runtime.implicitLoop(root, function (elt) { + elt.setAttribute(prop, valueToPut); + }); + } else if (styleWrite) { + runtime.implicitLoop(root, function (elt) { + elt.style[prop] = valueToPut; + }); + } else if (arrayIndex) { + root[prop] = valueToPut; + } else { + runtime.implicitLoop(root, function (elt) { + putInto(runtime, elt, prop, valueToPut); + }); + } + } else { + var op = + operation === "before" + ? Element.prototype.before + : operation === "after" + ? Element.prototype.after + : operation === "start" + ? Element.prototype.prepend + : operation === "end" + ? Element.prototype.append + : Element.prototype.append; // unreachable + + runtime.implicitLoop(root, function (elt) { + op.call( + elt, + valueToPut instanceof Node + ? valueToPut + : runtime.convertValue(valueToPut, "Fragment") + ); + // process any new content + if (elt.parentElement) { + runtime.processNode(elt.parentElement); + } else { + runtime.processNode(elt); + } + }); + } + } + return runtime.findNext(this, context); + }, + }; + return putCmd; + } + }); + + function parsePseudopossessiveTarget(parser, runtime, tokens) { + var targets; + if ( + tokens.matchToken("the") || + tokens.matchToken("element") || + tokens.matchToken("elements") || + tokens.currentToken().type === "CLASS_REF" || + tokens.currentToken().type === "ID_REF" || + (tokens.currentToken().op && tokens.currentToken().value === "<") + ) { + parser.possessivesDisabled = true; + try { + targets = parser.parseElement("expression", tokens); + } finally { + delete parser.possessivesDisabled; + } + // optional possessive + if (tokens.matchOpToken("'")) { + tokens.requireToken("s"); + } + } else if (tokens.currentToken().type === "IDENTIFIER" && tokens.currentToken().value === "its") { + var identifier = tokens.matchToken("its"); + targets = { + type: "pseudopossessiveIts", + token: identifier, + name: identifier.value, + evaluate: function (context) { + return runtime.resolveSymbol("it", context); + }, + }; + } else { + tokens.matchToken("my") || tokens.matchToken("me"); // consume optional 'my' + targets = parser.parseElement("implicitMeTarget", tokens); + } + return targets; + } + + parser.addCommand("transition", function (parser, runtime, tokens) { + if (tokens.matchToken("transition")) { + var targetsExpr = parsePseudopossessiveTarget(parser, runtime, tokens); + + var properties = []; + var from = []; + var to = []; + var currentToken = tokens.currentToken(); + while ( + !parser.commandBoundary(currentToken) && + currentToken.value !== "over" && + currentToken.value !== "using" + ) { + if (tokens.currentToken().type === "STYLE_REF") { + let styleRef = tokens.consumeToken(); + let styleProp = styleRef.value.substr(1); + properties.push({ + type: "styleRefValue", + evaluate: function () { + return styleProp; + }, + }); + } else { + properties.push(parser.requireElement("stringLike", tokens)); + } + + if (tokens.matchToken("from")) { + from.push(parser.requireElement("expression", tokens)); + } else { + from.push(null); + } + tokens.requireToken("to"); + if (tokens.matchToken("initial")) { + to.push({ + type: "initial_literal", + evaluate : function(){ + return "initial"; + } + }); + } else { + to.push(parser.requireElement("expression", tokens)); + } + currentToken = tokens.currentToken(); + } + if (tokens.matchToken("over")) { + var over = parser.requireElement("expression", tokens); + } else if (tokens.matchToken("using")) { + var using = parser.requireElement("expression", tokens); + } + + var transition = { + to: to, + args: [targetsExpr, properties, from, to, using, over], + op: function (context, targets, properties, from, to, using, over) { + runtime.nullCheck(targets, targetsExpr); + var promises = []; + runtime.implicitLoop(targets, function (target) { + var promise = new Promise(function (resolve, reject) { + var initialTransition = target.style.transition; + if (over) { + target.style.transition = "all " + over + "ms ease-in"; + } else if (using) { + target.style.transition = using; + } else { + target.style.transition = config.defaultTransition; + } + var internalData = runtime.getInternalData(target); + var computedStyles = getComputedStyle(target); + + var initialStyles = {}; + for (var i = 0; i < computedStyles.length; i++) { + var name = computedStyles[i]; + var initialValue = computedStyles[name]; + initialStyles[name] = initialValue; + } + + // store initial values + if (!internalData.initialStyles) { + internalData.initialStyles = initialStyles; + } + + for (var i = 0; i < properties.length; i++) { + var property = properties[i]; + var fromVal = from[i]; + if (fromVal === "computed" || fromVal == null) { + target.style[property] = initialStyles[property]; + } else { + target.style[property] = fromVal; + } + } + //console.log("transition started", transition); + + var transitionStarted = false; + var resolved = false; + + target.addEventListener( + "transitionend", + function () { + if (!resolved) { + //console.log("transition ended", transition); + target.style.transition = initialTransition; + resolved = true; + resolve(); + } + }, + { once: true } + ); + + target.addEventListener( + "transitionstart", + function () { + transitionStarted = true; + }, + { once: true } + ); + + // it no transition has started in 100ms, continue + setTimeout(function () { + if (!resolved && !transitionStarted) { + //console.log("transition ended", transition); + target.style.transition = initialTransition; + resolved = true; + resolve(); + } + }, 100); + + setTimeout(function () { + var autoProps = []; + for (var i = 0; i < properties.length; i++) { + var property = properties[i]; + var toVal = to[i]; + if (toVal === "initial") { + var propertyValue = internalData.initialStyles[property]; + target.style[property] = propertyValue; + } else { + target.style[property] = toVal; + } + //console.log("set", property, "to", target.style[property], "on", target, "value passed in : ", toVal); + } + }, 0); + }); + promises.push(promise); + }); + return Promise.all(promises).then(function () { + return runtime.findNext(transition, context); + }); + }, + }; + return transition; + } + }); + + parser.addCommand("measure", function (parser, runtime, tokens) { + if (!tokens.matchToken("measure")) return; + + var targetExpr = parsePseudopossessiveTarget(parser, runtime, tokens); + + var propsToMeasure = []; + if (!parser.commandBoundary(tokens.currentToken())) + do { + propsToMeasure.push(tokens.matchTokenType("IDENTIFIER").value); + } while (tokens.matchOpToken(",")); + + return { + properties: propsToMeasure, + args: [targetExpr], + op: function (ctx, target) { + runtime.nullCheck(target, targetExpr); + if (0 in target) target = target[0]; // not measuring multiple elts + var rect = target.getBoundingClientRect(); + var scroll = { + top: target.scrollTop, + left: target.scrollLeft, + topMax: target.scrollTopMax, + leftMax: target.scrollLeftMax, + height: target.scrollHeight, + width: target.scrollWidth, + }; + + ctx.result = { + x: rect.x, + y: rect.y, + left: rect.left, + top: rect.top, + right: rect.right, + bottom: rect.bottom, + width: rect.width, + height: rect.height, + bounds: rect, + + scrollLeft: scroll.left, + scrollTop: scroll.top, + scrollLeftMax: scroll.leftMax, + scrollTopMax: scroll.topMax, + scrollWidth: scroll.width, + scrollHeight: scroll.height, + scroll: scroll, + }; + + runtime.forEach(propsToMeasure, function (prop) { + if (prop in ctx.result) ctx.locals[prop] = ctx.result[prop]; + else throw "No such measurement as " + prop; + }); + + return runtime.findNext(this, ctx); + }, + }; + }); + + parser.addLeafExpression("closestExpr", function (parser, runtime, tokens) { + if (tokens.matchToken("closest")) { + if (tokens.matchToken("parent")) { + var parentSearch = true; + } + + var css = null; + if (tokens.currentToken().type === "ATTRIBUTE_REF") { + var attributeRef = parser.requireElement("attributeRefAccess", tokens, null); + css = "[" + attributeRef.attribute.name + "]"; + } + + if (css == null) { + var expr = parser.requireElement("expression", tokens); + if (expr.css == null) { + parser.raiseParseError(tokens, "Expected a CSS expression"); + } else { + css = expr.css; + } + } + + if (tokens.matchToken("to")) { + var to = parser.parseElement("expression", tokens); + } else { + var to = parser.parseElement("implicitMeTarget", tokens); + } + + var closestExpr = { + type: "closestExpr", + parentSearch: parentSearch, + expr: expr, + css: css, + to: to, + args: [to], + op: function (ctx, to) { + if (to == null) { + return null; + } else { + let result = []; + runtime.implicitLoop(to, function(to){ + if (parentSearch) { + result.push(to.parentElement ? to.parentElement.closest(css) : null); + } else { + result.push(to.closest(css)); + } + }) + if (runtime.shouldAutoIterate(to)) { + return result; + } else { + return result[0]; + } + } + }, + evaluate: function (context) { + return runtime.unifiedEval(this, context); + }, + }; + + if (attributeRef) { + attributeRef.root = closestExpr; + attributeRef.args = [closestExpr]; + return attributeRef; + } else { + return closestExpr; + } + } + }); + + parser.addCommand("go", function (parser, runtime, tokens) { + if (tokens.matchToken("go")) { + if (tokens.matchToken("back")) { + var back = true; + } else { + tokens.matchToken("to"); + if (tokens.matchToken("url")) { + var target = parser.requireElement("stringLike", tokens); + var url = true; + if (tokens.matchToken("in")) { + tokens.requireToken("new"); + tokens.requireToken("window"); + var newWindow = true; + } + } else { + tokens.matchToken("the"); // optional the + var verticalPosition = tokens.matchAnyToken("top", "middle", "bottom"); + var horizontalPosition = tokens.matchAnyToken("left", "center", "right"); + if (verticalPosition || horizontalPosition) { + tokens.requireToken("of"); + } + var target = parser.requireElement("unaryExpression", tokens); + + var plusOrMinus = tokens.matchAnyOpToken("+", "-"); + if (plusOrMinus) { + tokens.pushFollow("px"); + try { + var offset = parser.requireElement("expression", tokens); + } finally { + tokens.popFollow(); + } + } + tokens.matchToken("px"); // optional px + + var smoothness = tokens.matchAnyToken("smoothly", "instantly"); + + var scrollOptions = { + block: "start", + inline: "nearest" + }; + + if (verticalPosition) { + if (verticalPosition.value === "top") { + scrollOptions.block = "start"; + } else if (verticalPosition.value === "bottom") { + scrollOptions.block = "end"; + } else if (verticalPosition.value === "middle") { + scrollOptions.block = "center"; + } + } + + if (horizontalPosition) { + if (horizontalPosition.value === "left") { + scrollOptions.inline = "start"; + } else if (horizontalPosition.value === "center") { + scrollOptions.inline = "center"; + } else if (horizontalPosition.value === "right") { + scrollOptions.inline = "end"; + } + } + + if (smoothness) { + if (smoothness.value === "smoothly") { + scrollOptions.behavior = "smooth"; + } else if (smoothness.value === "instantly") { + scrollOptions.behavior = "instant"; + } + } + } + } + + var goCmd = { + target: target, + args: [target, offset], + op: function (ctx, to, offset) { + if (back) { + window.history.back(); + } else if (url) { + if (to) { + if (newWindow) { + window.open(to); + } else { + window.location.href = to; + } + } + } else { + runtime.implicitLoop(to, function (target) { + + if (target === window) { + target = document.body; + } + + if(plusOrMinus) { + // a scroll w/ an offset of some sort + let boundingRect = target.getBoundingClientRect(); + + let scrollShim = document.createElement("div"); + + let actualOffset = plusOrMinus.value === "+" ? offset : offset * -1; + + let offsetX = scrollOptions.inline == "start" || scrollOptions.inline == "end" ? actualOffset : 0; + + let offsetY = scrollOptions.block == "start" || scrollOptions.block == "end" ? actualOffset : 0; + + scrollShim.style.position = "absolute"; + scrollShim.style.top = (boundingRect.top + window.scrollY + offsetY) + "px"; + scrollShim.style.left = (boundingRect.left + window.scrollX + offsetX) + "px"; + scrollShim.style.height = boundingRect.height + "px"; + scrollShim.style.width = boundingRect.width + "px"; + scrollShim.style.zIndex = "" + Number.MIN_SAFE_INTEGER; + scrollShim.style.opacity = "0"; + + document.body.appendChild(scrollShim); + setTimeout(function () { + document.body.removeChild(scrollShim); + }, 100); + + target = scrollShim; + } + + target.scrollIntoView(scrollOptions); + }); + } + return runtime.findNext(goCmd, ctx); + }, + }; + return goCmd; + } + }); + + config.conversions.dynamicResolvers.push(function (str, node) { + if (!(str === "Values" || str.indexOf("Values:") === 0)) { + return; + } + var conversion = str.split(":")[1]; + /** @type Object */ + var result = {}; + + var implicitLoop = parser.runtime.implicitLoop.bind(parser.runtime); + + implicitLoop(node, function (/** @type HTMLInputElement */ node) { + // Try to get a value directly from this node + var input = getInputInfo(node); + + if (input !== undefined) { + result[input.name] = input.value; + return; + } + + // Otherwise, try to query all child elements of this node that *should* contain values. + if (node.querySelectorAll != undefined) { + /** @type {NodeListOf} */ + var children = node.querySelectorAll("input,select,textarea"); + children.forEach(appendValue); + } + }); + + if (conversion) { + if (conversion === "JSON") { + return JSON.stringify(result); + } else if (conversion === "Form") { + /** @ts-ignore */ + // TODO: does this work with multiple inputs of the same name? + return new URLSearchParams(result).toString(); + } else { + throw "Unknown conversion: " + conversion; + } + } else { + return result; + } + + /** + * @param {HTMLInputElement} node + */ + function appendValue(node) { + var info = getInputInfo(node); + + if (info == undefined) { + return; + } + + // If there is no value already stored in this space. + if (result[info.name] == undefined) { + result[info.name] = info.value; + return; + } + + if (Array.isArray(result[info.name]) && Array.isArray(info.value)) { + result[info.name] = [].concat(result[info.name], info.value); + return; + } + } + + /** + * @param {HTMLInputElement} node + * @returns {{name:string, value:string | string[]} | undefined} + */ + function getInputInfo(node) { + try { + /** @type {{name: string, value: string | string[]}}*/ + var result = { + name: node.name, + value: node.value, + }; + + if (result.name == undefined || result.value == undefined) { + return undefined; + } + + if (node.type == "radio" && node.checked == false) { + return undefined; + } + + if (node.type == "checkbox") { + if (node.checked == false) { + result.value = undefined; + } else if (typeof result.value === "string") { + result.value = [result.value]; + } + } + + if (node.type == "select-multiple") { + /** @type {NodeListOf} */ + var selected = node.querySelectorAll("option[selected]"); + + result.value = []; + for (var index = 0; index < selected.length; index++) { + result.value.push(selected[index].value); + } + } + return result; + } catch (e) { + return undefined; + } + } + }); + + config.conversions["HTML"] = function (value) { + var toHTML = /** @returns {string}*/ function (/** @type any*/ value) { + if (value instanceof Array) { + return value + .map(function (item) { + return toHTML(item); + }) + .join(""); + } + + if (value instanceof HTMLElement) { + return value.outerHTML; + } + + if (value instanceof NodeList) { + var result = ""; + for (var i = 0; i < value.length; i++) { + var node = value[i]; + if (node instanceof HTMLElement) { + result += node.outerHTML; + } + } + return result; + } + + if (value.toString) { + return value.toString(); + } + + return ""; + }; + + return toHTML(value); + }; + + config.conversions["Fragment"] = function (val) { + var frag = document.createDocumentFragment(); + parser.runtime.implicitLoop(val, function (val) { + if (val instanceof Node) frag.append(val); + else { + var temp = document.createElement("template"); + temp.innerHTML = val; + frag.append(temp.content); + } + }); + return frag; + }; + } + + + // Public API + + const runtime_ = new Runtime(), lexer_ = runtime_.lexer, parser_ = runtime_.parser + + /** + * + * @param {string} src + * @param {Partial} [ctx] + */ + function run(src, ctx) { + return runtime_.evaluate(src, ctx) + } + + function browserInit() { + /** @type {HTMLScriptElement[]} */ + var scripts = Array.from(globalScope.document.querySelectorAll("script[type='text/hyperscript'][src]")) + Promise.all( + scripts.map(function (script) { + return fetch(script.src) + .then(function (res) { + return res.text(); + }); + }) + ) + .then(script_values => script_values.forEach(sc => _hyperscript(sc))) + .then(() => ready(function () { + mergeMetaConfig(); + runtime_.processNode(document.documentElement); + globalScope.document.addEventListener("htmx:load", function (/** @type {CustomEvent} */ evt) { + runtime_.processNode(evt.detail.elt); + }); + })); + + function ready(fn) { + if (document.readyState !== "loading") { + setTimeout(fn); + } else { + document.addEventListener("DOMContentLoaded", fn); + } + } + + function getMetaConfig() { + /** @type {HTMLMetaElement} */ + var element = document.querySelector('meta[name="htmx-config"]'); + if (element) { + return parseJSON(element.content); + } else { + return null; + } + } + + function mergeMetaConfig() { + var metaConfig = getMetaConfig(); + if (metaConfig) { + Object.assign(config, metaConfig); + } + } + } + + /** + * @typedef {Object} HyperscriptAPI + * + * @property {Object} config + * @property {string} config.attributes + * @property {string} config.defaultTransition + * @property {string} config.disableSelector + * @property {typeof conversions} config.conversions + * + * @property {Object} internals + * @property {Lexer} internals.lexer + * @property {typeof Lexer} internals.Lexer + * @property {Parser} internals.parser + * @property {typeof Parser} internals.Parser + * @property {Runtime} internals.runtime + * @property {typeof Runtime} internals.Runtime + * + * @property {typeof ElementCollection} ElementCollection + * + * @property {(keyword: string, definition: ParseRule) => void} addFeature + * @property {(keyword: string, definition: ParseRule) => void} addCommand + * @property {(keyword: string, definition: ParseRule) => void} addLeafExpression + * @property {(keyword: string, definition: ParseRule) => void} addIndirectExpression + * + * @property {(src: string, ctx?: Partial) => any} evaluate + * @property {(src: string) => ASTNode} parse + * @property {(node: Element) => void} processNode + * + * @property {() => void} browserInit + * + * + * @typedef {HyperscriptAPI & ((src: string, ctx?: Partial) => any)} Hyperscript + */ + + /** + * @type {Hyperscript} + */ + const _hyperscript = Object.assign( + run, + { + config, + + use(plugin) { plugin(_hyperscript) }, + + internals: { + lexer: lexer_, parser: parser_, runtime: runtime_, + Lexer, Tokens, Parser, Runtime, + }, + ElementCollection, + + addFeature: parser_.addFeature.bind(parser_), + addCommand: parser_.addCommand.bind(parser_), + addLeafExpression: parser_.addLeafExpression.bind(parser_), + addIndirectExpression: parser_.addIndirectExpression.bind(parser_), + + evaluate: runtime_.evaluate.bind(runtime_), + parse: runtime_.parse.bind(runtime_), + processNode: runtime_.processNode.bind(runtime_), + version: "0.9.12", + browserInit, + } + ) + + return _hyperscript +}) + + +_hyperscript.addCommand('sort', function(parser, runtime, tokens) { + if (!tokens.matchToken("sort")) return; + + var sortables = parser.requireElement("expression", tokens); + + var operationToken = tokens.matchToken("by"); + + var sorting = parser.requireElement("expression", tokens); + + if (sorting.type != "symbol" && sorting.type != "attributeRef") { + return; + } + + var sortCmd = { + value: sortables, + args: [sortables], + op: function (context, sortables) { + if (sortables == null) { + sortables = []; + } else if (!(Array.isArray(sortables) || sortables instanceof NodeList)) { + sortables = [sortables]; + } + + unsortedGroup = [] + sortables.forEach(function (part, idx) { + unsortedGroup[idx] = [] + sortables.forEach(function (potentialSibling) { + if (part.parentNode == potentialSibling.parentNode) { + positionInParent = Array.prototype.indexOf.call(part.parentNode.children, potentialSibling) + unsortedGroup[idx].push(potentialSibling) + if (sorting.type === "attributeRef") { + console.log(sorting.name) + console.log(potentialSibling.getAttribute(sorting.name)) + } + if (sorting.type === "symbol") { + console.log(potentialSibling[sorting.name]) + } + } + + }); + sortables.shift() + }); + + return runtime.findNext(this) + }, + }; + return sortCmd; +}) diff --git a/components/web/static_files/js/_hyperscript/_hyperscript.template.js b/components/web/static_files/js/_hyperscript/_hyperscript.template.js new file mode 100644 index 0000000..a4e60ba --- /dev/null +++ b/components/web/static_files/js/_hyperscript/_hyperscript.template.js @@ -0,0 +1,86 @@ +(function (self, factory) { + const plugin = factory(self) + + if (typeof exports === 'object' && typeof exports['nodeName'] !== 'string') { + module.exports = plugin + } else { + if ('_hyperscript' in self) self._hyperscript.use(plugin) + } +})(typeof self !== 'undefined' ? self : this, self => { + + function compileTemplate(template) { + return template.replace(/(?:^|\n)([^@]*)@?/gm, function (match, p1) { + var templateStr = (" " + p1).replace(/([^\\])\$\{/g, "$1$${escape html ").substring(1); + return "\ncall meta.__ht_template_result.push(`" + templateStr + "`)\n"; + }); + } + + /** + * @param {HyperscriptObject} _hyperscript + */ + return _hyperscript => { + + function renderTemplate(template, ctx) { + var buf = []; + const renderCtx = Object.assign({}, ctx); + renderCtx.meta = Object.assign({ __ht_template_result: buf }, ctx.meta); + _hyperscript.evaluate(template, renderCtx); + return buf.join(""); + } + + _hyperscript.addCommand("render", function (parser, runtime, tokens) { + if (!tokens.matchToken("render")) return; + var template_ = parser.requireElement("expression", tokens); + var templateArgs = {}; + if (tokens.matchToken("with")) { + templateArgs = parser.parseElement("namedArgumentList", tokens); + } + return { + args: [template_, templateArgs], + op: function (ctx, template, templateArgs) { + if (!(template instanceof Element)) throw new Error(template_.sourceFor() + " is not an element"); + const context = _hyperscript.internals.runtime.makeContext() + context.locals = templateArgs; + ctx.result = renderTemplate(compileTemplate(template.innerHTML), context); + return runtime.findNext(this, ctx); + }, + }; + }); + + function escapeHTML(html) { + return String(html) + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/\x22/g, """) + .replace(/\x27/g, "'"); + } + + _hyperscript.addLeafExpression("escape", function (parser, runtime, tokens) { + if (!tokens.matchToken("escape")) return; + var escapeType = tokens.matchTokenType("IDENTIFIER").value; + + // hidden! for use in templates + var unescaped = tokens.matchToken("unescaped"); + + var arg = parser.requireElement("expression", tokens); + + return { + args: [arg], + op: function (ctx, arg) { + if (unescaped) return arg; + if (arg === undefined) return ""; + switch (escapeType) { + case "html": + return escapeHTML(arg); + default: + throw new Error("Unknown escape: " + escapeType); + } + }, + evaluate: function (ctx) { + return runtime.unifiedEval(this, ctx); + }, + }; + }); + } +}) \ No newline at end of file diff --git a/components/web/static_files/js/htmx.org/htmx.org.js b/components/web/static_files/js/htmx.org/htmx.org.js new file mode 100644 index 0000000..370cc0f --- /dev/null +++ b/components/web/static_files/js/htmx.org/htmx.org.js @@ -0,0 +1,5261 @@ +var htmx = (function() { + 'use strict' + + // Public API + const htmx = { + // Tsc madness here, assigning the functions directly results in an invalid TypeScript output, but reassigning is fine + /* Event processing */ + /** @type {typeof onLoadHelper} */ + onLoad: null, + /** @type {typeof processNode} */ + process: null, + /** @type {typeof addEventListenerImpl} */ + on: null, + /** @type {typeof removeEventListenerImpl} */ + off: null, + /** @type {typeof triggerEvent} */ + trigger: null, + /** @type {typeof ajaxHelper} */ + ajax: null, + /* DOM querying helpers */ + /** @type {typeof find} */ + find: null, + /** @type {typeof findAll} */ + findAll: null, + /** @type {typeof closest} */ + closest: null, + /** + * Returns the input values that would resolve for a given element via the htmx value resolution mechanism + * + * @see https://htmx.org/api/#values + * + * @param {Element} elt the element to resolve values on + * @param {HttpVerb} type the request type (e.g. **get** or **post**) non-GET's will include the enclosing form of the element. Defaults to **post** + * @returns {Object} + */ + values: function(elt, type) { + const inputValues = getInputValues(elt, type || 'post') + return inputValues.values + }, + /* DOM manipulation helpers */ + /** @type {typeof removeElement} */ + remove: null, + /** @type {typeof addClassToElement} */ + addClass: null, + /** @type {typeof removeClassFromElement} */ + removeClass: null, + /** @type {typeof toggleClassOnElement} */ + toggleClass: null, + /** @type {typeof takeClassForElement} */ + takeClass: null, + /** @type {typeof swap} */ + swap: null, + /* Extension entrypoints */ + /** @type {typeof defineExtension} */ + defineExtension: null, + /** @type {typeof removeExtension} */ + removeExtension: null, + /* Debugging */ + /** @type {typeof logAll} */ + logAll: null, + /** @type {typeof logNone} */ + logNone: null, + /* Debugging */ + /** + * The logger htmx uses to log with + * + * @see https://htmx.org/api/#logger + */ + logger: null, + /** + * A property holding the configuration htmx uses at runtime. + * + * Note that using a [meta tag](https://htmx.org/docs/#config) is the preferred mechanism for setting these properties. + * + * @see https://htmx.org/api/#config + */ + config: { + /** + * Whether to use history. + * @type boolean + * @default true + */ + historyEnabled: true, + /** + * The number of pages to keep in **localStorage** for history support. + * @type number + * @default 10 + */ + historyCacheSize: 10, + /** + * @type boolean + * @default false + */ + refreshOnHistoryMiss: false, + /** + * The default swap style to use if **[hx-swap](https://htmx.org/attributes/hx-swap)** is omitted. + * @type HtmxSwapStyle + * @default 'innerHTML' + */ + defaultSwapStyle: 'innerHTML', + /** + * The default delay between receiving a response from the server and doing the swap. + * @type number + * @default 0 + */ + defaultSwapDelay: 0, + /** + * The default delay between completing the content swap and settling attributes. + * @type number + * @default 20 + */ + defaultSettleDelay: 20, + /** + * If true, htmx will inject a small amount of CSS into the page to make indicators invisible unless the **htmx-indicator** class is present. + * @type boolean + * @default true + */ + includeIndicatorStyles: true, + /** + * The class to place on indicators when a request is in flight. + * @type string + * @default 'htmx-indicator' + */ + indicatorClass: 'htmx-indicator', + /** + * The class to place on triggering elements when a request is in flight. + * @type string + * @default 'htmx-request' + */ + requestClass: 'htmx-request', + /** + * The class to temporarily place on elements that htmx has added to the DOM. + * @type string + * @default 'htmx-added' + */ + addedClass: 'htmx-added', + /** + * The class to place on target elements when htmx is in the settling phase. + * @type string + * @default 'htmx-settling' + */ + settlingClass: 'htmx-settling', + /** + * The class to place on target elements when htmx is in the swapping phase. + * @type string + * @default 'htmx-swapping' + */ + swappingClass: 'htmx-swapping', + /** + * Allows the use of eval-like functionality in htmx, to enable **hx-vars**, trigger conditions & script tag evaluation. Can be set to **false** for CSP compatibility. + * @type boolean + * @default true + */ + allowEval: true, + /** + * If set to false, disables the interpretation of script tags. + * @type boolean + * @default true + */ + allowScriptTags: true, + /** + * If set, the nonce will be added to inline scripts. + * @type string + * @default '' + */ + inlineScriptNonce: '', + /** + * If set, the nonce will be added to inline styles. + * @type string + * @default '' + */ + inlineStyleNonce: '', + /** + * The attributes to settle during the settling phase. + * @type string[] + * @default ['class', 'style', 'width', 'height'] + */ + attributesToSettle: ['class', 'style', 'width', 'height'], + /** + * Allow cross-site Access-Control requests using credentials such as cookies, authorization headers or TLS client certificates. + * @type boolean + * @default false + */ + withCredentials: false, + /** + * @type number + * @default 0 + */ + timeout: 0, + /** + * The default implementation of **getWebSocketReconnectDelay** for reconnecting after unexpected connection loss by the event code **Abnormal Closure**, **Service Restart** or **Try Again Later**. + * @type {'full-jitter' | ((retryCount:number) => number)} + * @default "full-jitter" + */ + wsReconnectDelay: 'full-jitter', + /** + * The type of binary data being received over the WebSocket connection + * @type BinaryType + * @default 'blob' + */ + wsBinaryType: 'blob', + /** + * @type string + * @default '[hx-disable], [data-hx-disable]' + */ + disableSelector: '[hx-disable], [data-hx-disable]', + /** + * @type {'auto' | 'instant' | 'smooth'} + * @default 'instant' + */ + scrollBehavior: 'instant', + /** + * If the focused element should be scrolled into view. + * @type boolean + * @default false + */ + defaultFocusScroll: false, + /** + * If set to true htmx will include a cache-busting parameter in GET requests to avoid caching partial responses by the browser + * @type boolean + * @default false + */ + getCacheBusterParam: false, + /** + * If set to true, htmx will use the View Transition API when swapping in new content. + * @type boolean + * @default false + */ + globalViewTransitions: false, + /** + * htmx will format requests with these methods by encoding their parameters in the URL, not the request body + * @type {(HttpVerb)[]} + * @default ['get', 'delete'] + */ + methodsThatUseUrlParams: ['get', 'delete'], + /** + * If set to true, disables htmx-based requests to non-origin hosts. + * @type boolean + * @default false + */ + selfRequestsOnly: true, + /** + * If set to true htmx will not update the title of the document when a title tag is found in new content + * @type boolean + * @default false + */ + ignoreTitle: false, + /** + * Whether the target of a boosted element is scrolled into the viewport. + * @type boolean + * @default true + */ + scrollIntoViewOnBoost: true, + /** + * The cache to store evaluated trigger specifications into. + * You may define a simple object to use a never-clearing cache, or implement your own system using a [proxy object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Proxy) + * @type {Object|null} + * @default null + */ + triggerSpecsCache: null, + /** @type boolean */ + disableInheritance: false, + /** @type HtmxResponseHandlingConfig[] */ + responseHandling: [ + { code: '204', swap: false }, + { code: '[23]..', swap: true }, + { code: '[45]..', swap: false, error: true } + ], + /** + * Whether to process OOB swaps on elements that are nested within the main response element. + * @type boolean + * @default true + */ + allowNestedOobSwaps: true + }, + /** @type {typeof parseInterval} */ + parseInterval: null, + /** @type {typeof internalEval} */ + _: null, + version: '2.0.4' + } + // Tsc madness part 2 + htmx.onLoad = onLoadHelper + htmx.process = processNode + htmx.on = addEventListenerImpl + htmx.off = removeEventListenerImpl + htmx.trigger = triggerEvent + htmx.ajax = ajaxHelper + htmx.find = find + htmx.findAll = findAll + htmx.closest = closest + htmx.remove = removeElement + htmx.addClass = addClassToElement + htmx.removeClass = removeClassFromElement + htmx.toggleClass = toggleClassOnElement + htmx.takeClass = takeClassForElement + htmx.swap = swap + htmx.defineExtension = defineExtension + htmx.removeExtension = removeExtension + htmx.logAll = logAll + htmx.logNone = logNone + htmx.parseInterval = parseInterval + htmx._ = internalEval + + const internalAPI = { + addTriggerHandler, + bodyContains, + canAccessLocalStorage, + findThisElement, + filterValues, + swap, + hasAttribute, + getAttributeValue, + getClosestAttributeValue, + getClosestMatch, + getExpressionVars, + getHeaders, + getInputValues, + getInternalData, + getSwapSpecification, + getTriggerSpecs, + getTarget, + makeFragment, + mergeObjects, + makeSettleInfo, + oobSwap, + querySelectorExt, + settleImmediately, + shouldCancel, + triggerEvent, + triggerErrorEvent, + withExtensions + } + + const VERBS = ['get', 'post', 'put', 'delete', 'patch'] + const VERB_SELECTOR = VERBS.map(function(verb) { + return '[hx-' + verb + '], [data-hx-' + verb + ']' + }).join(', ') + + //= =================================================================== + // Utilities + //= =================================================================== + + /** + * Parses an interval string consistent with the way htmx does. Useful for plugins that have timing-related attributes. + * + * Caution: Accepts an int followed by either **s** or **ms**. All other values use **parseFloat** + * + * @see https://htmx.org/api/#parseInterval + * + * @param {string} str timing string + * @returns {number|undefined} + */ + function parseInterval(str) { + if (str == undefined) { + return undefined + } + + let interval = NaN + if (str.slice(-2) == 'ms') { + interval = parseFloat(str.slice(0, -2)) + } else if (str.slice(-1) == 's') { + interval = parseFloat(str.slice(0, -1)) * 1000 + } else if (str.slice(-1) == 'm') { + interval = parseFloat(str.slice(0, -1)) * 1000 * 60 + } else { + interval = parseFloat(str) + } + return isNaN(interval) ? undefined : interval + } + + /** + * @param {Node} elt + * @param {string} name + * @returns {(string | null)} + */ + function getRawAttribute(elt, name) { + return elt instanceof Element && elt.getAttribute(name) + } + + /** + * @param {Element} elt + * @param {string} qualifiedName + * @returns {boolean} + */ + // resolve with both hx and data-hx prefixes + function hasAttribute(elt, qualifiedName) { + return !!elt.hasAttribute && (elt.hasAttribute(qualifiedName) || + elt.hasAttribute('data-' + qualifiedName)) + } + + /** + * + * @param {Node} elt + * @param {string} qualifiedName + * @returns {(string | null)} + */ + function getAttributeValue(elt, qualifiedName) { + return getRawAttribute(elt, qualifiedName) || getRawAttribute(elt, 'data-' + qualifiedName) + } + + /** + * @param {Node} elt + * @returns {Node | null} + */ + function parentElt(elt) { + const parent = elt.parentElement + if (!parent && elt.parentNode instanceof ShadowRoot) return elt.parentNode + return parent + } + + /** + * @returns {Document} + */ + function getDocument() { + return document + } + + /** + * @param {Node} elt + * @param {boolean} global + * @returns {Node|Document} + */ + function getRootNode(elt, global) { + return elt.getRootNode ? elt.getRootNode({ composed: global }) : getDocument() + } + + /** + * @param {Node} elt + * @param {(e:Node) => boolean} condition + * @returns {Node | null} + */ + function getClosestMatch(elt, condition) { + while (elt && !condition(elt)) { + elt = parentElt(elt) + } + + return elt || null + } + + /** + * @param {Element} initialElement + * @param {Element} ancestor + * @param {string} attributeName + * @returns {string|null} + */ + function getAttributeValueWithDisinheritance(initialElement, ancestor, attributeName) { + const attributeValue = getAttributeValue(ancestor, attributeName) + const disinherit = getAttributeValue(ancestor, 'hx-disinherit') + var inherit = getAttributeValue(ancestor, 'hx-inherit') + if (initialElement !== ancestor) { + if (htmx.config.disableInheritance) { + if (inherit && (inherit === '*' || inherit.split(' ').indexOf(attributeName) >= 0)) { + return attributeValue + } else { + return null + } + } + if (disinherit && (disinherit === '*' || disinherit.split(' ').indexOf(attributeName) >= 0)) { + return 'unset' + } + } + return attributeValue + } + + /** + * @param {Element} elt + * @param {string} attributeName + * @returns {string | null} + */ + function getClosestAttributeValue(elt, attributeName) { + let closestAttr = null + getClosestMatch(elt, function(e) { + return !!(closestAttr = getAttributeValueWithDisinheritance(elt, asElement(e), attributeName)) + }) + if (closestAttr !== 'unset') { + return closestAttr + } + } + + /** + * @param {Node} elt + * @param {string} selector + * @returns {boolean} + */ + function matches(elt, selector) { + // @ts-ignore: non-standard properties for browser compatibility + // noinspection JSUnresolvedVariable + const matchesFunction = elt instanceof Element && (elt.matches || elt.matchesSelector || elt.msMatchesSelector || elt.mozMatchesSelector || elt.webkitMatchesSelector || elt.oMatchesSelector) + return !!matchesFunction && matchesFunction.call(elt, selector) + } + + /** + * @param {string} str + * @returns {string} + */ + function getStartTag(str) { + const tagMatcher = /<([a-z][^\/\0>\x20\t\r\n\f]*)/i + const match = tagMatcher.exec(str) + if (match) { + return match[1].toLowerCase() + } else { + return '' + } + } + + /** + * @param {string} resp + * @returns {Document} + */ + function parseHTML(resp) { + const parser = new DOMParser() + return parser.parseFromString(resp, 'text/html') + } + + /** + * @param {DocumentFragment} fragment + * @param {Node} elt + */ + function takeChildrenFor(fragment, elt) { + while (elt.childNodes.length > 0) { + fragment.append(elt.childNodes[0]) + } + } + + /** + * @param {HTMLScriptElement} script + * @returns {HTMLScriptElement} + */ + function duplicateScript(script) { + const newScript = getDocument().createElement('script') + forEach(script.attributes, function(attr) { + newScript.setAttribute(attr.name, attr.value) + }) + newScript.textContent = script.textContent + newScript.async = false + if (htmx.config.inlineScriptNonce) { + newScript.nonce = htmx.config.inlineScriptNonce + } + return newScript + } + + /** + * @param {HTMLScriptElement} script + * @returns {boolean} + */ + function isJavaScriptScriptNode(script) { + return script.matches('script') && (script.type === 'text/javascript' || script.type === 'module' || script.type === '') + } + + /** + * we have to make new copies of script tags that we are going to insert because + * SOME browsers (not saying who, but it involves an element and an animal) don't + * execute scripts created in

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 literal 0 HcmV?d00001 diff --git a/components/web/static_files/fonts/Go-Medium-Italic.woff2 b/components/web/static_files/fonts/Go-Medium-Italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..6dc7ec1ed3a471fa6f359c108480967682e7f994 GIT binary patch literal 56328 zcmV)3K+C^(Pew8T0RR910Ne-w4gdfE0)w0Y0Nbnp0RR9100000000000000000000 z00006U;v6f2!SvOoD2~N3W&^jhuusImLvcHHUcCAmL3Ek1-Af8k*J>#ckOf$=nmpVYMv6Z|NsC0{|!k+#!R~{>BfMo zqIwbe^#|z?^dv+$f@EZ+Duq#FAdC<(RGH{wwA3lD=C2lh&3DLq98TvtxJ+A`HQfVdi4AA>^^gEk2byRwVK^l z-AMb8s|1pC?^x4<810W8yJ;ipZbQr9a8-gHd6vnH`;0IG4SzvUq99O~mXI6?6iGSc zW`EyLN8snrHmwrQ=&0U+_R4&kLbSxD+0xFoPT`HhCHK$UeI2|V;c-_n>xR2s=nZ%m zvt{Y2|Hb?@zaCnLDr$Q7ncg#Sz$fiPrp^T%{i_?ryajM_dvzQ|2qQ#j!a{70JxQ+1 z8;0;XMBBW7KmohJsF>(5vZroiiWL~$6WEMgW7INP$uitp<@w0&AO6>_uI`z0pXJmk z6ghm3;f!<${(r}})L)Wzy(UIU&q2WDRCFN(-*1emn46yYe*J#G`$cg(yZ4<%R3k&R z>XqbGGDG~WAet@Wk%<5QpSr%iPrA2Cl8sGrAarL71h45R+XW`PWFwZ_bkOLlD0;j~ zRUK(dr*Vdw~+G*p`gcfK1=v1DnX zN2F#l0-@si?R|j=CLsigC>od9nW{wipwqq&du$U8NTetUfyfSd#=M-;zH4VNKLmASfGSR_nx=8x35Ppr?lHXq+{zT ztdMUQLRfz@BBqR367<{qp{Ci=`yU{%tJFdR%)kgCEfQ;= zF)sR<$;{<VPBu8Gs^)aAz;t%y^#2K2)WCl z#6{B^0&L5eIFf|`YYOxvHT&OvQzIIio-fG4LTQG;|M{l&rB&~t`+?F72b8|S_Z-9X zDXrsZUD{}Xob~SH#%JBP>b|OeuAAKr*8oVU0f-z>6hT04NSRl!>a|{X1KI{CjqL29 zG|o{Yed8s_jJMG@(b~vH-}p!yZoW~V$z;|A@n-1;VY2Zi!G^*9y{TIJKj^S-7UjlZ{4+2``(gk@e!c8-gt#jFsQ zlHx*GS^{md`1agaPT(ZgE;J#qCzu)X5}aUJGim}|Y=BNxX^HM$E3f{#yTtRp9)PGy zQVhf~w(4dx?mo(Q4NPhX0fi5UZPqE&(huPvPeh1F{^lD+(mC(Wv899}K}6&sBF^#i zx7U6eKPK^-$!k4x79c3r2ntGDF#qpozqCrKrfKFr(!?`|VgyA61>vDI)BRkiR9QO5 z;}C-79Vie56_LKE{;)Ocq__tGeSG#R%;1FxDpu>2kaJ*v##Y}k@yl`dGAxXVv`|pQ zLV4&FLEbLVKNbHQ6GR&pIyJ(rG>K*$BbO~1wz~(u1c2yE*?|J}s;LJ+SE$_?@oljM z_5%4oydV6|hk}g%Ig0y+9K`$F)HG(uxMEO${abPA<# zL4}L5nB}Zyz!vs!ggd0LnB}Zy69-7=G*9y^S9yuo_<*m>+$PN0!Y#^TE%D#|tNq<$ z9{_;MRrRMaSMs++YrVGW{>U4}qk7bip$7fRD^qH}K>%fd{NLS$L7Gy0=)0Gto?h&= z6%3zq9YVkxAD7cd1o%R}w8M zh-CIIGyUc4sV8Tn&H+=oL3tcs@5~R(*UT48Ci6Noms!p%W9Bk> zOfHj!UEY>!6C^*%R#*VR7z;sXuC@Y$4Mm7$`~Ry`yOT3x(zAr909v-=dVUZ_agt^^ zk^qx}mKCd;w(Ey+v)%0v$J6<8y*#?esGoiO2~NmFLbnKf_Gg0s#z=X}Xa7A;16DatV5 zn8fmyCZUcg*I5b3m0VhW5W z1!;$JY^)`|BA!aOfCz(YlYmt^7e~L4TIG5~QG9BA$;A{fU-1QQzc5EJg`N^n%b) z%wxCJpa#E@$@0%KB%8fqkD_=>#dY_WM`|X0=>i|#9fgUg@Ve1@{jSImjx`6)caWCj zSUhGz-&in0`hC>+jSL|qsG`=v&T)w@<)HI;hSX_sNPO&xw>1U3r-nP`@$<`g<;k$p zyyDVO4^~Gd303Bimcf|fv`r55K<2StO_keTnC7U7kg*m|tEwbqO$3VOtTqlMz^l*D z4xcsh%7)3OwxSWqm;1+Ns{w-DhGq4Y0j{(d`B~z>Ve9UXfv`SgjGO@2yL4 zk?ElDyOeO79xMguE>|0~PlBdefDHZ^dxQlfUYtY{aK)reO?{-iK$9g8QbkhI$J)Nn ztn2Da+P#bu6zsj@*Y=J9V{JuHGem~pIiUX9fuwenq5L#cciBB*FM(uFK*f78%T6Xc z>go3wGVD#QoT>fkGgXMPk-J2cE(eA%wy*?6Esgpn%)lM#l90GBB&G9XEkYxsW#7{` zhaMesw2i!S2$$(W6Pt}Y4d#t*D+Fs5P~rI|OEpwWAMAD|BQ_cE6)eNe1uGUTeo_$gpzyk|&6Vg8?+z zmN+S1-MrE>f|FBzXlG}xSliR_WSV)}?fH)?pnoQt6xB=Tz&EBBF3^BJWxP3(U_)Ef zMtp|HIo)}g%;zZ*^9i{GW-(xWhIpz==HwNs2ebDrUDvCT6wBCK-yl=jdxc81h{jP) zuB6`&%oM*G;g3zgy|uY=oyhLp_x$Wz5HXYSDD%MT%w$WpPinGtk`4`+P1jIl*F@D< zjUsUgTj1B>nK_ zu0XA&qozDF_vqoykjIM`qMJm1UG>gP5DFkziXS_n-!{AIF{@QRPGPGt_VJ&;YqtA8 zX=hCQ0Y3$AW3aW)z+I%ufqmV>bY1T(3RXNO`_K6W+YB=5Gm%!u`G%_${0b_W?0e%2 zWMjr1bl99<6axzeaUg`f=d4T`Yb%phStKuy;kJcH<<+j_Car8y5Wzov9Yj;UUf|sF zPHFgZI*~Ug-y(x-j`B*#_u7@4JJ~-M;+~*FKQ%Q{_4i@SrAqmI)(22pq3cytwh-kq zL{*EYRnyPX0Xzc$sA*ZWa7vCo72DZ}b2*}}&GYUS%ePp8#R@H6G#(u*reh^^tdx$I zRnxU{y0l<9Qrhq zinJbJJ<69-i%@3FjG!URq@pXB{b? z&EysFqB`vEjd(nBaq zZNl*fGl;5wkg;m66%B!26K-8pmeMx1J}OJ@5*yH40T0(F2?Kg@n;%jgaX z2pHrt<&b^$@nTM$Fu4zW%rLdxuX6#u0-(Czkue6U+(8w5e2zI`ahg!S34F7MIYbpRmEkFAKWY(f`7hU zbU}w_qS@(Tw+v;6gq^0a%Q>m;fCStg2?<#uvVeOcDw;-WNGdUbG@%9BrIb!^+hlyj zbeN)9nqKOn+Qj+m*4dSmtMHaC=p1!IWL~Kl#|L>!`~+dzu1+xm#$;U`H6mM-?mHo) z3dMqDs#DkT_o7KVR6H&?9TjvY-!JoIPj2(s4@^FetK+i!$HF+Kk1%PyN}G#csL%eK z!Dr={*1Gx1;N->X+9kP>vc^Ms3nNn_c@l4W%l|bYj1PQZVUiI!C?=G_r^3O57AB0^Tz5j`tj@zvxJ9`8II&| zJQ&O*I9gLQYwD{*A?Z46opadrrey}yo{hZT+2*7g6Q0y(e8!xGY} zi^7y1g{SG)hVul9X9Q834^m1Y7Q}2-xKh$r2IUg&nm8N_OrbB|Lbmq^BBv=2AT|iv zg998#XjSOySp8=qoA9d2j8R*C?)8brka5vHLq_|4UokE~A#dVf+y(>?M zWWt7m(L@hPMfh$?hjSxmG`M+5T0vI5u2JlOJX0VBr$%|5QqTfw`tr3T?7p7#N zIvQtEX}~nOqwTWKU9bpGzT|IQXkiHBPe(z;*4nx;I@`{;Dz{;BOja67a0LV$U9?8D;i*0d zXpNutNpDJ1>USFnNYL}ORokO2B0s%_cCk58)H;q>Rt`{Vl1Xp}5iYREG!106w#9>D z4uRAZT(Ja53u%#2nF#`(;zrEoRq(R7MDL(fHMn9kl*QUp*=b?eqc|cExIdmD07FO! z0F^)<;PxJw0V-1bh}r2O1$2>JMIV0xZcH#nDVQldvq_MSt29ny7so`|3@uQ!POCBK zz?xB&I9sb05+KQU^Nt-_+w}4brQ0b3@w^K54VNsh(qJr)=4cnAr(Y@$E>IO^0)!}e zK5v)$&8q6P+6+o}k(FZkBpV6wm2f6v2bR}AQ)^KE=%Q|Rpku}{(N=+do&16CggP4< zWo)&ppAWKB429W(H!z7$5~~5=>&l`cw6TqIg)tS8`v^}sz~R<$Fxc}Z&92T2XYYIs zcdvV#Z)aCUIy07@ls_)LnRe6(Hf4(PYMp&fA#+llg}oD6=zab=?uItEp<&{nfHG9V zv)9U9OrL*`-C8txs=?Ay7jCwHS_Ow%r#6V`8nu1YMakk4C;DF_?m}RZ>JGT!QQ<~v zSE$*jfA%|M{-iJZ#F9D?0t##?Q>2q@#dtlnLfJbjj_liZ9_z(*B=mQyIF&|1SH@4a zdL+{g(XHnOB3LiqCnM0eufpft-84HDyjMRfF~h}e(Sl$9+DaQ5q_tEQftYi&`>~n%S^EQjw6Y1P$*q+GX-zE?S(I4bnG>R>d$BfYqEOZ>}a0=Q!gQxVeWmSzugQYn<~-)T2oa6{pkRC>eY*mfbtBAB!xG* zYgk1&Ju|gi)NK2WCbk+};l*LF0rDzSj(RB5AVn*+-WdtP2nr;TrW{VG08T$r&kWa# zx8l9^P!N%r1w4tCwHmKA4gBRlzSfXY zqPxq(y8?>VR2m1v-%VvQ=odM?TbeCE?~l5yprvKonZ_uyyG4_h3Ur(!R~r)sw48RJ;)!#4`VR@qKG3V+F$N(1Pvzb#MPlsTot-nB%Qa0r5u)tW^c zeR6D`{(_H6Q3{5d2E-*rtyoa@oP)qu=$Qddd-y2=;9Nk%2#iHR%nS62yOqn{H$`s1 za4tQ9NQ@y`wqra%&08iR5L28r8W2?#sFrXo*9=%}s;N@!j8Wy9P`=$(1-;!OkBFAZaCZtGk;ChJe&2s@A5EZ+j?#ka1T9 z1V)tP2h;-2ilN^FadDajB>ldJ^C&DoYaOuIS0nhLvmP}PgtuYOP(6{A+JWcyUQvUl z;Vve_+Ju~qN!&h@D3$4Kr3>AS+p}9FvMQ`&HT1AcTzr2U<`P+oX@m3tAt3_sU_NLd zQ7jO)t)|l&Ls36wq6t)Ex@NGjkD?YE2hk09sttM>K)voi)qO_`it2Q6TEYv`ly2-+ zJ$(>XN4i?n)st4oOj3ZUo&PO^mMpNgm+p;|)Zx7V4JZ`gt_P;*30QH;#9NLc^SW0n zzThTW9716GmO+dK#R)-g@q-pmqk5Ab>fI>S)}fj)2@eb5N*nrFOpDt#oKbJk>5f45 zfY*5jstoHCBY{6>lIw2BES(;9y|y!yKm~1tz-lu`?O*aO+|#x)+wg;fLn)9IKvcQ7 za#!>npHFA{jks=PE)srU>=AZlaY9R<+xDHd^Kt&!8cK0|#jVe+-z*RlQ_Xc{;crF) z3#=Y?Fyq+lSA4(&v{FG*2^)C0`$FWxB3#~0qAjVBA&{niNVN9lmOP?F$)%&9%EDB% zz%#U0>)NZazfQ0@V~NKVQI|TRElnhP^0{9+A4}CJ%1IqnEYuLwV?8$N`%z3wGb>V{ z2eyx4sqs12Fwy4-C=y`+VZ&=mU6)>jl%eG!(1&-Tm|=-TeZ=K;Q6;`{jg;xX{vu`C zaQeLZp^~_1Y5E4!H4Y7g-BU+m*T_WGEaS$4Scd8LNW@8-;4PJS;18OlBg8m2n^?8d z;uW2svWb?k#!sC%ZO-;9iYhzUzfDx&t#}2jww5?QYoX4q_scnDRq#fuas~e+jwXxl zs&Vt;M`vDsXhjE$C@=0$M?Ey&F@Mr({xI|!Rl=lcU#n$V`dwq2F+DpV)X#$cY}k;Z2dHfeVfc(O;eECRq;s&!r&V? z+2z=y7CH@=A@=gZk6C5k!@X*cr;X1+HH+gx4tKiX2p^g{!0T15ft08orml>f~HJ&cNx%qrefD6)=J zMXuO?-B8LYZX_m|!9|*Y#C!nj`9;89O2F6?P;!zB4mbv;FLe5b!ql1~Qn2SGO}+}y z)RwhJHz@D=Issna%vCY!HX0DH)&rS#v4(hxW@)UkECJV_&t`kB&Lh^eEV2X?M<6^{ z)HHI5H~HH*ihgH`%so{QR{N%NPp_dCe;eilsO{+3N!HNv50yRj_LR=&oN-DxnTeO@ zE1918eEf<|+U*>J2!ye^Skoqf0*w)`+XiOpQeAe5p2|}|TF;YU(?AJk)B)0Ce>e;? zBVB}g@Rswh8)?Wn@w4DfH19ei=YJ9nV1i7r;7QF51H_tc2aavj zhwqNhmnEev;adgdttF6}7>+&zy=JrudjMC>s7u?1fmORsfWpaf?8jqp(HQUbgBZI< zC!Sw#U)00&wpgN@3k~t<3$5k&^|P~{-Qz!&0jF@MulZQWpo$QbT%LXM8qywq{lJ9} zKw2f^ja@EaMqi!K#98Y-Gu>!yc)ba{spft<*h|}K1Ce981;>&qtmo_uBpO!Gq$r#H zFi-kL_PB;lH>lzKd?ivzFbSf)A%HzPHz}AuF>tN#ih-uE9K7K~{5fla-HrW)_;P75 zj-gcmFKy*xitcW}^L3Gx4F-9TQiyEInh4MuP+aDn&OF0by0XQdNN2!cuP-L-W_VXZ z*vs(qZyw1Ct_-0h#RWXFtE=G3$+PhCmZ67o?a4;A?4ruYGMF~3Y3@Vdvs7=8d1M5< z|0ur$R;DG>pyM@a(UATLH-L{=tj&`pqTPly<%%q)^TFiGcyNW}=^jD$O>kGOEZy`6 zIIg+C@}Oq3dP;{%!e3xSE-`jK2D_OTHr_>ny+Q>#hq2ANMG9%!7787Zu9>D1b@<2^ zL}82}Q6g7~WcD3+f7j6LJP2ifS68xc_svA-PS-deizmG*PB3;HD!mneRQ36^@?POX zme*mH5yVsN>&(X&m-Mg=&!*-&Du%$rFgkr87aYrvL=gxP?0X>BW^5sJphZF4JVHy8 zVuM|!Z;&B8IHQMQdN!RHVQdTb$sk#apE@==N|yGqhKe73$tgFMb29&3^1qpslbrq8 z0B^YU>P=OuSMQ2d4=Qkk(=x^e9VLe@Laz(87m`)Hc(K&N2xr-P5$Zu^NAUteRdtYm zYbfcjT1eB^SUc$;6sG@)ndM#aix&jwAUB4>ibI2=>bzy5UMsniXJ5nckxV;9!5Nxq z6evD}e_Bj;Ejj|>#eosF!Eo5?ET!GBITp_hbTBG>7Oy0X3 zXk&FmG@*Nd_9PJmE!Z${pKR@mYqst|*GOKhx*J7Haq~v$mP*OFuiQ3Fofjl}`IZ8L7Wb3lxbt`+Q z;6pV(qzu`7ajl3OKlzG$vm{Bo_-f*-2Ejyf5veoE19g_uT)i>{Toc0Hcm~^^knm_= zp9KvP#6359Fo%lA=o~Q7_E5TdxRRU53!d<FrR%aeML8o)N2cMfCM>9$b zG`AK4F9D#9xdmsTVF4dyLXd=#Grabgi`GdkGSSY>+?B;+WG$`_$$@;9AOot4@ZgBM(v%W;3B^DH4|!qu zx$SgW_sfSbyxB2cP0dR1IgpeWtRvDev`KUK6c6g01^Aj=zc6<{R-7AqqP-@)1lxQI1z5L}GNp1oPYn`|l{ z$qX_{tgP*N|oNPn_{gv{wYEOC|H4_eCQI5Q z9{&6HyON1{1>d5EfR_oSd*oidO7F5}pF(FBcj2YMR7Cx+;DG8Q9s0w`;pM1HUmz9H z*qgZYT6;f0!2(sYd{j$=g;P0ZRtscP_}XB3VATWOY>M8r8lPKz!S+QkaGpu;DevA^ zpqph{HO^7mV%du72>9L2YC62~kvcKf_@=KPxhsXosGsx4Z;pSVxRFc18wypl@`3~j z$efj-e#f244^GWE^hf!dNxgou-+$E5286;0KEP;z^`2zBX+2>aB6^g8r?nTX>+xp2 z43_h)ZZ2!-Tc#RA>@A?xiSZ2>4?M-sMzGB#*nHY&_@O`pim(m zgQRKN*dS-7GLV*=)5oJ9{mG#*%UkrJMya{)ZO#_~3fv6=gs%9*`Cm-)+Vke43^}XN z+4A*Zz8pS;@d8Fd8dlO=-0n&D$!iC)aY4@g>HqVYq>FW;d>~P{p~>LBEn$O&4OiuO z+cq_AjBdN7^H~h)y|3G{F5#jwPt}~@Dw{=AswCH8b2yJC7+k%zp;%ez%;;vZzGiyD zmS0x5-d0@^M_FhB^+cpaZFc1FUe3`!cP&8P3JN(WaDBnkORMoMP%O`TZ=e`Ud*x}G z^(7pgawS|Y!)wf`WJR#nF&o&n3F>3ybD?n-L;E1naq$ezB+~leXq$ubx5+iwnaI40 z)=sf{D@B`&N?77CCP>3^`tbpdouC^z3F1PUNU`$(*mL?p@ZJfC6yDukw za!m2giOmGM{d;c=`x`kGSgaepVNj1=@!GDAV<6I$IeKU3Qj8)^rtv`p3>{3wxMcBC z=-%w*cP^uzD~%pm-JCS7hUQT%Y>^KPv}O$eE%=Xz7#zt#{P5Bhe7CzmId_e9f=yX_ zIo%aV5_A$C1yZb<&PqH|V9ZW@bZ*cIz}GlL6k*d>toH1t;>$(BK}^2$B-2!doR&To zS-2x~6Kv3-pHX0P+#B%$lTW>7+u@_6le@Z64&hw=NWkfIRO3n7Kuu9q=_%=9)L<5Q zAg4$QEAIu!z{6oO!OF7p8Sso_=fehWi5O>GXuM$twxsEmnmdRr%?s|4OX^$!&85BK zb>+=7_m=U&JM_vNNxYd9%+(JjXGCjNpiU<@YRjY-J0B=sk{5m!RDZ;O$+CpRHF;9G zwrqNFqs~+2h)R}}H#5h3;_%uY?JhNxl&Ay#2yjoi9lMB&aHG|3wi?al{iT*?h7ufc z`8nBpmQ(TwPFnPvpx*`kDiXfjTf`+d_|E7zM!zue>u^c#c8Yk~LkupbG|vnUyldqB z?}*XueQU(Nw|yS4Cv%tEZq9`xnjw47<^RmWQ68Tw&Nsn=)ujIFjFs19)#z5GC03?n zolEqnK1ybVvdAW_mWsCi7g&mdZJy4WrW<`gSXnB zgpuFCzG5Ke`hz38Hzub4^t&ATGqsM42Os;*C2gEv^pm@OzXN*Q$2*%Us+tyMW}o7D z_e`LLpiNCZJ%+gH!s6;_*4ar+{a|^yGG= zCjEwOOuauOQTA0~&jtm{Mw+Um=~S9S{(6o^rLVM7(Tcf9Zu7=15~XId#0`R^uEBhU z_xWw;xzdu|!Q9s6J3SD0UES9v2P#1g<)5=)k$5V3#TiYo#fz*7kkS8o1<{H6XC&RJT926 zr%8J6i6ePCC%Jt>md$QQCI8FU|F61MBk7gf=FAheI*Sl2_gtWs+O4}-2itQyDGw#! z;dr6^g*bM512Kve{Sc)beD7%H(vXyVUT++!mdq~@r_7Q4x4Pa{gSS9kvu-5oA5*1m z+od1gLfY?+T5Ek;uPpjf8dP%r=( z)veNR5jYW>qmD1Ja<4p1}+!H8NiOSXCD+4wXYXPssNM$%ZT`=4;GouK=5 zVe1A%&%K9-_s*(vrw;HKR#2@vumT)?0pB z8j~79z+FRT-~_tVv`&DOnnCqk2bp_Qa$b`u(MubTh;VVVGtIHTh2Nr)Ky0vL`ocCRrQVsF?t9_YSc6P45?yc1X1dv z0weTaMzt9>r@nKF)3p$XN1qzJQ~ChU%~3Di5oXpS6NeuMvra*%lLQjdy;@6j#%3b}x^2Ijpk3Z@D z2wQ=z1^s|u;!Rs&)I2OrqWL{ny|;Kp3~@?{tKq1a71J~tchc<#Z27ssk8o%B{{R#I zg#iTu<{|DET!70wl{ZNCUy<-?9=1Oe>Ua8~BeX}|JU8kP*qLnm{Hzogth@K`53{ek!FNo((yFeN;wUbYB z!uwD2Tj85rO#OyzxjNU(-FGYeFc$Y=HhJM$YzBKo8fJfCv*|-7>)dAGvG`FNezN}# zga8CJF7YpJ%n@LO==Vn)_j-q1^EiDsiruT1h_uk;@xto-Ful}51HZobNxaSpQ)EZb z`}$4uVHxPyJa^BdrK8k+<{Laxa_E`KNO{84-pni9?55L3{7LChJ>!TOJpTm{kvzdX zH6b0+W-b=VDchOn_>@KpR;Y_+OH&m~5CU4`gYRJ~+7<61N>{}mWwGYV7G-I%hcHG= zS?R*T?7P;<+%_1CRF54SSO{x!BNar+)-w2mo% z%f54%y{eDIG(5JUc2KPjh{+@XvmM3?Y1=K|Z!Qk&Fy#6JO%NRW9)8>{S{#~G04}+S z2u~av$hhQ~mO5iqln^|K$OSVFU6+d zX_TQQsL%ot49c>WQ%E)m-b3}=2odiV&lYxQaPV|kvs3tHsfxYOUUOQYbi^{a3EMW~ zD|fe(Ys-5~f-l@2QzCA^NZ;vqyW$B?_Jd8VKGi2p14cp!nr5RM@A%{=AsD!AGM*58 z$eLf=bttm0T`4HyVbHi)u1O#eC)a-9z4*vF+o``^QeQ1gJLn9P*RcQXpxiRkG;%?4 ztLS6p2j-bBBxR;?9x1_zA(MNfPv}bRIo>3O49!ZHl!MW%GvL)T9>Evn*sIut9f;s* zJ*E&RLm`7;j7XkE6pz3KLEyYt!V~?o(%I%mA&vXZpWv$9v@~xzUah@tu4~TBQuo^_ z+R2$GV`yb~nn{NUPm|_X8`#Py@M-<0CSO-Cu3lS)6n;kt*WM=+y~21=Hr5_yb9-4Q z{Sdm;;6!fwaj`ZFw57%&O_P=39qy54slDaJK;0`jcY z@wII{_9dvn*HxHzWff|-C*;i@32Zejnz$FCU;R(pSGhNCV~-k5;$eW2Eo|cxD`e>r zq=9^)k{Tw$RcO*;m#6FIAS(T2A219Ar4RNPt9z-~Z*S`@`Ski~*A?~GxLTp?-Hq)k_i@u@ zjG{@Ywwx6HaF5A9Cdbr~oOCv!mH0z?*LklxqjC@dgpB$_Zb~kX3CN65j>7tvsZxG2 z4QxfKz~zhJ7eN;pC+cn-ki+ENx9+r>@Kku>oMV(Q2KZCZ54rh&p*wr=dq&?tve-dJnj+qT!*%L?N&;63iO520VROY8uBAB+LJIq?JLV*gG0nq)Ef z_tk3qcwD_87GZkhy;n%BZeGg$fmeKhN8g+D`s-{WZI(XYPkwR*pE5f3DW&czn?ye% z|F!RCvH3>3W~38cithydDDBIsVd_J57WEbZK?`-v0syRX3(Vv7B$C1qx>0ng^Ld=1?Y+ zLOT5MQpYj~K|18{=M!VSyXgk6IeEU7t}H{adxxCy&-`|zPBCi_zXDFigt1hMz%cgx zm}h$V>VbR6lux`0(3^~t6O1FbVN9qwVQdw^QPe>k1X4BWEzwoXdIMo3Y#3DpTs-~~ zSk$d^**=l0O6c=kU`tw-9slC%bKxqD4nB@$CbVP|4vMbRMbuq0L$BI)sxnu%kos}d zrMQJOy1rGJbijMe?v`wycp+AQtod1ukj)wPs$|1-5Blqb4^!)X?^ zQeD64M+aAwqzf4*>{kQM)93!C&)Ba9{KZ)0V?*5YWCzKUkCC~E@5w_n-^!yqW_0Hb z;^R1dF@=ePm)=K<<+m$KZl7j>@dz3II5r`kW;K4RvJ%DsvtVLhEHipI%N3$Y>1xrS zFbV`xWaYu@9wprf{?Ocm6<%^IAvCnfpX@BecV+%K(z_-p@L1e(Mn7M%K%@|p5L2_m zr-Q5j8XjG=1*hY|m4~h~m*yX=_!Se;U64zdJVIy2l?tM-#t+(Z9j% z)~-&wG0=8NoM9Ld5r=oYA`KqU&37AE;-&5b*7sCUXDW~~@8JkE(=*_pD=^K~TkfXE z7;jL=Z@A~G=*<4%EZ1zHV`0Dnrz0WN`>!(>=N_*378B8JuydGfTw~hmu;PX|-@V^y zGhBVcnx>wi=`XNaFrmMD_m}$Rz(7 zM#~n|^qJ?}z49=n_~Ae9aTCkXO3%;w)imR9J0S4 z$8E7j9_xyXupk;Uo{a)O!ad>!%9!ySR3h2g)ABs@CvMCM58S<`5%OVB*W7!t_11QA z*Im^?-Ri!&O5&v$!uQWoL>{_XsdRvN4_kq)&%8In`!5?7 zA6s;Yk}2nCWzqS5CVnMwra0nf z;t`4q|1%s#bbm#3Vcj!%564XwM3!yLlRweL=UZI6oXN|!U?=bJk*6^;rMMuT9y)F$GDu8=&bPXLXPM2Ph`0B@(b zg?0X7o+2;wLI+t&=3ra(#w zC*$*rXPgTstBu$z--raP4*+iREU-m;sme%`x|vc>&hN+z zKHpB3P&in$xxna=D>$0GFRF*lWx#mRw>FTB1;Oz>ZQPi-1s95UQaIzh4=)0tb4K7r zbD&oqO;1GtM$|}yv7!ay1X^}DgCF&5JG7K_?G$Uey)UUC1XinrdN66rSU~;&?iwav zyDau%XWNB<92?+d5pZwGmI_+XnMRvJbt?p}9MEALaInd^8W3haZrYy5SY6 z47qmS+UT?Hr5Vc14D+=9kIJlD8D(Celj)J_MZHI+|F7Z3*FXe}jKJ2xStGolbn>Gk zVdI@o{JkTF#add7Hn_OsaB*SB;e3QqmycLIEGv9)*tobPYQ0w;DVBAXi8L7Uke_0; zxpb_3f=^2ef=0m7qqj9^I0vxL&^S~ujwV0m2!nc7LIDH6zdEkZNta;C?YviQpXZRO zCAlJ`|JBK0sLYc7{H4Gy=0A)av=^gry6@lrcrVj z%Rd`um+ooS5GK4MuM5mL{$YX7%N5*~*9E2@|8qh8m;2M758qKUxk|IJz@b`49$viH=w>!3K=BKIPx8?BoPDsms3BJH?9>SG0E zt>y_>aE`kXQ<1=svMS0@ECkcN3?|Q#F$K*o<0ZE6o02prth*TmyXh33T1c9BOd3)N z5hmO2O(MmV=r6K8Q9$)&R?1Xdz=cGdsX!pDKaSR#`2mx=5*PTsx><`BFMR;o$vyXB zHy!E>5u-2>7`?fq7|9~h#Brfph_p+vp=&xrM-fP;h+-s(<`yb8IGi{VmC!5}lDB&d4~!(|>qH>JdW>c49j|SxXh6?esr|0C0QF->zCj7n|g9k;7qZ zMf<6(w%f>P{)qqyg zr+UGmv~ko>8qTSooq{7+r%8iA9)NK2;*H1n!))OG*lT>_zW6{wJ-#P&j!CnBZCOK4{&3G-OLe+>gRnc4 z!CTx1rmV$9XTAj5M5AVw`FPdl$LGuvd#MMNlTo|$Kasm;-izerap`CmgSP|twzArv z|Hs3&3|W`P_q`9)a%v6S>~x)%jfi}#+iTlw|L0DqCj^(sVI}YT}Ggq*G*g{V{A!5~c?) zseHPWUAh=w4C68^2H|7u!)be$1>N0SfHq+`p}f}4Wl?}>JmRr4*cOE^-(6$m!fDop zm4I%eOJaUfj$^Yp0glK=@TD*^TqsC@S-?JPffPw0rBGWe;a9(s%9Mw%C&xBb4J_Z> zA04}YFCU7(yZX1>%u>K{S>U2f^x-}I_*-%FCqd1IZB4O8%eFX}nP{ccX@`9&!u@F( z!kZsMY4UI*H=du}*AMw2v-lhlMw?-t9HjoVY;8LqHEZGnL*NS~i!ApzKOD$k8yf3J`X(DiX6b%^P3Q1 zj0IHpdw6{}FC~X=f>Jv|Za}FjRNzvNA_ww8D;M&)x~|8?B9yB< z|;U;z76udq^HeWCYzUb_QXHJH{shMKS+9;z1P3o7`Mw-RX&ip!3U*s z+BQ~;j4SIhVk%dQgVj+suK19>&E;Y>`i|57Wpg*qmEJR8>5ht1n&8J-Rrwia*V=}S z_E~%CT%jqv6C{tH)cxk{)q>LQ%H6ruRfnHFcS#L!q>c+^?*8ZPP4}M-+2s{^0D*45 zQEHZR<3en(R*9=LH;jzIEpco4O-zNCNWEb`O*9`~k3mW>nR4mz@2R7F7r_lImEz>? zD_<$u!{b3HmWPRRbIA|bANyw}oNf^D@^L5oi7i}}AP!;r@Vjp%Bq0Y=COcH7I%KYm z>|}8GK+zhQ7*-=fD+ZuZ+@ z#B4YDsJkj1is#Dhh{VCeMp!K|i?#qwSm`idMXjE;=bjF%rBuGLgNV=1*|`6f9PZmqY@i$lI@; zqPT5c%h&d=zt&5Rx~90;accQEb&4|18JVYh8R9IZ&?>qUlD?ZQI#n>{PTscT6{&xX z9UeNe!lNHf@x4uoHPt=6mhM}csKR7=WJI7Po@y|HzU+H~4aMjXc|J_#!sSTD$|JAy zH^f(L8Bd=1G5WX=LY~%M98nqN|I7{h2P-VjrQ>Obo5J2O!o;hvcbZ#u_UYQ z0lYr#iwvfPj{pjD4dnIRSlv)oJ}A2@Bs zRsLpgnC|itU`+TE?t>eVZh~K(Iqmdb^Tc10*V|e|e*g-mGO|#_1O2WpO$ZoeSMp_w zFZI-{h%nQgiyS@Y{YDcOuf;WHe>c{5(>G6dP%Q7JT*DMjoIA%$o zcl;Lp{bjRj%q4fjhO86|wmhp7&So5sxFYh2wK)wS8J%aOUjkHX;mSZQ>RjIZVkF5U zl-Jq2EYR;OYIrmJuR8b^M2Yf$yk-XFPVNNtU=0QknfCm1sLB|nRWKt!nN3r#Kby-U zYRh%0(I1?`P_%%MIc%hyuaZ)3>{|=i&fUhJw?hrwOpWo{wp;ZhdFb&Y7qi)8-|$4_ zsL>~EVdlO4iZw~zLJXBeogA5n8p-**eqCB{Adb3Y=&1E=an0Nv)`dycf{1W~a`Si( z)z96jG=UQf9YFB0W(d>V_ouF7`sg!1j}UZwxe7ABlsN-ky;@!7x9|*qJ$M`{HdBsz z4-K4cOJi?@=$UO>+GEGJYR3TDlopioMbdh7he1MNPFUpSGI?k&G$jFDF@Fu$ha9<| z?iuxO)rGxQ?V(Nc$7(r!X{-`fXQLMr$Fk|qid^Pz8KX|~#%fV$iJ^#IV}Np&1!0B3 zQfKRp*aoA)&$Bn*O%1bBXAv^LQFsd`75nhN$@FTQ)`MDhPwpm8!1#yiTQotZa2FU? zNM+6PpOv5Y`Y+bbR6&%Yrur{m32gTzIdbz>q+{8BTXN_}MRJ=2X1c zRYT2IDqANYrt3bG{j3gHgkOdkf8Gk&iar|-|2X1jKc3lM*cr-@ualY$3k{ArDO(`A zyh1K#h0d4vs*qi_(*kcFJThm~1(yCJuKd`w*GiY|4BsL<57rD%P^O)41~+Qs%y>*A zcF;g4w*pl>*Hi&*c(SE%fpzyGoph7_34{4CMRjC5U8_+C9LTx_JywlHx5|!X9fh=a z*C%Zpqs{Qf>a?(u&)bMz9f=YaM`C3DdR6R7vj%24MZ}i%U<|ia2eNLH^sVyfxJH~P zAiEIM>o{hvtOv=jcz=fLLlq5(?fMwmYWw{qLxfw}r3`~RPP8##Iu6JRnWJkJ*YY)1 z>bN$`W&O#wK_(IBzWJEP%An4z>St=yMS)j_)E&}|hX2==7B?te-Vw$oG)AJ|vrb~T zmPDd`{0*wurnZkx_4AiaJ=7Tn81oCDhW+K#3-#k5hfa;+78^Ts7Y(}Hf9~4J8-&%J zD|AdQ7z%<7YB~mpfP12^@pL&_32wgDecgSZgf*3bvI1dDBfjzH?T`(w&9?gN%SQuX zZa&k@GhQ*s*IaMGD=&}PAFYi3kVgC@<+>nM;F=XizW@SCLn`oJw&1DXk}wQidRLc7 zbyAt?K378*9anqWgjb=4tcCKO`pez5knLeE%+fkY3%amtYJ64P;FKojB~bA_&=*(3 zGibMj9#lBlJMGVXbT5l}qBMRRdTJ|5SshKDOgzV?cX(h6ZyfM;5~|Fd^1t8eTS0Bj zd15C0$o&dT0)FK?ul@YDuvO(pMvhuk3WL$ z?0M$L9_uJPWv9(=FjD*&nZw3>+~T7_#=a8LGksnuvGA~d!LBV8y3N-4OS~C%9uq6P zurARxdXKHWmUfN5Yf`%`Lh_uHVkXJQR5Ul&S`xE0!HHSQ=;Ll?;n6Rt@z!g9xzlbP z^-XoaMT-{Bopj`FH{{Ab#&@B?BFWV6*G?Qe%2}eh`YbN<+tVMvy1Z&9>I6X0uk_pl zGqQN3qu(mY5y%;S=7oRyatRav6jDFnp$pm~p zFkpg93xP{r%V1PD-I9OUMaKNWfOQsiH?~q7uSd`quFGi$5raVg$;>?WRUrfZ6@Zc1 zrKn4W$l2|K5^l+m_6#zZ?QR1S)2$fM<)L4W?R37C7T@3q+~UwK!IyRm0FvVZqvwQN zE>bajsXBVQ$w+@NDx66py9FG&BF+fY(JZ`l+z7rq%e{GBc=uX;<%QtUgUOovWDj-Q zp?rldip~!M&efh^ilLGCL}unP-dCe0w9)9XSk#+=9#)F>(5HE0b^3j&Ea{uW^meTt z=*NQQlB?;qzAFSbUNDB-DtCHsvHc+b=;K{{+Vm&9H};}EelP8mmgebEh8d!3~EUI60`UjiM%-Ifae)?Q}%^5 zKX%ruylSWAn$JLg1kX@40F?FhTrH~yjtx}~8MM&OkfRj(dVpDQElWWtnZ#gCYno`G zbb58Z8!H}+19v{>JTs$aH!ifS>2~pDN%|WvFW*4oL)!g_66cDeD|g$FSJ6lMFWjh%l%j5F!Q$}o$x7g{j+|`zvOzuwAYMXWDRkP>gv@~r{ zbR&wymg(s^4GE#0KZjEpg!uVsrr~S7!qJIP7is?9PXX#k+!c?s@IHTv%&{6q)4A;Y z6pXd-jN+^#qZ1)i{g#}DyV(z$By+Y6VZ@#)_0u;PB3aChchg{>Vi*)>CgpVxMtEus zj2#v{wO|hG1*MaIDi93Ly;9UWuDZ*RGB5d5p>ikd`8gSZQUlOS_{3{~x=o*(2*T~x z-j2zal3#XN!kBV{v_G3v+LT3K=i{v&?CMWI*tH0iN1!=O?eNifz2xwHBN*iH1B9MT z*df~#GNuDqJADlq#2(W{n-{aGLtMOf?kY>Z$>(EnFxW)deQH`YB@dZ04^kyh_%F$< ztuH7x4cD9&`MfJ+q}NM(UT5E^FG!wZnVam`djnykR5)o@KXKU=Bk+*R_g9-#$$tKu zSOAc@=NReg1~9?#l-&H&CIio~+xRn=MH!3$2?irK9V`r8eYkeeEnJp)6x#;ZHU9p8 zbNU0R40mvN_N`j-b-Ky4TC_Xe4aAZD$FM(0uLgB8_5{eWYI{T1@1S1JkUcH&< zy!X}6@XcoD#NB&GyB$ZKCdNA5HZv!0`ETGVM#c@-qUPx!Qi(I<6w+&=Wyjn&5WlQ__lNGeNgTeI~O#Wpefw>7}I*- zEO%^e1~|FG*D_BuqR&@<35b@u4bC!Pt2CRGa(!05kZ;Sr)FE;6Hx9Y#qtiss?Fnip z!DUj4%=ClkP25nL-slD@IAwg7G8`F*L5u<|O#>PL`FfC(a#x}Ou;p>h*WQ7CV0}*s zaHhmrrgP!9n=?2G3pnW|HZyoQ{n!FC_NIhf^21;gVGul`Qcd4%Hw+Ie@jqbpTA+jL*yfc zQYa#d2Gbv?)04Vwfj(q zKLpQt&FEujhf}gnfgTWKm@5tFv(l1pXkXqY9f5}o8sCi2anh0qEYN|@alvqH6E+UpRTm9|_P5d&_j`>lUvApl*l+E2=539yih1Vz*5w9vZ?s}tN*y~>Qn)JXGTH&4``!`U#)7?_W9cZD>m`JBeD5XTdRyGE~0t!ka!uX+K zzVptvQU)udXteR)Vi+MmePd_3mG>>&(4o{|A!)=|kcg z-j9GRKIARR(49Sd_X{fY7#C(bGmiZT>Em58bnkNEoxW8}tL|#+19SAMD)-tdlH+#4 zwC6mZ=QV6H+x5OKuVFb76!C)~S8=)Es!Pa@)hfJbby7CW-7_SHe;o&va{}jnbZa*! z+tRBWrT4&RnS*B+Qt&E2Nc6jIW>>yE=+y2jg1QdTiygf-RkIuC2ChU!TKkW`wZ8Gw z#5S&BK%z1P9+d*L z*_(?9JPHo+s%PNCgB5g1Xm>&Wh>3Wo!9Sl?FJBWIofk_l7WG0q7rO$)oiUnzZ*Ez= zq~+v^`nvjQGJB(6I_s!n)5gwU9x%TO-U;2jp?2;&IgH4ST(eC&f=zbIvHVwAT9hk5 zVPva)u*)_;KSWQ$kR80EEp+XZ^+j|W!_N@v$#qooxBBEXBLoShz&ZU1Y`ubCYfo_% zg=f1{BpN!+sx>fCuZP>>W0G?l%qbrEA?aRpH4M`t@=}v`lS+^20R0RgbUGmios%!L zp{P<+a5f^UzZ2zw4c`o-k9x#@1CSrt?id8DK3a7ih}>o%mWAoTX!dnd?0p_}76kDu zC`as~OM5EF{$rJ7(>+WPc`PUjI9b#_745)=lH$0EveRz#&hCHdi?m+IW>2+>)y<8L ztaGeo@J`rIu3{6{6f=dSZRSejBJ#nJ`ZV0$8P3_lP+tqo-T3@32_mr{$$=zRv69JW z@x6z+(OE{DjNz6@bCscveZ9BNMWm&{)$@()Y6XOQ-*!%)bTo3GEt?sHaU_hwgLh2# z9ArtGmWZ|FT8de-CpnD`#_UX@+>i_}#$}}Oe`FmNw!s^VQ~ixh-uYD z1y)jhhDVy@Bp6L8ld)=zX;jSRY#&tyMn{}un&;tG0U1c`h?hnsmpms zxtwd?5?WLDq|U|d3)x}s)Q(o-%u%DOaK2J;HJptHF*Iq;*f69fx&d3av-y)?2#SIR zopSfwrcE-UsK2Om!~EdsoDZM-UuY=L%&vnC!FlM?gwum9>)vG*hdg8rq$N}lZQolzCsQMb4aBlg zJs3r1KdMicKMj`HM3EA7p^kgPwx)QHf-1)yS;e+TL`-nD$8ySC?U)yu%C@E;h`1iT zuPK2h1&nGfuIjJRZc1o%0u~itCS>Ck@H#uP7D;NJjaqb>gHmBsWwjwX54YtaJxh|u;r8~5ER+6qlQCGXS^^m@i9XMq-qUn zX$?!3jYSGjay-|^^M3gA)XBgEu0GXbIg%pkq7`x7fPKeptrM%Jupf;td=rGQ69j|4@L`JWgrNI z=v7tCnKjlhh^oUg47S<84G6BLC`SV$eyFnB7Z`kcE7vRdjBBc6;Q&&Sh1NDs{o;|( z*8NRqJqJHEza}d$KIkm2^jtuzaE)cJPENg!DvReqy1n-nYtYa_T!V9wjxdSHhmzFI zM%=)dY?p*YS|;SMwmBFZ*efk{PER@@s4rsgL5d)_oeC>Nf3@emHN^pXXP${OT6AKWW3z6K8V$1vJ*;KR9C_o@MxXW zMm*gP3A;^kmR;F(mc+APAn|YnT@{sn{R)EV9`u{>KE3NJs+ER5M8~K)DW2rR9A5hlS^^hP>4rSG+YWSR<8gy zazaSMMJ}SUzYdqyVttxptY}J}So|qOu(7uhN|Ihw2ZpNDUjY*>T6GY&K}6*iF65$B zi!Q>%F@`~L0)us&bh6prL?((H?%j@aHLv()T%_qtR4nS(I#&27#dKXPyrQesu$8d@ zP~NPImpbXmCaX!;v;SY86ZWL>i2)(za!*-xIs^5@+ayh9sWpIaKd+h}|KU4Rp%wq( zwZnflxGzb8JrbrgFSwRe0S=;M=;G8<15FpblY%KbgQ(NKMlVQe94jcJ42)ic%Nz+Q z;pDh;?s8O>$$~c#^^iVyDd->a=LX(w4l+;9_`~Hu#mTHWeg$~Fe$!cK!NAOhqKm9E zqx6p#ETYb(|8{q>-TeZi+lEnTmmT)!mCw>NUu7qLU~_dZ<PH&eY?qz}EnxR0+`vL~~%@&RHI7ZPO)2SKoTlFSx@_<*OvRpkiHU*VU9 zzyhU(=<+a(>cHq{#;GIXrocE;xA27XXG?kNKD}>`7HjtSnKxaM0nJ=ejAt91jc@Or z%ZVq`-jVuC91_tTlA76p=pmw<3r!zOEu#I_&&f*HXq08w=fClTpA0t&Ir1$a>^0PFXQ?S7+z%ao z+Ji@|DB0j(fx1MW3ydF{VtTHNe)S#kTfG;5zz_=G zZUcA5&E1HW;XqM&<@~?@qi^+g>$8UX5lN2Rmex z69zCA6<>uN{7)9GlA~B~ebcp5U&4PTmOl|$B)K^YNj0W4Nf`3G5|5@ZVZ@s2D6!28 zuNL8v<-Sj|cKZ6E;0QQ5z^nd$5`NZI;!bo-&&2a|TghJT+5km~>0@rjuKga#=p=qC zmz$`OL6q)j>H$iAgER4vA>0Vz#FWvfU0(6EhA{RCEeV{VH>rh&UNI=8*jQt04ChpU zp}tYdu4fNqrzG`Ep&(1JKpa@^dMTpr72fz*gRMbIOQd6=7Z@pY(8)FX*T7eEw1cMq zI!8}3TdtD2k)rHfhx1;!)a2YFL=yO9lreYD7XZ|^HRcdaTU#D7E9}yFlGpet^5n&# zsQ_ItL}F)xP?GmjJKDCR3;N{B6dNMyxiMIyA!22o?GZ;uc{n8h;;Q~aZwIdhIv3yW z99=x-pkWi@)Jez9$kp^AofFt<#&LVu5-$tG8!o$mRxjU8 zo2fMgqjVHNUx9RqOdPK-=G-tm_j1^}BpK7fstLq2rHL0YSPmTfP!~{1`m27I*XJEh z=M?OAxWeA(Re2fCc$Ow7{Anrc}Gj)SkE#*7S@T;TOw+2x=+f6u)$ z`8VqAj<8phVIznkq-$;_u;t*jhjnoo) zt$gFcb#X(KDuf(#*GvL+oW6Lvuy7-@T=lXHXm%jQdUU|KTDpu~Oufx!&6%|s^|osK z>}W6w1j7i#nXQC^ot)4!X~0KSZv6cbFF$m2-z(;Kcip6Mj0sy?bto>8slUePE8D*m zJxDC#LX$eA>Y4ET5_*Y$=c61*V1pw%#AM z)Spjhv$rQ_iF|@@ej0HHa~Vb~O!0DW710P3dB(`n5+T;G?AE5ydLh}-D8xwJ>mYcf zFm}Q(6DJ9jp*qyX53v2N(hq-k`b3FG1+KBLa%s}X-RbFklb?qzK7SwCa$lTIya<68;?X{RZ%Y+JWt)*j_G3cm750~jENj1@H?%H6=C;;w(e96wnS+qq9zCd z%Ph9$BtZM&JU;jRpuslqG;!(aiCm8g-7EjP6fsL$(8XYspwNiiN7b&4BnT_4vE-lv z7`tBHndRG`+tB3WK-Vt+H$SQuJWZ@)oi4TpSKEaL##!uIYks1EX(MKA=;tyG(-DOA|DRwR<3fKcj zp8Y!$KjTP;RMXi|^!P`jhwdmb@9vARyZ9g0W*(_-ks?<%E}8>|QfIt2Wkn3WOE?wW zyerIqljB8^MtHK0glmP z^Q(E_s0E{tgRocVaEKWEuOv?l!carB7#C*)ePeCMXN>ZnhVlbWz$@lj#D^xxrARRW*@>kYg*l?yE8>dgrZ2+! zpmA#m*Ucx&PfJt-w7b|!E4L`RSKmx!N#WF_3fb!_L4}FoNkDPCXW)EG5Iv4{3U@o> zC?VZn1BMApKe=!BCD4xcfBJcMQ{c(VU+*c$7|vq(E<*U9%Eo&d-$s3;lyFI@y}{&d zkgMoj=u-K$*4~pLr4&I{Pd4s#w)>r8E_GLbFl7hy8afqS5_Pqu=VWjRQJD2a`a8g$ z9p{_^Van56z$ge7(5xc!&dfFrXS=**h}f}CDVdCfv?d4^j8bV)k^4X(ak=b|=}W6h zebpEucPJv>lJ+&Y$!Wjy8L2n!yul4|$kBh{V7_ImMCutIOVbLYq`&A+A&d|oOBFmL ze8p1X_p~0dW9Rllhk#|$bgIu4l^APryJg@JeR7*>^^~r_*Q*B3f^(#GwSMRIs;`gz zQB@h_n9~4;0$EznkHN@=`NCbCd_ONUj1K4e)bI8?rCZ%%gg+|G^6$bY69cIkA1tiB z&=$rD;gn7J$q75U)juy7)8+emr~R66rS-MG=h-y_V@r3Z`+ZI#_6s=31B_BwQ#YrL z_Mf57oIwv%cMc7nvI?B{bvc0IbX@Vs>>=F6)!>@bA51A;dbPwX;lQ>u2J5`!PEP*R zZPo=uxKfLfRGgHaJ96_iCgjE^u3_S@!B-DZROw4SCC6M8hP_hp0PZff99z5V-eBi7 zX})6IrJyQw5vX1^e{uMroRxP|x@$ze!k(&m(J!9q-?A7NC1tX@krH^$uA1P`JobN1 zT+_tgIEIF@w3T!R28L@SRLzk@EEopOc4t5ierOqDG_8#N4tw5unPvB_w z@}W0Zgo)AFfrv^dvHlok=GLJ}j~A5Tbt_lzJeR_Jo=dTzfY&kpFom(e@^Rw=jR%0G zwZ_Z3Lk=XY;DpWRy;29T4_w%MsXp!QOxvc%9-m1R4iz{r^&Z3H`j>i`y=SR2XHf?l zr)I=c6bd=n%`u!0(6q(E1`+jEIV>-!WAUBsZXdk-Rf-Mu)jFYZexMy~NX8ha85%i{ zwwdhjmx(9$JT94J^QqOxB)VtFId;_vptxNm@~pFZExHidSCc$%W1t@JjG-VCKVDri z^a}yUe8APRz=Ic@%_*96sV#y!Eh~{kiArAp5;s42bhZO)w{fy$FGt|#T?M7U=#rXR z{|lU&v|W3uD}x+ZdAIQw9>LC#m}ke{Tx@gBfpP((#ridpwo5WwC~BI0n8H}AG|k}c z7Nv zcvBl#AyrDid^DxHfsQBH0@$%@DFooGn=H|eNA-~)$l2?7=pTtR)Tot$7&t4^uO)jP zwMYC=XZOb;sDZ$L#RJJK|vz9m*(@ z2_A2`zXxx1FF87*kVmuWDkP2XmRK`jOv=J53C}9xS%&37%T!Yl!|TX10ws5S?(F&O zl`tNh5dpoe)1y_`63wp$V?>4VSrO1yUKWh$+8mp2j*lvAHTr@{H8Q(&8?PDt)Degf z6`jD5E;@{Pwitd@ya-Rj$#m7s;5e9O@uI;(w=mFOXB)}t>bQb^oL~I)y>oX;5T{gLr3glpjfl&P@y~M{%X}Ofg@_?IZw7Y zI3PzFXzPvvzhhWkf7^f%m?NmoMDo-$J5hvnfe{er)E~fdiVhkKD9g;s+i^gm6ju^* zpvXAP*I}j)r5x<#mEFD#b{q5kup*<>Ys`76hdWq0;~PoIP~Klnz~Ha8)`o-D*lyLQtoy zbe0|C%LQsbpRAH-T*dq}NM(9$jDyFXwJ$T-&`Z{@tzz3LgS*1Uj z>l1XpOBcb*;@jD~H1geZ-#I(rMf~J*U51EluYBY614G3Pr|WobF?w#uo$1AeLH!Be zGp$hGdHi-)NpKFv`o)j)(3eu$+4SJ*3}nWQDZsmzyUI`Tsx&@6*^dsF(g==kb|uBn z^x7B)kGsR+_nuM5Tis-jo1y=5*tQgju$=t)o62CpkMHPPUX$cV55sE+?#IgFy9oA1 zoxgA@ih|63;EWJUY<1YK-5pZ}f^ZM{A2D*GI=KN!L=ZLV1=XgaJ~g0!3T>w1f{cF9 zZZ|V*W_LRlqHl;$S&twh3HeJxYBN#4TJZcx%PE4kucGgf>D8=TrxW+UQCCk{D;kQ5 z_ISv!gfoc0*`nCPu}RNG_%M>^!mbVByxCZMl}|Jqev@(SO2{)ip8L&c$B)u@?Fuvh zUEmgMp$!ByYFC--?^X=0Qo9lp%pM({1y1@^XZoU?wfKg4R;2nWQs^A{Yzhyn^F{Lo zub$V=sD{m06L(_O`l>~}M_TDGakVcQCliGdO+@xAF+RRp=Nj0w1jJ>F*uu4mOL=;! z3hJLQd-R{EY_F%6yuvpSR8NkhR`!iYm*zI}fZXorpwhmQH~Ax#u|eJ3{`5$ZeO`HS%}aFWW5 zS?b8f*524Xlh{ZGPL;;xG{V@fKfCvNBYZg408OWsC6QEtZPg|BDGdK_LjHq{&~5c# zDMJZPZ3HSgXkpZH@+EEDzdsNpGs8TnQ26&}Jym|w*r*%4QqFDB+Uf1b>`*Qq7GP@_ zhyD9^OBF#^4k&vjz^&c7%8t`kZBNNM)FTrFJTNBx$Qhh z@T)D=N365^8ipE9ebax02v6LrD4+9iFzL}u(f&!Ao7l?eu;xpt`UbWp++tqDL0iuq zW`(V#MthMg?G?|50d?ce?o4z}WQ>oh5rRV&1Yg>HVsEF>1>&}^#5U6|{SI=7oz$pVXC5IiQyvl0%aic2?wyPN zL}_PsL7x@Fr!rw;Jlsq;Thf)#Z<)~RQK)tEvuLa}9(b9?EkS3cad|=-ijXCO5uUb! z*!zf_)u-5Ht+!L_p3RehnCC?a>)i_%fhzZjH65@1v0D1F^guieGfB>y9+kR2OoZT4 z0v3Y(>|ARJ11+D^L!X>0h`S?RHH|P{nVQ>@K2K#MMnC)1d$%ku*4NcFd`#K!zb{JP zc}xk<`+ac?&6ph}{$8+mF#Fqvhyr?e0)K%vBB{W}1_AQE)q)ma4kIIUkIIeUmD-XF*^k z#klNvrQvM*GV1=P4Bv6Y02mf?+s_O**9K`|!wH{0FRY19$%^-u<82YtL*{M%TuQP04Olt7GwPrx{Fq;Fh~u)}Jp zstbjA80Fsv?PmB7KmYE)gD<1JeajG5v7I&St2=z$oGeU2+Sp;w2=*Frne*CQ4&eIv z0x7({e;g(#a^i!KL7Tl@^-8?#**O7#vBOx4UZr(QBCq zDUpuSR^!_C7fzIXr%-P+;8#PVdaM~Q`Z|N@CZM^qVwc z9XwPNxab#aA-7n>1pwfHL_PZe{U2VP9bV7T6V{sAJZb#w9U!q7UHi3|cot$wK04ey z*xHV5L zkryG&f%AZ|e0fG%0;G+H2xEATCL0@sxCjgb<_eJlp-IhiwGl{BW@-Ysm74%#d9~bz z23Kr2hCi0;PK+3%uJ6YHZy7KH$MZJhAIn$)u1qu+De-!t8h$(gc-D{=FrK>!{~KQ? zuSglh14P_1S;6 zTj@Sv{F%kDaynOma_DOLXiLuCb9M3ZbRZl!b6~#F=Q?`h^jq|sNbWn2d-NVpYYHSE zDuIfjxj8*V1-rOnHXXlz$q;cb^mLEIrQB^YHQpYzK%5DT0(h z6d;~Dg5=sz>e_-G#PywQBRECRW|)2oy*xMbXL|#?P(&Si0M!DKTMph@cJX?{4#($t zdXm_`D7i?OULJ7Q!8B_)k&U%A5*zm9GV*h*sm2N#Sbk6;x%(i`Ja z4vh0y%Bg5V%Saj#T`aVhwORv)k_?ZI3G4eV{7^SO)tagLM<+qcY-tws zmfFi&n4d$FmVHhrpZ*81QTqg&BkjDid&uJrpOjTUGZC{`&EIMGtgQNp+T>phd3W1c zgbR&loSu|F2T4c1RDw{P1kYGrw;zZDj_%9j{!FrpeUDN<$jW7~&<|JcX82y0e>mTp zC(fZ#Z0MBa)=Ns8SU0*`4mz{ZNf86O4BxG>={pKiwwk3giW>?N@P4a8DP^gE12=3B zD+nwF$u%E&ukZ(%VLzXN!~3%nnTp?mC^0f%L-P+ONLfJy>YtT#tYp8sKp1FDEqX)Y zc~^JUjam+|A2w~J5e_NE@(!b*AfGdAneX|Ex)UsG7fRSzQyhM;s71`7i**;0s1Mjy zam1L43q*xyY3KHDRS4dRPTaK%bvk<>DetYNMCYMk9@h2f-iUsX(4yc65;klJFy{HX zMZN_pSMmE{y)*^!tU`!KysM>){4P+`(~GD+&d(=AapZR_?;+)hxUARtCp(1> z!yNIRgGXjxd^(u2%v6{UsP~J5c^1+Gzn~=oGtVX3fSYo`W>7)QK*1l51}74qhXVrQ zdFU0Z86Wsi`}9L1&E-f7FG}3BH#8o>ws+v2@P7495iNNxTw6en;V*L~Q}*Sl|EU15 zzvAl-bC)`P%GsY%pt#-+u&uRktbxi!={!m8P<6y|&ffspSr319`Ludz^=irX4?x}R zvo}^QRbD=>a!@%Cs3PV95fewp;;6uo7gtp7mb0+aIpds zl8zp9TSJY+VzA*BU=AELe;KW9Yt3z=c}9LkB>!Xf|C^13{?dC!63oJ4Vfy3Yg9n~@ zU@Dl1f~M+`PmWYpmRB7+S#dK@o+__gwbLi7q+Qujd4G&pD(-5JVG&7BTeJks?w05R zN#pR^QI*X~25eBW%0|^j%|euL>#(H7SocB})hrfIt86@l+jmZRv-}A46pqOLAaH*7 zM!+a%?c(~h@Zk6V=VyNWSe*X(V`2X1x8y^2y(cH7jBWKkwAMNwN^8Amfsw^# za!eJhxw4{?$+EAiWHUI-ILJAs{fpN!-q8j4`!g2Hx}t4c*&VFg&+VHy7C*p38Mz=- zN2wY-|KX$M%E3WHxuKtxRCoJ$zcAEcDZo#p)yo?PtuTD5UN&i8->vNt-G_k`{CX0S-yAQM!LH0-|f;br9JK> zL%v)P)D<>065hoWBz{+Ttk>eY5ZLym{;Q^q2Kqz8hX$by3fTIt@lQ>=N4Bp+jTc^8 zZ=6V8NxpBrW|?>@>6qnBtF==}E6I1Pu37FnnS4ZjI#4Xb_JpOw?GRO|fmk{=S*tRs zP0ZcC(^(ZNlS11or`0t`Qx5MY5#qn-_j^eS$=WS?=fghV0N<>E;Mvhs2UjH?_QP8?y42314zlTa@7mA7Zx-12aF+OI7< zEbtGqMR~Z~-m@p(I?Iw#&iUMGoTC-~LJ!%MjJ(h*zxkJ}rIF~Wwx!=6?NwJ9gG~5l zv?*TR%m-)s+GhrMVPR0@wJU( znb|tq&mf2p7Pe2D1IQ+>69i$5g4Ldsz-?M#Bm>}BuZReH$O>Tp< z1JyWSF3hqtWGhP*q3i%NdBszGZlJYy!$RG+9Ub&NWh4q6z&WzEXmbh%n4U3r>jZ6- z*o$=pM=rjJI$$|}yTl;WmlP#uaII2x!-hhbjzA+HdLV-lY+$3)sr`KJEBXeO&_x18 z<9&je)}>+J>|$)aqK-NOvfR=T?y6T?L2rGaj?4sZ`8DRfem#tM~0Q zBE%~9P^4i@xD4&wYBt7?+tl+Ec^{`ZTHZ>)Hp>ojqlk#f1YG$zn*#* z%8{{SLN-D`22-M%7DR(+Ar|ww%Qe>FCtCh7z*{KQy>kENbU>~TU^vJvnIBlPoKQ(wbD0ywNH`i)`LS< z04sbWg=@oRKRHJ{O-a-d;Ff&I2a=_5@R8ydkvS_ImVyD%8fMdEI1$l0Yf(K;rX7R9 zVfpC-dSyQ#z8$J8oe9RDrl}M(wO(gbr25R`XP$z^Jc)&lo(KM)Hm!pECz5|hZY8tQ zAMRscY7RfI1ad!HW;Ccc(+w6gUoTsMtbi z`IT_c`$~#`x}BGhYC1z{7j-s}&yrv&H3P`uZwq{Elfnnx&$~=en+LRPS;>Ragd4V zn5`o+doBd;Ezn9(Vd7VG=Wd16>RBIjUAqQAX^WtT9{;_27A_CF$XtQT__`@g*DJ{>*dK#dY#S@2xnAql&YhekW@P&^jSa&OF{_*6!?l%{y;-6eY+(6Ql8JP&k4N?5=2>@?s zKhegEET4)X!3y&7V-7C=9Vno9wRhrVy9p*g5vM3&f+gfMg`1;?3W$3@VZVl#^-AIO zu`*Z#lqk0X1mf=9&JZ9Oq_WT0PD<RUq+%iMAvvT{00h;J1S`l(SiNo_j3M3?1r1VjEVLUMs_Aa8ueUMUTK=FUWxsFn>mO@7i?Z5&!B@yeNZN;ylFyArQ2ah^6f$77k+8! z0ORUgOvns|d60^~2LMb!v%e=^|0Q>VQTCNGPD2q^bd^v_4!L5IYNwo+48+gxNon~b z!3ilBH28HkwFpSY)E$wKJOPBCr;on;L!<)vz;ulP!c+Df8z zxI12as%Nxn8pNi^p4OCkZA|2lb14ZU#9E?^RM4Y3BO{CxL`#3%)9WnKbFf~7pc{YX zVg87o;7wY*G$r^zOx;?{teCo}6_XxP`j1)RMo`iY&$p z>4^jix1jzq#ldg%a2JQJjTUId)08oaNFa$>R*z7k-C;0}8{s77c1qum33*rn;E1Ol z%bc20A&LbN`TnV2?^gt3+j7VBiXkXg%bCU89;L<;8tkjK+8>=tM5bd}F=gboWUJW>vA2|egyW_krt*I12#pmOe@QZ?XQGYi^Mt29T0$AA9Vby`}$WIEK`G zUofF*|AjOgX-tFGi6BEZu43|?fG3V=X^yP&WhZv-v<=1kxyOkw6p>`^P zbB_EM6z1LwLXGF1S^0d~Ax^+WTUl6v{O0(tW94iJkl%pUPPqX9i(TYl&R^PX>z2_bea}4ECwE z_2VizRZ7x9L5HLE{3p2nxLX}3k%&VB##N+Ziu~yiVl6F#0gzm~YfMPKpo7*ub57%K zMnmBml2#{HQV11$Z@gRx0g_xO| zv|aExEgtsV9=O{td|p+@&QVLWMX>GYZ8c`mTc9n8t~JwoU;@o1fDPMw)$!Q?sr6`7 zYm1@layH8?x!PeHtxTakGVh{Jg|!Kltmdd{`D#9vp#`S6JM1QTZwneef1LLJ^xg{VNSCI;=AP!Uh1Rbm(r9htT2nLtc6zpQ0FtOdZ zyX16$HyEnn^bDJDhW*S&4g#U5c{Z*nnqMbPI_5{-0TSVfHOnLu46pGBN`V#OlJ5DU z68r>L8778-2?O5iR*7+?6D^bSF5nVD)yrW_>zIhPoQ>(Ov%+_U6;>Mz#HUL2yj%wn zCEK=OHhuRjB&ev+=HmQOZN$L_=c}h_{8{iikgpA{7783i1U?(^-J>U zU+1r%c!da~d^DVD{t9f}2v>fB9vz4f2Da#eu)mG%e(xN|zya}lda7*b z0W&$H+fM`$17V*+k!mNULo2P6GKMBfNyVkGT=?|~fP?@$S>(CB@@v8kZxtrGznoKa zb~4M!aJG$R$y1>B;}+w55ww8EJQRkYO{HrP$_3*>@ri{OgRl3yipFCycFhvNC1&0> zAVE!x)}8IJAWG$HXzwhQvOFxr<%nyspqf5<(TiVPid$RTlSON<*W-aB*cxErJUq-FtB|KUeuSa)cmU15_}_ntK4`+>4UN z?t$J7|52{ZoK03-x5H)iY1u)AB3to?7~whEW;eUmFIDerzC9kgy!9X_5(Y{}9d*E} z1DL{_veg#tk3i%a!61@f%t``DSTzkwQdu$!U5iYGf+l5yhnJ~M``=%2IfE8W&O%#m zOsn8`@>?u&MQ@QqV#vz*oy;*JMJ^kMj2-2ReQ?1UR@(izMUp%~NW6Jq2W+sd1hkUr zr#d8oWi0m&q`jx?WqG`!cm?j$joQ(+h`Ikm>aN5VOA$UeF;5YkeJ@AlNskNPzYda^ zC1})8ud@>zxnb+i(zaqkD4D6jQ!7nG!iAi@qsqmqWtO?zDS|Xw8G|;+Zz3j1ZaUuj zeQpM(2Rt&sg~mHHt0|F7ybW|vx(zo!68x9Tf}_8Zil&bhk^eVW^||A&?+kVQxldd4 zdnBv$$p=Tqi2&kA`RV^tbP$-vdpL+9ik#r^;Trq6-?9~bqKz1k8O3h`{%Ip*RqrSD zH3$geicpm~-;(@fqUYDzJQrx!emEzi7zr0IQIba4-I~7~tD2Pu)xK%wkv2)OahQBt z=)nH(zrzVsFdrQ9f+am}k|&5eN-7b>sgN`stL zPHgnxdnI)wwOY*_w|%+oyXu>#^et~eaBxJW4`)9V4NJ+0tT1%cpWYT|mSHROYGXZ; z+OL}Zg|80?&;jtgeoIC0sMiBnkMJQ#r4Mqc5A07-7kZdu6nTV z!JKSQJAZe9zW4$GIWcz#reVuUN=IqVr-&fY>Iq1Z5G&lO98%idpTz=Q6Sqkl2FCP3 z5_lC*As)Op=v6u?$zHp;6H5%+Efg!MLldzD4yl+3FG^21@xj)`Q;gWp;0-hR_kZRS z`yi?G(2sC=eMF4FU&TD451y#&pCw^Z_(H_~=_}sp?t$Q5>7VINQ->_HH@p@;f!*%e z)p2UYw| zXEUz#=vixXXvHN^B87V={D#)UJtJ)MrHdizvwX3AdEIw4H>x7bx6l~FVxY-wrcIox zAnK#a`Pxc7ld1IhgIN&tyt-z5Jw^a!7+5C6z~Z@hg@_fG$q|mC^op1+ufmS2v(gxW zati|U#DDaO4pX-@nR>ot5JqB_E9P41#S=%B0+def7P_pxRH_oz`!lZ07OPZY&r-jsrJ z6zPjByuFf&j1u3`>^<(BQIEUgE`m&i5iQV1YkS(L-J^oGH}L^)(L^b!n4|j4%R0}} z*fy|%(Wg7&B_BqKz$yOJhMX*S^q`OgPgfDOs^Sx(MJ44gBrC*f^%VK>B9Nc^)+G;L zcWqh*H~RgyAU0oOOmmCHooz91nXDQ$+UV+v5opVM#OF(tTTCPiasTNQx89u2Ad@2) zWkF;Ea&u8>h8E4K^Q__u07?(CEzQ|dK4%ez$i$T=xkUE9S8<~y%9HpU&>>~)WUKkw zmm#91Ag;XO{bXQ{T|0R2@Y?J%?swaMzkIp`U7zroEgqJ8^C# z3cH48x_^2vS2ewhtXZjG$Bc}Y@Wdm~nADXLjd8ur<*?es9Q6G7U^7cy-I|mlt*q(C zNQ@U`$J}1BtKMcOboA?0%Jh;Nve5^!D(&nciJ%oJ>qD8hvr3+hIK69yQr9};HiQ}} zou)(sODRZ_Ys7ro2Md6%PYTAUNRsrY=d~0b^AJ{`JR$uCQYu)3$>? z_Dv~NVtP=>9Rl|rhcRpThf@Esy z?%8S5VaHUE*A|W({{2@sI&#LYWi$#bpuP=Gm(9&KcUooh&LlzC<=IZB8i@4sZ*7S}s9}h@aw5x_aF*<|vnsJ_!fz_=k%_a&$x3fnX1Sek zE3`7O6=V~zV>#FpIYjx{|2<{Z>c}M)3 z2Z#z4tdQyyc94rC+CLD|&$RzU*`){Cimj-im8!q3D%B5DTcL&eot8)R;G$%sW0$rM zQCyi@YX2>yZOegC&Z$Lr?zYxRr`lmm5llBoR`_1durgs)ms^$og8G*o23hYy^RJk{ zujK-MC8&zeNvqCUAv_xlB}a|+Qvp(&GLvg>^?h6InR5fMJ>?WvvvV4h!kY~66y*7H zIU40r+y<>crEXILS)Gd|#3PeuAw6mf#Ik1ePGN(}E;mZ}0y%xU5Fg>{~-F-`^Y8$aEcveWI_ zYQAPWHIJyK!(t6`MBe!0T~3>!@7kKyL;WiEsVb-CR;O1uRW&+2yKYENAfve|H(UE^ z?FCrX_M{SCSf2nv8rV{qE@`517geEVg$U+n{jOV+&Lnd28E`w;qtTPB=SP{1%bTWQ6G?d<=Ga)KUad4H;2xU-SSh4f=<^V*Y1)UJ7r0#ef zX+gu|oHbr_QB*1!;bB`sBdJ5^<&5LQeb$elbrUMja%K6QfqdlT9l`p@tcdq7Nt=3hjuBEpb>4J#I7&n@gRZk zwRlFeU=?>9r%j>uXrs7=fDH(jpy$tg=YS6#5@wH4ml{OIx9kiQ83NCZ-q10 z$_Z>rn5}_+XB})abET8oiYtX-u^54gqs?@V2vLP;L$y?*N!V&h?NILM&8J>ttxDDP zTp1`OErn<5E`C~JFn{lBQLGqZ`^jLrM7#?6DwGHH05trrYTC>a8fH;8T??rAb5z5Q$^)n$~*Wb$k8-#dXSUO4``PHX>0M!`d#mJ_5NfbWg z4<^u;v!bX{h}YxDzNi%v;?ey(Nv8Oe#MS>eENG_i_NzCSeQ~U6Z zve6)L0K#vPget16*Uc+Qt{RgHE2t1=Te183Y1at1aI2}TTXCoHoJZrPEffFQY+9@h zq@CgVArj$PcJ;oviFiO9ZNYUzSXs}yA(S}M|X0jBe6=)Z%U z^95~{@*G^*;51~Bui^n^w;D>-qqty=7eBQXZtMuOD>FovF%Vg(yi?E$E2d~$H(m;c z!MhtwW$(x9`op$@?p%3~C`rsa=)k7xGxye7y%21Y1nWmtROqyB7wsAFbdVs3up{S5Ws<%?-M) zgq_N*?}L>XheUu`LED$h!m{lPedL25MY$mB=1ub&})mV%~v) z8riCcn{oY?i3mo$)kT+Z(;Ll51wxE$^e4Y6YyG|w=ud^YTq4F1YmpoDN1UP**a~cB zmzA6}WnIBb#aV!&*S<>X7zTnBvz>G5lfLbm`(@JO$5iaqL5`6pCV|a|@IZC%N0QQ9 z?J2iV4}%Jn?qd9Ehw{>y-KJZyglM{m5%sO90r8GHWpZ;$>hsiJ zIeuO%UwEse`g25Mb;NhB%RfqS4;WQnAR5}%Z zS$F_p<6s$S@LEvvl`BSpl5zT&R*F{vf({2E`1>VYR(4xOnI46}T*D0b*F;jI1v4F^ ztI=&bVfRT@PAYLP1;ubd=$C)@17#6q$BYJ2NGh%({^h5BH8F_;Fh6Z34J&|mU|`0t z^yd&*NF$teX@)XPk0$eO$r_=BkPco9^{WahDn&VJBhhC?-m|rjAY}~rVe z^p2@!1)J9MC<39@d49Wtrd66`)E+LKgaRDuVygzesRTYaxzMV|L` zPc*$qpEiA#3G){cEg8>)YTDqX(ub{HiRTSg_+ztw+^}K;=aE zY9o-)?wOT@6@S}qApjfL5LkrVeH)zvzIH4{408Nc3n!+E{h}dA;%l|I%u=q=fHM;c zjgd@aLq#GMOU0{r8!TqjJ#Fe>saHlQ+8b&|RE2GTE&=T!8)d2t|CLQAJyr+;qOx<> z5O=p>okv7Qgu;qHeAe^0&fswIBW-9J7O}Jfci6vQ+ZKsxsxT*_<#FvQ3e7lOXSmTu zCR`6J0vzS=u+k0dD8dWwTV$felscMlr3G=o$>S(7TEC#WyeVwCwtH49!?kgb%rIJ< z<-qpPd(M`G9j*6@xYgpzX9?oH=(pKy zYArNIbc2=uCh1_jD2O}gJMl@gaWGFTW^P{9BEg=U*Xu1IfDeL4f3d`f*%c5; z$ZIUM7J+oA@r?9p~k%gDe8c@3=9_Y^us#Fes+ z-0-YhtQr?s%Zu_#h!iY=n$1;0HI2SB^--CrL2=DgvuvY7&0_%1eae_ti zOeDq46RoHSY$*1fIZ*>Tn@dD$h0#16f>b&I96SSG^$ET^?_SDy`?x3*Q7?0D4{wG+ zFFd8hN{`Fz6o*h`gr|sQwhZz_7HmRZxn>@LR2!*9r=X3gpkxv*fRzqxWvQn53FJao zXxihQ6Nx=YEkNmv?aD1Pvz*E>4Bgv7L9xVM$I9=HQ>lm)mNtcgr0%Cn6t{hd;Mxot z;Zh0gO{Pz{kHM84iN=tGKSSux3-Meg5N0R3d5S484H#*-2hozA(pcy)jHotb?_O@F z30d=0b`AF76^6dBLiW7hGr_LGHrTIAy3MPPRw@`b-6pc3N*&`zknjAf%QO^y@t6uH zXOg90GtLFB7z|-4&4S>oX)$I;taFFM-Di)@O`Win-ROLVhM_5AK35-D(4zA^?^U31 zQS2(r_Dml5-VLJ#**kkcoyRir-Oux(tikO$_g;J&ag(@=5mB=*dK6S{n6->N@lpD= zD($mhlBHihZ>s7N{^CD+dk(JD%tEH(dc1B2fye7f=RFpq6LH>3tAZu~wcMy{y?<5? zXX6S4I#*%Mp3Vl_4bFulj#{=B!>TKwZ{#^zhmf;M0ZPHvNePVt)K(CH8p2FIkGygo zEh(b}+e0tvLg*bHC`ypMXT9Lf}*`w zlZuof3o9r^a6EO%G>N0Y1FAN-ItxE}aH7Z+*)Fpr_2CKmmjq4ScOBInm+;U9J}M%b z7U(V%?Hx*G=89}-RMwqrj@(tCQ0A9Tu|rvz4RX;*OFiWsg}@Fzq~onPrf%T)Tj1kr$Ie2^NvjJ&dRIq$dQgivui z*CSx3v%M7SG6Yc!NdAs&S+<6v6?@<#rEy!ag^*gHP$jkH+h%ULCA}9snzc1DYfhMH zr2tb&4Y}6`lD$XnKGJ{O;fN?5(!t|)$NmHZ5ck$Q54 zUZKyRcAxY7-FM!;?=B~MEx_MpSpLubxkZ9EfIJTtKaq|fDfbzPaE-1-*rkH;p|S^> zPx?weUfVBZ_=X5}YA8rMz%IuLuK3VAmf{`!Mic}f>g0U9s^IT{Ce zzBez8!K(5_ToZ7AOWpW9v$7MJaNw$Bq8=B`2!$06oBjS3F8PF6&%wXik@bC0@CSYx zo82HfV;x>#WyoxFKK##PC(_}Vlc1?0sD{>NIuVg>DMYd; z+?kf5u!_gI7#VyiFU8E@tf6NZ1#+=+J*9a{iDK*>b8=_BEFTwV^imJUqBC3YWYLmB z$ACnueThj&RU;uuIL^&3*@Yoc)B$_U6aHOhp22FESFQ;#CihZ3zRZOgJsq~NiVL}M zTU`P83{cBR#3-(mlL&%&EG)GRTd79dw_fAm)O9nO@j~d5JlGD0-79Wh#;6;|!&PwbuV^X&Cy|H0u! zGi1Abhw)^8Opltj(X`k|<$4F1yqoo}k@|Mgrl#JR`xzDm(k`+x3G&2 zSm(-0?)?xxYuUKfjtW9V+#ye~^TNDb?E;m8hyC$F5gwOVNhOx)TI)v2Fak&oQ+2L^ z9{AKVIq8aApKugFM^a00L_o)VkGWdj5SBl6C#NAw@c?E>b1Sl6YtW@`tKY1PRM9GU)QJ@Z6lOTeqP?_D zGq5JN0c4xq|GujM82QJ3JRqC`#+wenqz!1!udz%3B|_zp3w zN1+F`yu+}LD>o?JU^FLDz9h*MAtU;#HLhL1A&}^h{jSdBmVBAp1XiZp`~JOdDnaFLl54dvIJJ!( zPE=E7X|>FVuUVD~KxYA!`9^gC(1ZRx4X9uSDs&#)(7)UGkcH)<9Vj$=d2wnzS#7yi z+E)V^?x&LUJX3W2>!U&0VChBKF5HlPr%2oMK-OzlL|R6{+xYX#IO;N|c{r=(GcOoN zFELf4^9XAdx!(*HeKOuM+u}r9D)hUk14-8^i+=M~Df^^*^PWD>4rx4p(=N|UTU>Zu zpR|t@d9`87<@uL3OoOhDCL~tSKrWYqecGJrkHM8ATb|`>diP3MoIed%FZ%b4TDHiv zrEP^in#_(VY~gJj#?zci)@~-vi75i2MK`7Cr`3j(Hub`wY!%-~IY}b%<|0wdtk&-Svh%1Zl>aa$06nL3nTLC!NYQH`=|7-R{_vPti4UD_`@4 zEkE7PQ^aq+1LeZbA+zx_eEFqtiWXuAzD}botsy*aXTjN}2VUkL4*Ums-{06TXIN!$ zI*`{PypYAV25)~#-U6YoEpKlExA*RPf4-g%yRolmo?3Zb56$(>9Jiz~9Q{Ms!4OHD z2E_3!A|#9n;`ofaX{a^5(_K3@2vv6GfE`je@t#h>NbwvEVnzxt#WGUzZh(NACr=}f z1U|zgGih}}qwAS}1Z(EWi*_J7kzg?r(M*t$Quq=yRm~Ug8GaQLY}b3{SO0L^i5n#^ zv@2V>E@3gK3YJQh>{2g!Ehy$xotsMrr%2T}xPaG4<0&J%%7IDmBb}uGz$!?Y0^FS^ znkE&v{&o*wF;M9%6DpDij}paB?YZ1CX(``SwD@lv5Hk!;CE*XJKu0HwjgtHSP^Xf% zn)bytiC)6R3w!EWtTZ{T#@(V@>RwBHU}E*zDDMf%+y5Yjki?H3V@zosl>o&1!)?-g2XDxZgU&%!uc>4}-)U;F z7Xu{m!ibDaHZxdrhc`PHRn;tgmB(va++mN$0Nxt6ALo-f_32hi~LzMgjR(F4V zk-*1kq6nG>v(uE6;+W^~icEweOzsJ@RkjV0o1`|&H{^Q>E8s(i3gaU6y zgq4b_@P3@uWumtYceK_Gj#i~`ZK(%t1%p%gxVt(cYZ9f0)c^~3CMZ~)E;x6+gWA03 zVG2&4c=Y5li7h0L>XOP7X{D?Q0>?=(qgfinqfzMiPozaXta;C$24!hzn8>*JY z9L9M3332XVHbJNWS>wo%Sp~21lXC=OD=fT|M@OpQO!mG@1T0YWf5nqW+O<8r8_Ies z6%2B4N)< zE93;<_yLg?0+T&VY&_0{dQNjPlmy5wdYxe~3u`hRA`KcbG054fmPz)(IOAdy;yJEV z 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 literal 0 HcmV?d00001 diff --git a/components/web/static_files/fonts/Go-Medium.woff2 b/components/web/static_files/fonts/Go-Medium.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..159665393dddfdaac137a99470e394f59214ae26 GIT binary patch literal 53740 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 literal 0 HcmV?d00001 diff --git a/components/web/static_files/fonts/Go-Mono-Bold-Italic.woff2 b/components/web/static_files/fonts/Go-Mono-Bold-Italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..1de960342b3bbbfb44e089faa19db1500a0b1262 GIT binary patch literal 57164 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